Use frozenlinks for submission from the specific project

This commit is contained in:
Max Lin 2017-06-23 21:19:46 +08:00
parent 79382b4e30
commit 6511997d29
2 changed files with 50 additions and 4 deletions

View File

@ -5,6 +5,7 @@ from colorama import Fore
from osc import oscerr
from osc.core import delete_project
from osc.core import show_package_meta
from osc import conf
from osclib.select_command import SelectCommand
from osclib.supersede_command import SupersedeCommand
@ -15,6 +16,7 @@ from xml.etree import cElementTree as ET
class AdiCommand:
def __init__(self, api):
self.api = api
self.config = conf.config[self.api.project]
def check_adi_project(self, project):
query_project = self.api.extract_staging_short(project)
@ -58,6 +60,7 @@ class AdiCommand:
self.check_adi_project(p)
def create_new_adi(self, wanted_requests, by_dp=False, split=False):
source_projects_expand = self.config.get('source_projects_expand', '').split()
requests = self.api.get_open_requests()
splitter = RequestSplitter(self.api, requests, in_ring=False)
splitter.filter_add('./action[@type="submit"]')
@ -96,7 +99,9 @@ class AdiCommand:
# Only create staging projec the first time a non superseded
# request is processed from a particular group.
if name is None:
name = self.api.create_adi_project(None)
use_frozenlinks = group in source_projects_expand and not split
name = self.api.create_adi_project(None,
use_frozenlinks, group)
if not self.api.rq_to_prj(request_id, name):
return False

View File

@ -41,7 +41,9 @@ from osc.core import http_GET
from osc.core import http_POST
from osc.core import http_PUT
from osc.core import rebuild
from osc.core import search
from osc.core import show_project_meta
from osc.core import show_project_sourceinfo
from osc.core import streamfile
from osclib.cache import Cache
@ -1570,7 +1572,34 @@ class StagingAPI(object):
adi_index = i + 2
return self.adi_prj_from_number(adi_index)
def create_adi_project(self, name):
def update_adi_frozenlinks(self, name, src_prj):
xpath = {
'package': "@project='%s' and devel/@project='%s'" % (self.project, src_prj),
}
collection = search(self.apiurl, **xpath)['package']
# all packages had matched devel project defined
pkglist = [p.attrib['name'] for p in collection.findall('package')]
flink = ET.Element('frozenlinks')
fl_prj = ET.SubElement(flink, 'frozenlink', {'project': self.project})
project_sourceinfo = ET.fromstring(show_project_sourceinfo(self.apiurl, self.project, True))
for si in project_sourceinfo.findall('sourceinfo'):
pkg = si.get('package')
if pkg in pkglist:
ET.SubElement(fl_prj, 'package', {'name': pkg, 'srcmd5': si.get('srcmd5'), 'vrev': si.get('vrev')})
# check multiple spec ie. sub-package
for linked in si.findall('linked'):
if linked.get('package') in pkglist:
ET.SubElement(fl_prj, 'package', {'name': pkg, 'srcmd5': si.get('lsrcmd5'), 'vrev': si.get('vrev')})
# commit frozenlinks
url = self.makeurl(['source', name, '_project', '_frozenlinks'], {'meta': '1'})
l = ET.tostring(flink)
http_PUT(url, data=l)
def create_adi_project(self, name, use_frozenlinks=False, src_prj=None):
"""Create an ADI project."""
if not name:
name = self._candidate_adi_project()
@ -1581,10 +1610,18 @@ class StagingAPI(object):
if name in adi_projects:
raise Exception('Project {} already exist'.format(name))
if use_frozenlinks:
linkproject = '<link project="{}"/>'.format(self.project)
repository = '<repository name="standard" rebuild="direct" linkedbuild="all">'
else:
linkproject = ''
repository = '<repository name="standard">'
meta = """
<project name="{0}">
<title></title>
<description></description>
{3}
<url>/project/staging_projects/{1}/adi:{2}</url>
<publish>
<disable/>
@ -1592,16 +1629,20 @@ class StagingAPI(object):
<debuginfo>
<enable/>
</debuginfo>
<repository name="standard">
{4}
<path project="{1}" repository="standard"/>
<arch>x86_64</arch>
</repository>
</project>""".format(name, self.project, self.extract_adi_number(name))
</project>""".format(name, self.project, self.extract_adi_number(name), linkproject, repository)
url = make_meta_url('prj', name, self.apiurl)
http_PUT(url, data=meta)
# put twice because on first put, the API adds useless maintainer
http_PUT(url, data=meta)
if use_frozenlinks:
self.update_adi_frozenlinks(name, src_prj)
return name
def is_user_member_of(self, user, group):