Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package openSUSE-release-tools for openSUSE:Factory checked in at 2025-08-13 16:31:22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/openSUSE-release-tools (Old) and /work/SRC/openSUSE:Factory/.openSUSE-release-tools.new.1085 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openSUSE-release-tools" Wed Aug 13 16:31:22 2025 rev:537 rq:1299218 version:20250806.05cbe030 Changes: -------- --- /work/SRC/openSUSE:Factory/openSUSE-release-tools/openSUSE-release-tools.changes 2025-07-10 22:14:32.877702990 +0200 +++ /work/SRC/openSUSE:Factory/.openSUSE-release-tools.new.1085/openSUSE-release-tools.changes 2025-08-13 16:33:59.493121773 +0200 @@ -1,0 +2,64 @@ +Wed Aug 06 10:26:26 UTC 2025 - opensuse-releaset...@opensuse.org + +- Update to version 20250806.05cbe030: + * ttm/releaser.py: Fix check for config completeness + +------------------------------------------------------------------- +Mon Aug 04 09:00:19 UTC 2025 - opensuse-releaset...@opensuse.org + +- Update to version 20250804.a945653f: + * check_source.py: Skip name validation for mkosi builds + +------------------------------------------------------------------- +Tue Jul 29 12:45:22 UTC 2025 - opensuse-releaset...@opensuse.org + +- Update to version 20250729.e4cb814c: + * staging-installcheck: fix syntax failure introduced with 597d48be + +------------------------------------------------------------------- +Tue Jul 29 08:10:45 UTC 2025 - opensuse-releaset...@opensuse.org + +- Update to version 20250729.d25df07e: + * osclib: core: explicitly replace OBS instance prefix in devel_project_fallback + +------------------------------------------------------------------- +Mon Jul 28 15:36:37 UTC 2025 - opensuse-releaset...@opensuse.org + +- Update to version 20250728.2755573d: + * TTM: only publish override repos if publish_multiple_product_repo config is enabled + +------------------------------------------------------------------- +Mon Jul 28 14:32:03 UTC 2025 - opensuse-releaset...@opensuse.org + +- Update to version 20250728.49d5752d: + * staging-installcheck: allow checking random devel projects + +------------------------------------------------------------------- +Mon Jul 28 14:10:01 UTC 2025 - opensuse-releaset...@opensuse.org + +- Update to version 20250728.1772cc0c: + * Publish the each override repository + * TTM: do allow to override product_repo for ftp + +------------------------------------------------------------------- +Mon Jul 28 08:47:35 UTC 2025 - opensuse-releaset...@opensuse.org + +- Update to version 20250728.12e0bdc5: + * tests/maintenance_tests.py: Add test cases for maintainer submissions + * check_maintenance_incidents.py: Expand devel pkg roles for maintainer check + * tests/maintenance_tests.py: Refactor and fix + +------------------------------------------------------------------- +Fri Jul 25 08:48:23 UTC 2025 - opensuse-releaset...@opensuse.org + +- Update to version 20250725.9a33dc77: + * gocd/checkers.opensuse.gocd.yaml: Rewrite ssh://src.opensuse.org to https:// + +------------------------------------------------------------------- +Fri Jul 25 07:03:21 UTC 2025 - opensuse-releaset...@opensuse.org + +- Update to version 20250725.99e6a216: + * Make it a valid date as otherwise source_validator rejects it + * Fix flake8 warning + +------------------------------------------------------------------- Old: ---- openSUSE-release-tools-20250703.42999618.obscpio New: ---- openSUSE-release-tools-20250806.05cbe030.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openSUSE-release-tools.spec ++++++ --- /var/tmp/diff_new_pack.hfOAKp/_old 2025-08-13 16:34:01.705214518 +0200 +++ /var/tmp/diff_new_pack.hfOAKp/_new 2025-08-13 16:34:01.717215022 +0200 @@ -21,7 +21,7 @@ %define announcer_filename factory-package-news %define services osrt-slsa.target osrt-relpkggen@.timer osrt-relpkggen@.service osrt-pkglistgen@.timer osrt-pkglistgen@.service Name: openSUSE-release-tools -Version: 20250703.42999618 +Version: 20250806.05cbe030 Release: 0 Summary: Tools to aid in staging and release work for openSUSE/SUSE License: GPL-2.0-or-later AND MIT ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.hfOAKp/_old 2025-08-13 16:34:01.925223743 +0200 +++ /var/tmp/diff_new_pack.hfOAKp/_new 2025-08-13 16:34:01.953224917 +0200 @@ -1,7 +1,7 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/openSUSE/openSUSE-release-tools.git</param> - <param name="changesrevision">4299961884e1f29ced8366904e3f5a8b27a2c997</param> + <param name="changesrevision">05cbe0309ddca144b95303c2f14d43ccfdac075e</param> </service> </servicedata> ++++++ openSUSE-release-tools-20250703.42999618.obscpio -> openSUSE-release-tools-20250806.05cbe030.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20250703.42999618/check_maintenance_incidents.py new/openSUSE-release-tools-20250806.05cbe030/check_maintenance_incidents.py --- old/openSUSE-release-tools-20250703.42999618/check_maintenance_incidents.py 2025-07-03 17:11:10.000000000 +0200 +++ new/openSUSE-release-tools-20250806.05cbe030/check_maintenance_incidents.py 2025-08-06 12:24:49.000000000 +0200 @@ -12,6 +12,7 @@ from osclib.core import action_is_patchinfo, devel_project_get from osclib.core import owner_fallback from osclib.core import maintainers_get +from osclib.core import package_role_expand, project_role_expand import ReviewBot @@ -24,8 +25,8 @@ ReviewBot.ReviewBot.__init__(self, *args, **kwargs) self.review_messages = {} - def add_devel_project_review(self, req, package): - """ add devel project/package as reviewer """ + def get_pkg_for_review(self, req, package): + """ Return devel prj/pkg to use as reviewer""" a = req.actions[0] if action_is_patchinfo(a): a = req.actions[1] @@ -39,9 +40,7 @@ prj, pkg = devel_project_get(self.apiurl, "openSUSE:Factory", package.rpartition('.')[0]) logging.debug(f'using devel project {prj}/{pkg}') if prj is not None: - msg = f'Submission for {pkg} by someone who is not maintainer in the devel project ({prj}). Please review' - self.add_review(req, by_project=prj, by_package=pkg, msg=msg) - return + return prj, pkg # no devel project -- fallback to /search/owner?package -- OBS side "owner" prj/pkg search with pkg only fallback root = owner_fallback(self.apiurl, project, package) @@ -53,6 +52,15 @@ if prj.startswith('openSUSE:Leap') or prj.startswith('openSUSE:1'): self.logger.debug("%s looks wrong as maintainer, skipped", prj) continue + + return prj, pkg + + return None, None + + def add_devel_project_review(self, req, package): + """ add devel project/package as reviewer """ + prj, pkg = self.get_pkg_for_review(req, package) + if prj is not None: msg = f'Submission for {pkg} by someone who is not maintainer in the devel project ({prj}). Please review' self.add_review(req, by_project=prj, by_package=pkg, msg=msg) @@ -102,7 +110,14 @@ self.logger.info(f"{pkgname} submitted from {a.src_project}, no maintainer review needed") return - maintainers = set(maintainers_get(self.apiurl, project, pkgname)) + devprj, devpkg = self.get_pkg_for_review(req, pkgname) + if devpkg is not None: + maintainers = set(package_role_expand(self.apiurl, devprj, devpkg)) + elif devprj is not None: + maintainers = set(project_role_expand(self.apiurl, devprj)) + else: + maintainers = set(maintainers_get(self.apiurl, project, pkgname)) + if maintainers: known_maintainer = False for m in maintainers: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20250703.42999618/check_source.py new/openSUSE-release-tools-20250806.05cbe030/check_source.py --- old/openSUSE-release-tools-20250703.42999618/check_source.py 2025-07-03 17:11:10.000000000 +0200 +++ new/openSUSE-release-tools-20250806.05cbe030/check_source.py 2025-08-06 12:24:49.000000000 +0200 @@ -270,7 +270,8 @@ expected_name = target_package if filename == '_preinstallimage': expected_name = 'preinstallimage' - if not (filename.endswith('.kiwi') or filename == 'Dockerfile') and new_info['name'] != expected_name: + if not (filename.endswith('.kiwi') or filename == 'Dockerfile' or filename.endswith('mkosi.conf')) \ + and new_info['name'] != expected_name: shutil.rmtree(copath) self.review_messages['declined'] = ( f"A package submitted as {target_package} has to build as 'Name: {expected_name}' - found Name '{new_info['name']}'") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20250703.42999618/gocd/checkers.opensuse.gocd.yaml new/openSUSE-release-tools-20250806.05cbe030/gocd/checkers.opensuse.gocd.yaml --- old/openSUSE-release-tools-20250703.42999618/gocd/checkers.opensuse.gocd.yaml 2025-07-03 17:11:10.000000000 +0200 +++ new/openSUSE-release-tools-20250806.05cbe030/gocd/checkers.opensuse.gocd.yaml 2025-08-06 12:24:49.000000000 +0200 @@ -19,7 +19,9 @@ resources: - staging-bot tasks: - - script: ./check_source.py -A https://api.opensuse.org --verbose --skip-add-reviews --user factory-auto review + - script: |- + git config --global url.https://src.opensuse.org/.insteadof ssh://gi...@src.opensuse.org/ + ./check_source.py -A https://api.opensuse.org --verbose --skip-add-reviews --user factory-auto review openSUSE.MaintInstCheck: group: openSUSE.Checkers lock_behavior: unlockWhenFinished diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20250703.42999618/metrics.py new/openSUSE-release-tools-20250806.05cbe030/metrics.py --- old/openSUSE-release-tools-20250703.42999618/metrics.py 2025-07-03 17:11:10.000000000 +0200 +++ new/openSUSE-release-tools-20250806.05cbe030/metrics.py 2025-08-06 12:24:49.000000000 +0200 @@ -94,8 +94,9 @@ points = [] -def point(measurement, fields, datetime, tags={}, delta=False): - global points +def point(measurement, fields, datetime, tags=None, delta=False): + if tags is None: + tags = {} points.append(Point(measurement, tags, fields, timestamp(datetime), delta)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20250703.42999618/osclib/core.py new/openSUSE-release-tools-20250806.05cbe030/osclib/core.py --- old/openSUSE-release-tools-20250703.42999618/osclib/core.py 2025-07-03 17:11:10.000000000 +0200 +++ new/openSUSE-release-tools-20250806.05cbe030/osclib/core.py 2025-08-06 12:24:49.000000000 +0200 @@ -345,7 +345,7 @@ project, package = devel_project_get(apiurl, 'openSUSE.org:openSUSE:Factory', target_package) if project: # Strip openSUSE.org: prefix since string since not used for lookup. - project = project.split(':', 1)[1] + project = project.replace("openSUSE.org:", "", count=1) return project, package diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20250703.42999618/staging-installcheck.py new/openSUSE-release-tools-20250806.05cbe030/staging-installcheck.py --- old/openSUSE-release-tools-20250703.42999618/staging-installcheck.py 2025-07-03 17:11:10.000000000 +0200 +++ new/openSUSE-release-tools-20250806.05cbe030/staging-installcheck.py 2025-08-06 12:24:49.000000000 +0200 @@ -173,11 +173,9 @@ args = args.replace(',', ' ').split(' ') return set(args) - def staging(self, project, force=False): + def staging(self, project, repository, force=False, devel=False): api = self.api - repository = self.api.cmain_repo - # fetch the build ids at the beginning - mirroring takes a while buildids = {} try: @@ -216,20 +214,21 @@ result = True to_ignore = self.packages_to_ignore(project) - status = api.project_status(project) - if status is None: - self.logger.error(f'no project status for {project}') - return False + if not devel: + status = api.project_status(project) + if status is None: + self.logger.error(f'no project status for {project}') + return False - # collect packages to be deleted - to_delete = set() - for req in status.findall('staged_requests/request'): - if req.get('type') == 'delete': - to_delete |= self.pkg_with_multibuild_flavors(req.get('package')) - - for req in status.findall('staged_requests/request'): - if req.get('type') == 'delete': - result = self.check_delete_request(req, to_ignore, to_delete, result_comment) and result + # collect packages to be deleted + to_delete = set() + for req in status.findall('staged_requests/request'): + if req.get('type') == 'delete': + to_delete |= self.pkg_with_multibuild_flavors(req.get('package')) + + for req in status.findall('staged_requests/request'): + if req.get('type') == 'delete': + result = self.check_delete_request(req, to_ignore, to_delete, result_comment) and result for arch in architectures: # hit the first repository in the target project (if existant) @@ -279,13 +278,16 @@ result_comment.append(yaml.dump(duplicates, default_flow_style=False)) result = False - if result: - self.report_state('success', self.gocd_url(), project, repository, buildids) + if devel: + print(project, '\n'.join(result_comment)) else: - result_comment.insert(0, f'Generated from {self.gocd_url()}\n') - self.report_state('failure', self.upload_failure(project, result_comment), project, repository, buildids) - self.logger.warning(f'Not accepting {project}') - return False + if result: + self.report_state('success', self.gocd_url(), project, repository, buildids) + else: + result_comment.insert(0, f'Generated from {self.gocd_url()}\n') + self.report_state('failure', self.upload_failure(project, result_comment), project, repository, buildids) + self.logger.warning(f'Not accepting {project}') + return False return result @@ -403,6 +405,10 @@ description='Do an installcheck on staging project') parser.add_argument('-s', '--staging', type=str, default=None, help='staging project') + parser.add_argument('--devel', type=str, default=None, + help='devel project (ex GNOME:Factory)') + parser.add_argument('-r', '--repository', type=str, default=None, + help='repository to check, if not specified, use the staging configuration') parser.add_argument('-p', '--project', type=str, default='openSUSE:Factory', help='project to check (ex. openSUSE:Factory, openSUSE:Leap:15.1)') parser.add_argument('-d', '--debug', action='store_true', default=False, @@ -417,6 +423,8 @@ apiurl = osc.conf.config['apiurl'] config = Config.get(apiurl, args.project) api = StagingAPI(apiurl, args.project) + if not args.repository: + args.repository = api.cmain_repo staging_report = InstallChecker(api, config) if args.debug: @@ -425,10 +433,13 @@ logging.basicConfig(level=logging.INFO) if args.staging: - if not staging_report.staging(api.prj_from_short(args.staging), force=True): + if not staging_report.staging(api.prj_from_short(args.staging), repository=args.repository, force=True): + sys.exit(1) + elif args.devel: + if not staging_report.staging(args.devel, repository=args.repository, force=True, devel=True): sys.exit(1) else: for staging in api.get_staging_projects(): if api.is_adi_project(staging): - staging_report.staging(staging) + staging_report.staging(staging, repository=args.repository) sys.exit(0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20250703.42999618/tests/fixtures/packages/wine/wine.changes new/openSUSE-release-tools-20250806.05cbe030/tests/fixtures/packages/wine/wine.changes --- old/openSUSE-release-tools-20250703.42999618/tests/fixtures/packages/wine/wine.changes 2025-07-03 17:11:10.000000000 +0200 +++ new/openSUSE-release-tools-20250806.05cbe030/tests/fixtures/packages/wine/wine.changes 2025-08-06 12:24:49.000000000 +0200 @@ -1,5 +1,5 @@ ------------------------------------------------------------------- -Thu Aug 4 00:06:66 UTC 2021 - Wine Drinker <win...@notanemulator.com> +Thu Aug 4 00:06:06 UTC 2021 - Wine Drinker <win...@notanemulator.com> - Initial version. - 1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20250703.42999618/tests/maintenance_tests.py new/openSUSE-release-tools-20250806.05cbe030/tests/maintenance_tests.py --- old/openSUSE-release-tools-20250703.42999618/tests/maintenance_tests.py 2025-07-03 17:11:10.000000000 +0200 +++ new/openSUSE-release-tools-20250806.05cbe030/tests/maintenance_tests.py 2025-08-06 12:24:49.000000000 +0200 @@ -31,15 +31,108 @@ logger=self.logger) self.checker.override_allow = False # Test setup cannot handle. - def test_non_maintainer_submit(self): - """same as above but already has devel project as reviewer - """ + httpretty.register_uri(httpretty.GET, + APIURL + "/source/home:brassh/mysql-workbench", + match_querystring=True, + body=""" + <directory name="mysql-workbench" rev="6" vrev="6" srcmd5="858204decf53f923d5574dbe6ae63b15"> + <linkinfo project="openSUSE:13.2" package="mysql-workbench" srcmd5="ed9c3b12388cbd14868eb3faabe34685" + baserev="ed9c3b12388cbd14868eb3faabe34685" xsrcmd5="08bfb4f40cb1e2de8f9cd4633bf02eb1" + lsrcmd5="858204decf53f923d5574dbe6ae63b15" /> + <serviceinfo code="succeeded" xsrcmd5="6ec4305a8e5363e26a7f4895a0ae12d2" /> + <entry name="_link" md5="85ef5fb38ca1ec7c300311fda9f4b3d1" size="121" mtime="1414567341" /> + <entry name="mysql-workbench-community-6.1.7-src.tar.gz" md5="ac059e239869fb77bf5d7a1f5845a8af" + size="24750696" mtime="1404405925" /> + <entry name="mysql-workbench-ctemplate.patch" md5="06ccba1f8275cd9408f515828ecede19" size="1322" mtime="1404658323" /> + <entry name="mysql-workbench-glib.patch" md5="67fd7d8e3503ce0909381bde747c8a1e" size="1785" mtime="1415732509" /> + <entry name="mysql-workbench-mysql_options4.patch" md5="9c07dfe1b94af95daf3e16bd6a161684" + size="910" mtime="1404658324" /> + <entry name="mysql-workbench-no-check-for-updates.patch" md5="1f0c9514ff8218d361ea46d3031b2b64" + size="1139" mtime="1404658324" /> + <entry name="mysql-workbench.changes" md5="26bc54777e6a261816b72f64c69630e4" size="13354" mtime="1415747835" /> + <entry name="mysql-workbench.spec" md5="88b562a93f01b842a5798f809e3c8188" size="7489" mtime="1415745943" /> + <entry name="openSUSE_(Vendor_Package).xml" md5="ab041af98d7748c216e7e5787ec36f65" + size="743" mtime="1315923090" /> + <entry name="patch-desktop-categories.patch" md5="c24b3283573c34a5e072be122388f8e1" + size="391" mtime="1376991147" /> + </directory> + """) + + httpretty.register_uri(httpretty.GET, + APIURL + "/source/openSUSE:Factory/mysql-workbench/_meta", + match_querystring=True, + body=""" + <package name="mysql-workbench" project="openSUSE:Factory"> + <title>MySQL Workbench</title> + <description>UI for MySQL server</description> + <devel project="server:database" package="mysql-workbench"/> + </package> + """) + + httpretty.register_uri(httpretty.GET, + APIURL + "/source/server:database/mysql-workbench/_meta", + match_querystring=True, + body=""" + <package name="mysql-workbench" project="server:database"> + <title>MySQL Workbench</title> + <description>UI for MySQL server</description> + <person userid="Gankov" role="maintainer"/> + <person userid="bruno_friedmann" role="maintainer"/> + </package> + """) + + httpretty.register_uri(httpretty.GET, + APIURL + "/source/server:database/_meta", + match_querystring=True, + body=""" + <project name="server:database"> + <title>Databases</title> + <description>Server Database software</description> + <group groupid="factory-maintainers" role="maintainer"/> + </project> + """) + + httpretty.register_uri(httpretty.GET, + APIURL + "/group/factory-maintainers", + match_querystring=True, + body=""" + <group> + <title>factory-maintainers</title> + <maintainer userid="dimstar_suse"/> + <maintainer userid="maxlin_factory"/> + <person> + <person userid="factory-maintainer"/> + <person userid="dimstar_suse"/> + </person> + </group> + """) + + httpretty.register_uri(httpretty.GET, + APIURL + "/search/owner?project=openSUSE:13.2:Update&binary=mysql-workbench", + match_querystring=True, + body=""" + <collection/> + """) + + httpretty.register_uri(httpretty.GET, + APIURL + "/search/owner?binary=mysql-workbench", + match_querystring=True, + body=""" + <collection> + <owner rootproject="openSUSE" project="server:database" package="mysql-workbench"> + <person name="Gankov" role="maintainer"/> + <person name="bruno_friedmann" role="maintainer"/> + </owner> + </collection> + """) + + def test_maintainer_submit(self): httpretty.register_uri(httpretty.GET, APIURL + '/search/request', body=""" <collection matches="1"> - <request id="261355" creator="brassh"> + <request id="261355" creator="bruno_friedmann"> <action type="maintenance_incident"> <source project="home:brassh" package="mysql-workbench" rev="857c77d2ba1d347b6dc50a1e5bcb74e1"/> <target project="openSUSE:Maintenance" releaseproject="openSUSE:13.2:Update"/> @@ -50,7 +143,7 @@ <review state="new" by_user="maintbot"> <comment></comment> </review> - <history who="brassh" when="2014-11-13T09:18:19"> + <history who="bruno_friedmann" when="2014-11-13T09:18:19"> <description>Request created</description> <comment>...</comment> </history> @@ -66,7 +159,7 @@ APIURL + "/request/261355", match_querystring=True, body=""" - <request id="261355" creator="brassh"> + <request id="261355" creator="bruno_friedmann"> <action type="maintenance_incident"> <source project="home:brassh" package="mysql-workbench" rev="857c77d2ba1d347b6dc50a1e5bcb74e1"/> <target project="openSUSE:Maintenance" releaseproject="openSUSE:13.2:Update"/> @@ -77,7 +170,7 @@ <review state="new" by_user="maintbot"> <comment></comment> </review> - <history who="brassh" when="2014-11-13T09:18:19"> + <history who="bruno_friedmann" when="2014-11-13T09:18:19"> <description>Request created</description> <comment>...</comment> </history> @@ -88,49 +181,84 @@ </request> """) + result = {'devel_review_added': None} + + def change_request(result, method, uri, headers): + query = parse_qs(urlparse(uri).query) + if query == {'by_package': ['mysql-workbench'], 'cmd': ['addreview'], 'by_project': ['server:database']}: + result['devel_review_added'] = True + return (200, headers, '<status code="ok"/>') + + httpretty.register_uri(httpretty.POST, + APIURL + "/request/261355", + body=lambda method, uri, headers: change_request(result, method, uri, headers)) + + self.checker.requests = [] + self.checker.set_request_ids_search_review() + self.checker.check_requests() + + self.assertFalse(result['devel_review_added']) + + def test_prj_maintainer_submit(self): + httpretty.register_uri(httpretty.GET, - APIURL + "/source/home:brassh/mysql-workbench", - match_querystring=True, + APIURL + '/search/request', body=""" - <directory name="mysql-workbench" rev="6" vrev="6" srcmd5="858204decf53f923d5574dbe6ae63b15"> - <linkinfo project="openSUSE:13.2" package="mysql-workbench" srcmd5="ed9c3b12388cbd14868eb3faabe34685" - baserev="ed9c3b12388cbd14868eb3faabe34685" xsrcmd5="08bfb4f40cb1e2de8f9cd4633bf02eb1" - lsrcmd5="858204decf53f923d5574dbe6ae63b15" /> - <serviceinfo code="succeeded" xsrcmd5="6ec4305a8e5363e26a7f4895a0ae12d2" /> - <entry name="_link" md5="85ef5fb38ca1ec7c300311fda9f4b3d1" size="121" mtime="1414567341" /> - <entry name="mysql-workbench-community-6.1.7-src.tar.gz" md5="ac059e239869fb77bf5d7a1f5845a8af" - size="24750696" mtime="1404405925" /> - <entry name="mysql-workbench-ctemplate.patch" md5="06ccba1f8275cd9408f515828ecede19" size="1322" mtime="1404658323" /> - <entry name="mysql-workbench-glib.patch" md5="67fd7d8e3503ce0909381bde747c8a1e" size="1785" mtime="1415732509" /> - <entry name="mysql-workbench-mysql_options4.patch" md5="9c07dfe1b94af95daf3e16bd6a161684" - size="910" mtime="1404658324" /> - <entry name="mysql-workbench-no-check-for-updates.patch" md5="1f0c9514ff8218d361ea46d3031b2b64" - size="1139" mtime="1404658324" /> - <entry name="mysql-workbench.changes" md5="26bc54777e6a261816b72f64c69630e4" size="13354" mtime="1415747835" /> - <entry name="mysql-workbench.spec" md5="88b562a93f01b842a5798f809e3c8188" size="7489" mtime="1415745943" /> - <entry name="openSUSE_(Vendor_Package).xml" md5="ab041af98d7748c216e7e5787ec36f65" - size="743" mtime="1315923090" /> - <entry name="patch-desktop-categories.patch" md5="c24b3283573c34a5e072be122388f8e1" - size="391" mtime="1376991147" /> - </directory> + <collection matches="1"> + <request id="261355" creator="factory-maintainer"> + <action type="maintenance_incident"> + <source project="home:brassh" package="mysql-workbench" rev="857c77d2ba1d347b6dc50a1e5bcb74e1"/> + <target project="openSUSE:Maintenance" releaseproject="openSUSE:13.2:Update"/> + </action> + <state name="review" who="lnussel_factory" when="2014-11-13T10:46:52"> + <comment></comment> + </state> + <review state="new" by_user="maintbot"> + <comment></comment> + </review> + <history who="factory-maintainer" when="2014-11-13T09:18:19"> + <description>Request created</description> + <comment>...</comment> + </history> + <history who="lnussel_factory" when="2014-11-13T10:46:52"> + <description>Request got a new review request</description> + </history> + <description>...</description> + </request> + </collection> """) httpretty.register_uri(httpretty.GET, - APIURL + "/source/openSUSE:Factory/mysql-workbench/_meta", + APIURL + "/request/261355", match_querystring=True, body=""" - <package name="mysql-workbench" project="openSUSE:Factory"> - <title>MySQL Workbench</title> - <description>UI for MySQL server</description> - <devel project="server:database" package="mysql-workbench"/> - </package> + <request id="261355" creator="factory-maintainer"> + <action type="maintenance_incident"> + <source project="home:brassh" package="mysql-workbench" rev="857c77d2ba1d347b6dc50a1e5bcb74e1"/> + <target project="openSUSE:Maintenance" releaseproject="openSUSE:13.2:Update"/> + </action> + <state name="review" who="lnussel_factory" when="2014-11-13T10:46:52"> + <comment></comment> + </state> + <review state="new" by_user="maintbot"> + <comment></comment> + </review> + <history who="factory-maintainer" when="2014-11-13T09:18:19"> + <description>Request created</description> + <comment>...</comment> + </history> + <history who="lnussel_factory" when="2014-11-13T10:46:52"> + <description>Request got a new review request</description> + </history> + <description>...</description> + </request> """) result = {'devel_review_added': None} def change_request(result, method, uri, headers): query = parse_qs(urlparse(uri).query) - if query == {'by_user': ['maintbot'], 'cmd': ['changereviewstate'], 'newstate': ['accepted']}: + if query == {'by_package': ['mysql-workbench'], 'cmd': ['addreview'], 'by_project': ['server:database']}: result['devel_review_added'] = True return (200, headers, '<status code="ok"/>') @@ -138,30 +266,89 @@ APIURL + "/request/261355", body=lambda method, uri, headers: change_request(result, method, uri, headers)) + self.checker.requests = [] + self.checker.set_request_ids_search_review() + self.checker.check_requests() + + self.assertFalse(result['devel_review_added']) + + def test_non_maintainer_submit(self): + """same as above but already has devel project as reviewer + """ + httpretty.register_uri(httpretty.GET, - APIURL + "/search/owner?project=openSUSE:13.2:Update&binary=mysql-workbench", - match_querystring=True, + APIURL + '/search/request', body=""" - <collection/> + <collection matches="1"> + <request id="261355" creator="brassh"> + <action type="maintenance_incident"> + <source project="home:brassh" package="mysql-workbench" rev="857c77d2ba1d347b6dc50a1e5bcb74e1"/> + <target project="openSUSE:Maintenance" releaseproject="openSUSE:13.2:Update"/> + </action> + <state name="review" who="lnussel_factory" when="2014-11-13T10:46:52"> + <comment></comment> + </state> + <review state="new" by_user="maintbot"> + <comment></comment> + </review> + <review state="new" by_package="mysql-workbench" by_project="server:database"> + <comment>review by devel project</comment> + </review> + <history who="brassh" when="2014-11-13T09:18:19"> + <description>Request created</description> + <comment>...</comment> + </history> + <history who="lnussel_factory" when="2014-11-13T10:46:52"> + <description>Request got a new review request</description> + </history> + <description>...</description> + </request> + </collection> """) httpretty.register_uri(httpretty.GET, - APIURL + "/search/owner?binary=mysql-workbench", + APIURL + "/request/261355", match_querystring=True, body=""" - <collection> - <owner rootproject="openSUSE" project="server:database" package="mysql-workbench"> - <person name="Gankov" role="maintainer"/> - <person name="bruno_friedmann" role="maintainer"/> - </owner> - </collection> + <request id="261355" creator="brassh"> + <action type="maintenance_incident"> + <source project="home:brassh" package="mysql-workbench" rev="857c77d2ba1d347b6dc50a1e5bcb74e1"/> + <target project="openSUSE:Maintenance" releaseproject="openSUSE:13.2:Update"/> + </action> + <state name="review" who="lnussel_factory" when="2014-11-13T10:46:52"> + <comment></comment> + </state> + <review state="new" by_user="maintbot"> + <comment></comment> + </review> + <history who="brassh" when="2014-11-13T09:18:19"> + <description>Request created</description> + <comment>...</comment> + </history> + <history who="lnussel_factory" when="2014-11-13T10:46:52"> + <description>Request got a new review request</description> + </history> + <description>...</description> + </request> """) + result = {'devel_review_added': None} + + def change_request(result, method, uri, headers): + query = parse_qs(urlparse(uri).query) + if query == {'by_package': ['mysql-workbench'], 'cmd': ['addreview'], 'by_project': ['server:database']}: + result['devel_review_added'] = True + return (200, headers, '<status code="ok"/>') + + httpretty.register_uri(httpretty.POST, + APIURL + "/request/261355", + body=lambda method, uri, headers: change_request(result, method, uri, headers)) + self.checker.requests = [] self.checker.set_request_ids_search_review() self.checker.check_requests() - self.assertTrue(result['devel_review_added']) + self.assertFalse(result['devel_review_added']) def test_non_maintainer_double_review(self): @@ -224,42 +411,11 @@ </request> """) - httpretty.register_uri(httpretty.GET, - APIURL + "/source/home:brassh/mysql-workbench", - match_querystring=True, - body=""" - <directory name="mysql-workbench" rev="6" vrev="6" srcmd5="858204decf53f923d5574dbe6ae63b15"> - <linkinfo project="openSUSE:13.2" package="mysql-workbench" - srcmd5="ed9c3b12388cbd14868eb3faabe34685" baserev="ed9c3b12388cbd14868eb3faabe34685" - xsrcmd5="08bfb4f40cb1e2de8f9cd4633bf02eb1" lsrcmd5="858204decf53f923d5574dbe6ae63b15" /> - <serviceinfo code="succeeded" xsrcmd5="6ec4305a8e5363e26a7f4895a0ae12d2" /> - <entry name="_link" md5="85ef5fb38ca1ec7c300311fda9f4b3d1" size="121" mtime="1414567341" /> - <entry name="mysql-workbench-community-6.1.7-src.tar.gz" md5="ac059e239869fb77bf5d7a1f5845a8af" - size="24750696" mtime="1404405925" /> - <entry name="mysql-workbench-ctemplate.patch" md5="06ccba1f8275cd9408f515828ecede19" - size="1322" mtime="1404658323" /> - <entry name="mysql-workbench-glib.patch" md5="67fd7d8e3503ce0909381bde747c8a1e" - size="1785" mtime="1415732509" /> - <entry name="mysql-workbench-mysql_options4.patch" md5="9c07dfe1b94af95daf3e16bd6a161684" - size="910" mtime="1404658324" /> - <entry name="mysql-workbench-no-check-for-updates.patch" md5="1f0c9514ff8218d361ea46d3031b2b64" - size="1139" mtime="1404658324" /> - <entry name="mysql-workbench.changes" md5="26bc54777e6a261816b72f64c69630e4" - size="13354" mtime="1415747835" /> - <entry name="mysql-workbench.spec" md5="88b562a93f01b842a5798f809e3c8188" - size="7489" mtime="1415745943" /> - <entry name="openSUSE_(Vendor_Package).xml" md5="ab041af98d7748c216e7e5787ec36f65" - size="743" mtime="1315923090" /> - <entry name="patch-desktop-categories.patch" md5="c24b3283573c34a5e072be122388f8e1" - size="391" mtime="1376991147" /> - </directory> - """) - result = {'devel_review_added': None} def change_request(result, method, uri, headers): - u = urlparse(uri) - if u.query == 'by_package=mysql-workbench&cmd=addreview&by_project=server%3Adatabase': + query = parse_qs(urlparse(uri).query) + if query == {'by_package': ['mysql-workbench'], 'cmd': ['addreview'], 'by_project': ['server:database']}: result['devel_review_added'] = True return (200, headers, '<status code="ok"/>') @@ -267,25 +423,6 @@ APIURL + "/request/261355", body=lambda method, uri, headers: change_request(result, method, uri, headers)) - httpretty.register_uri(httpretty.GET, - APIURL + "/search/owner?project=openSUSE:13.2:Update&binary=mysql-workbench", - match_querystring=True, - body=""" - <collection/> - """) - - httpretty.register_uri(httpretty.GET, - APIURL + "/search/owner?binary=mysql-workbench", - match_querystring=True, - body=""" - <collection> - <owner rootproject="openSUSE" project="server:database" package="mysql-workbench"> - <person name="Gankov" role="maintainer"/> - <person name="bruno_friedmann" role="maintainer"/> - </owner> - </collection> - """) - self.checker.requests = [] self.checker.set_request_ids_search_review() self.checker.check_requests() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20250703.42999618/ttm/publisher.py new/openSUSE-release-tools-20250806.05cbe030/ttm/publisher.py --- old/openSUSE-release-tools-20250703.42999618/ttm/publisher.py 2025-07-03 17:11:10.000000000 +0200 +++ new/openSUSE-release-tools-20250806.05cbe030/ttm/publisher.py 2025-08-06 12:24:49.000000000 +0200 @@ -305,6 +305,10 @@ self.api.switch_flag_in_prj( self.project.test_project, flag='publish', state='enable', repository=self.project.product_repo) + if self.project.publish_multiple_product_repo and len(self.project.product_repo_overrides): + for key, value in self.project.product_repo_overrides.items(): + self.api.switch_flag_in_prj(self.project.test_project, flag='publish', + state='enable', repository=value) if self.project.totest_images_repo != self.project.product_repo: self.logger.info('Publish test project content (image_products)') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20250703.42999618/ttm/releaser.py new/openSUSE-release-tools-20250806.05cbe030/ttm/releaser.py --- old/openSUSE-release-tools-20250703.42999618/ttm/releaser.py 2025-07-03 17:11:10.000000000 +0200 +++ new/openSUSE-release-tools-20250806.05cbe030/ttm/releaser.py 2025-08-06 12:24:49.000000000 +0200 @@ -81,7 +81,9 @@ # as well as agama-installer if 'productcompose' in self.project.main_products[0] and\ 'productcompose' in self.project.ftp_products[0]: - return self.productcompose_build_version(self.project.name, self.project.ftp_products[0]) + return self.productcompose_build_version(self.project.name, self.project.ftp_products[0], + repo=self.project.product_repo_overrides.get(self.project.ftp_products[0], + self.project.product_repo)) return self.iso_build_version(self.project.name, self.project.main_products[0]) return self.iso_build_version(self.project.name, self.project.image_products[0].package, @@ -146,6 +148,9 @@ products[image_product.package] = image_product.archs all_found = self.verify_package_list_complete(self.project.product_repo, products) + if len(self.project.product_repo_overrides): + for key, value in self.project.product_repo_overrides.items(): + all_found = self.verify_package_list_complete(value, products) and all_found # Then for containerfile_products if self.project.containerfile_products: @@ -212,7 +217,9 @@ prjresult = ET.parse(resultxml).getroot() for product in self.project.ftp_products + self.project.main_products: - if not self.package_ok(prjresult, self.project.name, product, self.project.product_repo, self.project.product_arch): + if not self.package_ok(prjresult, self.project.name, product, + self.project.product_repo_overrides.get(product, self.project.product_repo), + self.project.product_arch): all_ok = False # agama-installer in Leap uses images repo as source repo as well as target repo @@ -250,7 +257,9 @@ product_version = self.get_product_version() if product_version is not None: for product in self.project.ftp_products: - for binary in self.binaries_of_product(self.project.name, product): + for binary in self.binaries_of_product(self.project.name, product, + repo=self.project.product_repo_overrides.get( + product, self.project.product_repo)): # The NonOSS tree doesn't include the version... if binary.endswith('.report') and 'NonOss' not in binary and product_version not in binary: self.logger.debug(f'{binary} in {product} does not include {product_version}') @@ -293,7 +302,9 @@ if len(self.project.main_products): for product in self.project.ftp_products: - self.release_package(self.project.name, product, repository=self.project.product_repo) + self.release_package(self.project.name, product, + repository=self.project.product_repo_overrides.get( + product, self.project.product_repo)) for cd in self.project.main_products: self.release_package(self.project.name, cd, set_release=set_release, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20250703.42999618/ttm/totest.py new/openSUSE-release-tools-20250806.05cbe030/ttm/totest.py --- old/openSUSE-release-tools-20250703.42999618/ttm/totest.py 2025-07-03 17:11:10.000000000 +0200 +++ new/openSUSE-release-tools-20250806.05cbe030/ttm/totest.py 2025-08-06 12:24:49.000000000 +0200 @@ -9,6 +9,7 @@ # Distribute under GPLv2 or GPLv3 import yaml +import re from osclib.core import attribute_value_load @@ -48,6 +49,9 @@ self.containerfile_products = [] self.livecd_products = [] self.image_products = [] + self.product_repo_overrides = {} + # publish the default product_repo, ignore product_repo_overrides + self.publish_multiple_product_repo = False self.test_subproject = 'ToTest' self.base = project.split(':')[0] @@ -68,6 +72,15 @@ if self.totest_images_repo is None: self.totest_images_repo = self.product_repo + # do allow to override repository for ftp product + ftp_products_copy = self.ftp_products.copy() + for product in ftp_products_copy: + extract_product = re.search(r"(.+)/product_repo:(.+)", product) + if extract_product: + self.ftp_products.remove(product) + self.ftp_products.append(extract_product.group(1)) + self.product_repo_overrides[extract_product.group(1)] = extract_product.group(2) + def parse_images(self, products): parsed = [] for package in products: ++++++ openSUSE-release-tools.obsinfo ++++++ --- /var/tmp/diff_new_pack.hfOAKp/_old 2025-08-13 16:34:06.157401182 +0200 +++ /var/tmp/diff_new_pack.hfOAKp/_new 2025-08-13 16:34:06.161401350 +0200 @@ -1,5 +1,5 @@ name: openSUSE-release-tools -version: 20250703.42999618 -mtime: 1751555470 -commit: 4299961884e1f29ced8366904e3f5a8b27a2c997 +version: 20250806.05cbe030 +mtime: 1754475889 +commit: 05cbe0309ddca144b95303c2f14d43ccfdac075e