Index: apply_issue.py
|
diff --git a/apply_issue.py b/apply_issue.py
|
index 41e133baa083b58e197da1dff879acee7133fee3..ba389878fbacb717296276fcbc534713401ecae4 100755
|
--- a/apply_issue.py
|
+++ b/apply_issue.py
|
@@ -166,52 +166,86 @@ def main():
|
options.patchset = properties['patchsets'][-1]
|
print('No patchset specified. Using patchset %d' % options.patchset)
|
|
- print('Downloading the patch.')
|
- try:
|
- patchset = obj.get_patch(options.issue, options.patchset)
|
- except urllib2.HTTPError as e:
|
- print(
|
- 'Failed to fetch the patch for issue %d, patchset %d.\n'
|
- 'Try visiting %s/%d') % (
|
- options.issue, options.patchset,
|
- options.server, options.issue)
|
- return 1
|
- if options.whitelist:
|
- patchset.patches = [patch for patch in patchset.patches
|
- if patch.filename in options.whitelist]
|
- if options.blacklist:
|
- patchset.patches = [patch for patch in patchset.patches
|
- if patch.filename not in options.blacklist]
|
- for patch in patchset.patches:
|
- print(patch)
|
- full_dir = os.path.abspath(options.root_dir)
|
- scm_type = scm.determine_scm(full_dir)
|
- if scm_type == 'svn':
|
- scm_obj = checkout.SvnCheckout(full_dir, None, None, None, None)
|
- elif scm_type == 'git':
|
- scm_obj = checkout.GitCheckout(full_dir, None, None, None, None)
|
- elif scm_type == None:
|
- scm_obj = checkout.RawCheckout(full_dir, None, None)
|
- else:
|
- parser.error('Couldn\'t determine the scm')
|
-
|
- # TODO(maruel): HACK, remove me.
|
- # When run a build slave, make sure buildbot knows that the checkout was
|
- # modified.
|
- if options.root_dir == 'src' and getpass.getuser() == 'chrome-bot':
|
- # See sourcedirIsPatched() in:
|
- # http://src.chromium.org/viewvc/chrome/trunk/tools/build/scripts/slave/
|
- # chromium_commands.py?view=markup
|
- open('.buildbot-patched', 'w').close()
|
-
|
- print('\nApplying the patch.')
|
- try:
|
- scm_obj.apply_patch(patchset, verbose=True)
|
- except checkout.PatchApplicationFailed as e:
|
- print(str(e))
|
- print('CWD=%s' % os.getcwd())
|
- print('Checkout path=%s' % scm_obj.project_path)
|
- return 1
|
+ issues_patchsets_to_apply = [(options.issue, options.patchset)]
|
+ depends_on_info = obj.get_depends_on_patchset(options.issue, options.patchset)
|
+ while depends_on_info:
|
+ depends_on_issue = int(depends_on_info['issue'])
|
+ depends_on_patchset = int(depends_on_info['patchset'])
|
+ try:
|
+ depends_on_info = obj.get_depends_on_patchset(depends_on_issue,
|
+ depends_on_patchset)
|
+ issues_patchsets_to_apply.insert(0, (depends_on_issue,
|
+ depends_on_patchset))
|
+ except urllib2.HTTPError:
|
+ print ('The patchset that was marked as a dependency no longer '
|
+ 'exists: %s/%d/#ps%d' % (
|
+ options.server, depends_on_issue, depends_on_patchset))
|
+ print 'Therefore it is likely that this patch will not apply cleanly.'
|
+ print
|
+ depends_on_info = None
|
+
|
+ num_issues_patchsets_to_apply = len(issues_patchsets_to_apply)
|
+ if num_issues_patchsets_to_apply > 1:
|
+ print
|
+ print 'apply_issue.py found %d dependent CLs.' % (
|
+ num_issues_patchsets_to_apply - 1)
|
+ print 'They will be applied in the following order:'
|
+ num = 1
|
+ for issue_to_apply, patchset_to_apply in issues_patchsets_to_apply:
|
+ print ' #%d %s/%d/#ps%d' % (
|
+ num, options.server, issue_to_apply, patchset_to_apply)
|
+ num += 1
|
+ print
|
+
|
+ for issue_to_apply, patchset_to_apply in issues_patchsets_to_apply:
|
+ issue_url = '%s/%d/#ps%d' % (options.server, issue_to_apply,
|
+ patchset_to_apply)
|
+ print('Downloading patch from %s' % issue_url)
|
+ try:
|
+ patchset = obj.get_patch(issue_to_apply, patchset_to_apply)
|
+ except urllib2.HTTPError as e:
|
+ print(
|
+ 'Failed to fetch the patch for issue %d, patchset %d.\n'
|
+ 'Try visiting %s/%d') % (
|
+ issue_to_apply, patchset_to_apply,
|
+ options.server, issue_to_apply)
|
+ return 1
|
+ if options.whitelist:
|
+ patchset.patches = [patch for patch in patchset.patches
|
+ if patch.filename in options.whitelist]
|
+ if options.blacklist:
|
+ patchset.patches = [patch for patch in patchset.patches
|
+ if patch.filename not in options.blacklist]
|
+ for patch in patchset.patches:
|
+ print(patch)
|
+ full_dir = os.path.abspath(options.root_dir)
|
+ scm_type = scm.determine_scm(full_dir)
|
+ if scm_type == 'svn':
|
+ scm_obj = checkout.SvnCheckout(full_dir, None, None, None, None)
|
+ elif scm_type == 'git':
|
+ scm_obj = checkout.GitCheckout(full_dir, None, None, None, None)
|
+ elif scm_type == None:
|
+ scm_obj = checkout.RawCheckout(full_dir, None, None)
|
+ else:
|
+ parser.error('Couldn\'t determine the scm')
|
+
|
+ # TODO(maruel): HACK, remove me.
|
+ # When run a build slave, make sure buildbot knows that the checkout was
|
+ # modified.
|
+ if options.root_dir == 'src' and getpass.getuser() == 'chrome-bot':
|
+ # See sourcedirIsPatched() in:
|
+ # http://src.chromium.org/viewvc/chrome/trunk/tools/build/scripts/slave/
|
+ # chromium_commands.py?view=markup
|
+ open('.buildbot-patched', 'w').close()
|
+
|
+ print('\nApplying the patch from %s' % issue_url)
|
+ try:
|
+ scm_obj.apply_patch(patchset, verbose=True)
|
+ except checkout.PatchApplicationFailed as e:
|
+ print(str(e))
|
+ print('CWD=%s' % os.getcwd())
|
+ print('Checkout path=%s' % scm_obj.project_path)
|
+ return 1
|
|
if ('DEPS' in map(os.path.basename, patchset.filenames)
|
and not options.ignore_deps):
|
|