Convert gerrit-push to Python
This commit is contained in:
parent
a19589abb4
commit
e01311dff3
184
gerrit-push
184
gerrit-push
|
@ -1,54 +1,146 @@
|
||||||
#!/bin/bash
|
#!/usr/bin/python
|
||||||
|
|
||||||
find_topdir()
|
import os
|
||||||
{
|
import sys
|
||||||
while [ ! -d ".repo" ]; do
|
import getopt
|
||||||
cd ".."
|
import subprocess
|
||||||
if [ $PWD = "/" ]; then
|
import urllib2
|
||||||
echo "Cannot find topdir"
|
import json
|
||||||
exit 1
|
import re
|
||||||
fi
|
from xml.etree import ElementTree
|
||||||
done
|
|
||||||
pwd
|
|
||||||
}
|
|
||||||
|
|
||||||
SCHEME="ssh"
|
cfg = dict()
|
||||||
GIT="git"
|
cfg['draft'] = False
|
||||||
if [ "$1" = "-t" ]; then
|
cfg['nodo'] = False
|
||||||
GIT="echo git"
|
cfg['ssh'] = False
|
||||||
shift
|
cfg['remote'] = None
|
||||||
fi
|
cfg['verbose'] = 0
|
||||||
if [ "$1" = "-h" ]; then
|
|
||||||
SCHEME="https"
|
|
||||||
fi
|
|
||||||
|
|
||||||
topdir=$(find_topdir)
|
def verbose(s):
|
||||||
len=$(( ${#topdir} + 1 ))
|
if cfg['verbose'] > 0:
|
||||||
prj_path=${PWD:$len}
|
sys.stderr.write(s)
|
||||||
|
|
||||||
prj_entry=$(repo manifest | grep "project .*path=\"$prj_path\"")
|
def get_topdir():
|
||||||
if [ -z "$prj_entry" ]; then
|
dir = os.getcwd()
|
||||||
echo "Cannot find project entry for $prj_path"
|
while not os.path.exists("%s/.repo" % (dir)):
|
||||||
exit 1
|
dir = os.path.realpath("%s/.." % (dir))
|
||||||
fi
|
if dir == '/':
|
||||||
|
raise OSError(2, 'No such file or directory', dir)
|
||||||
|
return dir
|
||||||
|
|
||||||
def_entry=$(repo manifest | grep "default ")
|
optargs, argv = getopt.getopt(sys.argv[1:], 'dnsv',
|
||||||
def_remote_name=$(echo $def_entry | egrep -o "remote=([^ ]*)" | cut -d'"' -f2)
|
['draft', 'nodo', 'remote=', 'ssh', 'verbose'])
|
||||||
def_remote_entry=$(repo manifest | grep "remote .*name=\"$def_remote_name\"")
|
for k, v in optargs:
|
||||||
|
if k in ('-d', '--draft'):
|
||||||
|
cfg['draft'] = True
|
||||||
|
if k in ('-n', '--nodo'):
|
||||||
|
cfg['nodo'] = True
|
||||||
|
if k in ('--remote'):
|
||||||
|
cfg['remote'] = v
|
||||||
|
if k in ('-s', '--ssh'):
|
||||||
|
cfg['ssh'] = True
|
||||||
|
if k in ('-v', '--verbose'):
|
||||||
|
cfg['verbose'] += 1
|
||||||
|
|
||||||
prj_name=$(echo $prj_entry | egrep -o "name=([^ ]*)" | cut -d'"' -f2)
|
if len(argv) != 0:
|
||||||
prj_remote_name=$(echo $prj_entry | egrep -o "remote=([^ ]*)" | cut -d'"' -f2)
|
print "Usage: gerrit-push [args]"
|
||||||
prj_revision=$(echo $prj_entry | egrep -o "revision=([^ ]*)" | cut -d'"' -f2)
|
print " --draft Push as draft"
|
||||||
if [ -z "$prj_revision" ]; then
|
print " --nodo Do not apply the change"
|
||||||
prj_revision=$(echo $def_entry | egrep -o "revision=([^ ]*)" | cut -d'"' -f2)
|
print " --remote Use specified remote"
|
||||||
fi
|
print " --ssh Use ssh, do not attempt http"
|
||||||
prj_revision="${prj_revision##refs/heads/}"
|
print " --verbose Increase verbose level"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
if [ -n "$prj_remote_name" ]; then
|
cur_dir = os.getcwd()
|
||||||
remote_entry=$(repo manifest | grep "remote .*name=\"$prj_remote_name\"")
|
verbose("cur_dir=%s" % (cur_dir))
|
||||||
else
|
prj_dir = None
|
||||||
remote_entry=$(repo manifest | grep "remote .*name=\"$def_remote_name\"")
|
try:
|
||||||
fi
|
top_dir = get_topdir()
|
||||||
remote_review=$(echo $remote_entry | egrep -o "review=([^ ]*)" | cut -d'"' -f2)
|
except OSError:
|
||||||
|
sys.stderr.write("Cannot find top of android tree\n")
|
||||||
|
sys.exit(1)
|
||||||
|
verbose("top_dir=%s" % (top_dir))
|
||||||
|
if len(top_dir) >= len(cur_dir):
|
||||||
|
sys.stderr.write("Not in project directory\n")
|
||||||
|
sys.exit(1)
|
||||||
|
prj_dir = cur_dir[len(top_dir)+1:]
|
||||||
|
verbose("prj_dir=%s" % (prj_dir))
|
||||||
|
|
||||||
$GIT push "$SCHEME://$remote_review:29418/$prj_name" "HEAD:refs/for/$prj_revision"
|
# Read our manifest
|
||||||
|
args = []
|
||||||
|
args.append('repo')
|
||||||
|
args.append('manifest')
|
||||||
|
child = subprocess.Popen(args, stdin=None, stdout=subprocess.PIPE, stderr=None)
|
||||||
|
out, err = child.communicate()
|
||||||
|
if child.returncode != 0:
|
||||||
|
sys.stderr.write('Failed to read manifest\n')
|
||||||
|
sys.exit(1)
|
||||||
|
manifest = ElementTree.fromstring(out)
|
||||||
|
|
||||||
|
# Figure out which remote to use
|
||||||
|
remote_name = cfg['remote']
|
||||||
|
if remote_name is None:
|
||||||
|
if prj_dir is None:
|
||||||
|
for elem in manifest.findall('default'):
|
||||||
|
cfg['remote'] = elem.get('name')
|
||||||
|
else:
|
||||||
|
for elem in manifest.findall('project'):
|
||||||
|
if elem.get('path') == prj_dir:
|
||||||
|
remote_name = elem.get('remote')
|
||||||
|
if remote_name is None:
|
||||||
|
sys.stderr.write("Cannot find appropriate remote entry in manifest\n");
|
||||||
|
sys.exit(1);
|
||||||
|
verbose("remote_name=%s\n" % (remote_name))
|
||||||
|
|
||||||
|
review_url = None
|
||||||
|
review_host = None
|
||||||
|
for elem in manifest.findall('remote'):
|
||||||
|
if elem.get('name') == remote_name:
|
||||||
|
review_url = elem.get('review')
|
||||||
|
if review_url.find(':') == -1:
|
||||||
|
review_host = review_url
|
||||||
|
review_url = "ssh://%s" % (review_url)
|
||||||
|
else:
|
||||||
|
review_host = review_url.strip_url_schema()
|
||||||
|
if review_url is None or review_host is None:
|
||||||
|
sys.stderr.write("Cannot find appropriate remote url in manifest\n");
|
||||||
|
sys.exit(1);
|
||||||
|
verbose("review_url=%s, review_host=%s\n" % (review_url, review_host))
|
||||||
|
|
||||||
|
project = None
|
||||||
|
for elem in manifest.findall('project'):
|
||||||
|
if elem.get('path') == prj_dir:
|
||||||
|
project = elem
|
||||||
|
if project is None:
|
||||||
|
sys.stderr.write('Error: project not found\n')
|
||||||
|
sys.exit(1)
|
||||||
|
project_path = project.get('path')
|
||||||
|
project_name = project.get('name')
|
||||||
|
|
||||||
|
# Figure out which branch to use
|
||||||
|
project_branch = project.get('revision')
|
||||||
|
if project_branch is None:
|
||||||
|
for elem in manifest.findall('default'):
|
||||||
|
project_branch = elem.get('revision')
|
||||||
|
if project_branch is None:
|
||||||
|
sys.stderr.write("Cannot find project branch in manifest\n");
|
||||||
|
sys.exit(1);
|
||||||
|
verbose("project_branch=%s\n" % (project_branch))
|
||||||
|
|
||||||
|
# Push the change
|
||||||
|
args = []
|
||||||
|
args.append('git')
|
||||||
|
args.append('push')
|
||||||
|
args.append('%s/%s' % (review_url, project_name))
|
||||||
|
args.append('HEAD:refs/for/%s' % (project_branch))
|
||||||
|
if cfg['nodo']:
|
||||||
|
print ' '.join(args)
|
||||||
|
else:
|
||||||
|
child = subprocess.Popen(args, stdin=None, stdout=None, stderr=None)
|
||||||
|
out, err = child.communicate()
|
||||||
|
if child.returncode != 0:
|
||||||
|
sys.stderr.write('Failed to push change\n')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
verbose('Success\n')
|
||||||
|
sys.exit(0)
|
||||||
|
|
Loading…
Reference in New Issue