devpi-server 6.19.0__tar.gz → 6.19.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. {devpi_server-6.19.0 → devpi_server-6.19.2}/CHANGELOG +31 -0
  2. {devpi_server-6.19.0 → devpi_server-6.19.2}/CHANGELOG.short.rst +31 -30
  3. {devpi_server-6.19.0 → devpi_server-6.19.2}/PKG-INFO +52 -52
  4. {devpi_server-6.19.0 → devpi_server-6.19.2}/README.rst +16 -20
  5. devpi_server-6.19.2/devpi_server/__init__.py +1 -0
  6. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/auth.py +6 -3
  7. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/cfg/nginx-devpi-caching-http.conf.template +1 -0
  8. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/config.py +102 -49
  9. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/exceptions.py +4 -4
  10. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/filestore.py +94 -45
  11. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/fileutil.py +1 -3
  12. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/fsck.py +50 -15
  13. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/genconfig.py +58 -10
  14. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/htmlpage.py +2 -2
  15. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/httpclient.py +5 -1
  16. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/importexport.py +62 -33
  17. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/interfaces.py +1 -1
  18. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/keyfs.py +88 -63
  19. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/keyfs_types.py +4 -3
  20. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/log.py +54 -18
  21. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/main.py +28 -18
  22. devpi_server-6.19.2/devpi_server/markers.py +76 -0
  23. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/middleware.py +9 -1
  24. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/mirror.py +75 -44
  25. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/model.py +224 -81
  26. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/mythread.py +12 -6
  27. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/readonly.py +16 -12
  28. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/replica.py +44 -26
  29. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/view_auth.py +15 -4
  30. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/views.py +65 -38
  31. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server.egg-info/PKG-INFO +52 -52
  32. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server.egg-info/requires.txt +2 -0
  33. {devpi_server-6.19.0 → devpi_server-6.19.2}/mypy.ini +1 -3
  34. {devpi_server-6.19.0 → devpi_server-6.19.2}/pyproject.toml +4 -1
  35. devpi_server-6.19.2/test_devpi_server/__init__.py +0 -0
  36. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/plugin.py +11 -14
  37. devpi_server-6.19.2/test_devpi_server/py.typed +0 -0
  38. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_auth.py +1 -1
  39. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_importexport.py +14 -4
  40. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_keyfs.py +15 -5
  41. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_mirror.py +5 -5
  42. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_model.py +72 -6
  43. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_replica.py +119 -0
  44. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_stage_customizer.py +0 -11
  45. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_streaming.py +22 -27
  46. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_views.py +17 -13
  47. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_views_patch.py +1 -0
  48. {devpi_server-6.19.0 → devpi_server-6.19.2}/tox.ini +3 -3
  49. devpi_server-6.19.0/devpi_server/__init__.py +0 -1
  50. devpi_server-6.19.0/devpi_server/markers.py +0 -34
  51. devpi_server-6.19.0/devpi_server/py.typed +0 -1
  52. devpi_server-6.19.0/test_devpi_server/py.typed +0 -1
  53. {devpi_server-6.19.0 → devpi_server-6.19.2}/.flake8 +0 -0
  54. {devpi_server-6.19.0 → devpi_server-6.19.2}/LICENSE +0 -0
  55. {devpi_server-6.19.0 → devpi_server-6.19.2}/MANIFEST.in +0 -0
  56. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/__main__.py +0 -0
  57. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/auth_basic.py +0 -0
  58. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/auth_devpi.py +0 -0
  59. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/cfg/__init__.py +0 -0
  60. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/cfg/crontab.template +0 -0
  61. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/cfg/devpi.service.template +0 -0
  62. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/cfg/launchd-macos.txt.template +0 -0
  63. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/cfg/nginx-devpi-caching-location.conf.template +0 -0
  64. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/cfg/nginx-devpi-caching-proxy.conf.template +0 -0
  65. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/cfg/nginx-devpi-caching-server.conf.template +0 -0
  66. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/cfg/nginx-devpi.conf.template +0 -0
  67. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/cfg/supervisor-devpi.conf.template +0 -0
  68. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/cfg/supervisord.conf.template +0 -0
  69. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/cfg/windows-service.txt.template +0 -0
  70. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/compat.py +0 -0
  71. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/filestore_db.py +0 -0
  72. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/filestore_fs.py +0 -0
  73. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/filestore_fs_base.py +0 -0
  74. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/filestore_hash_hl.py +0 -0
  75. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/hookspecs.py +0 -0
  76. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/init.py +0 -0
  77. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/keyfs_sqlite.py +0 -0
  78. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/keyfs_sqlite_fs.py +0 -0
  79. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/normalized.py +0 -0
  80. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/passwd.py +0 -0
  81. /devpi_server-6.19.0/test_devpi_server/__init__.py → /devpi_server-6.19.2/devpi_server/py.typed +0 -0
  82. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server/sizeof.py +0 -0
  83. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server.egg-info/SOURCES.txt +0 -0
  84. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server.egg-info/dependency_links.txt +0 -0
  85. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server.egg-info/entry_points.txt +0 -0
  86. {devpi_server-6.19.0 → devpi_server-6.19.2}/devpi_server.egg-info/top_level.txt +0 -0
  87. {devpi_server-6.19.0 → devpi_server-6.19.2}/pytest_devpi_server/__init__.py +0 -0
  88. {devpi_server-6.19.0 → devpi_server-6.19.2}/setup.cfg +0 -0
  89. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/conftest.py +0 -0
  90. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/example.py +0 -0
  91. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/functional.py +0 -0
  92. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/badindexname/dataindex.json +0 -0
  93. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/badusername/dataindex.json +0 -0
  94. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/basescycle/dataindex.json +0 -0
  95. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/createdmodified/dataindex.json +0 -0
  96. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/deletedbase/dataindex.json +0 -0
  97. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/mirrordata/dataindex.json +0 -0
  98. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/mirrordata/root/pypi/dddttt/0.1.dev1/dddttt-0.1.dev1.tar.gz +0 -0
  99. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/modifiedpypi/dataindex.json +0 -0
  100. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/nocreatedmodified/dataindex.json +0 -0
  101. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/normalization/dataindex.json +0 -0
  102. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/normalization/root/dev/hello.pkg/hello.pkg-1.0.tar.gz +0 -0
  103. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/normalization_merge/dataindex.json +0 -0
  104. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/normalization_merge/root/dev/hello-pkg/hello.pkg-1.1.tar.gz +0 -0
  105. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/normalization_merge/root/dev/hello.pkg/hello.pkg-1.0.tar.gz +0 -0
  106. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/norootpypi/dataindex.json +0 -0
  107. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/nouser/dataindex.json +0 -0
  108. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/removedindexplugin/dataindex.json +0 -0
  109. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/removedindexplugin/user/dev/pkg/pkg-1.0.tar.gz +0 -0
  110. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/toxresult_naming_scheme/dataindex.json +0 -0
  111. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/toxresult_naming_scheme/root/dev/hello/0.9/hello-0.9.tar.gz +0 -0
  112. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/toxresult_naming_scheme/root/dev/hello/sha256=ed7002b439e9ac845f22357d822bac1444730fbdb6016d3ec9432297b9ec9f73/hello-0.9.tar.gz.toxresult0 +0 -0
  113. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/importexportdata/toxresult_upload_default/dataindex.json +0 -0
  114. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/reqmock.py +0 -0
  115. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/simpypi.py +0 -0
  116. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_authcheck.py +0 -0
  117. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_config.py +0 -0
  118. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_conftest.py +0 -0
  119. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_filestore.py +0 -0
  120. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_filestore_fs.py +0 -0
  121. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_fileutil.py +0 -0
  122. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_fsck.py +0 -0
  123. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_genconfig.py +0 -0
  124. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_log.py +0 -0
  125. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_main.py +0 -0
  126. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_mirror_no_project_list.py +0 -0
  127. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_mythread.py +0 -0
  128. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_nginx.py +0 -0
  129. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_nginx_replica.py +0 -0
  130. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_permissions.py +0 -0
  131. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_readonly.py +0 -0
  132. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_replica_functional.py +0 -0
  133. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_streaming_nginx.py +0 -0
  134. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_streaming_replica.py +0 -0
  135. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_streaming_replica_nginx.py +0 -0
  136. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_view_auth.py +0 -0
  137. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_views_push_external.py +0 -0
  138. {devpi_server-6.19.0 → devpi_server-6.19.2}/test_devpi_server/test_views_status.py +0 -0
