From 06ec2829fc44daad5bab7c09a6d4ab12fbaa58d2 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Wed, 25 Jun 2025 23:26:32 +0100 Subject: [PATCH 1/2] Separate default install tag from default launch tag. This 'fixes' issues people have where they want prerelease installer but not prerelease Python. At 3.14's release, we'll remove the default config setting that installs 3-dev. Fixes #122 --- src/manage/commands.py | 4 +++- src/manage/config.py | 2 ++ src/manage/install_command.py | 14 +++++++------- src/pymanager.json | 5 ++++- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/manage/commands.py b/src/manage/commands.py index b049b39..7deae18 100644 --- a/src/manage/commands.py +++ b/src/manage/commands.py @@ -22,7 +22,7 @@ # or check out the docs for administrative controls: # https://docs.python.org/using/windows DEFAULT_SOURCE_URL = "https://www.python.org/ftp/python/index-windows.json" -DEFAULT_TAG = "3.14" +DEFAULT_TAG = "3" # TODO: Remove the /dev/ for stable release @@ -253,6 +253,7 @@ def execute(self): "fallback_source": (str, None, "env", "path", "uri"), "enable_shortcut_kinds": (str, config_split_append), "disable_shortcut_kinds": (str, config_split_append), + "default_install_tag": (str, None), }, "first_run": { @@ -792,6 +793,7 @@ class InstallCommand(BaseCommand): from_script = None enable_shortcut_kinds = None disable_shortcut_kinds = None + default_install_tag = DEFAULT_TAG def __init__(self, args, root=None): super().__init__(args, root) diff --git a/src/manage/config.py b/src/manage/config.py index 31a999b..7518a41 100644 --- a/src/manage/config.py +++ b/src/manage/config.py @@ -208,6 +208,8 @@ def resolve_config(cfg, source, relative_to, key_so_far="", schema=None, error_u def merge_config(into_cfg, from_cfg, schema, *, source="", overwrite=False): for k, v in from_cfg.items(): + if k.startswith("#"): + continue try: into = into_cfg[k] except LookupError: diff --git a/src/manage/install_command.py b/src/manage/install_command.py index c89afb2..a0fe4ce 100644 --- a/src/manage/install_command.py +++ b/src/manage/install_command.py @@ -604,8 +604,8 @@ def execute(cmd): if not cmd.by_id: for arg in cmd.args: if arg.casefold() == "default".casefold(): - LOGGER.debug("Replacing 'default' with '%s'", cmd.default_tag) - cmd.tags.append(tag_or_range(cmd.default_tag)) + LOGGER.debug("Replacing 'default' with '%s'", cmd.default_install_tag) + cmd.tags.append(tag_or_range(cmd.default_install_tag)) else: try: cmd.tags.append(tag_or_range(arg)) @@ -613,7 +613,7 @@ def execute(cmd): LOGGER.warn("%s", ex) if not cmd.tags and cmd.automatic: - cmd.tags = [tag_or_range(cmd.default_tag)] + cmd.tags = [tag_or_range(cmd.default_install_tag)] else: if cmd.from_script: raise ArgumentError("Cannot use --by-id and --from-script together") @@ -629,9 +629,9 @@ def execute(cmd): try: tag = cmd.tags[0] except IndexError: - if cmd.default_tag: - LOGGER.debug("No tags provided, installing default tag %s", cmd.default_tag) - tag = cmd.default_tag + if cmd.default_install_tag: + LOGGER.debug("No tags provided, installing default tag %s", cmd.default_install_tag) + tag = cmd.default_install_tag else: LOGGER.debug("No tags provided, installing first runtime in feed") tag = None @@ -671,7 +671,7 @@ def execute(cmd): if spec: cmd.tags.append(tag_or_range(spec)) else: - cmd.tags.append(tag_or_range(cmd.default_tag)) + cmd.tags.append(tag_or_range(cmd.default_install_tag)) if cmd.virtual_env: LOGGER.debug("Clearing virtual_env setting to avoid conflicts during install.") diff --git a/src/pymanager.json b/src/pymanager.json index 2697ab9..c55af9a 100644 --- a/src/pymanager.json +++ b/src/pymanager.json @@ -1,7 +1,10 @@ { "install": { "source": "%PYTHON_MANAGER_SOURCE_URL%", - "fallback_source": "./bundled/fallback-index.json" + "fallback_source": "./bundled/fallback-index.json", + + "#": "Install 3.14 (prerelease) by default during prerelease PyManager", + "default_install_tag": "3-dev" }, "list": { "format": "%PYTHON_MANAGER_LIST_FORMAT%" From c3ec3f95b86759f446d4d3dbea684faf44dbdee2 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Wed, 25 Jun 2025 23:28:37 +0100 Subject: [PATCH 2/2] Default to matching default_tag, not the constant --- src/manage/commands.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/manage/commands.py b/src/manage/commands.py index 7deae18..fbc84d7 100644 --- a/src/manage/commands.py +++ b/src/manage/commands.py @@ -793,13 +793,15 @@ class InstallCommand(BaseCommand): from_script = None enable_shortcut_kinds = None disable_shortcut_kinds = None - default_install_tag = DEFAULT_TAG + default_install_tag = None def __init__(self, args, root=None): super().__init__(args, root) if not self.source: self.source = DEFAULT_SOURCE_URL + if not self.default_install_tag: + self.default_install_tag = self.default_tag if "://" not in str(self.source): try: self.source = Path(self.source).absolute().as_uri()