From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Marko Lemmetty Date: Fri, 15 May 2020 14:20:54 +0300 Subject: [PATCH] Support 'osc copyprj' in api by Islam Amer usage: osc copyprj SOURCEPRJ DESTPRJ A way to copy a project and all packages in it It can not yet be done across buildservice instances The user must be able to create DESTPRJ --- osc/commandline.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++ osc/core.py | 28 ++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/osc/commandline.py b/osc/commandline.py index 9180f9256b9351e24667be7b51c115085272a859..b5ce2169e384c6203583e960a20b660be199fa6c 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -3203,6 +3203,59 @@ Please submit there instead, or use --nodevelproject to force direct submission. break sys.stdout.write(decode_it(buf)) + @cmdln.option('-b', '--with-binaries', action='store_true', + help='copy the built binaries over to avoid a rebuild') + @cmdln.option('-H', '--with-history', action='store_true', + help='replicate the history of each package.') + @cmdln.option('-o', '--make-older', action='store_true', + help='No idea') + @cmdln.option('-r', '--re-sign', action='store_true', + help='re-sign the binaries') + @cmdln.option('-m', '--message', metavar='TEXT', + help='specify message TEXT') + def do_copyprj(self, subcmd, opts, *args): + """${cmd_name}: Copy a project + + A way to copy a project and all packages in it + + It can not yet be done across buildservice instances + + The user must be able to create DESTPRJ + + usage: + osc copyprj SOURCEPRJ DESTPRJ + ${cmd_option_list} + """ + + args = slash_split(args) + + if not args or len(args) != 2: + raise oscerr.WrongArgs('Incorrect number of arguments.\n\n' \ + + self.get_cmd_help('copypac')) + + src_project = args[0] + dst_project = args[1] + + src_apiurl = conf.config['apiurl'] + + if opts.message: + comment = opts.message + else: + comment = 'osc copyprj from project:%s' % ( src_project ) + + if src_project == dst_project: + raise oscerr.WrongArgs('Source and destination are the same.') + + print("calling cp") + r = copy_prj(src_apiurl, src_project, dst_project, + withbinaries = opts.with_binaries, + withhistory = opts.with_history, + makeolder = opts.make_older, + resign = opts.re_sign, + comment = comment) + print("done cp") + print(r) + @cmdln.option('-m', '--message', metavar='TEXT', help='specify message TEXT') diff --git a/osc/core.py b/osc/core.py index 2d07c7f7d54ea32a2b9219efa0137fb978c365be..93aa7dd20f6dd71f7e934534896d3330fffab4fc 100644 --- a/osc/core.py +++ b/osc/core.py @@ -5620,6 +5620,34 @@ def copy_pac(src_apiurl, src_project, src_package, raise oscerr.APIError('failed to copy: %s' % ', '.join(todo)) return 'Done.' +def copy_prj(src_apiurl, src_project, dst_project, + withbinaries = False, + withhistory = False, + makeolder = False, + resign = False, + comment = None): + """ + Create a copy of a project. + + Copying can only be done on the server, in a single api call. + """ + + print('Copying project...') + query = {'cmd': 'copy', 'oproject': src_project } + if withbinaries: + query['withbinaries'] = '1' + if withhistory: + query['withhistory'] = '1' + if makeolder: + query['makeolder'] = '1' + if resign: + query['resign'] = '1' + if comment: + query['comment'] = comment + u = makeurl(src_apiurl, ['source', dst_project], query=query) + print >>sys.stderr, "copyprj ", u + f = http_POST(u) + return f.read() def unlock_package(apiurl, prj, pac, msg): query = {'cmd': 'unlock', 'comment': msg}