devpi-server 6.16.0__tar.gz → 6.18.0__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 (146) hide show
  1. {devpi_server-6.16.0 → devpi_server-6.18.0}/.flake8 +2 -3
  2. {devpi_server-6.16.0 → devpi_server-6.18.0}/CHANGELOG +78 -51
  3. devpi_server-6.18.0/CHANGELOG.short.rst +137 -0
  4. {devpi_server-6.16.0 → devpi_server-6.18.0}/PKG-INFO +67 -45
  5. devpi_server-6.18.0/devpi_server/__init__.py +1 -0
  6. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/__main__.py +1 -0
  7. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/auth.py +6 -59
  8. devpi_server-6.18.0/devpi_server/compat.py +35 -0
  9. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/config.py +160 -86
  10. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/filestore.py +144 -59
  11. devpi_server-6.18.0/devpi_server/filestore_db.py +82 -0
  12. devpi_server-6.18.0/devpi_server/filestore_fs.py +178 -0
  13. devpi_server-6.18.0/devpi_server/filestore_fs_base.py +329 -0
  14. devpi_server-6.18.0/devpi_server/filestore_hash_hl.py +232 -0
  15. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/fileutil.py +30 -18
  16. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/fsck.py +9 -10
  17. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/genconfig.py +23 -20
  18. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/hookspecs.py +1 -0
  19. devpi_server-6.18.0/devpi_server/htmlpage.py +73 -0
  20. devpi_server-6.18.0/devpi_server/httpclient.py +273 -0
  21. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/importexport.py +156 -123
  22. devpi_server-6.18.0/devpi_server/interfaces.py +569 -0
  23. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/keyfs.py +202 -40
  24. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/keyfs_sqlite.py +43 -21
  25. devpi_server-6.18.0/devpi_server/keyfs_sqlite_fs.py +47 -0
  26. devpi_server-6.18.0/devpi_server/keyfs_types.py +302 -0
  27. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/main.py +90 -116
  28. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/middleware.py +1 -1
  29. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/mirror.py +446 -155
  30. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/model.py +340 -169
  31. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/mythread.py +1 -0
  32. devpi_server-6.18.0/devpi_server/normalized.py +29 -0
  33. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/readonly.py +35 -10
  34. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/replica.py +354 -231
  35. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/sizeof.py +13 -6
  36. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/view_auth.py +47 -22
  37. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/views.py +260 -205
  38. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server.egg-info/PKG-INFO +67 -45
  39. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server.egg-info/SOURCES.txt +8 -3
  40. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server.egg-info/entry_points.txt +0 -3
  41. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server.egg-info/requires.txt +4 -1
  42. {devpi_server-6.16.0 → devpi_server-6.18.0}/mypy.ini +60 -25
  43. {devpi_server-6.16.0 → devpi_server-6.18.0}/pyproject.toml +4 -29
  44. devpi_server-6.18.0/pytest_devpi_server/__init__.py +11 -0
  45. devpi_server-6.18.0/test_devpi_server/example.py +25 -0
  46. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/functional.py +63 -6
  47. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/plugin.py +405 -75
  48. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/simpypi.py +9 -1
  49. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_auth.py +10 -19
  50. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_config.py +40 -9
  51. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_conftest.py +1 -0
  52. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_filestore.py +145 -69
  53. devpi_server-6.18.0/test_devpi_server/test_filestore_fs.py +180 -0
  54. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_importexport.py +79 -49
  55. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_keyfs.py +124 -50
  56. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_log.py +6 -5
  57. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_main.py +67 -34
  58. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_mirror.py +384 -111
  59. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_mirror_no_project_list.py +4 -2
  60. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_model.py +190 -141
  61. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_mythread.py +0 -1
  62. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_permissions.py +6 -1
  63. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_replica.py +350 -148
  64. devpi_server-6.18.0/test_devpi_server/test_replica_functional.py +172 -0
  65. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_stage_customizer.py +21 -6
  66. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_streaming.py +2 -3
  67. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_view_auth.py +3 -0
  68. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_views.py +106 -42
  69. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_views_push_external.py +148 -134
  70. {devpi_server-6.16.0 → devpi_server-6.18.0}/tox.ini +20 -4
  71. devpi_server-6.16.0/CHANGELOG.short.rst +0 -116
  72. devpi_server-6.16.0/devpi_server/__init__.py +0 -1
  73. devpi_server-6.16.0/devpi_server/filestore_fs.py +0 -136
  74. devpi_server-6.16.0/devpi_server/interfaces.py +0 -289
  75. devpi_server-6.16.0/devpi_server/keyfs_sqlite_fs.py +0 -227
  76. devpi_server-6.16.0/devpi_server/keyfs_types.py +0 -144
  77. devpi_server-6.16.0/devpi_server/vendor/_pip.py +0 -152
  78. devpi_server-6.16.0/pytest_devpi_server/__init__.py +0 -4
  79. devpi_server-6.16.0/test_devpi_server/__init__.py +0 -0
  80. devpi_server-6.16.0/test_devpi_server/example.py +0 -22
  81. devpi_server-6.16.0/test_devpi_server/test_keyfs_sqlite_fs.py +0 -71
  82. devpi_server-6.16.0/test_devpi_server/test_replica_functional.py +0 -98
  83. {devpi_server-6.16.0 → devpi_server-6.18.0}/LICENSE +0 -0
  84. {devpi_server-6.16.0 → devpi_server-6.18.0}/MANIFEST.in +0 -0
  85. {devpi_server-6.16.0 → devpi_server-6.18.0}/README.rst +0 -0
  86. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/auth_basic.py +0 -0
  87. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/auth_devpi.py +0 -0
  88. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/cfg/__init__.py +0 -0
  89. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/cfg/crontab.template +0 -0
  90. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/cfg/devpi.service.template +0 -0
  91. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/cfg/launchd-macos.txt.template +0 -0
  92. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/cfg/nginx-devpi-caching-http.conf.template +0 -0
  93. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/cfg/nginx-devpi-caching-location.conf.template +0 -0
  94. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/cfg/nginx-devpi-caching-proxy.conf.template +0 -0
  95. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/cfg/nginx-devpi-caching-server.conf.template +0 -0
  96. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/cfg/nginx-devpi.conf.template +0 -0
  97. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/cfg/supervisor-devpi.conf.template +0 -0
  98. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/cfg/supervisord.conf.template +0 -0
  99. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/cfg/windows-service.txt.template +0 -0
  100. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/exceptions.py +0 -0
  101. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/init.py +0 -0
  102. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/log.py +0 -0
  103. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/markers.py +0 -0
  104. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/passwd.py +0 -0
  105. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server/py.typed +0 -0
  106. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server.egg-info/dependency_links.txt +0 -0
  107. {devpi_server-6.16.0 → devpi_server-6.18.0}/devpi_server.egg-info/top_level.txt +0 -0
  108. {devpi_server-6.16.0 → devpi_server-6.18.0}/setup.cfg +0 -0
  109. {devpi_server-6.16.0/devpi_server/vendor → devpi_server-6.18.0/test_devpi_server}/__init__.py +0 -0
  110. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/conftest.py +0 -0
  111. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/badindexname/dataindex.json +0 -0
  112. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/badusername/dataindex.json +0 -0
  113. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/basescycle/dataindex.json +0 -0
  114. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/createdmodified/dataindex.json +0 -0
  115. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/deletedbase/dataindex.json +0 -0
  116. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/mirrordata/dataindex.json +0 -0
  117. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/mirrordata/root/pypi/dddttt/0.1.dev1/dddttt-0.1.dev1.tar.gz +0 -0
  118. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/modifiedpypi/dataindex.json +0 -0
  119. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/nocreatedmodified/dataindex.json +0 -0
  120. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/normalization/dataindex.json +0 -0
  121. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/normalization/root/dev/hello.pkg/hello.pkg-1.0.tar.gz +0 -0
  122. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/normalization_merge/dataindex.json +0 -0
  123. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/normalization_merge/root/dev/hello-pkg/hello.pkg-1.1.tar.gz +0 -0
  124. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/normalization_merge/root/dev/hello.pkg/hello.pkg-1.0.tar.gz +0 -0
  125. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/norootpypi/dataindex.json +0 -0
  126. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/nouser/dataindex.json +0 -0
  127. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/removedindexplugin/dataindex.json +0 -0
  128. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/removedindexplugin/user/dev/pkg/pkg-1.0.tar.gz +0 -0
  129. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/toxresult_naming_scheme/dataindex.json +0 -0
  130. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/toxresult_naming_scheme/root/dev/hello/0.9/hello-0.9.tar.gz +0 -0
  131. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/toxresult_naming_scheme/root/dev/hello/sha256=ed7002b439e9ac845f22357d822bac1444730fbdb6016d3ec9432297b9ec9f73/hello-0.9.tar.gz.toxresult0 +0 -0
  132. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/importexportdata/toxresult_upload_default/dataindex.json +0 -0
  133. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/py.typed +0 -0
  134. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/reqmock.py +0 -0
  135. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_authcheck.py +0 -0
  136. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_fileutil.py +1 -1
  137. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_fsck.py +0 -0
  138. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_genconfig.py +1 -1
  139. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_nginx.py +0 -0
  140. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_nginx_replica.py +3 -3
  141. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_readonly.py +0 -0
  142. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_streaming_nginx.py +1 -1
  143. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_streaming_replica.py +1 -1
  144. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_streaming_replica_nginx.py +1 -1
  145. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_views_patch.py +0 -0
  146. {devpi_server-6.16.0 → devpi_server-6.18.0}/test_devpi_server/test_views_status.py +0 -0
