 e7d88cd8f0
			
		
	
	e7d88cd8f0
	
	
	
		
			
			This "or r" was accidentally removed in I5ad5b617. Change-Id: If4419e204b54e619559ed2a2a25c508fc2367d35
		
			
				
	
	
		
			94 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python
 | |
| # Copyright (C) 2014 The Android Open Source Project
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 (the "License");
 | |
| # you may not use this file except in compliance with the License.
 | |
| # You may obtain a copy of the License at
 | |
| #
 | |
| # http://www.apache.org/licenses/LICENSE-2.0
 | |
| #
 | |
| # Unless required by applicable law or agreed to in writing, software
 | |
| # distributed under the License is distributed on an "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| # See the License for the specific language governing permissions and
 | |
| # limitations under the License.
 | |
| 
 | |
| from __future__ import print_function
 | |
| 
 | |
| import argparse
 | |
| import collections
 | |
| import os
 | |
| import subprocess
 | |
| import sys
 | |
| 
 | |
| 
 | |
| def get_config(name):
 | |
|   args = ['git', 'config', '--get', name]
 | |
|   p = subprocess.Popen(args, stdout=subprocess.PIPE)
 | |
|   out, _ = p.communicate()
 | |
|   ret = p.poll()
 | |
|   if ret not in (0, 1):
 | |
|     raise subprocess.CalledProcessError(ret, ' '.join(args), output=out)
 | |
|   return out.strip()
 | |
| 
 | |
| 
 | |
| def deref(name):
 | |
|   p = subprocess.Popen(
 | |
|       ['git', 'rev-parse', '--symbolic-full-name', name],
 | |
|       stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 | |
|   out, _ = p.communicate()
 | |
|   return out.strip()
 | |
| 
 | |
| 
 | |
| def main(argv):
 | |
|   p = argparse.ArgumentParser(description='Push changes to Gerrit for review')
 | |
|   p.add_argument('-r', '--remote', default='', metavar='REMOTE',
 | |
|                  help='remote name or URL to push to')
 | |
|   p.add_argument('-b', '--branch', default='', metavar='BRANCH',
 | |
|                  help='remote branch name, refs/for/BRANCH')
 | |
|   p.add_argument('args', nargs='*', metavar='REVIEWER_OR_HASHTAG',
 | |
|                  help='reviewer names or aliases, or #hashtags')
 | |
|   p.add_argument('-t', '--topic', default='', metavar='TOPIC',
 | |
|                  help='topic for new changes')
 | |
|   p.add_argument('--dry-run', action='store_true',
 | |
|                  help='dry run, print git command and exit')
 | |
|   args = p.parse_args()
 | |
| 
 | |
|   if not args.remote or not args.branch:
 | |
|     hp = 'refs/heads/'
 | |
|     upstream = deref('HEAD')
 | |
|     while upstream.startswith(hp):
 | |
|       upstream = deref(upstream[len(hp):] + '@{u}')
 | |
| 
 | |
|     rp = 'refs/remotes/'
 | |
|     if upstream.startswith(rp):
 | |
|       def_remote, def_branch = upstream[len(rp):].split('/', 1)
 | |
|     else:
 | |
|       def_remote, def_branch = 'origin', 'master'
 | |
|     args.remote = args.remote or def_remote
 | |
|     args.branch = args.branch or def_branch
 | |
| 
 | |
| 
 | |
|   opts = collections.defaultdict(list)
 | |
|   is_hashtag = lambda x: x.startswith('#')
 | |
|   opts['r'].extend(
 | |
|       (get_config('reviewer.' + r) or r)
 | |
|       for r in args.args if not is_hashtag(r))
 | |
|   opts['t'].extend(t[1:] for t in args.args if is_hashtag(t))
 | |
|   if args.topic:
 | |
|     opts['topic'].append(args.topic)
 | |
|   opts_str = ','.join('%s=%s' % (k, v) for k in opts for v in opts[k])
 | |
|   if opts_str:
 | |
|     opts_str = '%' + opts_str
 | |
| 
 | |
|   git_args = ['git', 'push', args.remote,
 | |
|               'HEAD:refs/for/%s%s' % (args.branch, opts_str)]
 | |
|   if args.dry_run:
 | |
|     print(' '.join(git_args))
 | |
|     return 0
 | |
|   os.execvp('git', git_args)
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|   sys.exit(main(sys.argv))
 |