Chromium Code Reviews| Index: git_cl.py |
| diff --git a/git_cl.py b/git_cl.py |
| index 9d7ba02b1b90ee8b2f456b5f7ef0cbe1be824f32..4fd1a2d6a0f5ab1f840a8d915c45d169f42fe314 100755 |
| --- a/git_cl.py |
| +++ b/git_cl.py |
| @@ -1313,6 +1313,87 @@ class Changelist(object): |
| return self._codereview_impl.CMDPatchWithParsedIssue( |
| parsed_issue_arg, reject, nocommit, directory) |
| + def CMDUpload(self, options, git_diff_args, orig_args): |
| + """Uploads a change to codereview.""" |
| + if git_diff_args: |
| + # TODO(ukai): is it ok for gerrit case? |
| + base_branch = git_diff_args[0] |
| + else: |
| + if self.GetBranch() is None: |
| + DieWithError('Can\'t upload from detached HEAD state. Get on a branch!') |
| + |
| + # Default to diffing against common ancestor of upstream branch |
| + base_branch = self.GetCommonAncestorWithUpstream() |
| + git_diff_args = [base_branch, 'HEAD'] |
| + |
| + # Make sure authenticated to codereview before running potentially expensive |
| + # hooks. It is a fast, best efforts check. Codereview still can reject the |
| + # authentication during the actual upload. |
| + self._codereview_impl.EnsureAuthenticated() |
| + |
| + # Apply watchlists on upload. |
| + change = self.GetChange(base_branch, None) |
| + watchlist = watchlists.Watchlists(change.RepositoryRoot()) |
| + files = [f.LocalPath() for f in change.AffectedFiles()] |
| + if not options.bypass_watchlists: |
| + self.SetWatchers(watchlist.GetWatchersForPaths(files)) |
| + |
| + if not options.bypass_hooks: |
| + if options.reviewers or options.tbr_owners: |
| + # Set the reviewer list now so that presubmit checks can access it. |
| + change_description = ChangeDescription(change.FullDescriptionText()) |
| + change_description.update_reviewers(options.reviewers, |
| + options.tbr_owners, |
| + change) |
| + change.SetDescriptionText(change_description.description) |
| + hook_results = self.RunHook(committing=False, |
| + may_prompt=not options.force, |
| + verbose=options.verbose, |
| + change=change) |
| + if not hook_results.should_continue(): |
| + return 1 |
| + if not options.reviewers and hook_results.reviewers: |
| + options.reviewers = hook_results.reviewers.split(',') |
| + |
| + if self.GetIssue(): |
| + latest_patchset = self.GetMostRecentPatchset() |
| + local_patchset = self.GetPatchset() |
| + if (latest_patchset and local_patchset and |
| + local_patchset != latest_patchset): |
| + print ('The last upload made from this repository was patchset #%d but ' |
| + 'the most recent patchset on the server is #%d.' |
| + % (local_patchset, latest_patchset)) |
| + print ('Uploading will still work, but if you\'ve uploaded to this ' |
| + 'issue from another machine or branch the patch you\'re ' |
| + 'uploading now might not include those changes.') |
| + ask_for_data('About to upload; enter to confirm.') |
| + |
| + print_stats(options.similarity, options.find_copies, git_diff_args) |
| + ret = self.CMDUploadChange(options, git_diff_args, change) |
| + if not ret: |
| + git_set_branch_value('last-upload-hash', |
| + RunGit(['rev-parse', 'HEAD']).strip()) |
| + # Run post upload hooks, if specified. |
| + if settings.GetRunPostUploadHook(): |
| + presubmit_support.DoPostUploadExecuter( |
| + change, |
| + self, |
| + settings.GetRoot(), |
| + options.verbose, |
| + sys.stdout) |
| + |
| + # Upload all dependencies if specified. |
| + if options.dependencies: |
| + print '--dependencies has been specified.' |
| + print 'All dependent local branches will be re-uploaded.' |
| + # Remove the dependencies flag from args so that we do not end up in a |
| + # loop. |
| + orig_args.remove('--dependencies') |
| + ret = upload_branch_deps(self, orig_args) |
| + return ret |
| + |
| # Forward methods to codereview specific implementation. |
| def CloseIssue(self): |
| @@ -1426,6 +1507,10 @@ class _ChangelistCodereviewBase(object): |
| failed.""" |
| raise NotImplementedError() |
| + def EnsureAuthenticated(self): |
| + """Best effort check that user is authenticated with coreview server.""" |
|
Michael Achenbach
2016/04/12 08:33:49
nit: codereview
tandrii(chromium)
2016/04/12 14:13:31
Done.
|
| + raise NotImplementedError() |
| + |
| def CMDUploadChange(self, options, args, change): |
| """Uploads a change to codereview.""" |
| raise NotImplementedError() |
| @@ -1455,6 +1540,14 @@ class _RietveldChangelistImpl(_ChangelistCodereviewBase): |
| self._rietveld_server = settings.GetDefaultServerUrl() |
| return self._rietveld_server |
| + def EnsureAuthenticated(self): |
| + """Best effort check that user is authenticated with Rietveld server.""" |
| + if self._auth_config.use_oauth2: |
| + authenticator = auth.get_authenticator_for_host( |
| + self.GetCodereviewServer(), self._auth_config) |
| + if not authenticator.has_cached_credentials(): |
| + raise auth.LoginRequiredError(self.GetCodereviewServer()) |
| + |
| def FetchDescription(self): |
| issue = self.GetIssue() |
| assert issue |
| @@ -1797,7 +1890,7 @@ class _RietveldChangelistImpl(_ChangelistCodereviewBase): |
| upload_args.extend( |
| ['--depends_on_patchset', '%s:%s' % ( |
| branch_cl_issue, branch_cl_patchset)]) |
| - print ( |
| + print( |
| '\n' |
| 'The current branch (%s) is tracking a local branch (%s) with ' |
| 'an associated CL.\n' |
| @@ -1878,6 +1971,10 @@ class _GerritChangelistImpl(_ChangelistCodereviewBase): |
| def IssueSettingPrefix(cls): |
| return 'gerritissue' |
| + def EnsureAuthenticated(self): |
| + """Best effort check that user is authenticated with Gerrit server.""" |
| + #TODO(tandrii): implement per bug http://crbug.com/583153. |
| + |
| def PatchsetSetting(self): |
| """Return the git setting that stores this change's most recent patchset.""" |
| return 'branch.%s.gerritpatchset' % self.GetBranch() |
| @@ -2079,6 +2176,10 @@ class _GerritChangelistImpl(_ChangelistCodereviewBase): |
| def CMDUploadChange(self, options, args, change): |
| """Upload the current branch to Gerrit.""" |
| + if options.squash and options.no_squash: |
| + DieWithError('Can only use one of --squash or --no-squash') |
| + options.squash = ((settings.GetSquashGerritUploads() or options.squash) and |
| + not options.no_squash) |
| # We assume the remote called "origin" is the one we want. |
| # It is probably not worthwhile to support different workflows. |
| gerrit_remote = 'origin' |
| @@ -3290,94 +3391,7 @@ def CMDupload(parser, args): |
| settings.GetIsGerrit() |
| cl = Changelist(auth_config=auth_config) |
| - if args: |
| - # TODO(ukai): is it ok for gerrit case? |
| - base_branch = args[0] |
| - else: |
| - if cl.GetBranch() is None: |
| - DieWithError('Can\'t upload from detached HEAD state. Get on a branch!') |
| - |
| - # Default to diffing against common ancestor of upstream branch |
| - base_branch = cl.GetCommonAncestorWithUpstream() |
| - args = [base_branch, 'HEAD'] |
| - |
| - # Make sure authenticated to Rietveld before running expensive hooks. It is |
| - # a fast, best efforts check. Rietveld still can reject the authentication |
| - # during the actual upload. |
| - if not cl.IsGerrit() and auth_config.use_oauth2: |
| - authenticator = auth.get_authenticator_for_host( |
| - cl.GetCodereviewServer(), auth_config) |
| - if not authenticator.has_cached_credentials(): |
| - raise auth.LoginRequiredError(cl.GetCodereviewServer()) |
| - |
| - # Apply watchlists on upload. |
| - change = cl.GetChange(base_branch, None) |
| - watchlist = watchlists.Watchlists(change.RepositoryRoot()) |
| - files = [f.LocalPath() for f in change.AffectedFiles()] |
| - if not options.bypass_watchlists: |
| - cl.SetWatchers(watchlist.GetWatchersForPaths(files)) |
| - |
| - if not options.bypass_hooks: |
| - if options.reviewers or options.tbr_owners: |
| - # Set the reviewer list now so that presubmit checks can access it. |
| - change_description = ChangeDescription(change.FullDescriptionText()) |
| - change_description.update_reviewers(options.reviewers, |
| - options.tbr_owners, |
| - change) |
| - change.SetDescriptionText(change_description.description) |
| - hook_results = cl.RunHook(committing=False, |
| - may_prompt=not options.force, |
| - verbose=options.verbose, |
| - change=change) |
| - if not hook_results.should_continue(): |
| - return 1 |
| - if not options.reviewers and hook_results.reviewers: |
| - options.reviewers = hook_results.reviewers.split(',') |
| - |
| - if cl.GetIssue(): |
| - latest_patchset = cl.GetMostRecentPatchset() |
| - local_patchset = cl.GetPatchset() |
| - if latest_patchset and local_patchset and local_patchset != latest_patchset: |
| - print ('The last upload made from this repository was patchset #%d but ' |
| - 'the most recent patchset on the server is #%d.' |
| - % (local_patchset, latest_patchset)) |
| - print ('Uploading will still work, but if you\'ve uploaded to this issue ' |
| - 'from another machine or branch the patch you\'re uploading now ' |
| - 'might not include those changes.') |
| - ask_for_data('About to upload; enter to confirm.') |
| - |
| - print_stats(options.similarity, options.find_copies, args) |
| - if cl.IsGerrit(): |
| - if options.squash and options.no_squash: |
| - DieWithError('Can only use one of --squash or --no-squash') |
| - |
| - options.squash = ((settings.GetSquashGerritUploads() or options.squash) and |
| - not options.no_squash) |
| - |
| - ret = cl.CMDUploadChange(options, args, change) |
| - if not ret: |
| - git_set_branch_value('last-upload-hash', |
| - RunGit(['rev-parse', 'HEAD']).strip()) |
| - # Run post upload hooks, if specified. |
| - if settings.GetRunPostUploadHook(): |
| - presubmit_support.DoPostUploadExecuter( |
| - change, |
| - cl, |
| - settings.GetRoot(), |
| - options.verbose, |
| - sys.stdout) |
| - |
| - # Upload all dependencies if specified. |
| - if options.dependencies: |
| - print '--dependencies has been specified.' |
| - print 'All dependent local branches will be re-uploaded.' |
| - # Remove the dependencies flag from args so that we do not end up in a |
| - # loop. |
| - orig_args.remove('--dependencies') |
| - upload_branch_deps(cl, orig_args) |
| - return ret |
| + return cl.CMDUpload(options, args, orig_args) |
| def IsSubmoduleMergeCommit(ref): |