Adds ability to deploy from upstream openstack
[apex.git] / apex / build_utils.py
index 66a63d3..c9d8472 100644 (file)
@@ -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,