Advertisement
Guest User

Count chromium 3way mergeable CLs

a guest
Sep 19th, 2014
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.83 KB | None | 0 0
  1. #!/usr/bin/env python
  2. import json
  3. import urllib2
  4. import sys
  5. import re
  6. from multiprocessing.pool import ThreadPool
  7.  
  8.  
  9. CR = 'https://codereview.chromium.org'
  10.  
  11. def GetDiffNoContext(cl, ps):
  12.   url = '%s/download/issue%s_%s.diff' % (CR, cl, ps)
  13.   diff = urllib2.urlopen(url).read()
  14.   difflines = re.findall(r'^([+-].*)$', diff, re.MULTILINE)
  15.   return difflines
  16.  
  17.  
  18. def CheckCRIs3WayMergeable(line):
  19.   line = line.rstrip('\n')
  20.   cl = line.split('/')[-1]
  21.   cl_data = json.load(urllib2.urlopen('%s/api/%s' % (CR, cl)))
  22.   if len(cl_data['patchsets']) < 2:
  23.     return
  24.   ps = cl_data['patchsets'][-1]
  25.   ps_2 = cl_data['patchsets'][-2]
  26.   try:
  27.     diff = GetDiffNoContext(cl, ps)
  28.     diff_2 = GetDiffNoContext(cl, ps_2)
  29.   except urllib2.HTTPError:
  30.     return
  31.   # if diff != diff_2:
  32.   #   print '\n'.join(set(diff).symmetric_difference(set(diff_2)))
  33.   if diff == diff_2:
  34.     return '3way mergeable'
  35.  
  36.  
  37. def CheckSafe(line):
  38.   try:
  39.     return CheckCRIs3WayMergeable(line)
  40.   except Exception as e:
  41.     print '\nError %s' % e
  42.  
  43.  
  44. def ExtractCRFromStdin():
  45.   match_re = r'.*%s/(\d+)$' % CR
  46.   while True:
  47.     line = sys.stdin.readline()
  48.     if not line:
  49.       break
  50.     m = re.match(match_re, line)
  51.     if m:
  52.       yield m.group(1)
  53.  
  54.  
  55.  
  56. if __name__ == "__main__":
  57.   print 'Usage: git log | %s\n\n' % sys.argv[0]
  58.   print 'Counting (press CTRL+C to stop)'
  59.   pool = ThreadPool(250)
  60.   count = 0
  61.   stats = {}
  62.   try:
  63.     for x in pool.imap_unordered(CheckSafe, ExtractCRFromStdin()):
  64.       count += 1
  65.       stats.setdefault(x, 0)
  66.       stats[x] += 1
  67.       stats_str = ''
  68.       for k, v in sorted(stats.items()):
  69.         fmt = '%s: %d (%.2f %%)  ' % (k, v, v * 100.0 / count)
  70.         stats_str += '%-25s' % fmt
  71.       print '\r[%d] %s' % (count, stats_str),
  72.       sys.stdout.flush()
  73.   except KeyboardInterrupt as e:
  74.     pass
  75.   print '\n\n'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement