Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Native Client Authors. All rights reserved. | 2 # Copyright (c) 2012 The Native Client Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """ | 6 """ |
| 7 This tool is a wrapper around nacl_deps_bump.py that is intended to be | 7 This tool is a wrapper around nacl_deps_bump.py that is intended to be |
| 8 run from a cron job. | 8 run from a cron job. |
| 9 | 9 |
| 10 This tool kicks off try jobs for updating nacl_revision in Chromium's | 10 This tool kicks off try jobs for updating nacl_revision in Chromium's |
| 11 DEPS file. To reduce load on the try servers, it kicks off a new try | 11 DEPS file. To reduce load on the try servers, it kicks off a new try |
| 12 job when a sufficient number of new NaCl revisions have appeared, or a | 12 job when a sufficient number of new NaCl revisions have appeared, or a |
| 13 sufficient time has elapsed, since its last try job. | 13 sufficient time has elapsed, since its last try job. |
| 14 | 14 |
| 15 Like nacl_deps_bump.py, this tool should be run from a Git checkout of | 15 Like nacl_deps_bump.py, this tool should be run from a Git checkout of |
| 16 Chromium. | 16 Chromium. |
| 17 """ | 17 """ |
| 18 | 18 |
| 19 import optparse | 19 import optparse |
| 20 import re | 20 import re |
| 21 import subprocess | 21 import subprocess |
| 22 import time | 22 import time |
| 23 | 23 |
| 24 import pysvn | |
| 25 | |
| 26 import nacl_deps_bump | 24 import nacl_deps_bump |
| 27 | 25 |
| 28 | 26 |
| 29 # When this number of new revisions accumulates, we kick off a new build. | 27 # When this number of new revisions accumulates, we kick off a new build. |
| 30 REVS_THRESHOLD = 10 | 28 REVS_THRESHOLD = 10 |
| 31 | 29 |
| 32 # When the last revision is this old, we kick off a new build. | 30 # When the last revision is this old, we kick off a new build. |
| 33 TIME_THRESHOLD = 60 * 60 * 12 # 12 hours | 31 TIME_THRESHOLD = 60 * 60 * 12 # 12 hours |
| 34 | 32 |
| 35 | 33 |
| 36 # Returns a list of NaCl SVN revision numbers that we have already | 34 # Returns a list of NaCl SVN revision numbers that we have already |
| 37 # kicked off try jobs for. This is based on the branch names in the | 35 # kicked off try jobs for. This is based on the branch names in the |
| 38 # current Git repo. This is imperfect because we might have created a | 36 # current Git repo. This is imperfect because we might have created a |
| 39 # branch before but failed to send a try job for it. We err on the | 37 # branch before but failed to send a try job for it. We err on the |
| 40 # side of not spamming the trybots. | 38 # side of not spamming the trybots. |
| 41 def GetExistingJobs(): | 39 def GetExistingJobs(): |
| 42 proc = subprocess.Popen(['git', 'for-each-ref', | 40 proc = subprocess.Popen(['git', 'for-each-ref', |
| 43 '--format', '%(refname:short)', | 41 '--format', '%(refname:short)', |
| 44 'refs/heads/*'], stdout=subprocess.PIPE) | 42 'refs/heads/*'], stdout=subprocess.PIPE) |
| 45 revs = [] | 43 revs = [] |
| 46 for line in proc.stdout: | 44 for line in proc.stdout: |
| 47 match = re.match('nacl-deps-r(\d+)$', line.strip()) | 45 match = re.match('nacl-deps-(.*)$', line.strip()) |
| 48 if match is not None: | 46 if match is not None: |
| 49 revs.append(int(match.group(1))) | 47 revs.append(match.group(1)) |
| 50 assert proc.wait() == 0, proc.wait() | 48 assert proc.wait() == 0, proc.wait() |
| 51 return revs | 49 return revs |
| 52 | 50 |
| 53 | 51 |
| 54 # Returns the time that the given SVN revision was committed, as a | 52 # Returns the time that the given GIT revision was committed, as a |
|
Mark Seaborn
2015/01/28 16:34:21
"Git"
bradn
2015/01/28 17:37:33
Done.
| |
| 55 # Unix timestamp. | 53 # Unix timestamp. |
| 56 def GetRevTime(svn_root, rev_num): | 54 def GetRevTime(git_dir, rev): |
| 57 rev = pysvn.Revision(pysvn.opt_revision_kind.number, rev_num) | 55 return int(subprocess.check_output( |
| 58 rev_info_list = pysvn.Client().log(svn_root, | 56 ['git', 'log', '--pretty=format:%ct', '-n1', rev], cwd=git_dir)) |
| 59 revision_start=rev, revision_end=rev) | |
| 60 assert len(rev_info_list) == 1, rev_info_list | |
| 61 return rev_info_list[0].date | |
| 62 | 57 |
| 63 | 58 |
| 64 def Main(): | 59 def Main(): |
| 60 nacl_git_dir = nacl_deps_bump.NACL_GIT_ROOT | |
| 61 | |
| 65 parser = optparse.OptionParser('%prog\n\n' + __doc__.strip()) | 62 parser = optparse.OptionParser('%prog\n\n' + __doc__.strip()) |
| 66 options, args = parser.parse_args() | 63 options, args = parser.parse_args() |
| 67 if len(args) != 0: | 64 if len(args) != 0: |
| 68 parser.error('Got unexpected arguments') | 65 parser.error('Got unexpected arguments') |
| 69 | 66 |
| 70 do_build = False | 67 do_build = False |
| 71 | 68 |
| 72 last_tried_rev = max([1] + GetExistingJobs()) | 69 last_tried_time, last_tried_rev = max( |
| 73 print 'Last tried NaCl revision is r%i' % last_tried_rev | 70 [(1, '')] + |
| 74 age = time.time() - GetRevTime(nacl_deps_bump.NACL_SVN_ROOT, last_tried_rev) | 71 [(GetRevTime(nacl_git_dir, i), i) for i in GetExistingJobs()]) |
|
Mark Seaborn
2015/01/28 16:34:21
"i" -> "rev"
bradn
2015/01/28 17:37:33
Done.
| |
| 75 print 'Age of r%i is %.1f hours' % (last_tried_rev, age / (60 * 60)) | 72 print 'Last tried NaCl revision is %s' % last_tried_rev |
| 73 age = time.time() - last_tried_time | |
| 74 print 'Age of %s is %.1f hours' % (last_tried_rev, age / (60 * 60)) | |
| 76 if age > TIME_THRESHOLD: | 75 if age > TIME_THRESHOLD: |
| 77 print 'Time threshold passed: trigger new build' | 76 print 'Time threshold passed: trigger new build' |
| 78 do_build = True | 77 do_build = True |
| 79 else: | 78 else: |
| 80 print 'Time threshold not passed' | 79 print 'Time threshold not passed' |
| 81 | 80 |
| 82 newest_rev = nacl_deps_bump.GetNaClRev() | 81 newest_rev = nacl_deps_bump.GetNaClRev(nacl_git_dir) |
| 83 rev_diff = newest_rev - last_tried_rev | 82 rev_diff = len(nacl_deps_bump.GetLog( |
| 83 nacl_git_dir, last_tried_rev, newest_rev)) - 1 | |
|
Mark Seaborn
2015/01/28 16:34:21
I don't think the "- 1" is right. Remove that?
bradn
2015/01/28 17:37:33
Ah, you're correct, didn't actually check the beha
| |
| 84 print 'There have been %i NaCl revisions since our last try job' % rev_diff | 84 print 'There have been %i NaCl revisions since our last try job' % rev_diff |
| 85 # Note that this comparison ignores that the commits might be to | 85 # Note that this comparison ignores that the commits might be to |
| 86 # branches rather the trunk. | 86 # branches rather the trunk. |
| 87 if rev_diff > REVS_THRESHOLD: | 87 if rev_diff > REVS_THRESHOLD: |
| 88 print 'Revision count threshold passed: trigger new build' | 88 print 'Revision count threshold passed: trigger new build' |
| 89 do_build = True | 89 do_build = True |
| 90 else: | 90 else: |
| 91 print 'Revision count threshold not passed' | 91 print 'Revision count threshold not passed' |
| 92 | 92 |
| 93 if do_build: | 93 if do_build: |
| 94 print 'Running nacl_deps_bump' | 94 print 'Running nacl_deps_bump' |
| 95 nacl_deps_bump.Main(['--revision', str(newest_rev)]) | 95 nacl_deps_bump.Main(['--revision', str(newest_rev)]) |
| 96 else: | 96 else: |
| 97 print 'Not running nacl_deps_bump' | 97 print 'Not running nacl_deps_bump' |
| 98 | 98 |
| 99 | 99 |
| 100 if __name__ == '__main__': | 100 if __name__ == '__main__': |
| 101 Main() | 101 Main() |
| OLD | NEW |