@@ -2,8 +2,7 @@
2
2
  # E203 is ignored because we enforce ruff format which contradicts it
3
3
  ignore = E203,E501,E704,E741,W503
4
4
  per-file-ignores =
5
- plugin.py:E127,E128,E225,E231
6
- importexport.py:E127
7
- model.py:E128,E225,E231
5
+ plugin.py:E127,E128,E231
6
+ model.py:E128,E231
8
7
  test_importexport.py:E121
9
8
  test*.py:E126,E127,E128,E225,E226,E231,E251
@@ -2,22 +2,97 @@
2
2
 
3
3
  .. towncrier release notes start
4
4
 
5
- 6.16.0 (2025-06-25)
5
+ 6.18.0 (2026-01-27)
6
+ ===================
7
+
8
+ Features
9
+ --------
10
+
11
+ - Store all available hashes of files.
12
+
13
+ - Validate hashes of all files during devpi-import, not only releases.
14
+
15
+ Bug Fixes
16
+ ---------
17
+
18
+ - Apply argparse transformations on values read from config file or environment.
19
+
20
+ - Restore Python and platform info in user agent string after switch to httpx.
21
+
22
+ - Remove all database entries on project deletion instead of only emptying them.
23
+
24
+ - Fix error at end of replica streaming caused by changed behavior from switch to httpx.
25
+
26
+ - Fix #1102: The data stream was cut off after 64k when proxying from replica to primary after switching to httpx.
27
+
28
+ - Fix #1107: retry file downloads if there has been an error during download.
29
+
30
+ Other Changes
31
+ -------------
32
+
33
+ - The filenames of some exported doczip files change due to normalization of the project name caused by changing the internals during export to allow ``--hard-links`` to work.
34
+
35
+
36
+ 6.17.0 (2025-08-27)
6
37
  ===================