@@ -2,6 +2,37 @@
2
2
 
3
3
  .. towncrier release notes start
4
4
 
5
+ 6.19.2 (2026-03-17)
6
+ ===================
7
+
8
+ Bug Fixes
9
+ ---------
10
+
11
+ - Preserve log for documentation uploads in export.
12
+
13
+ - Any missing file on mirrors will be ignored during event processing as is already the case in other places.
14
+
15
+ - Use short timeout when project list is requested for ``has_project`` call on mirrors instead of the long one used for ``list_projects``. This prevents installers from timing out and retrying several times.
16
+
17
+ - Fix error handling for proxy requests from replica to primary.
18
+
19
+ Other Changes
20
+ -------------
21
+
22
+ - Removed limit of reported missing files for devpi-fsck.
23
+
24
+
25
+ 6.19.1 (2026-02-09)
26
+ ===================
27
+
28
+ Bug Fixes
29
+ ---------
30
+
31
+ - Pin setuptools as pyramid still requires pkg_resources.
32
+
33
+ - Always allow replicas to access deleted releases to get the proper ``410 Gone`` instead of ``403 Forbidden`` when ``devpi-lockdown`` is in use.
34
+
35
+
5
36
  6.19.0 (2026-02-06)
6
37
  ===================
7
38
 
