Chromium Code Reviews| Index: git_cl.py |
| =================================================================== |
| --- git_cl.py (revision 120036) |
| +++ git_cl.py (working copy) |
| @@ -147,6 +147,7 @@ |
| self.viewvc_url = None |
| self.updated = False |
| self.did_migrate_check = False |
| + self.is_gerrit = None |
| def LazyUpdateIfNeeded(self): |
| """Updates the settings from a codereview.settings file, if available.""" |
| @@ -264,6 +265,12 @@ |
| def GetDefaultCCList(self): |
| return self._GetConfig('rietveld.cc', error_ok=True) |
| + def GetIsGerrit(self): |
| + """Return true if this repo is assosiated with gerrit code review system.""" |
| + if self.is_gerrit is None: |
| + self.is_gerrit = self._GetConfig('gerrit.host', error_ok=True) |
| + return self.is_gerrit |
| + |
| def _GetConfig(self, param, **kwargs): |
| self.LazyUpdateIfNeeded() |
| return RunGit(['config', param], **kwargs).strip() |
| @@ -604,6 +611,7 @@ |
| def GetCodereviewSettingsInteractively(): |
| """Prompt the user for settings.""" |
| + # TODO(ukai): ask code review system is rietveld or gerrit? |
| server = settings.GetDefaultServerUrl(error_ok=True) |
| prompt = 'Rietveld server (host[:port])' |
| prompt += ' [%s]' % (server or DEFAULT_SERVER) |
| @@ -723,6 +731,15 @@ |
| SetProperty('tree-status-url', 'STATUS', unset_error_ok=True) |
| SetProperty('viewvc-url', 'VIEW_VC', unset_error_ok=True) |
| + if 'GERRIT_HOST' in keyvals and 'GERRIT_PORT' in keyvals: |
| + RunGit(['config', 'gerrit.host', keyvals['GERRIT_HOST']]) |
| + RunGit(['config', 'gerrit.port', keyvals['GERRIT_PORT']]) |
| + # Install the standard commit-msg hook. |
| + RunCommand(['scp', '-p', '-P', keyvals['GERRIT_PORT'], |
| + '%s:hooks/commit-msg' % keyvals['GERRIT_HOST'], |
| + os.path.join(settings.GetRoot(), |
| + '.git', 'hooks', 'commit-msg')]) |
| + |
| if 'PUSH_URL_CONFIG' in keyvals and 'ORIGIN_URL_CONFIG' in keyvals: |
| #should be of the form |
| #PUSH_URL_CONFIG: url.ssh://gitrw.chromium.org.pushinsteadof |
| @@ -863,6 +880,44 @@ |
| return 0 |
| +def GerritUpload(options, args, cl): |
| + """upload the current branch to gerrit.""" |
| + # We assume the remote called "origin" is the one we want. |
| + # It is probably not worthwhile to support different workflows. |
|
M-A Ruel
2012/02/01 15:50:35
What about CL pipelining? Why not just get the bra
ukai
2012/02/02 04:21:59
I'm new to gerrit and don't know how to do it yet.
|
| + remote = 'origin' |
| + branch = 'master' |
| + if args: |
| + branch = args[0] |
| + |
| + description = RunCommand(['git', 'log', '--pretty=format:%s%n%n%b', |
| + '%s...' % (branch)]).strip() |
| + |
| + receive_options = [] |
| + cc = [] |
| + if options.cc: |
| + cc = options.cc.split(',') |
| + cc = filter(None, (cl.GetCCList(), cc)) |
| + if cc: |
| + receive_options += ['--cc=' + email for email in cc] |
| + # Retrieves all reviewer lines |
| + reviewer_regexp = re.compile(r'^\s*(TBR|R)=(.+)$', re.MULTILINE) |
|
M-A Ruel
2012/02/01 15:50:35
Why can't you reuse the parsing code? It'd be nice
ukai
2012/02/02 04:21:59
Done.
|
| + reviewers = filter(None, ','.join( |
| + i.group(2).strip() |
| + for i in reviewer_regexp.finditer(description)).split(',')) |
| + if options.reviewers: |
| + reviewers += filter(None, options.reviewers.split(',')) |
| + if reviewers: |
| + receive_options += ['--reviewer=' + email for email in reviewers] |
| + |
| + git_command = ['push'] |
| + if receive_options: |
| + git_command.append('--receive-pack=git receive-pack ' + |
| + ' '.join(receive_options)) |
| + git_command += [remote, 'HEAD:refs/for/' + branch] |
| + RunGit(git_command) |
| + return 0 |
| + |
| + |
| @usage('[args to "git diff"]') |
| def CMDupload(parser, args): |
| """upload the current changelist to codereview""" |
| @@ -896,11 +951,15 @@ |
| cl = Changelist() |
| if args: |
| + # TODO(ukai): is it ok for gerrit case? |
| base_branch = args[0] |
| else: |
| # Default to diffing against the "upstream" branch. |
| base_branch = cl.GetUpstreamBranch() |
| - args = [base_branch + "..."] |
| + if settings.GetIsGerrit(): |
| + args = ['master'] |
|
M-A Ruel
2012/02/01 15:50:35
Why?
ukai
2012/02/02 04:21:59
I initially thought args[0] to be used for target
|
| + else: |
| + args = [base_branch + "..."] |
| if not options.bypass_hooks: |
| hook_results = cl.RunHook(committing=False, upstream_branch=base_branch, |
| @@ -921,6 +980,11 @@ |
| subprocess2.call( |
| ['git', 'diff', '--no-ext-diff', '--stat', '-M'] + args, env=env) |
| + if settings.GetIsGerrit(): |
| + GerritUpload(options, args, cl) |
| + # TODO(ukai): parse Change-Id: and set issue number? |
| + return 0 |
| + |
| upload_args = ['--assume_yes'] # Don't ask about untracked files. |
|
M-A Ruel
2012/02/01 15:50:35
I'd rather move the rest into RietveldUpload to ma
ukai
2012/02/02 04:21:59
Done.
|
| upload_args.extend(['--server', cl.GetRietveldServer()]) |
| if options.emulate_svn_auto_props: |
| @@ -1229,6 +1293,7 @@ |
| issue_arg = args[0] |
| # TODO(maruel): Use apply_issue.py |
| + # TODO(ukai): use gerrit-cherry-pick for gerrit repository? |
| if re.match(r'\d+', issue_arg): |
| # Input is an issue id. Figure out the URL. |