Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-devpi-client for
openSUSE:Factory checked in at 2026-05-04 12:54:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-devpi-client (Old)
and /work/SRC/openSUSE:Factory/.python-devpi-client.new.30200 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-devpi-client"
Mon May 4 12:54:31 2026 rev:18 rq:1350560 version:7.3.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-devpi-client/python-devpi-client.changes
2026-04-04 19:09:32.054332463 +0200
+++
/work/SRC/openSUSE:Factory/.python-devpi-client.new.30200/python-devpi-client.changes
2026-05-04 12:58:03.444691470 +0200
@@ -1,0 +2,7 @@
+Sun May 3 17:32:29 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 7.3.0:
+ * Allow ``patchjson`` to read from stdin with ``-`` as JSON
+ filename.
+
+-------------------------------------------------------------------
Old:
----
devpi_client-7.2.1.tar.gz
New:
----
devpi_client-7.3.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-devpi-client.spec ++++++
--- /var/tmp/diff_new_pack.T3SqNo/_old 2026-05-04 12:58:03.932711555 +0200
+++ /var/tmp/diff_new_pack.T3SqNo/_new 2026-05-04 12:58:03.936711720 +0200
@@ -26,7 +26,7 @@
%endif
%{?sle15_python_module_pythons}
Name: python-devpi-client%{psuffix}
-Version: 7.2.1
+Version: 7.3.0
Release: 0
Summary: Client for devpi
License: MIT
@@ -127,7 +127,7 @@
%if !%{with test}
%files %{python_files}
-%doc AUTHORS CHANGELOG README.rst
+%doc CHANGELOG README.rst
%license LICENSE
%python_alternative %{_bindir}/devpi
%{python_sitelib}/devpi
++++++ devpi_client-7.2.1.tar.gz -> devpi_client-7.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/.flake8
new/devpi_client-7.3.0/.flake8
--- old/devpi_client-7.2.1/.flake8 1970-01-01 01:00:00.000000000 +0100
+++ new/devpi_client-7.3.0/.flake8 2026-04-30 11:10:07.000000000 +0200
@@ -0,0 +1,12 @@
+[flake8]
+# E203 is ignored because we enforce ruff format which contradicts it
+ignore = E203,E501,E704,E741,W503
+per-file-ignores =
+ conftest.py:E226
+ index.py:E225
+ list_remove.py:E226
+ main.py:E128,E225,E226
+ test*.py:E225
+ upload.py:E225
+ use.py:E225
+ user.py:E225
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/CHANGELOG
new/devpi_client-7.3.0/CHANGELOG
--- old/devpi_client-7.2.1/CHANGELOG 2026-03-17 16:11:43.000000000 +0100
+++ new/devpi_client-7.3.0/CHANGELOG 2026-04-30 11:10:07.000000000 +0200
@@ -2,6 +2,15 @@
.. towncrier release notes start
+7.3.0 (2026-04-30)
+==================
+
+Features
+--------
+
+- Allow ``patchjson`` to read from stdin with ``-`` as JSON filename.
+
+
7.2.1 (2026-03-17)
==================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/CHANGELOG.short.rst
new/devpi_client-7.3.0/CHANGELOG.short.rst
--- old/devpi_client-7.2.1/CHANGELOG.short.rst 2026-03-17 16:12:52.000000000
+0100
+++ new/devpi_client-7.3.0/CHANGELOG.short.rst 2026-04-30 11:11:23.000000000
+0200
@@ -9,6 +9,15 @@
.. towncrier release notes start
+7.3.0 (2026-04-30)
+==================
+
+Features
+--------
+
+- Allow ``patchjson`` to read from stdin with ``-`` as JSON filename.
+
+
7.2.1 (2026-03-17)
==================
@@ -79,12 +88,3 @@
- Fix #1011: change HTTP status codes >=400 to use self.fatal instead of raw
SystemExit, protect 403 and 404 errors from SystemExit
-
-7.0.2 (2023-10-19)
-==================
-
-Bug Fixes
----------
-
-- Fix #992: Fix error added in 6.0.4 when old authentication data from before
6.x exists.
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/MANIFEST.in
new/devpi_client-7.3.0/MANIFEST.in
--- old/devpi_client-7.2.1/MANIFEST.in 2026-03-17 16:11:43.000000000 +0100
+++ new/devpi_client-7.3.0/MANIFEST.in 2026-04-30 11:10:07.000000000 +0200
@@ -1,3 +1,4 @@
+include .flake8
include CHANGELOG
include README.rst
include AUTHORS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/PKG-INFO
new/devpi_client-7.3.0/PKG-INFO
--- old/devpi_client-7.2.1/PKG-INFO 2026-03-17 16:12:52.635483000 +0100
+++ new/devpi_client-7.3.0/PKG-INFO 2026-04-30 11:11:23.232559400 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: devpi-client
-Version: 7.2.1
+Version: 7.3.0
Summary: devpi upload/install/... workflow commands for Python developers
Maintainer-email: Florian Schulze <[email protected]>
License:
@@ -92,6 +92,15 @@
.. towncrier release notes start
+7.3.0 (2026-04-30)
+==================
+
+Features
+--------
+
+- Allow ``patchjson`` to read from stdin with ``-`` as JSON filename.
+
+
7.2.1 (2026-03-17)
==================
@@ -162,12 +171,3 @@
- Fix #1011: change HTTP status codes >=400 to use self.fatal instead of raw
SystemExit, protect 403 and 404 errors from SystemExit
-
-7.0.2 (2023-10-19)
-==================
-
-Bug Fixes
----------
-
-- Fix #992: Fix error added in 6.0.4 when old authentication data from before
6.x exists.
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/devpi/__init__.py
new/devpi_client-7.3.0/devpi/__init__.py
--- old/devpi_client-7.2.1/devpi/__init__.py 2026-03-17 16:11:43.000000000
+0100
+++ new/devpi_client-7.3.0/devpi/__init__.py 2026-04-30 11:10:07.000000000
+0200
@@ -1 +1 @@
-__version__ = "7.2.1"
+__version__ = "7.3.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/devpi/getjson.py
new/devpi_client-7.3.0/devpi/getjson.py
--- old/devpi_client-7.2.1/devpi/getjson.py 2026-03-17 16:11:43.000000000
+0100
+++ new/devpi_client-7.3.0/devpi/getjson.py 2026-04-30 11:10:07.000000000
+0200
@@ -1,5 +1,7 @@
from devpi_common.url import URL
+from pathlib import Path
import json
+import sys
def main(hub, args=None):
@@ -11,7 +13,7 @@
current = hub.current
- if path_url.scheme in ('http', 'https'):
+ if path_url.scheme in ("http", "https"):
url = path_url
elif not path_url.path.startswith("/") and not current.index:
hub.fatal("cannot use relative path without an active index")
@@ -27,7 +29,7 @@
if hub.args.verbose:
hub.line("GET REQUEST sent to %s" % url)
for name in sorted(r.headers):
- hub.line("%s: %s" %(name.upper(), r.headers[name]))
+ hub.line("%s: %s" % (name.upper(), r.headers[name]))
hub.line()
hub.out_json(r._json)
@@ -38,8 +40,11 @@
args = hub.args
path = args.path
- with open(args.jsonfile) as f:
- data = json.load(f)
+ if args.jsonfile == "-":
+ data = json.load(sys.stdin)
+ else:
+ with Path(args.jsonfile).open() as f:
+ data = json.load(f)
current = hub.current
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/devpi/login.py
new/devpi_client-7.3.0/devpi/login.py
--- old/devpi_client-7.2.1/devpi/login.py 2026-03-17 16:11:43.000000000
+0100
+++ new/devpi_client-7.3.0/devpi/login.py 2026-04-30 11:10:07.000000000
+0200
@@ -11,11 +11,12 @@
password = args.password
if password is None:
password = hub.hook.devpiclient_get_password(
- url=hub.current.root_url.url, username=user)
+ url=hub.current.root_url.url, username=user
+ )
input = dict(user=user, password=password)
r = hub.http_api("post", hub.current.login, input, quiet=False)
hub.current.set_auth(user, r.result["password"])
- hours = r.result["expiration"] / (60*60.0)
+ hours = r.result["expiration"] / (60 * 60.0)
msg = "logged in %r" % user
if hub.current.index:
msg = "%s at %r" % (msg, hub.current.index)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/devpi/main.py
new/devpi_client-7.3.0/devpi/main.py
--- old/devpi_client-7.2.1/devpi/main.py 2026-03-17 16:11:43.000000000
+0100
+++ new/devpi_client-7.3.0/devpi/main.py 2026-04-30 11:10:07.000000000
+0200
@@ -865,8 +865,11 @@
"""
parser.add_argument("path", action="store",
help="path to a resource to patch information on. ")
- parser.add_argument("jsonfile", action="store",
- help="file to read json content from")
+ parser.add_argument(
+ "jsonfile",
+ action="store",
+ help="file to read json content from use '-' for STDIN",
+ )
@subcommand("devpi.list_remove:main_list", "list")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/devpi_client.egg-info/PKG-INFO
new/devpi_client-7.3.0/devpi_client.egg-info/PKG-INFO
--- old/devpi_client-7.2.1/devpi_client.egg-info/PKG-INFO 2026-03-17
16:12:52.000000000 +0100
+++ new/devpi_client-7.3.0/devpi_client.egg-info/PKG-INFO 2026-04-30
11:11:23.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: devpi-client
-Version: 7.2.1
+Version: 7.3.0
Summary: devpi upload/install/... workflow commands for Python developers
Maintainer-email: Florian Schulze <[email protected]>
License:
@@ -92,6 +92,15 @@
.. towncrier release notes start
+7.3.0 (2026-04-30)
+==================
+
+Features
+--------
+
+- Allow ``patchjson`` to read from stdin with ``-`` as JSON filename.
+
+
7.2.1 (2026-03-17)
==================
@@ -162,12 +171,3 @@
- Fix #1011: change HTTP status codes >=400 to use self.fatal instead of raw
SystemExit, protect 403 and 404 errors from SystemExit
-
-7.0.2 (2023-10-19)
-==================
-
-Bug Fixes
----------
-
-- Fix #992: Fix error added in 6.0.4 when old authentication data from before
6.x exists.
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/devpi_client.egg-info/SOURCES.txt
new/devpi_client-7.3.0/devpi_client.egg-info/SOURCES.txt
--- old/devpi_client-7.2.1/devpi_client.egg-info/SOURCES.txt 2026-03-17
16:12:52.000000000 +0100
+++ new/devpi_client-7.3.0/devpi_client.egg-info/SOURCES.txt 2026-04-30
11:11:23.000000000 +0200
@@ -1,3 +1,4 @@
+.flake8
AUTHORS
CHANGELOG
CHANGELOG.short.rst
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/pyproject.toml
new/devpi_client-7.3.0/pyproject.toml
--- old/devpi_client-7.2.1/pyproject.toml 2026-03-17 16:11:43.000000000
+0100
+++ new/devpi_client-7.3.0/pyproject.toml 2026-04-30 11:10:07.000000000
+0200
@@ -68,11 +68,9 @@
[tool.ruff.format]
exclude = [
- "devpi/getjson.py",
"devpi/index.py",
"devpi/install.py",
"devpi/list_remove.py",
- "devpi/login.py",
"devpi/main.py",
"devpi/push.py",
"devpi/refresh.py",
@@ -90,7 +88,6 @@
"testing/test_login.py",
"testing/test_main.py",
"testing/test_push.py",
- "testing/test_pypirc.py",
"testing/test_test.py",
"testing/test_upload.py",
"testing/test_use.py",
@@ -150,12 +147,6 @@
"devpi/use.py" = [
"I001", # maybe cleanup later - import block unsorted
]
-"testing/conftest.py" = [
- "I001", # maybe cleanup later - import block unsorted
-]
-"testing/test_functional.py" = [
- "I001", # maybe cleanup later - import block unsorted
-]
"testing/test_index.py" = [
"I001", # maybe cleanup later - import block unsorted
]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/testing/conftest.py
new/devpi_client-7.3.0/testing/conftest.py
--- old/devpi_client-7.2.1/testing/conftest.py 2026-03-17 16:11:43.000000000
+0100
+++ new/devpi_client-7.3.0/testing/conftest.py 2026-04-30 11:10:07.000000000
+0200
@@ -1,26 +1,26 @@
from _pytest import capture
from contextlib import closing
+from devpi.main import Hub
+from devpi.main import get_pluginmanager
+from devpi.main import initmain
+from devpi.main import parse_args
from devpi_common.contextlib import chdir
from devpi_common.metadata import parse_version
+from devpi_common.url import URL
from io import StringIO
from pathlib import Path
-import codecs
import gc
+import json
import os
import platform
import pytest
-import socket
-import textwrap
import shutil
+import socket
+import subprocess
import sys
-import json
+import textwrap
import time
-from devpi.main import Hub, get_pluginmanager, initmain, parse_args
-from devpi_common.url import URL
-
-import subprocess
-
pytest_plugins = ["testing.reqmock"]
@@ -70,9 +70,33 @@
return print(*args, **kwargs)
[email protected]
+def remote_index_info(server_version):
+ from devpi_common.metadata import parse_version
+
+ if server_version < parse_version("7.0.0.dev2"):
+
+ class MirrorInfo:
+ refresh_option = "mirror_cache_expiry"
+ type = "mirror"
+ url_fmt_option = "mirror_web_url_fmt"
+ url_option = "mirror_url"
+
+ return MirrorInfo()
+
+ class RemoteInfo:
+ refresh_option = "remote_refresh_delay"
+ type = "remote"
+ url_fmt_option = "remote_web_url_fmt"
+ url_option = "remote_url"
+
+ return RemoteInfo()
+
+
@pytest.fixture(scope="session")
def simpypiserver():
- from .simpypi import httpserver, SimPyPIRequestHandler
+ from .simpypi import SimPyPIRequestHandler
+ from .simpypi import httpserver
import threading
host = 'localhost'
port = get_open_port(host)
@@ -225,7 +249,7 @@
"--serverdir", str(clientdir)]
init_executable = server_executable.replace(
"devpi-server", "devpi-init")
- check_call(request, [init_executable, *args])
+ check_call(request, [init_executable, "--no-root-pypi", *args])
args.extend(indexer_backend_option)
out = check_output(request, [server_executable, "-h"])
if b'--argon2' in out:
@@ -508,7 +532,7 @@
out=capture.FDCapture(1),
err=capture.FDCapture(2))
cap.start_capturing()
- now = time.time()
+ now = time.monotonic()
ret = 0
try:
try:
@@ -525,7 +549,7 @@
raise
print(out)
print(err, file=sys.stderr)
- return RunResult(ret, out.split("\n"), None, time.time()-now)
+ return RunResult(ret, out.split("\n"), None, time.monotonic() - now)
return out_devpi_func
@@ -587,15 +611,14 @@
cmdargs = [str(x) for x in cmdargs]
p1 = Path(tmpdir) / "stdout"
print_info("running", cmdargs, "curdir=", Path())
- with codecs.open(str(p1), "w", encoding="utf8") as f1:
- now = time.time()
+ with open(p1, "w", encoding="utf8") as f1:
+ now = time.monotonic()
popen = subprocess.Popen(
cmdargs, stdout=f1, stderr=subprocess.STDOUT,
close_fds=(sys.platform != "win32"))
ret = popen.wait()
- with codecs.open(str(p1), "r", encoding="utf8") as f1:
- outerr = f1.read().splitlines()
- return RunResult(ret, outerr, None, time.time()-now)
+ outerr = p1.read_text().splitlines()
+ return RunResult(ret, outerr, None, time.monotonic() - now)
@pytest.fixture
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/testing/functional.py
new/devpi_client-7.3.0/testing/functional.py
--- old/devpi_client-7.2.1/testing/functional.py 2026-03-17
16:11:43.000000000 +0100
+++ new/devpi_client-7.3.0/testing/functional.py 2026-04-30
11:10:07.000000000 +0200
@@ -168,20 +168,6 @@
if m: # only server-side mapp returns messages
assert "not/exists" in m
- def test_pypi_index_attributes(self, mapp):
- mapp.login_root()
- data = mapp.getjson("/root/pypi?no_projects=")
- res = data["result"]
- res.pop("projects", None)
- assert sorted(res.keys()) == sorted([
- "type", "volatile", "title", "mirror_url", "mirror_web_url_fmt"])
- assert res["type"] == "mirror"
- assert res["volatile"] is False
- assert res["title"] == "PyPI"
- assert 'pypi' in res["mirror_url"]
- assert 'pypi' in res["mirror_web_url_fmt"]
- assert '{name}' in res["mirror_web_url_fmt"]
-
def test_create_index_base_empty(self, mapp):
indexconfig = dict(bases="")
mapp.login_root()
@@ -189,12 +175,6 @@
data = mapp.getjson("/root/empty")
assert not data["result"]["bases"]
- def test_create_index_base_normalized(self, mapp):
- indexconfig = dict(bases=("/root/pypi",))
- mapp.login_root()
- mapp.create_index("root/hello", indexconfig=indexconfig,
- code=200)
-
def test_create_index_base_invalid(self, mapp):
mapp.login_root()
indexconfig = dict(bases=("/root/dev/123",))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/testing/test_functional.py
new/devpi_client-7.3.0/testing/test_functional.py
--- old/devpi_client-7.2.1/testing/test_functional.py 2026-03-17
16:11:43.000000000 +0100
+++ new/devpi_client-7.3.0/testing/test_functional.py 2026-04-30
11:10:07.000000000 +0200
@@ -1,3 +1,8 @@
+from .functional import MappMixin
+from .functional import TestIndexPushThings # noqa: F401
+from .functional import TestIndexThings # noqa: F401
+from .functional import TestProjectThings # noqa: F401
+from .functional import TestUserThings # noqa: F401
from io import BytesIO
import json
import pytest
@@ -6,12 +11,13 @@
import tarfile
import time
-from .functional import TestIndexThings # noqa: F401
-from .functional import TestIndexPushThings # noqa: F401
-from .functional import TestProjectThings # noqa: F401
-from .functional import TestUserThings # noqa: F401
-from .functional import TestMirrorIndexThings # noqa: F401
-from .functional import MappMixin
+
+try:
+ from .functional import ( # type: ignore[attr-defined] # noqa: F401
+ TestRemoteIndexThings,
+ )
+except ImportError:
+ from .functional import TestMirrorIndexThings # noqa: F401
@pytest.fixture
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/testing/test_pypirc.py
new/devpi_client-7.3.0/testing/test_pypirc.py
--- old/devpi_client-7.2.1/testing/test_pypirc.py 2026-03-17
16:11:43.000000000 +0100
+++ new/devpi_client-7.3.0/testing/test_pypirc.py 2026-04-30
11:10:07.000000000 +0200
@@ -4,7 +4,8 @@
def test_pypirc(tmpdir):
p = tmpdir.join("pypirc")
- p.write(dedent("""\n
+ p.write(
+ dedent("""\n
[distutils]
index-servers = local
testindex
@@ -22,7 +23,8 @@
[nopassword]
repository: http://localhost:3141/
username: test3
- """))
+ """)
+ )
rc = pypirc.Auth(p)
url, (user, p) = rc.get_url_auth("local")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/testing/test_test.py
new/devpi_client-7.3.0/testing/test_test.py
--- old/devpi_client-7.2.1/testing/test_test.py 2026-03-17 16:11:43.000000000
+0100
+++ new/devpi_client-7.3.0/testing/test_test.py 2026-04-30 11:10:07.000000000
+0200
@@ -444,8 +444,18 @@
(out, err) = capfd.readouterr()
assert "could not find/receive links for notexists73" in out
- def test_main_example(self, out_devpi, create_and_upload):
- result = out_devpi("index", "bases=root/pypi")
+ def test_main_example(
+ self, create_and_upload, devpi_username, remote_index_info, out_devpi
+ ):
+ result = out_devpi(
+ "index",
+ "-c",
+ "mirror",
+ f"type={remote_index_info.type}",
+ f"{remote_index_info.url_option}=https://pypi.org/simple/",
+ )
+ assert result.ret == 0
+ result = out_devpi("index", f"bases={devpi_username}/mirror")
assert result.ret == 0
create_and_upload("exa-1.0", filedefs={
"tox.ini": """
@@ -491,8 +501,18 @@
result = out_devpi("test", "--no-upload", "exa")
assert result.ret == 0
- def test_specific_version(self, out_devpi, create_and_upload):
- result = out_devpi("index", "bases=root/pypi")
+ def test_specific_version(
+ self, create_and_upload, devpi_username, remote_index_info, out_devpi
+ ):
+ result = out_devpi(
+ "index",
+ "-c",
+ "mirror",
+ f"type={remote_index_info.type}",
+ f"{remote_index_info.url_option}=https://pypi.org/simple/",
+ )
+ assert result.ret == 0
+ result = out_devpi("index", f"bases={devpi_username}/mirror")
assert result.ret == 0
create_and_upload("exa-1.0", filedefs={
"tox.ini": """
@@ -516,8 +536,18 @@
*exa-1.0.*
*tests passed*""")
- def test_pkgname_with_dashes(self, out_devpi, create_and_upload):
- result = out_devpi("index", "bases=root/pypi")
+ def test_pkgname_with_dashes(
+ self, create_and_upload, devpi_username, remote_index_info, out_devpi
+ ):
+ result = out_devpi(
+ "index",
+ "-c",
+ "mirror",
+ f"type={remote_index_info.type}",
+ f"{remote_index_info.url_option}=https://pypi.org/simple/",
+ )
+ assert result.ret == 0
+ result = out_devpi("index", f"bases={devpi_username}/mirror")
assert result.ret == 0
create_and_upload(("my-pkg-123", "1.0"), filedefs={
"tox.ini": """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/testing/test_upload.py
new/devpi_client-7.3.0/testing/test_upload.py
--- old/devpi_client-7.2.1/testing/test_upload.py 2026-03-17
16:11:43.000000000 +0100
+++ new/devpi_client-7.3.0/testing/test_upload.py 2026-04-30
11:10:07.000000000 +0200
@@ -762,7 +762,8 @@
""".format(projname_version=projname_version_norm_fnmatch))
def test_upload_to_mirror(
- self, initproj, out_devpi, projname_version):
+ self, initproj, out_devpi, projname_version, remote_index_info
+ ):
initproj(projname_version.rsplit("-", 1), {"doc": {
"conf.py": "#nothing",
"contents.rst": "",
@@ -770,8 +771,9 @@
assert Path("setup.py").is_file()
# use mirror
- out = out_devpi("use", "root/pypi")
- out.stdout.fnmatch_lines_random("current devpi index*/root/pypi*")
+ out = out_devpi("index", "-c", "mirror",
f"type={remote_index_info.type}")
+ out = out_devpi("use", "mirror")
+ out.stdout.fnmatch_lines_random("current devpi index*/*/mirror*")
out = out_devpi("upload", "--no-isolation", "--dry-run")
out.stdout.fnmatch_lines_random("*does not support upload.")
out.stdout.fnmatch_lines_random("*it is a mirror.")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/devpi_client-7.2.1/tox.ini
new/devpi_client-7.3.0/tox.ini
--- old/devpi_client-7.2.1/tox.ini 2026-03-17 16:11:43.000000000 +0100
+++ new/devpi_client-7.3.0/tox.ini 2026-04-30 11:10:07.000000000 +0200
@@ -1,5 +1,5 @@
[pytest]
-norecursedirs = .tox build
+collect_ignore = .tox build
addopts =
-r a
-W once::DeprecationWarning
@@ -10,7 +10,7 @@
[tox]
-envlist = py37{,-server520,-setuptools6920,-version},py314,pypy3,flake8
+envlist = py37{,-server6,-setuptools6920,-version},py314,pypy3,flake8
[testenv]
passenv = GITHUB_ACTIONS, LANG, PIP_INDEX_URL
@@ -20,7 +20,8 @@
pytest-instafail
pytest-timeout
devpi-server;python_version>="3.9"
- pypitoken
+ pip
+ pypitoken; python_version<"3.15"
importlib.metadata;python_version<"3.8"
mock
sphinx
@@ -45,8 +46,8 @@
commands = devpi --version
-[testenv:py37-server520]
-commands = py.test --timeout 300 --instafail {posargs}
--devpi-server-requirements "devpi-server==5.2.0" --devpi-server-requirements
"pyramid<2" --devpi-server-requirements "ruamel.yaml"
+[testenv:py37-server6]
+commands = py.test --timeout 300 --instafail {posargs}
--devpi-server-requirements "devpi-server==6.0.0" --devpi-server-requirements
"ruamel.yaml" --devpi-server-requirements "setuptools<=81"
[testenv:flake8]