Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(729)

Side by Side Diff: git_cl.py

Issue 7253015: Remove manual --tbr support and convert it into automatic TBR= detection. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: removed tests/tbr.sh Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 The Chromium 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 # Copyright (C) 2008 Evan Martin <martine@danga.com> 6 # Copyright (C) 2008 Evan Martin <martine@danga.com>
7 7
8 """A git-command for integrating reviews on Rietveld.""" 8 """A git-command for integrating reviews on Rietveld."""
9 9
10 import errno 10 import errno
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 """Set this branch's issue. If issue=0, clears the issue.""" 503 """Set this branch's issue. If issue=0, clears the issue."""
504 if issue: 504 if issue:
505 RunGit(['config', self._IssueSetting(), str(issue)]) 505 RunGit(['config', self._IssueSetting(), str(issue)])
506 if self.rietveld_server: 506 if self.rietveld_server:
507 RunGit(['config', self._RietveldServer(), self.rietveld_server]) 507 RunGit(['config', self._RietveldServer(), self.rietveld_server])
508 else: 508 else:
509 RunGit(['config', '--unset', self._IssueSetting()]) 509 RunGit(['config', '--unset', self._IssueSetting()])
510 self.SetPatchset(0) 510 self.SetPatchset(0)
511 self.has_issue = False 511 self.has_issue = False
512 512
513 def RunHook(self, committing, upstream_branch, tbr, may_prompt, verbose, 513 def RunHook(self, committing, upstream_branch, may_prompt, verbose, author):
514 author):
515 """Calls sys.exit() if the hook fails; returns a HookResults otherwise.""" 514 """Calls sys.exit() if the hook fails; returns a HookResults otherwise."""
516 root = RunCommand(['git', 'rev-parse', '--show-cdup']).strip() or '.' 515 root = RunCommand(['git', 'rev-parse', '--show-cdup']).strip() or '.'
517 absroot = os.path.abspath(root) 516 absroot = os.path.abspath(root)
518 517
519 # We use the sha1 of HEAD as a name of this change. 518 # We use the sha1 of HEAD as a name of this change.
520 name = RunCommand(['git', 'rev-parse', 'HEAD']).strip() 519 name = RunCommand(['git', 'rev-parse', 'HEAD']).strip()
521 # Need to pass a relative path for msysgit. 520 # Need to pass a relative path for msysgit.
522 files = scm.GIT.CaptureStatus([root], upstream_branch) 521 files = scm.GIT.CaptureStatus([root], upstream_branch)
523 522
524 issue = ConvertToInteger(self.GetIssue()) 523 issue = ConvertToInteger(self.GetIssue())
(...skipping 20 matching lines...) Expand all
545 544
546 # Apply watchlists on upload. 545 # Apply watchlists on upload.
547 if not committing: 546 if not committing:
548 watchlist = watchlists.Watchlists(change.RepositoryRoot()) 547 watchlist = watchlists.Watchlists(change.RepositoryRoot())
549 files = [f.LocalPath() for f in change.AffectedFiles()] 548 files = [f.LocalPath() for f in change.AffectedFiles()]
550 self.SetWatchers(watchlist.GetWatchersForPaths(files)) 549 self.SetWatchers(watchlist.GetWatchersForPaths(files))
551 550
552 try: 551 try:
553 output = presubmit_support.DoPresubmitChecks(change, committing, 552 output = presubmit_support.DoPresubmitChecks(change, committing,
554 verbose=verbose, output_stream=sys.stdout, input_stream=sys.stdin, 553 verbose=verbose, output_stream=sys.stdout, input_stream=sys.stdin,
555 default_presubmit=None, may_prompt=may_prompt, tbr=tbr, 554 default_presubmit=None, may_prompt=may_prompt,
556 rietveld_obj=self.RpcServer()) 555 rietveld_obj=self.RpcServer())
557 except presubmit_support.PresubmitFailure, e: 556 except presubmit_support.PresubmitFailure, e:
558 DieWithError( 557 DieWithError(
559 ('%s\nMaybe your depot_tools is out of date?\n' 558 ('%s\nMaybe your depot_tools is out of date?\n'
560 'If all fails, contact maruel@') % e) 559 'If all fails, contact maruel@') % e)
561 560
562 # TODO(dpranke): We should propagate the error out instead of calling 561 # TODO(dpranke): We should propagate the error out instead of calling
563 # exit(). 562 # exit().
564 if not output.should_continue(): 563 if not output.should_continue():
565 sys.exit(1) 564 sys.exit(1)
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 return 1 889 return 1
891 890
892 cl = Changelist() 891 cl = Changelist()
893 if args: 892 if args:
894 base_branch = args[0] 893 base_branch = args[0]
895 else: 894 else:
896 # Default to diffing against the "upstream" branch. 895 # Default to diffing against the "upstream" branch.
897 base_branch = cl.GetUpstreamBranch() 896 base_branch = cl.GetUpstreamBranch()
898 897
899 cl.RunHook(committing=not options.upload, upstream_branch=base_branch, 898 cl.RunHook(committing=not options.upload, upstream_branch=base_branch,
900 tbr=False, may_prompt=False, verbose=options.verbose, 899 may_prompt=False, verbose=options.verbose,
901 author=None) 900 author=None)
902 return 0 901 return 0
903 902
904 903
905 @usage('[args to "git diff"]') 904 @usage('[args to "git diff"]')
906 def CMDupload(parser, args): 905 def CMDupload(parser, args):
907 """upload the current changelist to codereview""" 906 """upload the current changelist to codereview"""
908 parser.add_option('--bypass-hooks', action='store_true', dest='bypass_hooks', 907 parser.add_option('--bypass-hooks', action='store_true', dest='bypass_hooks',
909 help='bypass upload presubmit hook') 908 help='bypass upload presubmit hook')
910 parser.add_option('-f', action='store_true', dest='force', 909 parser.add_option('-f', action='store_true', dest='force',
(...skipping 25 matching lines...) Expand all
936 cl = Changelist() 935 cl = Changelist()
937 if args: 936 if args:
938 base_branch = args[0] 937 base_branch = args[0]
939 else: 938 else:
940 # Default to diffing against the "upstream" branch. 939 # Default to diffing against the "upstream" branch.
941 base_branch = cl.GetUpstreamBranch() 940 base_branch = cl.GetUpstreamBranch()
942 args = [base_branch + "..."] 941 args = [base_branch + "..."]
943 942
944 if not options.bypass_hooks and not options.force: 943 if not options.bypass_hooks and not options.force:
945 hook_results = cl.RunHook(committing=False, upstream_branch=base_branch, 944 hook_results = cl.RunHook(committing=False, upstream_branch=base_branch,
946 tbr=False, may_prompt=True, 945 may_prompt=True,
947 verbose=options.verbose, 946 verbose=options.verbose,
948 author=None) 947 author=None)
949 if not options.reviewers and hook_results.reviewers: 948 if not options.reviewers and hook_results.reviewers:
950 options.reviewers = hook_results.reviewers 949 options.reviewers = hook_results.reviewers
951 950
952 951
953 # --no-ext-diff is broken in some versions of Git, so try to work around 952 # --no-ext-diff is broken in some versions of Git, so try to work around
954 # this by overriding the environment (but there is still a problem if the 953 # this by overriding the environment (but there is still a problem if the
955 # git config key "diff.external" is used). 954 # git config key "diff.external" is used).
956 env = os.environ.copy() 955 env = os.environ.copy()
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1051 parser.add_option('--bypass-hooks', action='store_true', dest='bypass_hooks', 1050 parser.add_option('--bypass-hooks', action='store_true', dest='bypass_hooks',
1052 help='bypass upload presubmit hook') 1051 help='bypass upload presubmit hook')
1053 parser.add_option('-m', dest='message', 1052 parser.add_option('-m', dest='message',
1054 help="override review description") 1053 help="override review description")
1055 parser.add_option('-f', action='store_true', dest='force', 1054 parser.add_option('-f', action='store_true', dest='force',
1056 help="force yes to questions (don't prompt)") 1055 help="force yes to questions (don't prompt)")
1057 parser.add_option('-c', dest='contributor', 1056 parser.add_option('-c', dest='contributor',
1058 help="external contributor for patch (appended to " + 1057 help="external contributor for patch (appended to " +
1059 "description and used as author for git). Should be " + 1058 "description and used as author for git). Should be " +
1060 "formatted as 'First Last <email@example.com>'") 1059 "formatted as 'First Last <email@example.com>'")
1061 parser.add_option('--tbr', action='store_true', dest='tbr',
1062 help="short for 'to be reviewed', commit branch " +
1063 "even without uploading for review")
1064 (options, args) = parser.parse_args(args) 1060 (options, args) = parser.parse_args(args)
1065 cl = Changelist() 1061 cl = Changelist()
1066 1062
1067 if not args or cmd == 'push': 1063 if not args or cmd == 'push':
1068 # Default to merging against our best guess of the upstream branch. 1064 # Default to merging against our best guess of the upstream branch.
1069 args = [cl.GetUpstreamBranch()] 1065 args = [cl.GetUpstreamBranch()]
1070 1066
1071 base_branch = args[0] 1067 base_branch = args[0]
1072 1068
1073 # Make sure index is up-to-date before running diff-index. 1069 # Make sure index is up-to-date before running diff-index.
(...skipping 19 matching lines...) Expand all
1093 extra_commits = RunGit(['rev-list', '^' + svn_head, base_branch]) 1089 extra_commits = RunGit(['rev-list', '^' + svn_head, base_branch])
1094 if extra_commits: 1090 if extra_commits:
1095 print ('This branch has %d additional commits not upstreamed yet.' 1091 print ('This branch has %d additional commits not upstreamed yet.'
1096 % len(extra_commits.splitlines())) 1092 % len(extra_commits.splitlines()))
1097 print ('Upstream "%s" or rebase this branch on top of the upstream trunk ' 1093 print ('Upstream "%s" or rebase this branch on top of the upstream trunk '
1098 'before attempting to %s.' % (base_branch, cmd)) 1094 'before attempting to %s.' % (base_branch, cmd))
1099 return 1 1095 return 1
1100 1096
1101 if not options.bypass_hooks and not options.force: 1097 if not options.bypass_hooks and not options.force:
1102 cl.RunHook(committing=True, upstream_branch=base_branch, 1098 cl.RunHook(committing=True, upstream_branch=base_branch,
1103 tbr=options.tbr, may_prompt=True, verbose=options.verbose, 1099 may_prompt=True, verbose=options.verbose,
1104 author=options.contributor) 1100 author=options.contributor)
1105 1101
1106 if cmd == 'dcommit': 1102 if cmd == 'dcommit':
1107 # Check the tree status if the tree status URL is set. 1103 # Check the tree status if the tree status URL is set.
1108 status = GetTreeStatus() 1104 status = GetTreeStatus()
1109 if 'closed' == status: 1105 if 'closed' == status:
1110 print ('The tree is closed. Please wait for it to reopen. Use ' 1106 print ('The tree is closed. Please wait for it to reopen. Use '
1111 '"git cl dcommit -f" to commit on a closed tree.') 1107 '"git cl dcommit -f" to commit on a closed tree.')
1112 return 1 1108 return 1
1113 elif 'unknown' == status: 1109 elif 'unknown' == status:
1114 print ('Unable to determine tree status. Please verify manually and ' 1110 print ('Unable to determine tree status. Please verify manually and '
1115 'use "git cl dcommit -f" to commit on a closed tree.') 1111 'use "git cl dcommit -f" to commit on a closed tree.')
1116 1112
1117 description = options.message 1113 description = options.message
1118 if not options.tbr: 1114 if not description and cl.GetIssue():
1119 # It is important to have these checks early. Not only for user 1115 description = cl.GetDescription()
1120 # convenience, but also because the cl object then caches the correct values
1121 # of these fields even as we're juggling branches for setting up the commit.
1122 if not cl.GetIssue():
1123 print 'Current issue unknown -- has this branch been uploaded?'
1124 print 'Use --tbr to commit without review.'
1125 return 1
1126 1116
1127 if not description: 1117 if not description:
1128 description = cl.GetDescription() 1118 print 'No description set.'
1119 print 'Visit %s/edit to set it.' % (cl.GetIssueURL())
1120 return 1
1129 1121
1130 if not description: 1122 if cl.GetIssue():
1131 print 'No description set.'
1132 print 'Visit %s/edit to set it.' % (cl.GetIssueURL())
1133 return 1
1134
1135 description += "\n\nReview URL: %s" % cl.GetIssueURL() 1123 description += "\n\nReview URL: %s" % cl.GetIssueURL()
1136 else:
1137 if not description:
1138 # Submitting TBR. See if there's already a description in Rietveld, else
1139 # create a template description. Eitherway, give the user a chance to edit
1140 # it to fill in the TBR= field.
1141 if cl.GetIssue():
1142 description = cl.GetDescription()
1143
1144 # TODO(dpranke): Update to use ChangeDescription object.
1145 if not description:
1146 description = """# Enter a description of the change.
1147 # This will be used as the change log for the commit.
1148
1149 """
1150 description += CreateDescriptionFromLog(args)
1151
1152 description = UserEditedLog(description + '\nTBR=')
1153
1154 if not description:
1155 print "Description empty; aborting."
1156 return 1
1157 1124
1158 if options.contributor: 1125 if options.contributor:
1159 if not re.match('^.*\s<\S+@\S+>$', options.contributor): 1126 if not re.match('^.*\s<\S+@\S+>$', options.contributor):
1160 print "Please provide contibutor as 'First Last <email@example.com>'" 1127 print "Please provide contibutor as 'First Last <email@example.com>'"
1161 return 1 1128 return 1
1162 description += "\nPatch from %s." % options.contributor 1129 description += "\nPatch from %s." % options.contributor
1163 print 'Description:', repr(description) 1130 print 'Description:', repr(description)
1164 1131
1165 branches = [base_branch, cl.GetBranchRef()] 1132 branches = [base_branch, cl.GetBranchRef()]
1166 if not options.force: 1133 if not options.force:
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
1479 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e))) 1446 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e)))
1480 1447
1481 # Not a known command. Default to help. 1448 # Not a known command. Default to help.
1482 GenUsage(parser, 'help') 1449 GenUsage(parser, 'help')
1483 return CMDhelp(parser, argv) 1450 return CMDhelp(parser, argv)
1484 1451
1485 1452
1486 if __name__ == '__main__': 1453 if __name__ == '__main__':
1487 fix_encoding.fix_encoding() 1454 fix_encoding.fix_encoding()
1488 sys.exit(main(sys.argv[1:])) 1455 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « gcl.py ('k') | presubmit_canned_checks.py » ('j') | presubmit_canned_checks.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698