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 - [email protected]
+
+- Update to version 20250806.05cbe030:
+ * ttm/releaser.py: Fix check for config completeness
+
+-------------------------------------------------------------------
+Mon Aug 04 09:00:19 UTC 2025 - [email protected]
+
+- Update to version 20250804.a945653f:
+ * check_source.py: Skip name validation for mkosi builds
+
+-------------------------------------------------------------------
+Tue Jul 29 12:45:22 UTC 2025 - [email protected]
+
+- Update to version 20250729.e4cb814c:
+ * staging-installcheck: fix syntax failure introduced with 597d48be
+
+-------------------------------------------------------------------
+Tue Jul 29 08:10:45 UTC 2025 - [email protected]
+
+- Update to version 20250729.d25df07e:
+ * osclib: core: explicitly replace OBS instance prefix in
devel_project_fallback
+
+-------------------------------------------------------------------
+Mon Jul 28 15:36:37 UTC 2025 - [email protected]
+
+- 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 - [email protected]
+
+- Update to version 20250728.49d5752d:
+ * staging-installcheck: allow checking random devel projects
+
+-------------------------------------------------------------------
+Mon Jul 28 14:10:01 UTC 2025 - [email protected]
+
+- 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 - [email protected]
+
+- 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 - [email protected]
+
+- 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 - [email protected]
+
+- 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 [email protected]
[email protected] [email protected] [email protected]
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://[email protected]/
+ ./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 <[email protected]>
+Thu Aug 4 00:06:06 UTC 2021 - Wine Drinker <[email protected]>
- 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