https://github.com/python/cpython/commit/c46265d94a2d2c5bcaabbbc312f8f6ac9162cd5f
commit: c46265d94a2d2c5bcaabbbc312f8f6ac9162cd5f
branch: main
author: Steve Dower <[email protected]>
committer: zooba <[email protected]>
date: 2025-10-13T20:43:14+01:00
summary:

gh-139810: Always generate -dev tags for PyManager packages (GH-139814)

files:
A Misc/NEWS.d/next/Windows/2025-10-08-22-54-38.gh-issue-139810.LAaemi.rst
M PC/layout/support/pymanager.py

diff --git 
a/Misc/NEWS.d/next/Windows/2025-10-08-22-54-38.gh-issue-139810.LAaemi.rst 
b/Misc/NEWS.d/next/Windows/2025-10-08-22-54-38.gh-issue-139810.LAaemi.rst
new file mode 100644
index 00000000000000..55252f288b0a33
--- /dev/null
+++ b/Misc/NEWS.d/next/Windows/2025-10-08-22-54-38.gh-issue-139810.LAaemi.rst
@@ -0,0 +1,2 @@
+Installing with ``py install 3[.x]-dev`` will now select final versions as
+well as prereleases.
diff --git a/PC/layout/support/pymanager.py b/PC/layout/support/pymanager.py
index 667c89cdd2cc7a..831d49ea3f9b46 100644
--- a/PC/layout/support/pymanager.py
+++ b/PC/layout/support/pymanager.py
@@ -80,7 +80,9 @@ def calculate_install_json(ns, *, for_embed=False, 
for_test=False):
 
     # Tag used in runtime ID (for side-by-side install/updates)
     ID_TAG = XY_ARCH_TAG
-    # Tag shown in 'py list' output
+    # Tag shown in 'py list' output.
+    # gh-139810: We only include '-dev' here for prereleases, even though it
+    # works for final releases too.
     DISPLAY_TAG = f"{XY_TAG}-dev{TAG_ARCH}" if VER_SUFFIX else XY_ARCH_TAG
     # Tag used for PEP 514 registration
     SYS_WINVER = XY_TAG + (TAG_ARCH if TAG_ARCH != '-64' else '')
@@ -102,9 +104,10 @@ def calculate_install_json(ns, *, for_embed=False, 
for_test=False):
         FULL_ARCH_TAG,
         XY_ARCH_TAG,
         X_ARCH_TAG,
-        # X_TAG and XY_TAG doesn't include VER_SUFFIX, so create -dev versions
-        f"{XY_TAG}-dev{TAG_ARCH}" if XY_TAG and VER_SUFFIX else "",
-        f"{X_TAG}-dev{TAG_ARCH}" if X_TAG and VER_SUFFIX else "",
+        # gh-139810: The -dev tags are always included so that the latest
+        # release is chosen, no matter whether it's prerelease or final.
+        f"{XY_TAG}-dev{TAG_ARCH}" if XY_TAG else "",
+        f"{X_TAG}-dev{TAG_ARCH}" if X_TAG else "",
     ]
 
     # Generate run-for entries for each target.
@@ -115,16 +118,15 @@ def calculate_install_json(ns, *, for_embed=False, 
for_test=False):
     ]:
         if not base["target"]:
             continue
-        STD_RUN_FOR.append({**base, "tag": FULL_ARCH_TAG})
+        STD_RUN_FOR.extend([
+            {**base, "tag": FULL_ARCH_TAG},
+            {**base, "tag": f"{XY_TAG}-dev{TAG_ARCH}" if XY_TAG else ""},
+            {**base, "tag": f"{X_TAG}-dev{TAG_ARCH}" if X_TAG else ""},
+        ])
         if XY_TAG:
             STD_RUN_FOR.append({**base, "tag": XY_ARCH_TAG})
         if X_TAG:
             STD_RUN_FOR.append({**base, "tag": X_ARCH_TAG})
-        if VER_SUFFIX:
-            STD_RUN_FOR.extend([
-                {**base, "tag": f"{XY_TAG}-dev{TAG_ARCH}" if XY_TAG else ""},
-                {**base, "tag": f"{X_TAG}-dev{TAG_ARCH}" if X_TAG else ""},
-            ])
 
     # Generate alias entries for each target. We need both arch and non-arch
     # versions as well as windowed/non-windowed versions to make sure that all

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to