7
38
 
8
39
  Deprecations and Removals
9
40
  -------------------------
10
41
 
11
- - Dropped support for Python 3.7 and 3.8.
42
+ - Dropped support for migrating old password hashes that were replaced in devpi-server 4.2.0.
12
43
 
44
+ - Removed support for basic authorization in primary URL. The connection is already secured by a bearer token header.
13
45
 
46
+ - Removed the experimental ``--replica-cert`` option. The replica is already using a token via a shared secret, so this is redundant.
47
+
48
+ - Removed ``--replica-max-retries`` option. It wasn't implemented for async_httpget and didn't work correctly when streaming data.
14
49
 
15
50
  Features
16
51
  --------
17
52
 
18
- - Update stored package metadata fields to version 2.4 for license expressions (PEP 639).
53
+ - Use httpx for all data fetching for mirrors and fetch projects list asynchronously to allow update in background even after a timeout.
54
+
55
+ - Use httpx instead of requests when proxying from replicas to primary.
56
+
57
+ - Use httpx for all requests from replicas to primary.
58
+
59
+ - Use httpx when pushing releases to external index.
60
+
61
+ - Added ``mirror_ignore_serial_header`` mirror index option, which allows switching from PyPI to a mirror without serials header when set to ``True``, otherwise only stale links will be served and no updates be stored.
62
+
63
+ - The HTTP cache information for mirrored projects is persisted and re-used on server restarts.
64
+
65
+ - Added ``--file-replication-skip-indexes`` option to skip file replication for ``all``, by index type (i.e. ``mirror``) or index name (i.e. ``root/pypi``).
66
+
67
+ Bug Fixes
68
+ ---------
69
+
70
+ - Correctly handle lists for ``Provides-Extra`` and ``License-File`` metadata in database.
71
+
72
+ - Fix traceback by returning 401 error code when using wrong password with a user that was created using an authentication plugin like devpi-ldap which passes authentication through in that case.
73
+
74
+ - Fix #1053: allow users to update their passwords when ``--restrict-modify`` is used.
75
+
76
+ - Fix #1097: return 404 when trying to POST to +simple.
77
+
78
+ Other Changes
79
+ -------------
80
+
81
+ - Changed User-Agent when fetching data for mirrors from just "server" to "devpi-server".
82
+
83
+
84
+ 6.16.0 (2025-06-25)
85
+ ===================
86
+
87
+ Deprecations and Removals
88
+ -------------------------
89
+
90
+ - Dropped support for Python 3.7 and 3.8.
19
91
 
