Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-python-gitlab for
openSUSE:Factory checked in at 2026-01-13 21:35:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-python-gitlab (Old)
and /work/SRC/openSUSE:Factory/.python-python-gitlab.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-python-gitlab"
Tue Jan 13 21:35:07 2026 rev:28 rq:1327011 version:7.1.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-python-gitlab/python-python-gitlab.changes
2025-11-03 18:56:43.101607928 +0100
+++
/work/SRC/openSUSE:Factory/.python-python-gitlab.new.1928/python-python-gitlab.changes
2026-01-13 21:35:34.470499216 +0100
@@ -1,0 +2,17 @@
+Tue Jan 13 06:25:17 UTC 2026 - Johannes Kastl
<[email protected]>
+
+- update to 7.1.0:
+ * Bug Fixes
+ - utils: Prevent negative sleep time in rate limit retry
+ (4221195)
+ * Continuous Integration
+ - release: Use the correct token for publish to GitHub
+ (614a74c)
+ * Features
+ - registry-protection: Add support for registry protection rule
+ deletion (9dd62c3)
+ * Testing
+ - functional: Update to GitLab 18.6 and resolve issues found
+ (c7c139b)
+
+-------------------------------------------------------------------
Old:
----
python_gitlab-7.0.0.tar.gz
New:
----
python_gitlab-7.1.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-python-gitlab.spec ++++++
--- /var/tmp/diff_new_pack.15VhL3/_old 2026-01-13 21:35:35.590545477 +0100
+++ /var/tmp/diff_new_pack.15VhL3/_new 2026-01-13 21:35:35.594545643 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-python-gitlab
#
-# Copyright (c) 2025 SUSE LLC and contributors
+# Copyright (c) 2026 SUSE LLC and contributors
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
Name: python-python-gitlab
-Version: 7.0.0
+Version: 7.1.0
Release: 0
Summary: Python module for interacting with the GitLab API
License: LGPL-3.0-only
++++++ python_gitlab-7.0.0.tar.gz -> python_gitlab-7.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_gitlab-7.0.0/CHANGELOG.md
new/python_gitlab-7.1.0/CHANGELOG.md
--- old/python_gitlab-7.0.0/CHANGELOG.md 2025-10-29 16:05:36.000000000
+0100
+++ new/python_gitlab-7.1.0/CHANGELOG.md 2025-12-28 02:26:37.000000000
+0100
@@ -2,6 +2,29 @@
All versions below are listed in reverse chronological order.
+## v7.1.0 (2025-12-28)
+
+### Bug Fixes
+
+- **utils**: Prevent negative sleep time in rate limit retry
+
([`4221195`](https://github.com/python-gitlab/python-gitlab/commit/422119576287de30e1b70411c7ab0bbe39231af7))
+
+### Continuous Integration
+
+- **release**: Use the correct token for publish to GitHub
+
([`614a74c`](https://github.com/python-gitlab/python-gitlab/commit/614a74c00f027f70b8e48a6b2a2ddcd3f823bffa))
+
+### Features
+
+- **registry-protection**: Add support for registry protection rule deletion
+
([`9dd62c3`](https://github.com/python-gitlab/python-gitlab/commit/9dd62c3f5bcf3e082c2733bd4edc068f993c22ec))
+
+### Testing
+
+- **functional**: Update to GitLab 18.6 and resolve issues found
+
([`c7c139b`](https://github.com/python-gitlab/python-gitlab/commit/c7c139b9e7823ec1800a819233aee469355ee8d1))
+
+
## v7.0.0 (2025-10-29)
### Features
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_gitlab-7.0.0/PKG-INFO
new/python_gitlab-7.1.0/PKG-INFO
--- old/python_gitlab-7.0.0/PKG-INFO 2025-10-29 16:05:42.511960300 +0100
+++ new/python_gitlab-7.1.0/PKG-INFO 2025-12-28 02:26:43.908252500 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: python-gitlab
-Version: 7.0.0
+Version: 7.1.0
Summary: The python wrapper for the GitLab REST and GraphQL APIs.
Author-email: Gauvain Pocentek <[email protected]>
Maintainer-email: John Villalovos <[email protected]>, Max Wittig
<[email protected]>, Nejc Habjan <[email protected]>, Roger Meier
<[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_gitlab-7.0.0/gitlab/_version.py
new/python_gitlab-7.1.0/gitlab/_version.py
--- old/python_gitlab-7.0.0/gitlab/_version.py 2025-10-29 16:05:36.000000000
+0100
+++ new/python_gitlab-7.1.0/gitlab/_version.py 2025-12-28 02:26:37.000000000
+0100
@@ -3,4 +3,4 @@
__email__ = "[email protected]"
__license__ = "LGPL3"
__title__ = "python-gitlab"
-__version__ = "7.0.0"
+__version__ = "7.1.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_gitlab-7.0.0/gitlab/utils.py
new/python_gitlab-7.1.0/gitlab/utils.py
--- old/python_gitlab-7.0.0/gitlab/utils.py 2025-10-29 16:05:25.000000000
+0100
+++ new/python_gitlab-7.1.0/gitlab/utils.py 2025-12-28 02:26:27.000000000
+0100
@@ -133,7 +133,7 @@
if "Retry-After" in headers:
wait_time = int(headers["Retry-After"])
elif "RateLimit-Reset" in headers:
- wait_time = int(headers["RateLimit-Reset"]) - time.time()
+ wait_time = max(0, int(headers["RateLimit-Reset"]) -
time.time())
self.cur_retries += 1
time.sleep(wait_time)
return True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_gitlab-7.0.0/gitlab/v4/objects/registry_protection_repository_rules.py
new/python_gitlab-7.1.0/gitlab/v4/objects/registry_protection_repository_rules.py
---
old/python_gitlab-7.0.0/gitlab/v4/objects/registry_protection_repository_rules.py
2025-10-29 16:05:25.000000000 +0100
+++
new/python_gitlab-7.1.0/gitlab/v4/objects/registry_protection_repository_rules.py
2025-12-28 02:26:27.000000000 +0100
@@ -1,5 +1,12 @@
from gitlab.base import RESTObject
-from gitlab.mixins import CreateMixin, ListMixin, SaveMixin, UpdateMethod,
UpdateMixin
+from gitlab.mixins import (
+ CreateMixin,
+ DeleteMixin,
+ ListMixin,
+ SaveMixin,
+ UpdateMethod,
+ UpdateMixin,
+)
from gitlab.types import RequiredOptional
__all__ = [
@@ -16,6 +23,7 @@
ListMixin[ProjectRegistryRepositoryProtectionRule],
CreateMixin[ProjectRegistryRepositoryProtectionRule],
UpdateMixin[ProjectRegistryRepositoryProtectionRule],
+ DeleteMixin[ProjectRegistryRepositoryProtectionRule],
):
_path = "/projects/{project_id}/registry/protection/repository/rules"
_obj_cls = ProjectRegistryRepositoryProtectionRule
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_gitlab-7.0.0/python_gitlab.egg-info/PKG-INFO
new/python_gitlab-7.1.0/python_gitlab.egg-info/PKG-INFO
--- old/python_gitlab-7.0.0/python_gitlab.egg-info/PKG-INFO 2025-10-29
16:05:42.000000000 +0100
+++ new/python_gitlab-7.1.0/python_gitlab.egg-info/PKG-INFO 2025-12-28
02:26:43.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: python-gitlab
-Version: 7.0.0
+Version: 7.1.0
Summary: The python wrapper for the GitLab REST and GraphQL APIs.
Author-email: Gauvain Pocentek <[email protected]>
Maintainer-email: John Villalovos <[email protected]>, Max Wittig
<[email protected]>, Nejc Habjan <[email protected]>, Roger Meier
<[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_gitlab-7.0.0/requirements-docker.txt
new/python_gitlab-7.1.0/requirements-docker.txt
--- old/python_gitlab-7.0.0/requirements-docker.txt 2025-10-29
16:05:25.000000000 +0100
+++ new/python_gitlab-7.1.0/requirements-docker.txt 2025-12-28
02:26:27.000000000 +0100
@@ -1,3 +1,3 @@
-r requirements.txt
-r requirements-test.txt
-pytest-docker==3.2.3
+pytest-docker==3.2.5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_gitlab-7.0.0/requirements-docs.txt
new/python_gitlab-7.1.0/requirements-docs.txt
--- old/python_gitlab-7.0.0/requirements-docs.txt 2025-10-29
16:05:25.000000000 +0100
+++ new/python_gitlab-7.1.0/requirements-docs.txt 2025-12-28
02:26:27.000000000 +0100
@@ -1,5 +1,5 @@
-r requirements.txt
-furo==2025.9.25
+furo==2025.12.19
jinja2==3.1.6
myst-parser==4.0.1
sphinx==8.2.3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_gitlab-7.0.0/requirements-lint.txt
new/python_gitlab-7.1.0/requirements-lint.txt
--- old/python_gitlab-7.0.0/requirements-lint.txt 2025-10-29
16:05:25.000000000 +0100
+++ new/python_gitlab-7.1.0/requirements-lint.txt 2025-12-28
02:26:27.000000000 +0100
@@ -1,14 +1,14 @@
-r requirements.txt
argcomplete==2.0.0
-black==25.9.0
-commitizen==4.9.1
+black==25.12.0
+commitizen==4.10.1
flake8==7.3.0
isort==7.0.0
-mypy==1.18.2
-pylint==4.0.1
-pytest==8.4.2
+mypy==1.19.1
+pylint==4.0.4
+pytest==9.0.2
responses==0.25.8
respx==0.22.0
types-PyYAML==6.0.12.20250915
types-requests==2.32.4.20250913
-types-setuptools==80.9.0.20250822
+types-setuptools==80.9.0.20251221
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_gitlab-7.0.0/requirements-precommit.txt
new/python_gitlab-7.1.0/requirements-precommit.txt
--- old/python_gitlab-7.0.0/requirements-precommit.txt 2025-10-29
16:05:25.000000000 +0100
+++ new/python_gitlab-7.1.0/requirements-precommit.txt 2025-12-28
02:26:27.000000000 +0100
@@ -1 +1 @@
-pre-commit==4.3.0
+pre-commit==4.5.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_gitlab-7.0.0/requirements-test.txt
new/python_gitlab-7.1.0/requirements-test.txt
--- old/python_gitlab-7.0.0/requirements-test.txt 2025-10-29
16:05:25.000000000 +0100
+++ new/python_gitlab-7.1.0/requirements-test.txt 2025-12-28
02:26:27.000000000 +0100
@@ -1,13 +1,13 @@
-r requirements.txt
-anyio==4.11.0
+anyio==4.12.0
build==1.3.0
-coverage==7.11.0
+coverage==7.13.0
pytest-console-scripts==1.4.1
pytest-cov==7.0.0
pytest-github-actions-annotate-failures==0.3.0
-pytest==8.4.2
+pytest==9.0.2
PyYaml==6.0.3
responses==0.25.8
respx==0.22.0
-trio==0.31.0
+trio==0.32.0
wheel==0.45.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_gitlab-7.0.0/tests/functional/api/test_epics.py
new/python_gitlab-7.1.0/tests/functional/api/test_epics.py
--- old/python_gitlab-7.0.0/tests/functional/api/test_epics.py 2025-10-29
16:05:25.000000000 +0100
+++ new/python_gitlab-7.1.0/tests/functional/api/test_epics.py 2025-12-28
02:26:27.000000000 +0100
@@ -15,18 +15,20 @@
assert group.epics.list()
[email protected](reason="404 on issue.id")
def test_epic_issues(epic, issue):
assert not epic.issues.list()
+ # FYI: Creating an issue causes a note to be created
epic_issue = epic.issues.create({"issue_id": issue.id})
assert epic.issues.list()
+ # FYI: Deleting an issue causes a note to be created
epic_issue.delete()
def test_epic_notes(epic):
- assert not epic.notes.list()
+ notes = epic.notes.list(get_all=True)
epic.notes.create({"body": "Test note"})
- assert epic.notes.list()
+ new_notes = epic.notes.list(get_all=True)
+ assert len(new_notes) == (len(notes) + 1), f"{new_notes} {notes}"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_gitlab-7.0.0/tests/functional/api/test_keys.py
new/python_gitlab-7.1.0/tests/functional/api/test_keys.py
--- old/python_gitlab-7.0.0/tests/functional/api/test_keys.py 2025-10-29
16:05:25.000000000 +0100
+++ new/python_gitlab-7.1.0/tests/functional/api/test_keys.py 2025-12-28
02:26:27.000000000 +0100
@@ -38,6 +38,14 @@
key_by_fingerprint = gl.keys.get(fingerprint=fingerprint)
assert key_by_fingerprint.title == key.title
assert key_by_fingerprint.key == key.key
- assert len(key_by_fingerprint.deploy_keys_projects) == 1
+
+ if not any(
+ key_project.get("project_id") == project.id
+ for key_project in key_by_fingerprint.deploy_keys_projects
+ ):
+ raise AssertionError(
+ f"Project {project} not found in 'deploy_keys_projects' "
+ f"{key_by_fingerprint.pformat()}"
+ )
key.delete()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_gitlab-7.0.0/tests/functional/api/test_project_job_token_scope.py
new/python_gitlab-7.1.0/tests/functional/api/test_project_job_token_scope.py
---
old/python_gitlab-7.0.0/tests/functional/api/test_project_job_token_scope.py
2025-10-29 16:05:25.000000000 +0100
+++
new/python_gitlab-7.1.0/tests/functional/api/test_project_job_token_scope.py
2025-12-28 02:26:27.000000000 +0100
@@ -1,3 +1,6 @@
+import pytest
+
+
#
https://docs.gitlab.com/ee/ci/jobs/ci_job_token.html#allow-any-project-to-access-your-project
def test_enable_limit_access_to_this_project(gl, project):
scope = project.job_token_scope.get()
@@ -10,6 +13,7 @@
assert scope.inbound_enabled
[email protected](reason="https://gitlab.com/gitlab-org/gitlab/-/issues/582271")
def test_disable_limit_access_to_this_project(gl, project):
scope = project.job_token_scope.get()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_gitlab-7.0.0/tests/functional/api/test_projects.py
new/python_gitlab-7.1.0/tests/functional/api/test_projects.py
--- old/python_gitlab-7.0.0/tests/functional/api/test_projects.py
2025-10-29 16:05:25.000000000 +0100
+++ new/python_gitlab-7.1.0/tests/functional/api/test_projects.py
2025-12-28 02:26:27.000000000 +0100
@@ -26,9 +26,9 @@
sudo_project = gl.projects.create({"name": "sudo_project"}, sudo=user.id)
- created = gl.projects.list()
+ created = gl.projects.list(get_all=True)
created_gen = gl.projects.list(iterator=True)
- owned = gl.projects.list(owned=True)
+ owned = gl.projects.list(owned=True, get_all=True)
assert admin_project in created and sudo_project in created
assert admin_project in owned and sudo_project not in owned
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_gitlab-7.0.0/tests/functional/api/test_registry.py
new/python_gitlab-7.1.0/tests/functional/api/test_registry.py
--- old/python_gitlab-7.0.0/tests/functional/api/test_registry.py
2025-10-29 16:05:25.000000000 +0100
+++ new/python_gitlab-7.1.0/tests/functional/api/test_registry.py
2025-12-28 02:26:27.000000000 +0100
@@ -26,3 +26,8 @@
protected_registry.minimum_access_level_for_push = "owner"
protected_registry.save()
assert protected_registry.minimum_access_level_for_push == "owner"
+
+ protected_registry.delete()
+
+ rules = project.registry_protection_repository_rules.list()
+ assert rules == []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_gitlab-7.0.0/tests/functional/fixtures/.env
new/python_gitlab-7.1.0/tests/functional/fixtures/.env
--- old/python_gitlab-7.0.0/tests/functional/fixtures/.env 2025-10-29
16:05:25.000000000 +0100
+++ new/python_gitlab-7.1.0/tests/functional/fixtures/.env 2025-12-28
02:26:27.000000000 +0100
@@ -1,4 +1,4 @@
GITLAB_IMAGE=gitlab/gitlab-ee
-GITLAB_TAG=17.8.2-ee.0
+GITLAB_TAG=18.7.0-ee.0
GITLAB_RUNNER_IMAGE=gitlab/gitlab-runner
GITLAB_RUNNER_TAG=96856197
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_gitlab-7.0.0/tests/functional/fixtures/docker-compose.yml
new/python_gitlab-7.1.0/tests/functional/fixtures/docker-compose.yml
--- old/python_gitlab-7.0.0/tests/functional/fixtures/docker-compose.yml
2025-10-29 16:05:25.000000000 +0100
+++ new/python_gitlab-7.1.0/tests/functional/fixtures/docker-compose.yml
2025-12-28 02:26:27.000000000 +0100
@@ -34,7 +34,7 @@
entrypoint:
- /bin/sh
- -c
- - ruby /create_license.rb && /assets/wrapper
+ - ruby /create_license.rb && /assets/init-container
volumes:
- ${PWD}/tests/functional/fixtures/create_license.rb:/create_license.rb
ports:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_gitlab-7.0.0/tests/functional/helpers.py
new/python_gitlab-7.1.0/tests/functional/helpers.py
--- old/python_gitlab-7.0.0/tests/functional/helpers.py 2025-10-29
16:05:25.000000000 +0100
+++ new/python_gitlab-7.1.0/tests/functional/helpers.py 2025-12-28
02:26:27.000000000 +0100
@@ -9,6 +9,7 @@
import gitlab
import gitlab.base
import gitlab.exceptions
+import gitlab.v4.objects
SLEEP_INTERVAL = 0.5
TIMEOUT = 60 # seconds before timeout will occur
@@ -37,6 +38,11 @@
object = manager.get(object.get_id()) # type: ignore[attr-defined]
except gitlab.exceptions.GitlabGetError:
return
+ # If object is already marked for deletion we have succeeded
+ if getattr(object, "marked_for_deletion_on", None) is not None:
+ # 'Group' and 'Project' objects have a 'marked_for_deletion_on'
attribute
+ logging.info(f"{object!r} is marked for deletion.")
+ return
if index:
logging.info(f"Attempt {index + 1} to delete {object!r}.")
@@ -52,22 +58,16 @@
# we shouldn't cause test to fail if it still exists
return
elif isinstance(object, gitlab.v4.objects.Project):
- # Immediately delete rather than waiting for at least 1day
- # https://docs.gitlab.com/ee/api/projects.html#delete-project
- object.delete(permanently_remove=True)
- pass
+ # Starting in GitLab 18, projects can't be immediately deleted.
+ # So this will mark it for deletion.
+ object.delete()
else:
# We only attempt to delete parent groups to prevent dangling
sub-groups
- # However parent groups can only be deleted on a delay in Gl 16
+ # However parent groups can only be deleted on a delay in
GitLab 16
# https://docs.gitlab.com/ee/api/groups.html#remove-group
object.delete()
except gitlab.exceptions.GitlabDeleteError:
- logging.info(f"{object!r} already deleted or scheduled for
deletion.")
- if isinstance(object, gitlab.v4.objects.Group):
- # Parent groups can never be immediately deleted in GL 16,
- # so don't cause test to fail if it still exists
- return
- pass
+ logging.exception(f"Error attempting to delete:
{object.pformat()}")
time.sleep(SLEEP_INTERVAL)
pytest.fail(f"{object!r} was not deleted")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_gitlab-7.0.0/tests/unit/objects/test_registry_protection_rules.py
new/python_gitlab-7.1.0/tests/unit/objects/test_registry_protection_rules.py
---
old/python_gitlab-7.0.0/tests/unit/objects/test_registry_protection_rules.py
2025-10-29 16:05:25.000000000 +0100
+++
new/python_gitlab-7.1.0/tests/unit/objects/test_registry_protection_rules.py
2025-12-28 02:26:27.000000000 +0100
@@ -58,6 +58,17 @@
yield rsps
[email protected]
+def resp_delete_protected_registry():
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.DELETE,
+
url="http://localhost/api/v4/projects/1/registry/protection/repository/rules/1",
+ status=204,
+ )
+ yield rsps
+
+
def test_list_project_protected_registries(project,
resp_list_protected_registries):
protected_registry = project.registry_protection_repository_rules.list()[0]
assert isinstance(protected_registry,
ProjectRegistryRepositoryProtectionRule)
@@ -80,3 +91,7 @@
1, {"repository_path_pattern": "abc*"}
)
assert updated["repository_path_pattern"] == "abc*"
+
+
+def test_delete_project_protected_registry(project,
resp_delete_protected_registry):
+ project.registry_protection_repository_rules.delete(1)