summaryrefslogtreecommitdiffstats
path: root/apex/build_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'apex/build_utils.py')
-rw-r--r--apex/build_utils.py70
1 files changed, 50 insertions, 20 deletions
diff --git a/apex/build_utils.py b/apex/build_utils.py
index 66a63d37..c9d8472e 100644
--- a/apex/build_utils.py
+++ b/apex/build_utils.py
@@ -16,9 +16,41 @@ import re
import shutil
import sys
+from apex.common import constants as con
from urllib.parse import quote_plus
+def get_change(url, repo, branch, change_id):
+ """
+ Fetches a change from upstream repo
+ :param url: URL of upstream gerrit
+ :param repo: name of repo
+ :param branch: branch of repo
+ :param change_id: SHA change id
+ :return: change if found and not abandoned, closed, or merged
+ """
+ rest = GerritRestAPI(url=url)
+ change_path = "{}~{}~{}".format(quote_plus(repo), quote_plus(branch),
+ change_id)
+ change_str = "changes/{}?o=CURRENT_REVISION".format(change_path)
+ change = rest.get(change_str)
+ try:
+ assert change['status'] not in 'ABANDONED' 'CLOSED', \
+ 'Change {} is in {} state'.format(change_id, change['status'])
+ if change['status'] == 'MERGED':
+ logging.info('Change {} is merged, ignoring...'
+ .format(change_id))
+ return None
+ else:
+ return change
+
+ except KeyError:
+ logging.error('Failed to get valid change data structure from url '
+ '{}/{}, data returned: \n{}'
+ .format(change_id, change_str, change))
+ raise
+
+
def clone_fork(args):
ref = None
logging.info("Cloning {}".format(args.repo))
@@ -36,26 +68,11 @@ def clone_fork(args):
if m:
change_id = m.group(1)
logging.info("Using change ID {} from {}".format(change_id, args.repo))
- rest = GerritRestAPI(url=args.url)
- change_path = "{}~{}~{}".format(args.repo, quote_plus(args.branch),
- change_id)
- change_str = "changes/{}?o=CURRENT_REVISION".format(change_path)
- change = rest.get(change_str)
- try:
- assert change['status'] not in 'ABANDONED' 'CLOSED',\
- 'Change {} is in {} state'.format(change_id, change['status'])
- if change['status'] == 'MERGED':
- logging.info('Change {} is merged, ignoring...'
- .format(change_id))
- else:
- current_revision = change['current_revision']
- ref = change['revisions'][current_revision]['ref']
- logging.info('setting ref to {}'.format(ref))
- except KeyError:
- logging.error('Failed to get valid change data structure from url '
- '{}/{}, data returned: \n{}'
- .format(change_id, change_str, change))
- raise
+ change = get_change(args.url, args.repo, args.branch, change_id)
+ if change:
+ current_revision = change['current_revision']
+ ref = change['revisions'][current_revision]['ref']
+ logging.info('setting ref to {}'.format(ref))
# remove existing file or directory named repo
if os.path.exists(args.repo):
@@ -73,6 +90,19 @@ def clone_fork(args):
logging.info('Checked out commit:\n{}'.format(ws.head.commit.message))
+def get_patch(change_id, repo, branch, url=con.OPENSTACK_GERRIT):
+ logging.info("Fetching patch for change id {}".format(change_id))
+ change = get_change(url, repo, branch, change_id)
+ if change:
+ current_revision = change['current_revision']
+ rest = GerritRestAPI(url=url)
+ change_path = "{}~{}~{}".format(quote_plus(repo), quote_plus(branch),
+ change_id)
+ patch_url = "changes/{}/revisions/{}/patch".format(change_path,
+ current_revision)
+ return rest.get(patch_url)
+
+
def get_parser():
parser = argparse.ArgumentParser()
parser.add_argument('--debug', action='store_true', default=False,