Create one SR for all packages in submission
authorEd Bartosh <eduard.bartosh@intel.com>
Fri, 9 May 2014 19:16:37 +0000 (22:16 +0300)
committerEd Bartosh <eduard.bartosh@intel.com>
Sun, 18 May 2014 11:01:17 +0000 (14:01 +0300)
Currently repa creates one SR per package.

This change implements creation of one SR per multiple packages by using new
schema of POST /request API https://api.opensuse.org/apidocs/request.rng

Note, that osc API doesn't support this schema, so it can't be used.

Fixes: #1386
Change-Id: Iae5cb55b0b5f489b9596c5a79e0845ec18a2ba51
Signed-off-by: Ed Bartosh <eduard.bartosh@intel.com>
repa/common.py
repa/obs.py

index 79d6ed757771dd336d816ce592f4f1e1603f678a..51128e22f176ffd392ffd3e83b6aac1a115d7ba3 100644 (file)
@@ -93,31 +93,19 @@ def accept_or_reject(obs, submission, state, target, comment=''):
               meta['git_tag'],
               commit)
 
-        for pkg in obs.get_source_packages(project):
-            # Create SR
-            try:
-                reqid = obs.create_sr(project, pkg, str(meta['obs_target_prj']),
-                                      message=str(message))
-            except RepaException:
-                if state == 'declined':
-                    # Broken sources. Try to avoid queryng source by
-                    # providing revision 1. It always exists and it doesn't
-                    # matter which revision to reject.
-                    reqid = obs.create_sr(project, pkg,
-                                          str(meta['obs_target_prj']),
-                                          message=str(message), revision=1)
-                else:
-                    raise
-
-            print 'package %s: created SR %s' % (pkg, reqid)
-
-            # and immediately set its state
-            message = "SR %s is set to %s" % (reqid, state)
-            if comment:
-                message += comment
-            obs.set_sr_state(reqid, state=state,
-                             message=str(message), force=True)
-            print 'set SR state to', state
+        # Create SR
+        reqid = obs.create_sr(project, obs.get_source_packages(project),
+                              str(meta['obs_target_prj']), message=message)
+
+        print 'created SR %s' % reqid
+
+        # and immediately set its state
+        message = "SR %s is set to %s" % (reqid, state)
+        if comment:
+            message += comment
+        obs.set_sr_state(reqid, state=state,
+                         message=str(message), force=True)
+        print 'set SR state to', state
 
     # delete submit group
     if submission.startswith('submitgroup'):
index 62277345e60652e1e36653b0606ce68426f5294c..be052e7743a369d7be58a027e5e6214c271adfad 100644 (file)
@@ -35,6 +35,7 @@ should be contributed to oscapi.
 
 import sys
 import re
+import cgi
 
 from base64 import b64encode
 from xml.etree import cElementTree as ET
@@ -159,22 +160,22 @@ class OBS(OSC):
             sys.stdout = saved
 
 
-    def create_sr(self, src_project, package, dst_project,
-                  message='', revision=None):
+    def create_sr(self, src_project, packages, tgt_project, message=''):
         """Create submit request for the project."""
-        rev = revision
-        if not rev:
-            url = core.makeurl(self.apiurl, ['source', src_project, package],
-                               query="expand=1")
-            try:
-                answer = self.core_http(core.http_GET, url)
-            except OSCError, err:
-                raise RepaException("cat't query source %s from "
-                       "project %s: %s" % (package, src_project, err))
-            rev = ET.parse(answer).getroot().get('rev')
-        return core.create_submit_request(self.apiurl, src_project, package,
-                                          dst_project, package, message=message,
-                                          orev=rev)
+
+        content = '<request><description>%s</description>' % \
+                  cgi.escape(str(message))
+        for package in packages:
+            content += '<action type="submit">'
+            content += '<source project="%s" package="%s"/>' % \
+                       (src_project, package)
+            content += '<target project="%s" package="%s" />' % \
+                       (tgt_project, package)
+            content += '</action>'
+        content += '</request>\n'
+        url = core.makeurl(self.apiurl, ['request'], query='cmd=create')
+        reply = self.core_http(core.http_POST, url, data=content)
+        return ET.parse(reply).getroot().get('id')
 
     def set_sr_state(self, reqid, state, message='', force=False):
         """Set SR state."""