mirror of
https://github.com/openSUSE/osc.git
synced 2025-02-26 12:12:11 +01:00
* patchinfo runtime fixes
* support submit requests on project level, osc is checking which packages have changed and submits only the changed after asking back. * add support for _patchinfo package submissions in "osc sr" on project level
This commit is contained in:
parent
601b3c3416
commit
bc6f77d1da
3
NEWS
3
NEWS
@ -20,6 +20,8 @@
|
|||||||
- osc buildinfo accepts now also "prj pkg repo arch [spec/dsc]"
|
- osc buildinfo accepts now also "prj pkg repo arch [spec/dsc]"
|
||||||
- osc buildconfig accepts now also "prj pkg repo arch"
|
- osc buildconfig accepts now also "prj pkg repo arch"
|
||||||
- fixed warning messages regarding SSL certificate on some plattforms (Fedora)
|
- fixed warning messages regarding SSL certificate on some plattforms (Fedora)
|
||||||
|
- support submit requests on project level, osc is checking which packages
|
||||||
|
have changed and submits only the changed after asking back.
|
||||||
#
|
#
|
||||||
# Features which require OBS 1.7
|
# Features which require OBS 1.7
|
||||||
#
|
#
|
||||||
@ -27,6 +29,7 @@
|
|||||||
- added "osc meta attribute" for basic attribute creation, deletion, showing and value setting
|
- added "osc meta attribute" for basic attribute creation, deletion, showing and value setting
|
||||||
- implement "osc mbranch" call to create projects with multiple source package (instances)
|
- implement "osc mbranch" call to create projects with multiple source package (instances)
|
||||||
- new "osc patchinfo" command: basic patchinfo generation and modification support
|
- new "osc patchinfo" command: basic patchinfo generation and modification support
|
||||||
|
- add support for _patchinfo package submissions in "osc sr" on project level
|
||||||
|
|
||||||
0.123
|
0.123
|
||||||
- IMPORTANT: ssl certificate checks are actually performed now to
|
- IMPORTANT: ssl certificate checks are actually performed now to
|
||||||
|
@ -330,6 +330,7 @@ class Osc(cmdln.Cmdln):
|
|||||||
apiurl = Project(localdir).apiurl
|
apiurl = Project(localdir).apiurl
|
||||||
else:
|
else:
|
||||||
sys.exit('This command must be called in a checked out project.')
|
sys.exit('This command must be called in a checked out project.')
|
||||||
|
patchinfo = None
|
||||||
for p in meta_get_packagelist(apiurl, project):
|
for p in meta_get_packagelist(apiurl, project):
|
||||||
if p.startswith("_patchinfo:"):
|
if p.startswith("_patchinfo:"):
|
||||||
patchinfo = p
|
patchinfo = p
|
||||||
@ -337,7 +338,7 @@ class Osc(cmdln.Cmdln):
|
|||||||
if opts.force or not patchinfo:
|
if opts.force or not patchinfo:
|
||||||
print "Creating initial patchinfo..."
|
print "Creating initial patchinfo..."
|
||||||
query='cmd=createpatchinfo'
|
query='cmd=createpatchinfo'
|
||||||
if args[0]:
|
if args and args[0]:
|
||||||
query += "&name=" + args[0]
|
query += "&name=" + args[0]
|
||||||
url = makeurl(apiurl, ['source', project], query=query)
|
url = makeurl(apiurl, ['source', project], query=query)
|
||||||
f = http_POST(url)
|
f = http_POST(url)
|
||||||
@ -620,6 +621,8 @@ class Osc(cmdln.Cmdln):
|
|||||||
help='show diff only instead of creating the actual request')
|
help='show diff only instead of creating the actual request')
|
||||||
@cmdln.option('-l', '--list', action='store_true',
|
@cmdln.option('-l', '--list', action='store_true',
|
||||||
help='show submitrequests. Same as \'osc req list -M -a -t submit -D 0\'')
|
help='show submitrequests. Same as \'osc req list -M -a -t submit -D 0\'')
|
||||||
|
@cmdln.option('--yes', action='store_true',
|
||||||
|
help='proceed without asking.')
|
||||||
@cmdln.alias("sr")
|
@cmdln.alias("sr")
|
||||||
@cmdln.alias("submitreq")
|
@cmdln.alias("submitreq")
|
||||||
@cmdln.alias("submitpac")
|
@cmdln.alias("submitpac")
|
||||||
@ -678,9 +681,92 @@ class Osc(cmdln.Cmdln):
|
|||||||
if len(args) > 4:
|
if len(args) > 4:
|
||||||
raise oscerr.WrongArgs('Too many arguments.')
|
raise oscerr.WrongArgs('Too many arguments.')
|
||||||
|
|
||||||
apiurl = conf.config['apiurl']
|
if len(args) > 0 and len(args) <= 2 and is_project_dir(os.getcwd()):
|
||||||
|
sys.exit('osc submitrequest from project directory is only working without target specs and for source linked files\n')
|
||||||
|
|
||||||
if len(args) <= 2:
|
if len(args) == 0 and is_project_dir(os.getcwd()):
|
||||||
|
import cgi
|
||||||
|
# submit requests for multiple packages are currently handled via multiple requests
|
||||||
|
# They could be also one request with multiple actions, but that avoids to accepts parts of it.
|
||||||
|
project = Project(os.getcwd())
|
||||||
|
apiurl = project.apiurl
|
||||||
|
|
||||||
|
sr_ids = []
|
||||||
|
pi = []
|
||||||
|
pac = []
|
||||||
|
targetprojects = []
|
||||||
|
# loop via all packages for checking their state
|
||||||
|
for p in meta_get_packagelist(apiurl, project.name):
|
||||||
|
if p.startswith("_patchinfo:"):
|
||||||
|
pi.append(p)
|
||||||
|
else:
|
||||||
|
# get _link info from server, who knows about the local state ...
|
||||||
|
u = makeurl(apiurl, ['source', project.name, p])
|
||||||
|
f = http_GET(u)
|
||||||
|
root = ET.parse(f).getroot()
|
||||||
|
linkinfo = root.find('linkinfo')
|
||||||
|
if linkinfo == None:
|
||||||
|
print "Package ", p, " is not a source link."
|
||||||
|
sys.exit("This is currently not supported.")
|
||||||
|
if linkinfo.get('error'):
|
||||||
|
print "Package ", p, " is a broken source link."
|
||||||
|
sys.exit("Please fix this first")
|
||||||
|
t = linkinfo.get('project')
|
||||||
|
if t:
|
||||||
|
if len(root.findall('entry')) > 1: # This is not really correct, but should work mostly
|
||||||
|
# Real fix is to ask the api if sources are modificated
|
||||||
|
# but there is no such call yet.
|
||||||
|
targetprojects.append(t)
|
||||||
|
pac.append(p)
|
||||||
|
print "Submitting package ", p
|
||||||
|
else:
|
||||||
|
print " Skipping package ", p
|
||||||
|
else:
|
||||||
|
print "Skipping package ", p, " since it is a source link pointing inside to the project."
|
||||||
|
|
||||||
|
if not opts.yes:
|
||||||
|
if pi:
|
||||||
|
str=", "
|
||||||
|
print "Submitting patchinfo ", str.join(pi), " to ", str.join(targetprojects)
|
||||||
|
print "\nEverything fine? Can we create the requests ? [y/n]"
|
||||||
|
if sys.stdin.read(1) != "y":
|
||||||
|
sys.exit("Aborted...")
|
||||||
|
|
||||||
|
# loop via all packages to do the action
|
||||||
|
for p in pac:
|
||||||
|
result = create_submit_request(apiurl, project.name, p)
|
||||||
|
if not result:
|
||||||
|
# sys.exit(result)
|
||||||
|
sys.exit("submit request creation failed")
|
||||||
|
sr_ids.append(result)
|
||||||
|
|
||||||
|
# create submit requests for all found patchinfos
|
||||||
|
actionxml=""
|
||||||
|
options_block=""
|
||||||
|
if src_update:
|
||||||
|
options_block="""<options><sourceupdate>%s</sourceupdate></options> """ % (src_update)
|
||||||
|
|
||||||
|
for p in pi:
|
||||||
|
for t in targetprojects:
|
||||||
|
s = """<action type="submit"> <source project="%s" package="%s" /> <target project="%s" package="%s" /> %s </action>""" % \
|
||||||
|
(project.name, p, t, p, options_block)
|
||||||
|
actionxml += s
|
||||||
|
|
||||||
|
if actionxml != "":
|
||||||
|
xml = """<request> %s <state name="new"/> <description>%s</description> </request> """ % \
|
||||||
|
(actionxml, cgi.escape(opts.message or ""))
|
||||||
|
u = makeurl(apiurl, ['request'], query='cmd=create')
|
||||||
|
f = http_POST(u, data=xml)
|
||||||
|
|
||||||
|
root = ET.parse(f).getroot()
|
||||||
|
sr_ids.append(root.get('id'))
|
||||||
|
|
||||||
|
print "Requests created: ",
|
||||||
|
for i in sr_ids:
|
||||||
|
print i,
|
||||||
|
sys.exit('Successfull finished')
|
||||||
|
|
||||||
|
elif len(args) <= 2:
|
||||||
# try using the working copy at hand
|
# try using the working copy at hand
|
||||||
p = findpacs(os.curdir)[0]
|
p = findpacs(os.curdir)[0]
|
||||||
src_project = p.prjname
|
src_project = p.prjname
|
||||||
|
19
osc/core.py
19
osc/core.py
@ -2419,22 +2419,30 @@ def create_change_devel_request(apiurl,
|
|||||||
return root.get('id')
|
return root.get('id')
|
||||||
|
|
||||||
|
|
||||||
|
# This creates an old style submit request for server api 1.0
|
||||||
def create_submit_request(apiurl,
|
def create_submit_request(apiurl,
|
||||||
src_project, src_package,
|
src_project, src_package,
|
||||||
dst_project, dst_package,
|
dst_project=None, dst_package=None,
|
||||||
message, orev=None, src_update=None):
|
message=None, orev=None, src_update=None):
|
||||||
|
|
||||||
import cgi
|
import cgi
|
||||||
options_block=""
|
options_block=""
|
||||||
if src_update:
|
if src_update:
|
||||||
options_block="""<options><sourceupdate>%s</sourceupdate></options> """ % (src_update)
|
options_block="""<options><sourceupdate>%s</sourceupdate></options> """ % (src_update)
|
||||||
|
|
||||||
|
# Yes, this kind of xml construction is horrible
|
||||||
|
targetxml = ""
|
||||||
|
if dst_project:
|
||||||
|
packagexml = ""
|
||||||
|
if dst_package:
|
||||||
|
packagexml = """package="%s" """ %( dst_package )
|
||||||
|
targetxml = """<target project="%s" %s /> """ %( dst_project, packagexml )
|
||||||
# XXX: keep the old template for now in order to work with old obs instances
|
# XXX: keep the old template for now in order to work with old obs instances
|
||||||
xml = """\
|
xml = """\
|
||||||
<request type="submit">
|
<request type="submit">
|
||||||
<submit>
|
<submit>
|
||||||
<source project="%s" package="%s" rev="%s"/>
|
<source project="%s" package="%s" rev="%s"/>
|
||||||
<target project="%s" package="%s" />
|
%s
|
||||||
%s
|
%s
|
||||||
</submit>
|
</submit>
|
||||||
<state name="new"/>
|
<state name="new"/>
|
||||||
@ -2443,10 +2451,9 @@ def create_submit_request(apiurl,
|
|||||||
""" % (src_project,
|
""" % (src_project,
|
||||||
src_package,
|
src_package,
|
||||||
orev or show_upstream_rev(apiurl, src_project, src_package),
|
orev or show_upstream_rev(apiurl, src_project, src_package),
|
||||||
dst_project,
|
targetxml,
|
||||||
dst_package,
|
|
||||||
options_block,
|
options_block,
|
||||||
cgi.escape(message or ''))
|
cgi.escape(message or ""))
|
||||||
|
|
||||||
u = makeurl(apiurl, ['request'], query='cmd=create')
|
u = makeurl(apiurl, ['request'], query='cmd=create')
|
||||||
f = http_POST(u, data=xml)
|
f = http_POST(u, data=xml)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user