Advertisement
Guest User

Untitled

a guest
Sep 19th, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.72 KB | None | 0 0
  1. require 'octokit'
  2. require 'csv'
  3. require 'hashie'
  4. require 'active_support/all'
  5.  
  6. class PR < Hashie::Dash
  7. property :pr
  8. property :created_at
  9. property :comment_count
  10. property :commit_count
  11. property :collaborative
  12. property :merged
  13.  
  14. def merged?
  15. merged == "1"
  16. end
  17.  
  18. def collaborative?
  19. collaborative == "1"
  20. end
  21. end
  22.  
  23. repos = [ { :name => 'spine/spine', :alias => 'spine' },
  24. { :name => 'octokit/octokit.rb', :alias => 'octokit' },
  25. { :name => 'github/linguist', :alias => 'linguist'}]
  26.  
  27. Octokit.auto_paginate = true
  28.  
  29. client = Octokit::Client.new(access_token: "xxxxxxxxxxxxxxx")
  30.  
  31. repos.each do |repo|
  32. closed = client.pulls(repo[:name], 'closed')
  33.  
  34. pull_requests = []
  35.  
  36. closed.each do |pr|
  37. pull_requests << { :number => pr.number, :created_at => pr.created_at }
  38. end
  39.  
  40. open = client.pulls(repo[:name], 'open')
  41.  
  42. open.each do |pr|
  43. pull_requests << { :number => pr.number, :created_at => pr.created_at }
  44. end
  45.  
  46. puts "Working with #{pull_requests.count} pull requests"
  47.  
  48. results = File.new("#{repo[:alias]}_raw_prs.csv", 'w')
  49. results.puts "pr,created_at,comment_count,commit_count,collaborative,merged"
  50.  
  51. pull_requests.each do |pr|
  52. pull_request = client.pull_request(repo, pr[:number])
  53. pull_request_commits = client.pull_request_commits(repo, pr[:number])
  54.  
  55. collaborative = 0
  56. merged = 0
  57.  
  58. # Skip if the PR has zero commits
  59. next unless pull_request_commits.any?
  60.  
  61. # Were more commits added to the PR over time
  62. if pull_request_commits.last.commit.committer.date > pull_request.created_at
  63. collaborative = 1
  64. end
  65.  
  66. if pull_request.merged
  67. merged = 1
  68. end
  69.  
  70. result = "#{pr[:number]},#{pr[:created_at]},#{pull_request.comments},#{pull_request.commits},#{collaborative},#{merged}"
  71. puts result
  72. results.puts result
  73. end
  74.  
  75. results.close
  76.  
  77. prs = []
  78.  
  79. CSV.foreach("#{repo[:alias]}_raw_prs.csv", :headers => true) do |row|
  80. prs << PR.new(row.to_hash)
  81. end
  82.  
  83. prs_grouped_by_month = prs.group_by { |m| m.created_at.to_date.beginning_of_month }
  84.  
  85. # Now we want the merge fraction over time for pull requests. This means looping
  86. # through PRs grouped by week and calculating the fraction that are closed.
  87.  
  88. merged_fraction_results = File.new("#{repo[:alias]}_merged_fraction.tsv", 'w')
  89.  
  90. merged_fraction_results.puts("date\tunix_date\tmerged_count\tnot_merged_count\tcount\tmerge_fraction")
  91.  
  92. total_prs = prs.count
  93. total_merged = 0
  94.  
  95. prs_grouped_by_month.sort.each do |month, prs|
  96.  
  97. merged_count = 0
  98. prs.each do |pr|
  99. merged_count += 1 if pr.merged?
  100. total_merged += 1 if pr.merged?
  101. end
  102.  
  103. f_merged = merged_count.to_f / prs.size.to_f
  104.  
  105. merged_fraction_results.puts("#{month.to_s}\t#{month.to_datetime.to_i*1000}\t#{merged_count}\t#{prs.size-merged_count}\t#{prs.size}\t#{f_merged}")
  106. end
  107.  
  108. # Overall stats (for debug)
  109. puts "#{repo[:alias]} is #{(total_merged.to_f / total_prs) * 100}% merged"
  110.  
  111. merged_fraction_results.close
  112.  
  113. collaborative_fraction_results = File.new("#{repo[:alias]}_collaborative_fraction.tsv", 'w')
  114.  
  115. collaborative_fraction_results.puts("date\tunix_date\tcollab_count\tnot_collab_count\tcount\tcollab_fraction")
  116.  
  117. total_collab = 0
  118.  
  119. prs_grouped_by_month.sort.each do |month, prs|
  120.  
  121. collab_count = 0
  122. prs.each do |pr|
  123. collab_count += 1 if pr.collaborative?
  124. total_collab += 1 if pr.collaborative?
  125. end
  126.  
  127. f_colab = collab_count.to_f / prs.size.to_f
  128.  
  129. collaborative_fraction_results.puts("#{month.to_s}\t#{month.to_datetime.to_i*1000}\t#{collab_count}\t#{prs.size-collab_count}\t#{prs.size}\t#{f_colab}")
  130. end
  131.  
  132. # Overall stats (for debug)
  133. puts "#{repo[:alias]} is #{(total_collab.to_f / total_prs) * 100}% collaborative"
  134.  
  135. collaborative_fraction_results.close
  136. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement