From 5c5597432c38595e089296d5d938b2763b7b18b5 Mon Sep 17 00:00:00 2001 From: Daniel Mach Date: Wed, 2 Mar 2022 14:38:21 +0100 Subject: [PATCH 1/2] Support flavors in aggregatepac --- osc/commandline.py | 2 +- osc/core.py | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/osc/commandline.py b/osc/commandline.py index b2350389..3967d251 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -2972,7 +2972,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. DESTPAC is omitted. usage: - osc aggregatepac SOURCEPRJ SOURCEPAC DESTPRJ [DESTPAC] + osc aggregatepac SOURCEPRJ SOURCEPAC[:FLAVOR] DESTPRJ [DESTPAC] ${cmd_option_list} """ diff --git a/osc/core.py b/osc/core.py index d8eb7be9..18570de2 100644 --- a/osc/core.py +++ b/osc/core.py @@ -5277,9 +5277,14 @@ def aggregate_pac(src_project, src_package, dst_project, dst_package, repo_map = meta_change = False dst_meta = '' apiurl = conf.config['apiurl'] + + # we need to remove :flavor from the package names when accessing meta + src_package_meta = src_package.split(":")[0] + dst_package_meta = dst_package.split(":")[0] + try: dst_meta = meta_exists(metatype='pkg', - path_args=(quote_plus(dst_project), quote_plus(dst_package)), + path_args=(quote_plus(dst_project), quote_plus(dst_package_meta)), template_args=None, create_new=False, apiurl=apiurl) root = ET.fromstring(parse_meta_to_string(dst_meta)) @@ -5292,8 +5297,8 @@ def aggregate_pac(src_project, src_package, dst_project, dst_package, repo_map = meta_change = True if meta_change: - src_meta = show_package_meta(apiurl, src_project, src_package) - dst_meta = replace_pkg_meta(src_meta, dst_package, dst_project) + src_meta = show_package_meta(apiurl, src_project, src_package_meta) + dst_meta = replace_pkg_meta(src_meta, dst_package_meta, dst_project) meta_change = True if disable_publish: @@ -5307,12 +5312,12 @@ def aggregate_pac(src_project, src_package, dst_project, dst_package, repo_map = dst_meta = ET.tostring(root, encoding=ET_ENCODING) if meta_change: edit_meta('pkg', - path_args=(dst_project, dst_package), + path_args=(dst_project, dst_package_meta), data=dst_meta) # create the _aggregate file # but first, make sure not to overwrite an existing one - if '_aggregate' in meta_get_filelist(apiurl, dst_project, dst_package): + if '_aggregate' in meta_get_filelist(apiurl, dst_project, dst_package_meta): print(file=sys.stderr) print('_aggregate file already exists...! Aborting', file=sys.stderr) sys.exit(1) @@ -5341,7 +5346,7 @@ def aggregate_pac(src_project, src_package, dst_project, dst_package, repo_map = """ - u = makeurl(apiurl, ['source', dst_project, dst_package, '_aggregate']) + u = makeurl(apiurl, ['source', dst_project, dst_package_meta, '_aggregate']) http_PUT(u, data=aggregate_template) print('Done.') From 12e2e81703dcbc5a69f18b05f8dba14d8e86f63e Mon Sep 17 00:00:00 2001 From: Daniel Mach Date: Fri, 11 Mar 2022 09:59:08 +0100 Subject: [PATCH 2/2] Check if repos provided to aggregatepac command exist --- osc/core.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/osc/core.py b/osc/core.py index 18570de2..766e0775 100644 --- a/osc/core.py +++ b/osc/core.py @@ -5267,16 +5267,20 @@ def link_pac(src_project, src_package, dst_project, dst_package, force, rev='', http_PUT(u, data=link_template) print('Done.') -def aggregate_pac(src_project, src_package, dst_project, dst_package, repo_map = {}, disable_publish = False, nosources = False): + +def aggregate_pac(src_project, src_package, dst_project, dst_package, repo_map=None, + disable_publish=False, nosources=False, repo_check=True): """ aggregate package - "src" is the original package - "dst" is the "aggregate" package that we are creating here - "map" is a dictionary SRC => TARGET repository mappings + - "repo_check" determines if presence of repos in the source and destination repos is checked """ meta_change = False dst_meta = '' apiurl = conf.config['apiurl'] + repo_map = repo_map or {} # we need to remove :flavor from the package names when accessing meta src_package_meta = src_package.split(":")[0] @@ -5296,6 +5300,34 @@ def aggregate_pac(src_project, src_package, dst_project, dst_package, repo_map = raise meta_change = True + if repo_check: + src_repos = set(get_repositories_of_project(apiurl, src_project)) + dst_repos = set(get_repositories_of_project(apiurl, dst_project)) + + if repo_map: + map_from = set(repo_map.keys()) + map_to = set(repo_map.values()) + + # only repos that do not exist in src/dst remain + delta_from = map_from - src_repos + delta_to = map_to - dst_repos + + if delta_from or delta_to: + msg = ["The following repos in repo map do not exist"] + if delta_from: + msg += [" Source repos: " + ", ".join(sorted(delta_from))] + if delta_to: + msg += [" Destination repos: " + ", ".join(sorted(delta_to))] + raise oscerr.OscBaseError("\n".join(msg)) + else: + # no overlap between src and dst repos leads to the 'broken: missing repositories: ' message + if not src_repos & dst_repos: + msg = [ + "The source and the destination project do not have any repository names in common.", + "Use repo map to specify actual repository mapping.", + ] + raise oscerr.OscBaseError("\n".join(msg)) + if meta_change: src_meta = show_package_meta(apiurl, src_project, src_package_meta) dst_meta = replace_pkg_meta(src_meta, dst_package_meta, dst_project)