Guest User

Untitled

a guest
Mar 16th, 2018
437
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.20 KB | None | 0 0
  1. require 'sqlite3'
  2.  
  3. $authors = {
  4. "rekkanoryo@cpw.pidgin.im" => "John Bailey",
  5. "rekkanoryo@pidgin.im" => "John Bailey",
  6. "rekkanoryo@rekkanoryo.org" => "John Bailey",
  7. "khc@pidgin.im" => "Ka-Hing CHeung",
  8. "sadrul@pidgin.im" => "Sadrul Chowdhury",
  9. "markdoliner@pidgin.im" => "Mark Doliner",
  10. "seanegan@pidgin.im" => "Sean Egan",
  11. "charkins@pidgin.im" => "Casey Harkins",
  12. "grim@pidgin.im" => "Gary Kramlich",
  13. "rlaager@pidgin.im" => "Richard Laager",
  14. "siege@pidgin.im" => "Christopher O'Brien",
  15. "bartosz@pidgin.im" => "Bartoz Oler",
  16. "deryni@pidgin.im" => "Etan Reisner",
  17. "marv@pidgin.im" => "Tim Ringerbach",
  18. "lschiere@pidgin.im" => "Luke Schierer",
  19. "evands@pidgin.im" => "Evan Schoenberg",
  20. "evands" => "Evan Schoenberg",
  21. "resiak@pidgin.im" => "Will Thompson",
  22. "resiak@soc.pidgin.im" => "Will Thompson",
  23. "nosnilmot@pidgin.im" => "Stu Tomlinson",
  24. "stu@nosnilmot.com" => "Stu Tomlinson",
  25. "datallah@pidgin.im" => "Daniel Atallah",
  26. "wabz@pidgin.im" => "Richard Nelson",
  27. "felipe.contreras@gmail.com" => "Felipe Contreras",
  28. "nix@go-nix.ca" => "Gabriel Schulhof",
  29. "elb@pidgin.im" => "Ethan Blanton",
  30. "kstange@pidgin.im" => "Kevin Stange",
  31. "nwalp@pidgin.im" => "Nathan Walp",
  32. "hbons@pidgin.im" => "Hylke Bons",
  33. "aluink@pidgin.im" => "Eric Polino",
  34. "jeff2@soc.pidgin.im" => "Jeffrey Connelly",
  35. "mshkutkov@soc.pidgin.im" => "Michael Shkutkov",
  36. "wehlhard@soc.pidgin.im" => "William Ehlhardt",
  37. "ecoffey@soc.pidgin.im" => "Eoin Coffey",
  38. "typ0@pidgin.im" => "Carlos Silva",
  39. "wtogami" => "Warren Togami",
  40. "friedel@translate.org.za" => "Friedel Wolff",
  41. "khaledhosny@eglug.org" => "Khaled Hosny",
  42. "ihar.hrachyshka@gmail.com" => "Ihar Hrachyshka",
  43. "josep.puigdemont@gmail.com" => "Josep Puigdemont",
  44. "toniher@softcatala.org" => "Toni Hermoso",
  45. "bjoern@cs.tu-berlin.de" => "Björn Voigt",
  46. "jochenkemnade@web.de" => "Jochen Kemnade",
  47. "panos@echidna-band.com" => "Bouklis Panos",
  48. "luke@lukeross.name" => "Luke Ross",
  49. "jfs@computer.org" => "Javier Fernández-Sanguino Peña",
  50. "okul@linux.ee" => "Ivar Smolin",
  51. "timo.jyrinki@iki.fi" => "Timo Jyrinki",
  52. "zongo_fr@users.sf.net" => "Éric Boumaour",
  53. "mariamarcp@gmail.com" => "Mar Castro",
  54. "fjrial@cesga.es" => "Francisco Rial",
  55. "scraimer@gmail.com" => "Shalom Craimer",
  56. "kelemeng@gnome.hu" => "Kelemen Gábor",
  57. "raireg@yahoo.com" => "Rai S. Regawa",
  58. "satriano@na.infn.it" => "Claudio Satriano",
  59. "takeshi.aihana@gmail.com" => "Takashi Aihana",
  60. "anousak@gmail.com" => "Anousak Souphavah",
  61. "laurynas.biveinis@gmail.com" => "Laurynas Biveinis",
  62. "arangel@linux.net.mk" => "Arangel Angov",
  63. "espenas@gmail.com" => "Espen Stefansen",
  64. "aalam@users.sf.net" => "Amanpreet Singh Alam",
  65. "mauricioc@gmail.com" => "Maurício Collares",
  66. "dumol@gnome.ro" => "Mişu Moldovan",
  67. "miles@filmsi.net" => "Martin Srebotnjak",
  68. "gpopac@gmail.com" => "Miloš Popović",
  69. "xake@telia.com" => "Peter Hjalmarsson",
  70. "rkvsraman@gmail.com" => "RKVS Raman",
  71. "fundawang@gmail.com" => "Funda Wang",
  72. "abelindsay@gmail.com" => "Abel Cheung",
  73. "acli@ada.dhs.org" => "Ambrose C. Li",
  74. "tulliana@gmail.com" => "Serdar Soytetir",
  75. "loptosko@gmail.com" => "loptosko",
  76. "eric.boumaour_pidgin@m4x.org" => "Éric Boumaour",
  77. "mitr@volny.cz" => "Miloslav Trmac",
  78. "hallvard.glad@gmail.com" => "Hallvard Glad",
  79. }
  80.  
  81. def shell_escape(text)
  82. [ "<", ">", "!", "?", "|", "(", ")" ].each{|char| text = text.gsub(char, '\\' + char)}
  83. return text
  84. end
  85.  
  86. class Commit
  87. attr_reader :id, :subject
  88. attr_accessor :body, :date, :author, :parents, :childs
  89. attr_accessor :counted, :count, :main, :alt, :tail
  90. attr_accessor :analyzed, :merges, :fork_commits
  91. attr_accessor :in_master
  92.  
  93. def initialize(id)
  94. @id = id
  95. @branches = []
  96. @parents = []
  97. @childs = []
  98.  
  99. @count = 0
  100. @tail = nil
  101. @in_master = false
  102. @merges = []
  103. @fork_commits = []
  104. end
  105.  
  106. def is_in(branch)
  107. @branches.member?(branch)
  108. end
  109.  
  110. def git_author()
  111. real_name = $authors[@author]
  112. real_name = @author if not real_name
  113. return "#{real_name} <#{@author}>"
  114. end
  115.  
  116. def git_message()
  117. tmp = [ @subject, "mtn id: #{@id}" ]
  118. tmp << @body if @body
  119. return tmp.join("\n\n");
  120. end
  121.  
  122. def to_s()
  123. return "commit=#{@id},subject=#{@subject}"
  124. end
  125.  
  126. def []=(name, value)
  127. case name
  128. when "branch"
  129. @branches << value
  130. when "changelog"
  131. lines = value.split("\n")
  132. @subject = lines[0]
  133. @subject = @subject[0..100] + "..." if @subject.length > 100
  134. @body = value if lines.length > 0
  135. when "date"
  136. @date = value
  137. when "author"
  138. @author = value
  139. end
  140. end
  141. end
  142.  
  143. class Branch
  144. def initialize(name)
  145. @name = name
  146. @commits = {}
  147.  
  148. @master = nil
  149. @heads = []
  150. @tails = []
  151. @authors = {}
  152. @lost = []
  153. @lost_levels = {}
  154. @rebaseable = []
  155. end
  156.  
  157. def filter_commits(commits)
  158. commits.each do |id,c|
  159. next if not c.is_in(@name)
  160. @commits[id] = c
  161. end
  162. end
  163.  
  164. def check_commits()
  165. @commits.each do |id,c|
  166. tmp_parents = []
  167. rows = $db.execute("select parent,child from revision_ancestry where child='#{id}'")
  168. rows.each do |e|
  169. parent, child = e
  170. c.parents << parent
  171. tmp_parents << @commits[parent] if @commits[parent]
  172. end
  173. @authors[c.author] = 0 if not @authors[c.author]
  174. @authors[c.author] += 1
  175. =begin
  176. tmp = c.body.scan(/patch.* from.([^,\.]*)/i)
  177. if not tmp.empty?
  178. p "== found ==", tmp
  179. end
  180. =end
  181. rows = $db.execute("select parent,child from revision_ancestry where parent='#{id}'")
  182. rows.each do |e|
  183. parent, child = e
  184. c.childs << child
  185. end
  186. if tmp_parents.empty?
  187. @tails << c
  188. end
  189. if c.childs.empty?
  190. @heads << c
  191. end
  192. end
  193. end
  194.  
  195. def find_master()
  196. check_commits()
  197.  
  198. def travel(c)
  199. return c if c.counted
  200. c.counted = true
  201. c.parents.each do |id|
  202. parent = @commits[id]
  203. if parent
  204. travel(parent)
  205. if parent.count > c.count
  206. c.alt = c.main
  207. c.count = parent.count
  208. c.main = parent
  209. if parent.tail
  210. c.tail = parent.tail
  211. else
  212. c.tail = parent
  213. end
  214. else
  215. c.alt = parent
  216. end
  217. end
  218. end
  219. c.count += 1
  220. return c
  221. end
  222.  
  223. master_count = 0
  224.  
  225. @heads.each do |h|
  226. travel(h)
  227. if h.count > master_count
  228. master_count = h.count
  229. @master = h
  230. end
  231. end
  232. end
  233.  
  234. def analyze()
  235. find_master()
  236.  
  237. def analyze_head(h)
  238. def travel(c)
  239. return [], [] if not c or c.analyzed == true
  240. c.analyzed = true
  241. merges, fork_commits = travel(c.main)
  242. merges << c if c.parents.length > 1
  243. fork_commits << c
  244. return merges, fork_commits
  245. end
  246.  
  247. h.merges, h.fork_commits = travel(h.main)
  248. # puts "branch=%s,merges=%d" % [h.id, h.merges.length]
  249. # puts "branch=%s,commits=%d" % [h.id, h.fork_commits.length]
  250.  
  251. h.merges.each do |m|
  252. analyze_head(m.alt) if m.alt
  253. end
  254. end
  255.  
  256. @heads.each do |h|
  257. analyze_head(h)
  258. end
  259.  
  260. def travel(c)
  261. c.in_master = true
  262. if c.alt
  263. @rebaseable << c.alt if c.alt.fork_commits.length == 0
  264. end
  265. travel(c.main) if c.main
  266. end
  267.  
  268. travel(@master)
  269.  
  270. @commits.each do |id,e|
  271. next if e.in_master
  272. @lost << e
  273. if @lost_levels[e.merges.length]
  274. ll = @lost_levels[e.merges.length]
  275. else
  276. ll = []
  277. @lost_levels[e.merges.length] = ll
  278. end
  279. ll << e
  280. end
  281. end
  282.  
  283. def print_results
  284. def travel(c)
  285. puts c
  286. travel(c.main) if c.main
  287. end
  288.  
  289. puts "== info =="
  290. puts "name=#{@name}"
  291. puts "commit_count=#{@commits.length}"
  292. puts "author_count=#{@authors.length}"
  293. puts "tail_count=#{@tails.length}"
  294. puts "lost_count=#{@lost.length}"
  295. puts "rebaseable_count=#{@rebaseable.length}"
  296. puts "== lost levels =="
  297. @lost_levels.each do |l,a|
  298. puts "level=#{l}:count=#{a.length}"
  299. end
  300. puts "== master =="
  301. travel(@master)
  302. puts "== rebaseable =="
  303. @rebaseable.each do |c|
  304. puts c
  305. end
  306. puts "== tails =="
  307. @tails.each do |c|
  308. puts c
  309. end
  310. puts "== not in master =="
  311. @lost_levels.each do |l,a|
  312. puts "=== level=#{l} ==="
  313. a.each do |c|
  314. puts c
  315. end
  316. end
  317. end
  318.  
  319. def generate_git
  320. def export_commit(c)
  321. puts "try #{c.id}"
  322. commit_dir = "commit-#{c.id}"
  323. system("./get-commit.sh #{c.id}")
  324. base_dir = Dir.pwd
  325. Dir.chdir(commit_dir)
  326. system("git add .")
  327. if c.alt
  328. c = c.alt if c.alt.fork_commits.length == 0
  329. end
  330. puts "generating #{c.id}, #{c.git_author}, #{c.git_message}"
  331. File.open("/tmp/message", "w") { |f| f.write c.git_message }
  332. system("git commit --quiet --author '#{c.git_author}' -F /tmp/message")
  333. Dir.chdir(base_dir)
  334. system("rm -rf #{commit_dir}")
  335. end
  336.  
  337. def travel(c)
  338. export_commit(c)
  339. c.childs.each do |e|
  340. child = @commits[e]
  341. travel(child) if child and child.in_master
  342. end
  343. end
  344.  
  345. git_dir = "#{Dir.pwd}/branches/master/.git"
  346. ENV['GIT_DIR'] = git_dir
  347. #system("mkdir -p #{}")
  348. travel(@master.tail)
  349. end
  350.  
  351. def print_all
  352. @commits.each do |id,c|
  353. puts "#{id}: forks=#{c.fork_commits.length}, in_master=#{c.in_master}, alt=#{c.alt}, forks=#{c.fork_commits}"
  354. end
  355. end
  356.  
  357. def print_authors
  358. puts "== authors =="
  359. @authors.each do |id,c|
  360. puts "author=%s,commit_count=%d" % [id, c]
  361. # puts id
  362. end
  363. end
  364. end
  365.  
  366. @all_commits = {}
  367.  
  368. $db = SQLite3::Database.new("mtn/pidgin.mtn")
  369. rows = $db.execute("select id,name,value from revision_certs")
  370. rows.each do |e|
  371. id, name, value = e
  372. if not @all_commits[id]
  373. commit = Commit.new(id)
  374. @all_commits[id] = commit
  375. else
  376. commit = @all_commits[id]
  377. end
  378. commit[name] = value
  379. end
  380.  
  381. branch = Branch.new("im.pidgin.pidgin")
  382. branch.filter_commits(@all_commits)
  383. branch.analyze()
  384. # branch.print_results()
  385. # branch.print_authors()
  386. branch.generate_git()
Add Comment
Please, Sign In to add comment