92
+ Features
93
+ --------
20
94
 
95
+ - Update stored package metadata fields to version 2.4 for license expressions (PEP 639).
21
96
 
22
97
  Bug Fixes
23
98
  ---------
@@ -27,7 +102,6 @@ Bug Fixes
27
102
  - Keep original metadata_version in database.
28
103
 
29
104
 
30
-
31
105
  6.15.0 (2025-05-18)
32
106
  ===================
33
107
 
@@ -37,7 +111,6 @@ Features
37
111
  - Add ``--connection-limit`` option to devpi-server passed on to waitress.
38
112
 
39
113
 
40
-
41
114
  6.14.0 (2024-10-16)
42
115
  ===================
43
116
 
@@ -50,15 +123,12 @@ Features
50
123
 
51
124
  - Allow pushing of documentation only with no release files. Requires devpi-client 7.2.0.
52
125
 
53
-
54
-
55
126
  Bug Fixes
56
127
  ---------
57
128
 
58
129
  - No longer automatically "register" a project when pushing releases to PyPI. The reply changed from HTTP status 410 to 400 breaking the upload. With devpi-client 7.2.0 there is a ``--register-project`` option if it is still required for some other package registry.
59
130
 
60
131
 
61
-
62
132
  6.13.0 (2024-09-19)
63
133
  ===================
64
134
 
@@ -70,8 +140,6 @@ Deprecations and Removals
70
140
  Using the old terms will now output warnings.
71
141
  The ``+status`` API has additional fields and the ``role`` field content will change with 7.0.0.
72
142
 
73
-
74
-
75
143
  Features
76
144
  --------
77
145
 
@@ -79,8 +147,6 @@ Features
79
147
 
80
148
  - Added support uv pip as an installer.
81
149
 
82
-
83
-
84
150
  Bug Fixes
85
151
  ---------
86
152
 
@@ -93,7 +159,6 @@ Bug Fixes
93
159
  - Only warn about replica not being in sync instead of fatal status while still replicating.
94
160
 
95
161
 
96
-
97
162
  6.12.1 (2024-07-24)
98
163
  ===================
99
164
 
@@ -107,7 +172,6 @@ Bug Fixes
107
172
  - Fix #1044: Correctly update cache expiry time when mirrored server returns 304 Not Modified.
108
173
 
109
174
 
110
-
111
175
  6.12.0 (2024-06-25)
112
176
  ===================
113
177
 
@@ -118,15 +182,12 @@ Features
118
182
 
119
183
  - Added ``devpiserver_on_toxresult_upload_forbidden`` hook to allow returning a custom message and result (403 or 200).
120
184
 
121
-
122
-
123
185
  Bug Fixes
124
186
  ---------
125
187
 
126
188
  - Return json data if toxresult upload is forbidden.
127
189
 
128
190
 
129
-
130
191
  6.11.0 (2024-04-20)
131
192
  ===================
132
193
 
@@ -137,8 +198,6 @@ Features
137
198
 
138
199
  - Fix #983: Add plugin hook for mirror authentication header.
139
200
 
140
-
141
-
142
201
  Bug Fixes
143
202
  ---------
144
203
 
@@ -147,7 +206,6 @@ Bug Fixes
147
206
  - Fix #1033: Use ``int`` for ``--mirror-cache-expiry`` to fix value of ``proxy_cache_valid`` in nginx caching config.
148
207
 
149
208
 
150
-
151
209
  6.10.0 (2023-12-19)
152
210
  ===================
153
211
 
@@ -158,8 +216,6 @@ Features
158
216
 