@@ -9,6 +9,37 @@ Changelog
9
9
 
10
10
  .. towncrier release notes start
11
11
 
12
+ 6.19.2 (2026-03-17)
13
+ ===================
14
+
15
+ Bug Fixes
16
+ ---------
17
+
18
+ - Preserve log for documentation uploads in export.
19
+
20
+ - Any missing file on mirrors will be ignored during event processing as is already the case in other places.
21
+
22
+ - Use short timeout when project list is requested for ``has_project`` call on mirrors instead of the long one used for ``list_projects``. This prevents installers from timing out and retrying several times.
23
+
24
+ - Fix error handling for proxy requests from replica to primary.
25
+
26
+ Other Changes
27
+ -------------
28
+
29
+ - Removed limit of reported missing files for devpi-fsck.
30
+
31
+
32
+ 6.19.1 (2026-02-09)
33
+ ===================
34
+
35
+ Bug Fixes
36
+ ---------
37
+
38
+ - Pin setuptools as pyramid still requires pkg_resources.
39
+
40
+ - Always allow replicas to access deleted releases to get the proper ``410 Gone`` instead of ``403 Forbidden`` when ``devpi-lockdown`` is in use.
41
+
42
+
12
43
  6.19.0 (2026-02-06)
13
44
  ===================
14
45
 
@@ -116,33 +147,3 @@ Other Changes
116
147
 
117
148
  - Changed User-Agent when fetching data for mirrors from just "server" to "devpi-server".
118
149
 
119
-
120
- 6.16.0 (2025-06-25)
121
- ===================
122
-
123
- Deprecations and Removals
124
- -------------------------
125
-
126
- - Dropped support for Python 3.7 and 3.8.
127
-
128
- Features
129
- --------
130
-
131
- - Update stored package metadata fields to version 2.4 for license expressions (PEP 639).
132
-
133
- Bug Fixes
134
- ---------
135
-
136
- - Preserve hash when importing mirror data to prevent unnecessary updates later on.
137
-
138
- - Keep original metadata_version in database.
139
-
140
-
141
- 6.15.0 (2025-05-18)
142
- ===================
143
-
144
- Features
145
- --------
146
-
147
- - Add ``--connection-limit`` option to devpi-server passed on to waitress.
148
-
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devpi-server
3
- Version: 6.19.0
4
- Summary: devpi-server: reliable, private, and pypi.org caching server
3
+ Version: 6.19.2
4
+ Summary: devpi-server: backend for hosting private package indexes and PyPI on-demand mirrors
5
5
  Maintainer-email: Florian Schulze <mail@pyfidelity.com>
6
6
  License-Expression: MIT
7
7
  Project-URL: Bug Tracker, https://github.com/devpi/devpi/issues
@@ -22,6 +22,7 @@ Classifier: Programming Language :: Python :: 3.10
22
22
  Classifier: Programming Language :: Python :: 3.11
23
23
  Classifier: Programming Language :: Python :: 3.12
24
24
  Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
25
26
  Classifier: Programming Language :: Python :: Implementation :: PyPy
26
27
  Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
27
28
  Classifier: Topic :: Internet :: WWW/HTTP
@@ -42,31 +43,32 @@ Requires-Dist: pluggy<2.0,>=0.6.0
42
43
  Requires-Dist: py>=1.4.23
43
44
  Requires-Dist: pyramid>=2
44
45
  Requires-Dist: repoze.lru>=0.6
46
+ Requires-Dist: requests>=2.3.0
47
+ Requires-Dist: setuptools<=81
45
48
  Requires-Dist: strenum; python_version < "3.11"
46
49
  Requires-Dist: strictyaml
47
50
  Requires-Dist: waitress>=1.0.1
48
51
  Requires-Dist: ruamel.yaml
49
52
  Dynamic: license-file
50
53
 
51
- =============================================================================
52
- devpi-server: server for private package indexes and PyPI caching
53
- =============================================================================
54
+ ====================================================================================
55
+ devpi-server: backend for hosting private package indexes and PyPI on-demand mirrors
56
+ ====================================================================================
54
57
 
55
58
 
56
- PyPI cache
57
- ==========
59
+ PyPI on-demand package mirror
60
+ =============================
58
61
 
59
- You can point ``pip or easy_install`` to the ``root/pypi/+simple/``
60
- index, serving as a transparent cache for pypi-hosted packages.
62
+ You can point ``uv``, ``pip`` or another Python package installer to the ``root/pypi/+simple/`` index,
63
+ serving as a transparent on-demand mirror for PyPI-hosted packages.
61
64
 
62
65
 
63
66
  User specific indexes
64
67
  =====================
65
68
 
66
- Each user (which can represent a person, project or team) can have
67
- multiple indexes and upload packages and docs via standard ``twine`` or
68
- ``setup.py`` invocations. Users and indexes can be manipulated through
69
- `devpi-client`_ and a RESTful HTTP API.
69
+ Each user (which can represent a person, project or team) can have multiple indexes,
70
+ and can upload packages and documents to these indexes via standard ``twine`` or ``setup.py`` invocations.
71
+ Users and indexes can be manipulated through `devpi-client`_ and a RESTful HTTP API.
70
72
 
71
73
 
72
74
  Index inheritance
@@ -78,19 +80,16 @@ index using ``root/pypi`` as a parent is a good place to test out a
78
80
  release candidate before you push it to PyPI.
79
81
 
80
82
 
81
- Good defaults and easy deployment
82
- =================================
83
+ Sensible defaults for a low friction deployment
84
+ ===============================================
83
85
 
84
- Get started easily and create a permanent devpi-server deployment
85
- including pre-configured templates for ``nginx`` and process managers.
86
+ Get started easily and deploy a devpi-server instance with pre-configured templates for ``nginx`` and process managers.
86
87
 
87
88
 
88
89
  Separate tool for Packaging/Testing activities
89
90
  ==============================================
90
91
 
91
- The complementary `devpi-client`_ tool
92
- helps to manage users, indexes, logins and typical setup.py-based upload and
93
- installation workflows.
92
+ The complementary `devpi-client`_ tool helps to manage users, indexes, logins and typical package upload and installation workflows.
94
93
 
95
94
  See https://doc.devpi.net on how to get started and further documentation.
96
95
 
@@ -103,9 +102,9 @@ Support
103
102
 
104
103
  If you find a bug, use the `issue tracker at Github`_.
105
104
 
106
- For general questions use `GitHub Discussions`_ or the `devpi-dev@python.org mailing list`_.
105
+ For general questions, use `GitHub Discussions`_ or the `devpi-dev@python.org mailing list`_.
107
106
 
108
- For support contracts and paid help contact ``mail at pyfidelity.com``.
107
+ For support contracts and paid help, contact ``mail at pyfidelity.com``.
109
108
 
110
109
  .. _issue tracker at Github: https://github.com/devpi/devpi/issues/
111
110
  .. _devpi-dev@python.org mailing list: https://mail.python.org/mailman3/lists/devpi-dev.python.org/
@@ -122,6 +121,37 @@ Changelog
122
121
 
123
122
  .. towncrier release notes start
124
123
 
124
+ 6.19.2 (2026-03-17)
125
+ ===================
126
+
127
+ Bug Fixes
128
+ ---------
129
+
130
+ - Preserve log for documentation uploads in export.
131
+
132
+ - Any missing file on mirrors will be ignored during event processing as is already the case in other places.
133
+
134
+ - Use short timeout when project list is requested for ``has_project`` call on mirrors instead of the long one used for ``list_projects``. This prevents installers from timing out and retrying several times.
135
+
136
+ - Fix error handling for proxy requests from replica to primary.
137
+
138
+ Other Changes
139
+ -------------
140
+
141
+ - Removed limit of reported missing files for devpi-fsck.
142
+
143
+
144
+ 6.19.1 (2026-02-09)
145
+ ===================
146
+
147
+ Bug Fixes
148
+ ---------
149
+
150
+ - Pin setuptools as pyramid still requires pkg_resources.
151
+
152
+ - Always allow replicas to access deleted releases to get the proper ``410 Gone`` instead of ``403 Forbidden`` when ``devpi-lockdown`` is in use.
153
+
154
+
125
155
  6.19.0 (2026-02-06)
126
156
  ===================
127
157
 
@@ -229,33 +259,3 @@ Other Changes
229
259
 
230
260
  - Changed User-Agent when fetching data for mirrors from just "server" to "devpi-server".
231
261
 
232
-
233
- 6.16.0 (2025-06-25)
234
- ===================
235
-
236
- Deprecations and Removals
237
- -------------------------
238
-
239
- - Dropped support for Python 3.7 and 3.8.
240
-
241
- Features
242
- --------
243
-
244
- - Update stored package metadata fields to version 2.4 for license expressions (PEP 639).
245
-
246
- Bug Fixes
247
- ---------
248
-
249
- - Preserve hash when importing mirror data to prevent unnecessary updates later on.
250
-
251
- - Keep original metadata_version in database.
252
-
253
-
254
- 6.15.0 (2025-05-18)
255
- ===================
256
-
257
- Features
258
- --------
259
-
260
- - Add ``--connection-limit`` option to devpi-server passed on to waitress.
261
-
@@ -1,22 +1,21 @@
1
- =============================================================================
2
- devpi-server: server for private package indexes and PyPI caching
3
- =============================================================================
1
+ ====================================================================================
2
+ devpi-server: backend for hosting private package indexes and PyPI on-demand mirrors
3
+ ====================================================================================
4
4
 
5
5
 
6
- PyPI cache
7
- ==========
6
+ PyPI on-demand package mirror
7
+ =============================
8
8
 
9
- You can point ``pip or easy_install`` to the ``root/pypi/+simple/``
10
- index, serving as a transparent cache for pypi-hosted packages.
9
+ You can point ``uv``, ``pip`` or another Python package installer to the ``root/pypi/+simple/`` index,
10
+ serving as a transparent on-demand mirror for PyPI-hosted packages.
11
11
 
12
12
 
13
13
  User specific indexes
14
14
  =====================
15
15
 
16
- Each user (which can represent a person, project or team) can have
17
- multiple indexes and upload packages and docs via standard ``twine`` or
18
- ``setup.py`` invocations. Users and indexes can be manipulated through
19
- `devpi-client`_ and a RESTful HTTP API.
16
+ Each user (which can represent a person, project or team) can have multiple indexes,
17
+ and can upload packages and documents to these indexes via standard ``twine`` or ``setup.py`` invocations.
18
+ Users and indexes can be manipulated through `devpi-client`_ and a RESTful HTTP API.
20
19
 
21
20
 
22
21
  Index inheritance
@@ -28,19 +27,16 @@ index using ``root/pypi`` as a parent is a good place to test out a
28
27
  release candidate before you push it to PyPI.
29
28
 
30
29
 
31
- Good defaults and easy deployment
32
- =================================
30
+ Sensible defaults for a low friction deployment
31
+ ===============================================
33
32
 
34
- Get started easily and create a permanent devpi-server deployment
35
- including pre-configured templates for ``nginx`` and process managers.
33
+ Get started easily and deploy a devpi-server instance with pre-configured templates for ``nginx`` and process managers.
36
34
 
37
35
 
38
36
  Separate tool for Packaging/Testing activities
39
37
  ==============================================
40
38
 
41
- The complementary `devpi-client`_ tool
42
- helps to manage users, indexes, logins and typical setup.py-based upload and
43
- installation workflows.
39
+ The complementary `devpi-client`_ tool helps to manage users, indexes, logins and typical package upload and installation workflows.
44
40
 
45
41
  See https://doc.devpi.net on how to get started and further documentation.
46
42
 
@@ -53,9 +49,9 @@ Support
53
49
 
54
50
  If you find a bug, use the `issue tracker at Github`_.
55
51
 
56
- For general questions use `GitHub Discussions`_ or the `devpi-dev@python.org mailing list`_.
52
+ For general questions, use `GitHub Discussions`_ or the `devpi-dev@python.org mailing list`_.
57
53
 
58
- For support contracts and paid help contact ``mail at pyfidelity.com``.
54
+ For support contracts and paid help, contact ``mail at pyfidelity.com``.
59
55
 
60
56
  .. _issue tracker at Github: https://github.com/devpi/devpi/issues/
61
57
  .. _devpi-dev@python.org mailing list: https://mail.python.org/mailman3/lists/devpi-dev.python.org/
@@ -0,0 +1 @@
1
+ __version__ = "6.19.2"
@@ -1,12 +1,15 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from .log import threadlog
4
+ from .markers import notset
4
5
  from passlib.context import CryptContext
6
+ from typing import TYPE_CHECKING
5
7
  import itertools
6
8
  import itsdangerous
7
9
 
8
10
 
9
- notset = object()
11
+ if TYPE_CHECKING:
12
+ from .main import XOM
10
13
 
11
14
 
12
15
  class AuthException(Exception):
@@ -19,7 +22,7 @@ class Auth:
19
22
  class Expired(Exception):
20
23
  """ proxy authentication expired. """
21
24
 
22
- def __init__(self, xom, secret):
25
+ def __init__(self, xom: XOM, secret: str) -> None:
23
26
  self.xom = xom
24
27
  self.serializer = itsdangerous.TimedSerializer(secret)
25
28
  self.hook = xom.config.hook.devpiserver_auth_request
@@ -56,7 +59,7 @@ class Auth:
56
59
  return dict(status="ok", groups=sorted(
57
60
  set(itertools.chain.from_iterable(groups))))
58
61
 
59
- def _autocreate_user(self, authuser):
62
+ def _autocreate_user(self, authuser: str) -> None:
60
63
  if self.model.get_user(authuser) is None:
61
64
  # Autocreated users will be authenticated via plugin, and so no
62
65
  # valid password should be stored.
@@ -9,6 +9,7 @@ map $http_user_agent $devpi_installer_agent {
9
9
  ~*setuptools/ 1;
10
10
  ~*pip/ 1;
11
11
  ~*pex/ 1;
12
+ ~*uv/ 1;
12
13
  }
13
14
 
14
15
  map $http_accept $devpi_installer_accept {