159
217
  - Fix #998: Use the pure Python httpx library instead of aiohttp to prevent delays in supporting newest Python releases.
160
218
 
161
-
162
-
163
219
  Bug Fixes
164
220
  ---------
165
221
 
@@ -168,7 +224,6 @@ Bug Fixes
168
224
  - Only compare hostname instead of full URL prefix when parsing mirror packages to fix mirrors with basic authentication and absolute URLs. See #1006
169
225
 
170
226
 
171
-
172
227
  6.9.2 (2023-08-06)
173
228
  ==================
174
229
 
@@ -199,7 +254,6 @@ Features
199
254
 
200
255
  - Fix #931: Add ``mirror_no_project_list`` setting for mirror indexes that have no full project list like google cloud artifacts or if you want to prevent downloading the full list for huge indexes like PyPI.
201
256
 
202
-
203
257
  Bug Fixes
204
258
  ---------
205
259
 
@@ -222,7 +276,6 @@ Features
222
276
 
223
277
  - Fix #929: Cache normalized project names per transaction on mirror index instances.
224
278
 
225
-
226
279
  Bug Fixes
227
280
  ---------
228
281
 
@@ -245,7 +298,6 @@ Features
245
298
 
246
299
  - Set headers to prevent caching for simple links with stale results.
247
300
 
248
-
249
301
  Bug Fixes
250
302
  ---------
251
303
 
@@ -283,7 +335,6 @@ Features
283
335
 
284
336
  - Support `PEP-691 <https://peps.python.org/pep-0691/>`_ conformant fetching for mirrors, and requests with JSON result for installers. Proxy servers should add compression support for the ``application/vnd.pypi.simple.v1+json`` content type (``gzip_types`` for nginx).
285
337
 
286
-
287
338
  Bug Fixes
288
339
  ---------
289
340
 
@@ -325,7 +376,6 @@ Features
325
376
 
326
377
  - Better logging and handling if a thread unexpectedly dies.
327
378
 
328
-
329
379
  Bug Fixes
330
380
  ---------
331
381
 
@@ -346,13 +396,11 @@ Deprecations and Removals
346
396
 
347
397
  - As announced with 6.0.0, support for Python 3.6 has been dropped, because it has reached its end of life.
348
398
 
349
-
350
399
  Features
351
400
  --------
352
401
 
353
402
  - When an installer user agent is detected the full list of projects is returned unsorted and with less info to improve performance and reduce memory usage.
354
403
 
355
-
356
404
  Bug Fixes
357
405
  ---------
358
406
 
@@ -378,7 +426,6 @@ Features
378
426
 
379
427
  - Use aiohttp (asyncio) for fetching release links from mirrors to return stale links immediately in case of a timeout, but update the database in the background for the next request.
380
428
 
381
-
382
429
  Bug Fixes
383
430
  ---------
384
431
 
@@ -412,7 +459,6 @@ Deprecations and Removals
412
459
 
413
460
  - Renamed 'pypi_submit' permission to 'upload'. The old permission still works, but will be removed in a later major release.
414
461
 
415
-
416
462
  Features
417
463
  --------
418
464
 
@@ -420,7 +466,6 @@ Features
420
466
 
421
467
  - Allow user and index URLs to work with a trailing slash.
422
468
 
423
-
424
469
  Bug Fixes
425
470
  ---------
426
471
 
@@ -448,7 +493,6 @@ Deprecations and Removals
448
493
 
449
494
  - Removed deprecated ``--start``, ``--stop`` and ``--status`` options.
450
495
 
451
-
452
496
  Features
453
497
  --------
454
498
 
@@ -480,7 +524,6 @@ Features
480
524
 
481
525
  - The user creation and modification time is now stored. Adding or removing an index doesn't count as a modification.
482
526
 
483
-
484
527
  Bug Fixes
485
528
  ---------
486
529
 
@@ -492,7 +535,6 @@ Bug Fixes
492
535
 
493
536
  - Handle cases where the ``Content-Type`` header from a mirror can be an empty string.
494
537
 
495
-
496
538
  Other Changes
497
539
  -------------
498
540
 
@@ -559,7 +601,6 @@ Features
559
601
 
560
602
  - On import files for mirror indexes are now imported when they were included in the dump (see ``--include-mirrored-files``).
561
603
 
562
-
563
604
  Bug Fixes
564
605
  ---------
565
606
 
@@ -587,7 +628,6 @@ Features
587
628
 
588
629
  - proxy requests from the replica to the master will use number of seconds from the new ``--proxy-timeout`` option as their timeout value.
589
630
 
590
-
591
631
  Bug Fixes
592
632
  ---------
593
633
 
@@ -610,7 +650,6 @@ Deprecations and Removals
610
650
 
611
651
  - The ``--passwd`` option is deprecated, use the new ``devpi-passwd`` command instead.
612
652
 
613
-
614
653
  Features
615
654
  --------
616
655
 
@@ -624,7 +663,6 @@ Features
624
663
 
625
664
  - Storage options can now be specified as a dict in yaml config files.
626
665
 
627
-
628
666
  Bug Fixes
629
667
  ---------
630
668
 
@@ -646,7 +684,6 @@ Bug Fixes
646
684
 
647
685
  - Unnecessary database writes where the final value didn't change are now prevented.
648
686
 
649
-
650
687
  Other Changes
651
688
  -------------
652
689
 
@@ -680,7 +717,6 @@ Deprecations and Removals
680
717
 
681
718
  - deprecated Python 2.7 support. This is the last major version supporting Python 2.7. For upgrading to Python 3.x you have to export your data using your current setup with Python 2.7 and import it in a new installation with Python 3.x.
682
719
 
683
-
684
720
  Features
685
721
  --------
686
722
 
@@ -698,7 +734,6 @@ Features
698
734
 
699
735
  - when credentials for the user are rejected, the error message now says so instead of claiming the user could not be found.
700
736
 
701
-
702
737
  Other Changes
703
738
  -------------
704
739
 
@@ -733,7 +768,6 @@ Features
733
768
 
734
769
  - add ``--hard-links`` support for replicas together with the ``--replica-file-search-path`` option. When a matching file is found it's hard linked instead of writing a copy.
735
770
 
736
-
737
771
  Bug Fixes
738
772
  ---------
739
773
 
@@ -743,7 +777,6 @@ Bug Fixes
743
777
 
744
778
  - use timeout when waiting for data from master in replica on mirror simple pages.
745
779
 
746
-
747
780
  Other Changes
748
781
  -------------
749
782
 
@@ -775,7 +808,6 @@ Features
775
808
 
776
809
  - The PATCH method of indexes supports a list of arguments with operations in the form of ``key=value`` for setting values and for lists in the form of ``key+=value`` and ``key-=value`` to add and remove items. This prevents undoing changes sent in concurrent PATCH requests.
777
810
 
778
-
779
811
  Bug Fixes
780
812
  ---------
781
813
 
@@ -805,7 +837,6 @@ Deprecations and Removals
805
837
 
806
838
  - Deprecated DEVPI_SERVERDIR environment variable in favor of DEVPISERVER_SERVERDIR to be consistent with the other option overwrites.
807
839
 
808
-
809
840
  Features
810
841
  --------
811
842
 
@@ -825,7 +856,6 @@ Features
825
856
 
826
857
  - Better handling of 404s in mirror indexes. Every project not found would create an entry in the database which would grow it unnecessarily.
827
858
 
828
-
829
859
  Bug Fixes
830
860
  ---------
831
861
 
@@ -863,7 +893,6 @@ Features
863
893
 
864
894
  - add `--request-timeout` option to provide adjustable request timeout
865
895
 
866
-
867
896
  Bug Fixes
868
897
  ---------
869
898
 
@@ -889,7 +918,6 @@ Features
889
918
 
890
919
  - Use ``pypi.org`` as new default for ``root/pypi`` mirror index.
891
920
 
892
-
893
921
  Bug Fixes
894
922
  ---------
895
923
 
@@ -909,7 +937,6 @@ Features
909
937
 
910
938
  - fix issue469: Add ``acl_toxresult_upload`` to index configuration.
911
939
 
912
-
913
940
  Bug Fixes
914
941
  ---------
915
942
 
@@ -0,0 +1,137 @@
1
+
2
+
3
+ =========
4
+ Changelog
5
+ =========
6
+
7
+
8
+
9
+
10
+ .. towncrier release notes start
11
+
12
+ 6.18.0 (2026-01-27)
13
+ ===================
14
+
15
+ Features
16
+ --------
17
+
18
+ - Store all available hashes of files.
19
+
20
+ - Validate hashes of all files during devpi-import, not only releases.
21
+
22
+ Bug Fixes
23
+ ---------
24
+
25
+ - Apply argparse transformations on values read from config file or environment.
26
+
27
+ - Restore Python and platform info in user agent string after switch to httpx.
28
+
29
+ - Remove all database entries on project deletion instead of only emptying them.
30
+
31
+ - Fix error at end of replica streaming caused by changed behavior from switch to httpx.
32
+
33
+ - Fix #1102: The data stream was cut off after 64k when proxying from replica to primary after switching to httpx.
34
+
35
+ - Fix #1107: retry file downloads if there has been an error during download.
36
+
37
+ Other Changes
38
+ -------------
39
+
40
+ - The filenames of some exported doczip files change due to normalization of the project name caused by changing the internals during export to allow ``--hard-links`` to work.
41
+
42
+
43
+ 6.17.0 (2025-08-27)
44
+ ===================
45
+
46
+ Deprecations and Removals
47
+ -------------------------
48
+
49
+ - Dropped support for migrating old password hashes that were replaced in devpi-server 4.2.0.
50
+
51
+ - Removed support for basic authorization in primary URL. The connection is already secured by a bearer token header.
52
+
53
+ - Removed the experimental ``--replica-cert`` option. The replica is already using a token via a shared secret, so this is redundant.
54
+
55
+ - Removed ``--replica-max-retries`` option. It wasn't implemented for async_httpget and didn't work correctly when streaming data.
56
+
57
+ Features
58
+ --------
59
+
60
+ - Use httpx for all data fetching for mirrors and fetch projects list asynchronously to allow update in background even after a timeout.
61
+
62
+ - Use httpx instead of requests when proxying from replicas to primary.
63
+
64
+ - Use httpx for all requests from replicas to primary.
65
+
66
+ - Use httpx when pushing releases to external index.
67
+
68
+ - Added ``mirror_ignore_serial_header`` mirror index option, which allows switching from PyPI to a mirror without serials header when set to ``True``, otherwise only stale links will be served and no updates be stored.
69
+
70
+ - The HTTP cache information for mirrored projects is persisted and re-used on server restarts.
71
+
72
+ - Added ``--file-replication-skip-indexes`` option to skip file replication for ``all``, by index type (i.e. ``mirror``) or index name (i.e. ``root/pypi``).
73
+
74
+ Bug Fixes
75
+ ---------
76
+
77
+ - Correctly handle lists for ``Provides-Extra`` and ``License-File`` metadata in database.
78
+
79
+ - Fix traceback by returning 401 error code when using wrong password with a user that was created using an authentication plugin like devpi-ldap which passes authentication through in that case.
80
+
81
+ - Fix #1053: allow users to update their passwords when ``--restrict-modify`` is used.
82
+
83
+ - Fix #1097: return 404 when trying to POST to +simple.
84
+
85
+ Other Changes
86
+ -------------
87
+
88
+ - Changed User-Agent when fetching data for mirrors from just "server" to "devpi-server".
89
+
90
+
91
+ 6.16.0 (2025-06-25)
92
+ ===================
93
+
94
+ Deprecations and Removals
95
+ -------------------------
96
+
97
+ - Dropped support for Python 3.7 and 3.8.
98
+
99
+ Features
100
+ --------
101
+
102
+ - Update stored package metadata fields to version 2.4 for license expressions (PEP 639).
103
+
104
+ Bug Fixes
105
+ ---------
106
+
107
+ - Preserve hash when importing mirror data to prevent unnecessary updates later on.
108
+
109
+ - Keep original metadata_version in database.
110
+
111
+
112
+ 6.15.0 (2025-05-18)
113
+ ===================
114
+
115
+ Features
116
+ --------
117
+
118
+ - Add ``--connection-limit`` option to devpi-server passed on to waitress.
119
+
120
+
121
+ 6.14.0 (2024-10-16)
122
+ ===================
123
+
124
+ Features
125
+ --------
126
+
127
+ - Allow pushing of versions which only have documentation and no releases.
128
+
129
+ - Allow pushing of release files only with no documentation. Requires devpi-client 7.2.0.
130
+
131
+ - Allow pushing of documentation only with no release files. Requires devpi-client 7.2.0.
132
+
133
+ Bug Fixes
134
+ ---------
135
+
136
+ - No longer automatically "register" a project when pushing releases to PyPI. The reply changed from HTTP status 410 to 400 breaking the upload. With devpi-client 7.2.0 there is a ``--register-project`` option if it is still required for some other package registry.
137
+