Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package asdf for openSUSE:Factory checked in 
at 2025-03-04 20:33:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/asdf (Old)
 and      /work/SRC/openSUSE:Factory/.asdf.new.19136 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "asdf"

Tue Mar  4 20:33:27 2025 rev:2 rq:1250124 version:0.16.5

Changes:
--------
--- /work/SRC/openSUSE:Factory/asdf/asdf.changes        2025-03-03 
16:23:55.910414211 +0100
+++ /work/SRC/openSUSE:Factory/.asdf.new.19136/asdf.changes     2025-03-04 
20:33:38.305538611 +0100
@@ -1,0 +2,14 @@
+Tue Mar 04 15:57:14 UTC 2025 - Alessio Biancalana <[email protected]>
+
+- Update to version 0.16.5:
+  * chore: release 0.16.5 (#1985)
+  * fix: preserve files untracked by Git on plugin update (#1995)
+  * fix: build static binary to improve portability (#1993)
+  * fix: latest version returns latest version (#1996)
+  * chore(docs): bump the docs group in /docs with 2 updates (#2000)
+  * fix: set correct env vars on recursive calls (#1989)
+  * fix: correct exit status when sub-command does not exist (#1991)
+  * fix: simplify env vars parsing (#1988)
+  * fix: always propagate env variables when executing commands (#1982)
+
+-------------------------------------------------------------------

Old:
----
  asdf-0.16.4.obscpio

New:
----
  asdf-0.16.5.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ asdf.spec ++++++
--- /var/tmp/diff_new_pack.ki9xmk/_old  2025-03-04 20:33:40.105613506 +0100
+++ /var/tmp/diff_new_pack.ki9xmk/_new  2025-03-04 20:33:40.105613506 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           asdf
-Version:        0.16.4
+Version:        0.16.5
 Release:        0
 Summary:        Extendable version manager
 License:        MIT

++++++ _service ++++++
--- /var/tmp/diff_new_pack.ki9xmk/_old  2025-03-04 20:33:40.133614671 +0100
+++ /var/tmp/diff_new_pack.ki9xmk/_new  2025-03-04 20:33:40.137614838 +0100
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/asdf-vm/asdf/</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="revision">v0.16.4</param>
+    <param name="revision">v0.16.5</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="changesgenerate">enable</param>
     <param name="versionrewrite-pattern">v(.*)</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.ki9xmk/_old  2025-03-04 20:33:40.157615670 +0100
+++ /var/tmp/diff_new_pack.ki9xmk/_new  2025-03-04 20:33:40.161615836 +0100
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param name="url">https://github.com/asdf-vm/asdf/</param>
-              <param 
name="changesrevision">4b9297b82df5a59fcce7f80bf8d92f8f8b07e38d</param></service></servicedata>
+              <param 
name="changesrevision">7352bf4890143184ba419392ca5e6204167c8306</param></service></servicedata>
 (No newline at EOF)
 

++++++ asdf-0.16.4.obscpio -> asdf-0.16.5.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/.editorconfig 
new/asdf-0.16.5/.editorconfig
--- old/asdf-0.16.4/.editorconfig       2025-02-22 13:44:42.000000000 +0100
+++ new/asdf-0.16.5/.editorconfig       2025-03-04 15:00:54.000000000 +0100
@@ -8,6 +8,9 @@
 trim_trailing_whitespace = true
 insert_final_newline = true
 
+[*.go]
+indent_style = tab
+
 [*.py]
 indent_size = 4
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/.github/workflows/release-build.yml 
new/asdf-0.16.5/.github/workflows/release-build.yml
--- old/asdf-0.16.4/.github/workflows/release-build.yml 2025-02-22 
13:44:42.000000000 +0100
+++ new/asdf-0.16.5/.github/workflows/release-build.yml 2025-03-04 
15:00:54.000000000 +0100
@@ -31,6 +31,7 @@
       - name: Build Go binaries
         uses: wangyoucao577/go-release-action@v1
         with:
+          pre_command: "export CGO_ENABLED=0"
           github_token: ${{ secrets.GITHUB_TOKEN }}
           goos: ${{ matrix.goos }}
           goarch: ${{ matrix.goarch }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/.gitignore new/asdf-0.16.5/.gitignore
--- old/asdf-0.16.4/.gitignore  2025-02-22 13:44:42.000000000 +0100
+++ new/asdf-0.16.5/.gitignore  2025-03-04 15:00:54.000000000 +0100
@@ -5,6 +5,7 @@
 .vagrant
 keyrings
 /tmp
+.idea
 
 dist/
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/.release-please-manifest.json 
new/asdf-0.16.5/.release-please-manifest.json
--- old/asdf-0.16.4/.release-please-manifest.json       2025-02-22 
13:44:42.000000000 +0100
+++ new/asdf-0.16.5/.release-please-manifest.json       2025-03-04 
15:00:54.000000000 +0100
@@ -23,5 +23,5 @@
     "docs/pt-br/guide/getting-started.md",
     "docs/zh-hans/guide/getting-started.md"
   ],
-  ".": "0.16.4"
+  ".": "0.16.5"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/CHANGELOG.md new/asdf-0.16.5/CHANGELOG.md
--- old/asdf-0.16.4/CHANGELOG.md        2025-02-22 13:44:42.000000000 +0100
+++ new/asdf-0.16.5/CHANGELOG.md        2025-03-04 15:00:54.000000000 +0100
@@ -1,5 +1,18 @@
 # Changelog
 
+## [0.16.5](https://github.com/asdf-vm/asdf/compare/v0.16.4...v0.16.5) 
(2025-03-04)
+
+
+### Bug Fixes
+
+* always propagate env variables when executing commands 
([#1982](https://github.com/asdf-vm/asdf/issues/1982)) 
([80265a8](https://github.com/asdf-vm/asdf/commit/80265a8eecedc623cb8cf5cca18ae563e9d4f94c))
+* build static binary to improve portability 
([#1993](https://github.com/asdf-vm/asdf/issues/1993)) 
([45047a6](https://github.com/asdf-vm/asdf/commit/45047a6c451599e718f996fdadbdcea3ecf683fd))
+* correct exit status when sub-command does not exist 
([#1991](https://github.com/asdf-vm/asdf/issues/1991)) 
([3dd0dd3](https://github.com/asdf-vm/asdf/commit/3dd0dd3b475d1c4ddcb6d76248a988be5cceef51)),
 closes [#1928](https://github.com/asdf-vm/asdf/issues/1928)
+* latest version returns latest version 
([#1996](https://github.com/asdf-vm/asdf/issues/1996)) 
([0ceac7a](https://github.com/asdf-vm/asdf/commit/0ceac7af8c126980901caba4d8daa80900819451))
+* preserve files untracked by Git on plugin update 
([#1995](https://github.com/asdf-vm/asdf/issues/1995)) 
([d4d8db0](https://github.com/asdf-vm/asdf/commit/d4d8db035d9f349bfed513af6976734db18e2c14))
+* set correct env vars on recursive calls 
([#1989](https://github.com/asdf-vm/asdf/issues/1989)) 
([97a91cc](https://github.com/asdf-vm/asdf/commit/97a91cc8d01bda0896a50dff50a162e87fd61e57))
+* simplify env vars parsing 
([#1988](https://github.com/asdf-vm/asdf/issues/1988)) 
([8990b6b](https://github.com/asdf-vm/asdf/commit/8990b6b4ae3c9754f3764289f0d7cf410815d29d)),
 closes [#1986](https://github.com/asdf-vm/asdf/issues/1986)
+
 ## [0.16.4](https://github.com/asdf-vm/asdf/compare/v0.16.3...v0.16.4) 
(2025-02-19)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/cmd/asdf/main_test.go 
new/asdf-0.16.5/cmd/asdf/main_test.go
--- old/asdf-0.16.4/cmd/asdf/main_test.go       2025-02-22 13:44:42.000000000 
+0100
+++ new/asdf-0.16.5/cmd/asdf/main_test.go       2025-03-04 15:00:54.000000000 
+0100
@@ -106,6 +106,10 @@
        t.Run("which_command", func(t *testing.T) {
                runBatsFile(t, dir, "which_command.bats")
        })
+
+       t.Run("non_existent_command", func(t *testing.T) {
+               runBatsFile(t, dir, "non_existent_command.bats")
+       })
 }
 
 func runBatsFile(t *testing.T, dir, filename string) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/docs/package-lock.json 
new/asdf-0.16.5/docs/package-lock.json
--- old/asdf-0.16.4/docs/package-lock.json      2025-02-22 13:44:42.000000000 
+0100
+++ new/asdf-0.16.5/docs/package-lock.json      2025-03-04 15:00:54.000000000 
+0100
@@ -5,8 +5,8 @@
   "packages": {
     "": {
       "devDependencies": {
-        "@types/node": "^22.13.0",
-        "prettier": "^3.4.2",
+        "@types/node": "^22.13.8",
+        "prettier": "^3.5.2",
         "vitepress": "^1.6.3"
       }
     },
@@ -1171,9 +1171,9 @@
       "dev": true
     },
     "node_modules/@types/node": {
-      "version": "22.13.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.0.tgz";,
-      "integrity": 
"sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==",
+      "version": "22.13.8",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.8.tgz";,
+      "integrity": 
"sha512-G3EfaZS+iOGYWLLRCEAXdWK9my08oHNZ+FHluRiggIYJPOXzhOiDgpVCUHaUvyIC5/fj7C/p637jdzC666AOKQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1984,10 +1984,11 @@
       }
     },
     "node_modules/prettier": {
-      "version": "3.4.2",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz";,
-      "integrity": 
"sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz";,
+      "integrity": 
"sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "prettier": "bin/prettier.cjs"
       },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/docs/package.json 
new/asdf-0.16.5/docs/package.json
--- old/asdf-0.16.4/docs/package.json   2025-02-22 13:44:42.000000000 +0100
+++ new/asdf-0.16.5/docs/package.json   2025-03-04 15:00:54.000000000 +0100
@@ -7,8 +7,8 @@
     "preview": "vitepress preview"
   },
   "devDependencies": {
-    "@types/node": "^22.13.0",
-    "prettier": "^3.4.2",
+    "@types/node": "^22.13.8",
+    "prettier": "^3.5.2",
     "vitepress": "^1.6.3"
   }
 }
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/internal/cli/cli.go 
new/asdf-0.16.5/internal/cli/cli.go
--- old/asdf-0.16.4/internal/cli/cli.go 2025-02-22 13:44:42.000000000 +0100
+++ new/asdf-0.16.5/internal/cli/cli.go 2025-03-04 15:00:54.000000000 +0100
@@ -181,7 +181,7 @@
                                Name: "plugin",
                                Action: func(_ *cli.Context) error {
                                        logger.Println("Unknown command: `asdf 
plugin`")
-                                       os.Exit(1)
+                                       cli.OsExiter(1)
                                        return nil
                                },
                                Subcommands: []*cli.Command{
@@ -335,14 +335,20 @@
                                },
                        },
                },
-               Action: func(_ *cli.Context) error {
-                       return helpCommand(logger, version, "", "")
+               CommandNotFound: func(_ *cli.Context, s string) {
+                       logger.Printf("invalid command provided: %s\n\n", s)
+                       helpCommand(logger, version, "", "")
+                       cli.OsExiter(1)
                },
        }
 
-       err := app.Run(os.Args)
+       err := unsetAsdfReservedEnvVars()
        if err != nil {
-               os.Exit(1)
+               cli.OsExiter(1)
+       }
+
+       if err = app.Run(os.Args); err != nil {
+               cli.OsExiter(1)
        }
 }
 
@@ -415,7 +421,7 @@
                }
 
                if !versionInstalled {
-                       os.Exit(1)
+                       cli.OsExiter(1)
                }
        } else {
                fmt.Printf("No such plugin: %s\n", tool)
@@ -521,8 +527,6 @@
                "PATH":                 setPath(execPaths),
        }
 
-       env = execenv.MergeEnv(execenv.SliceToMap(os.Environ()), env)
-
        if parsedVersion.Type != "system" {
                env, err = execenv.Generate(plugin, env)
                if _, ok := err.(plugins.NoCallbackError); !ok && err != nil {
@@ -535,7 +539,8 @@
                return err
        }
 
-       err = exec.Exec(fname, realArgs, execute.MapToSlice(env))
+       finalEnv := execute.MergeWithCurrentEnv(env)
+       err = exec.Exec(fname, realArgs, finalEnv)
        if err != nil {
                fmt.Printf("err %#+v\n", err.Error())
        }
@@ -581,8 +586,6 @@
                "PATH":                 setPath(execPaths),
        }
 
-       env = execenv.MergeEnv(execenv.SliceToMap(os.Environ()), env)
-
        if parsedVersion.Type != "system" {
                env, err = execenv.Generate(plugin, env)
                if _, ok := err.(plugins.NoCallbackError); !ok && err != nil {
@@ -592,11 +595,12 @@
 
        err = hook.RunWithOutput(conf, fmt.Sprintf("pre_%s_%s", plugin.Name, 
filepath.Base(executable)), args, os.Stdout, os.Stderr)
        if err != nil {
-               os.Exit(1)
+               cli.OsExiter(1)
                return err
        }
 
-       return exec.Exec(executable, args, execute.MapToSlice(env))
+       finalEnv := execute.MergeWithCurrentEnv(env)
+       return exec.Exec(executable, args, finalEnv)
 }
 
 func extensionCommand(logger *log.Logger, args []string) error {
@@ -615,12 +619,12 @@
        pluginName := args[0]
        plugin := plugins.New(conf, pluginName)
 
-       err = runExtensionCommand(plugin, args[1:], 
execenv.SliceToMap(os.Environ()))
+       err = runExtensionCommand(plugin, args[1:])
        logger.Printf("error running extension command: %s", err.Error())
        return err
 }
 
-func runExtensionCommand(plugin plugins.Plugin, args []string, environment 
map[string]string) (err error) {
+func runExtensionCommand(plugin plugins.Plugin, args []string) (err error) {
        path := ""
        if len(args) > 0 {
                path, err = plugin.ExtensionCommandPath(args[0])
@@ -640,7 +644,7 @@
                }
        }
 
-       return exec.Exec(path, args, execute.MapToSlice(environment))
+       return exec.Exec(path, args, os.Environ())
 }
 
 func getExecutable(logger *log.Logger, conf config.Config, command string) 
(executable string, plugin plugins.Plugin, version string, err error) {
@@ -655,7 +659,7 @@
 
                if _, ok := err.(shims.NoExecutableForPluginError); ok {
                        logger.Printf("No executable %s found for current 
version. Please select a different version or install %s manually for the 
current version", command, command)
-                       os.Exit(1)
+                       cli.OsExiter(1)
                        return "", plugin, version, err
                }
                shimPath := shims.Path(conf, command)
@@ -727,7 +731,7 @@
                        return nil
                }
 
-               os.Exit(1)
+               cli.OsExiter(1)
                return nil
        }
 
@@ -738,7 +742,7 @@
 func pluginRemoveCommand(_ *cli.Context, logger *log.Logger, pluginName 
string) error {
        if pluginName == "" {
                logger.Print("No plugin given")
-               os.Exit(1)
+               cli.OsExiter(1)
                return nil
        }
 
@@ -759,7 +763,7 @@
        err2 := shims.RemoveAll(conf)
        if err2 != nil {
                logger.Printf("%s", err2)
-               os.Exit(1)
+               cli.OsExiter(1)
                return err2
        }
 
@@ -820,7 +824,7 @@
        }
        if disableRepo {
                logger.Printf("Short-name plugin repository is disabled")
-               os.Exit(1)
+               cli.OsExiter(1)
                return nil
        }
 
@@ -883,26 +887,26 @@
                if version != "" {
                        err := help.PrintToolVersion(conf, tool, version)
                        if err != nil {
-                               os.Exit(1)
+                               cli.OsExiter(1)
                        }
                        return err
                }
 
                err := help.PrintTool(conf, tool)
                if err != nil {
-                       os.Exit(1)
+                       cli.OsExiter(1)
                }
                return err
        }
 
        allPlugins, err := plugins.List(conf, false, false)
        if err != nil {
-               os.Exit(1)
+               cli.OsExiter(1)
        }
 
        err = help.Print(asdfVersion, allPlugins)
        if err != nil {
-               os.Exit(1)
+               cli.OsExiter(1)
        }
 
        return err
@@ -945,7 +949,7 @@
        conf, err := config.LoadConfig()
        if err != nil {
                l.Printf("error loading config: %s", err)
-               os.Exit(1)
+               cli.OsExiter(1)
                return
        }
 
@@ -1041,7 +1045,7 @@
 
 func failTest(logger *log.Logger, msg string) {
        logger.Printf("FAILED: %s", msg)
-       os.Exit(1)
+       cli.OsExiter(1)
 }
 
 func formatUpdateResult(logger *log.Logger, pluginName, updatedToRef string, 
err error) {
@@ -1100,7 +1104,7 @@
 
                                if _, ok := err.(versions.NoVersionSetError); 
ok {
                                        logger.Printf("No versions specified 
for %s in config files or environment", toolName)
-                                       os.Exit(1)
+                                       cli.OsExiter(1)
                                }
 
                                logger.Printf("error installing version: %v", 
err)
@@ -1158,7 +1162,7 @@
        if !all {
                err = latestForPlugin(conf, toolName, pattern, false)
                if err != nil {
-                       os.Exit(1)
+                       cli.OsExiter(1)
                }
 
                return err
@@ -1180,7 +1184,7 @@
        }
 
        if err != nil {
-               os.Exit(1)
+               cli.OsExiter(1)
                return maybeErr
        }
        return nil
@@ -1205,13 +1209,13 @@
 func listAllCommand(logger *log.Logger, conf config.Config, toolName, filter 
string) error {
        if toolName == "" {
                logger.Print("No plugin given")
-               os.Exit(1)
+               cli.OsExiter(1)
                return nil
        }
 
        plugin, err := loadPlugin(logger, conf, toolName)
        if err != nil {
-               os.Exit(1)
+               cli.OsExiter(1)
                return err
        }
 
@@ -1225,7 +1229,7 @@
                os.Stderr.WriteString(stderr.String())
                os.Stderr.WriteString(stdout.String())
 
-               os.Exit(1)
+               cli.OsExiter(1)
                return err
        }
 
@@ -1237,7 +1241,7 @@
 
        if len(versions) == 0 {
                logger.Printf("No compatible versions available (%s %s)", 
plugin.Name, filter)
-               os.Exit(1)
+               cli.OsExiter(1)
                return nil
        }
 
@@ -1268,7 +1272,7 @@
        if pluginName != "" {
                plugin, err := loadPlugin(logger, conf, pluginName)
                if err != nil {
-                       os.Exit(1)
+                       cli.OsExiter(1)
                        return err
                }
                versions, _ := installs.Installed(conf, plugin)
@@ -1279,13 +1283,13 @@
 
                if len(versions) == 0 {
                        logger.Printf("No compatible versions installed (%s 
%s)", plugin.Name, filter)
-                       os.Exit(1)
+                       cli.OsExiter(1)
                        return nil
                }
 
                currentVersions, _, err := resolve.Version(conf, plugin, 
currentDir)
                if err != nil {
-                       os.Exit(1)
+                       cli.OsExiter(1)
                        return err
                }
 
@@ -1312,7 +1316,7 @@
                if len(versions) > 0 {
                        currentVersions, _, err := resolve.Version(conf, 
plugin, currentDir)
                        if err != nil {
-                               os.Exit(1)
+                               cli.OsExiter(1)
                                return err
                        }
                        for _, version := range versions {
@@ -1343,7 +1347,7 @@
                plugin = plugins.New(conf, tool)
                if err := plugin.Exists(); err != nil {
                        logger.Printf("No such plugin: %s", plugin.Name)
-                       os.Exit(1)
+                       cli.OsExiter(1)
                        return err
                }
        }
@@ -1427,14 +1431,14 @@
 func uninstallCommand(logger *log.Logger, tool, version string) error {
        if tool == "" || version == "" {
                logger.Print("No plugin given")
-               os.Exit(1)
+               cli.OsExiter(1)
                return nil
        }
 
        conf, err := config.LoadConfig()
        if err != nil {
                logger.Printf("error loading config: %s", err)
-               os.Exit(1)
+               cli.OsExiter(1)
                return err
        }
 
@@ -1442,7 +1446,7 @@
        err = versions.Uninstall(conf, plugin, version, os.Stdout, os.Stderr)
        if err != nil {
                logger.Printf("%s", err)
-               os.Exit(1)
+               cli.OsExiter(1)
                return err
        }
 
@@ -1451,7 +1455,7 @@
        err = shims.RemoveAll(conf)
        if err != nil {
                logger.Printf("%s", err)
-               os.Exit(1)
+               cli.OsExiter(1)
                return err
        }
 
@@ -1568,3 +1572,16 @@
        }
        return "missing"
 }
+
+func unsetAsdfReservedEnvVars() error {
+       // These are environment variables which are passed via env or exec.
+       // We strip these out to avoid any potential issues with recursive 
calls to asdf.
+       asdfManagedVars := []string{"ASDF_INSTALL_TYPE", 
"ASDF_INSTALL_VERSION", "ASDF_INSTALL_PATH"}
+       for _, v := range asdfManagedVars {
+               err := os.Unsetenv(v)
+               if err != nil {
+                       return err
+               }
+       }
+       return nil
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/internal/execenv/execenv.go 
new/asdf-0.16.5/internal/execenv/execenv.go
--- old/asdf-0.16.4/internal/execenv/execenv.go 2025-02-22 13:44:42.000000000 
+0100
+++ new/asdf-0.16.5/internal/execenv/execenv.go 2025-03-04 15:00:54.000000000 
+0100
@@ -4,7 +4,6 @@
 
 import (
        "fmt"
-       "os"
        "strings"
 
        "github.com/asdf-vm/asdf/internal/execute"
@@ -13,20 +12,6 @@
 
 const execEnvCallbackName = "exec-env"
 
-// CurrentEnv returns the current environment as a map
-func CurrentEnv() map[string]string {
-       return SliceToMap(os.Environ())
-}
-
-// MergeEnv takes two maps with string keys and values and merges them.
-func MergeEnv(map1, map2 map[string]string) map[string]string {
-       for key, value := range map2 {
-               map1[key] = value
-       }
-
-       return map1
-}
-
 // Generate runs exec-env callback if available and captures the environment
 // variables it sets. It then parses them and returns them as a map.
 func Generate(plugin plugins.Plugin, callbackEnv map[string]string) (env 
map[string]string, err error) {
@@ -42,33 +27,11 @@
        // executing the callback isn't enough. We actually need to source it 
(.) so
        // the environment variables get set, and then run `env` so they get 
printed
        // to STDOUT.
-       expression := execute.NewExpression(fmt.Sprintf(". \"%s\"; env", 
execEnvPath), []string{})
+       expression := execute.NewExpression(fmt.Sprintf(". \"%s\"; env -0", 
execEnvPath), []string{})
        expression.Env = callbackEnv
        expression.Stdout = &stdout
        err = expression.Run()
 
        str := stdout.String()
-       return SliceToMap(strings.Split(str, "\n")), err
-}
-
-// SliceToMap converts an env map to env slice suitable for syscall.Exec
-func SliceToMap(env []string) map[string]string {
-       envMap := map[string]string{}
-
-       var previousKey string
-
-       for _, envVar := range env {
-               varValue := strings.SplitN(envVar, "=", 2)
-               if len(varValue) == 2 {
-                       // new var=value line
-                       previousKey = varValue[0]
-                       envMap[varValue[0]] = varValue[1]
-               } else {
-                       // value from variable defined on a previous line, 
append
-                       val := envMap[previousKey]
-                       envMap[previousKey] = val + "\n" + varValue[0]
-               }
-       }
-
-       return envMap
+       return execute.SliceToMap(strings.Split(str, "\x00")), err
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/internal/execenv/execenv_test.go 
new/asdf-0.16.5/internal/execenv/execenv_test.go
--- old/asdf-0.16.4/internal/execenv/execenv_test.go    2025-02-22 
13:44:42.000000000 +0100
+++ new/asdf-0.16.5/internal/execenv/execenv_test.go    2025-03-04 
15:00:54.000000000 +0100
@@ -1,7 +1,6 @@
 package execenv
 
 import (
-       "fmt"
        "testing"
 
        "github.com/asdf-vm/asdf/internal/config"
@@ -15,41 +14,7 @@
        testPluginName2 = "ruby"
 )
 
-func TestCurrentEnv(t *testing.T) {
-       t.Run("returns map of current environment", func(t *testing.T) {
-               envMap := CurrentEnv()
-               path, found := envMap["PATH"]
-               assert.True(t, found)
-               assert.NotEmpty(t, path)
-       })
-}
-
-func TestMergeEnv(t *testing.T) {
-       t.Run("merges two maps", func(t *testing.T) {
-               map1 := map[string]string{"Key": "value"}
-               map2 := map[string]string{"Key2": "value2"}
-               map3 := MergeEnv(map1, map2)
-               assert.Equal(t, map3["Key"], "value")
-               assert.Equal(t, map3["Key2"], "value2")
-       })
-
-       t.Run("doesn't change original map", func(t *testing.T) {
-               map1 := map[string]string{"Key": "value"}
-               map2 := map[string]string{"Key2": "value2"}
-               _ = MergeEnv(map1, map2)
-               assert.Equal(t, map1["Key2"], "value2")
-       })
-
-       t.Run("second map overwrites values in first", func(t *testing.T) {
-               map1 := map[string]string{"Key": "value"}
-               map2 := map[string]string{"Key": "value2"}
-               map3 := MergeEnv(map1, map2)
-               assert.Equal(t, map3["Key"], "value2")
-       })
-}
-
 func TestGenerate(t *testing.T) {
-
        t.Run("returns map of environment variables", func(t *testing.T) {
                testDataDir := t.TempDir()
                conf := config.Config{DataDir: testDataDir}
@@ -100,38 +65,17 @@
                assert.Equal(t, "bar", env["BAZ"])
                assert.Equal(t, "abc\n123", env["EQUALSTEST"])
        })
-}
 
-func TestSliceToMap(t *testing.T) {
-       tests := []struct {
-               input  []string
-               output map[string]string
-       }{
-               {
-                       input:  []string{"VAR=value"},
-                       output: map[string]string{"VAR": "value"},
-               },
-               {
-                       input:  []string{"BASH_FUNC_bats_readlinkf%%=() {  
readlink -f \"$1\"\n}"},
-                       output: map[string]string{"BASH_FUNC_bats_readlinkf%%": 
"() {  readlink -f \"$1\"\n}"},
-               },
-               {
-                       input:  []string{"MYVAR=some things = with = in it"},
-                       output: map[string]string{"MYVAR": "some things = with 
= in it"},
-               },
-               {
-                       input:  []string{"MYVAR=value\nwith\nnewlines"},
-                       output: map[string]string{"MYVAR": 
"value\nwith\nnewlines"},
-               },
-               {
-                       input:  []string{"MYVAR=value", "with", "newlines"},
-                       output: map[string]string{"MYVAR": 
"value\nwith\nnewlines"},
-               },
-       }
-
-       for _, tt := range tests {
-               t.Run(fmt.Sprintf("input: %s, output: %s", tt.input, 
tt.output), func(t *testing.T) {
-                       assert.Equal(t, tt.output, SliceToMap(tt.input))
-               })
-       }
+       t.Run("preserves environment variables that contain equals sign and 
line breaks in value", func(t *testing.T) {
+               value := "-----BEGIN 
CERTIFICATE-----\nMANY\\LINES\\THE\nLAST\\ONE\\ENDS\\IN\nAN=\n-----END 
CERTIFICATE-----"
+               testDataDir := t.TempDir()
+               conf := config.Config{DataDir: testDataDir}
+               _, err := repotest.InstallPlugin("dummy_plugin", testDataDir, 
testPluginName)
+               assert.Nil(t, err)
+               plugin := plugins.New(conf, testPluginName)
+               assert.Nil(t, repotest.WritePluginCallback(plugin.Dir, 
"exec-env", "#!/usr/bin/env bash\nexport BAZ=\""+value+"\""))
+               env, err := Generate(plugin, map[string]string{})
+               assert.Nil(t, err)
+               assert.Equal(t, value, env["BAZ"])
+       })
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/internal/execute/execute.go 
new/asdf-0.16.5/internal/execute/execute.go
--- old/asdf-0.16.4/internal/execute/execute.go 2025-02-22 13:44:42.000000000 
+0100
+++ new/asdf-0.16.5/internal/execute/execute.go 2025-03-04 15:00:54.000000000 
+0100
@@ -6,6 +6,7 @@
 import (
        "fmt"
        "io"
+       "os"
        "os/exec"
        "strings"
 )
@@ -47,7 +48,12 @@
 
        cmd := exec.Command("bash", "-c", command)
 
-       cmd.Env = MapToSlice(c.Env)
+       if len(c.Env) > 0 {
+               cmd.Env = MergeWithCurrentEnv(c.Env)
+       } else {
+               cmd.Env = os.Environ()
+       }
+
        cmd.Stdin = c.Stdin
 
        // Capture stdout and stderr
@@ -57,6 +63,25 @@
        return cmd.Run()
 }
 
+// MergeWithCurrentEnv merges the provided map into the current environment 
variables
+func MergeWithCurrentEnv(env map[string]string) (slice []string) {
+       return MapToSlice(MergeEnv(CurrentEnv(), env))
+}
+
+// CurrentEnv returns the current environment as a map
+func CurrentEnv() map[string]string {
+       return SliceToMap(os.Environ())
+}
+
+// MergeEnv takes two maps with string keys and values and merges them.
+func MergeEnv(map1, map2 map[string]string) map[string]string {
+       for key, value := range map2 {
+               map1[key] = value
+       }
+
+       return map1
+}
+
 // MapToSlice converts an env map to env slice suitable for syscall.Exec
 func MapToSlice(env map[string]string) (slice []string) {
        for key, value := range env {
@@ -66,6 +91,21 @@
        return slice
 }
 
+// SliceToMap converts an env map to env slice suitable for syscall.Exec
+func SliceToMap(env []string) map[string]string {
+       envMap := map[string]string{}
+
+       for _, envVar := range env {
+               varValue := strings.SplitN(envVar, "=", 2)
+
+               if len(varValue) == 2 {
+                       envMap[varValue[0]] = varValue[1]
+               }
+       }
+
+       return envMap
+}
+
 func formatArgString(args []string) string {
        var newArgs []string
        for _, str := range args {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/internal/execute/execute_test.go 
new/asdf-0.16.5/internal/execute/execute_test.go
--- old/asdf-0.16.4/internal/execute/execute_test.go    2025-02-22 
13:44:42.000000000 +0100
+++ new/asdf-0.16.5/internal/execute/execute_test.go    2025-03-04 
15:00:54.000000000 +0100
@@ -1,6 +1,8 @@
 package execute
 
 import (
+       "fmt"
+       "os"
        "os/exec"
        "strings"
        "testing"
@@ -70,6 +72,33 @@
                assert.Equal(t, "my var value\n", stdout.String())
        })
 
+       t.Run("system environment variables are passed to command", func(t 
*testing.T) {
+               cmd := New("echo $MYVAR1;", []string{})
+               err := os.Setenv("MYVAR1", "my var value")
+               assert.Nil(t, err)
+
+               var stdout strings.Builder
+               cmd.Stdout = &stdout
+               err = cmd.Run()
+
+               assert.Nil(t, err)
+               assert.Equal(t, "my var value\n", stdout.String())
+       })
+
+       t.Run("provided env overwrites system environment variables when passed 
to command", func(t *testing.T) {
+               cmd := New("echo $MYVAR2;", []string{})
+               err := os.Setenv("MYVAR2", "should be dropped")
+               assert.Nil(t, err)
+
+               var stdout strings.Builder
+               cmd.Stdout = &stdout
+               cmd.Env = map[string]string{"MYVAR2": "final value"}
+               err = cmd.Run()
+
+               assert.Nil(t, err)
+               assert.Equal(t, "final value\n", stdout.String())
+       })
+
        t.Run("captures stdout and stdin", func(t *testing.T) {
                cmd := New("echo 'a test' | tee /dev/stderr", []string{})
                cmd.Env = map[string]string{"MYVAR": "my var value"}
@@ -173,3 +202,78 @@
                assert.Equal(t, 12, err.(*exec.ExitError).ExitCode())
        })
 }
+
+func TestMergeWithCurrentEnv(t *testing.T) {
+       t.Run("merge with current env", func(t *testing.T) {
+               path := os.Getenv("PATH")
+               assert.NotEmpty(t, path)
+
+               newEnv := map[string]string{"PATH": "new_path"}
+               mergedEnv := MergeWithCurrentEnv(newEnv)
+               assert.Contains(t, mergedEnv, "PATH=new_path")
+               assert.NotContains(t, mergedEnv, "PATH="+path)
+       })
+}
+
+func TestCurrentEnv(t *testing.T) {
+       t.Run("returns map of current environment", func(t *testing.T) {
+               envMap := CurrentEnv()
+               path, found := envMap["PATH"]
+               assert.True(t, found)
+               assert.NotEmpty(t, path)
+       })
+}
+
+func TestMergeEnv(t *testing.T) {
+       t.Run("merges two maps", func(t *testing.T) {
+               map1 := map[string]string{"Key": "value"}
+               map2 := map[string]string{"Key2": "value2"}
+               map3 := MergeEnv(map1, map2)
+               assert.Equal(t, map3["Key"], "value")
+               assert.Equal(t, map3["Key2"], "value2")
+       })
+
+       t.Run("doesn't change original map", func(t *testing.T) {
+               map1 := map[string]string{"Key": "value"}
+               map2 := map[string]string{"Key2": "value2"}
+               _ = MergeEnv(map1, map2)
+               assert.Equal(t, map1["Key2"], "value2")
+       })
+
+       t.Run("second map overwrites values in first", func(t *testing.T) {
+               map1 := map[string]string{"Key": "value"}
+               map2 := map[string]string{"Key": "value2"}
+               map3 := MergeEnv(map1, map2)
+               assert.Equal(t, map3["Key"], "value2")
+       })
+}
+
+func TestSliceToMap(t *testing.T) {
+       tests := []struct {
+               input  []string
+               output map[string]string
+       }{
+               {
+                       input:  []string{"VAR=value"},
+                       output: map[string]string{"VAR": "value"},
+               },
+               {
+                       input:  []string{"BASH_FUNC_bats_readlinkf%%=() {  
readlink -f \"$1\"\n}"},
+                       output: map[string]string{"BASH_FUNC_bats_readlinkf%%": 
"() {  readlink -f \"$1\"\n}"},
+               },
+               {
+                       input:  []string{"MYVAR=some things = with = in it"},
+                       output: map[string]string{"MYVAR": "some things = with 
= in it"},
+               },
+               {
+                       input:  []string{"MYVAR=value\nwith\nnewlines"},
+                       output: map[string]string{"MYVAR": 
"value\nwith\nnewlines"},
+               },
+       }
+
+       for _, tt := range tests {
+               t.Run(fmt.Sprintf("input: %s, output: %s", tt.input, 
tt.output), func(t *testing.T) {
+                       assert.Equal(t, tt.output, SliceToMap(tt.input))
+               })
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/internal/git/git.go 
new/asdf-0.16.5/internal/git/git.go
--- old/asdf-0.16.4/internal/git/git.go 2025-02-22 13:44:42.000000000 +0100
+++ new/asdf-0.16.5/internal/git/git.go 2025-03-04 15:00:54.000000000 +0100
@@ -115,10 +115,10 @@
                // If on a branch checkout the latest version of it from the 
remote
                branch := head.Name()
                ref = branch.String()
-               checkoutOptions = git.CheckoutOptions{Branch: branch, Force: 
true}
+               checkoutOptions = git.CheckoutOptions{Branch: branch, Keep: 
true}
        } else {
                // Checkout ref if provided
-               checkoutOptions = git.CheckoutOptions{Hash: 
plumbing.NewHash(ref), Force: true}
+               checkoutOptions = git.CheckoutOptions{Hash: 
plumbing.NewHash(ref), Keep: true}
        }
 
        fetchOptions := git.FetchOptions{RemoteName: DefaultRemoteName, Force: 
true, RefSpecs: []config.RefSpec{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/internal/git/git_test.go 
new/asdf-0.16.5/internal/git/git_test.go
--- old/asdf-0.16.4/internal/git/git_test.go    2025-02-22 13:44:42.000000000 
+0100
+++ new/asdf-0.16.5/internal/git/git_test.go    2025-03-04 15:00:54.000000000 
+0100
@@ -153,6 +153,40 @@
                assert.Equal(t, latestHash, currentHash)
        })
 
+       t.Run("updates repo while leaving untracked files in place", func(t 
*testing.T) {
+               latestHash, err := getCurrentCommit(directory)
+               assert.Nil(t, err)
+
+               _, err = checkoutPreviousCommit(directory)
+               assert.Nil(t, err)
+
+               untrackedDir := filepath.Join(directory, "untracked")
+               err = os.Mkdir(untrackedDir, 0o777)
+               assert.Nil(t, err)
+
+               expectedContent := []byte("dummy_content")
+               err = os.WriteFile(filepath.Join(untrackedDir, "file_one"), 
expectedContent, 0o777)
+               assert.Nil(t, err)
+               err = os.WriteFile(filepath.Join(untrackedDir, "file_two"), 
expectedContent, 0o777)
+               assert.Nil(t, err)
+
+               updatedToRef, _, _, err := repo.Update("")
+               assert.Nil(t, err)
+               assert.Equal(t, "refs/heads/master", updatedToRef)
+
+               currentHash, err := getCurrentCommit(directory)
+               assert.Nil(t, err)
+               assert.Equal(t, latestHash, currentHash)
+
+               content, err := os.ReadFile(filepath.Join(untrackedDir, 
"file_one"))
+               assert.Nil(t, err)
+               assert.Equal(t, expectedContent, content)
+
+               content, err = os.ReadFile(filepath.Join(untrackedDir, 
"file_two"))
+               assert.Nil(t, err)
+               assert.Equal(t, expectedContent, content)
+       })
+
        t.Run("Returns error when specified ref does not exist", func(t 
*testing.T) {
                ref := "non-existent"
                updatedToRef, _, _, err := repo.Update(ref)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/internal/plugins/plugins.go 
new/asdf-0.16.5/internal/plugins/plugins.go
--- old/asdf-0.16.4/internal/plugins/plugins.go 2025-02-22 13:44:42.000000000 
+0100
+++ new/asdf-0.16.5/internal/plugins/plugins.go 2025-03-04 15:00:54.000000000 
+0100
@@ -172,8 +172,8 @@
        }
 
        cmd := execute.New(fmt.Sprintf("'%s'", callback), arguments)
-       cmd.Env = environment
 
+       cmd.Env = environment
        cmd.Stdout = stdOut
        cmd.Stderr = errOut
 
@@ -255,6 +255,7 @@
        }
 
        env := map[string]string{
+               "ASDF_DATA_DIR":        conf.DataDir,
                "ASDF_PLUGIN_PATH":     p.Dir,
                "ASDF_PLUGIN_PREV_REF": oldSHA,
                "ASDF_PLUGIN_POST_REF": newSHA,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/asdf-0.16.4/internal/versions/testdata/list-all-elixir 
new/asdf-0.16.5/internal/versions/testdata/list-all-elixir
--- old/asdf-0.16.4/internal/versions/testdata/list-all-elixir  1970-01-01 
01:00:00.000000000 +0100
+++ new/asdf-0.16.5/internal/versions/testdata/list-all-elixir  2025-03-04 
15:00:54.000000000 +0100
@@ -0,0 +1 @@
+0.12.4 0.12.5 0.13.0 0.13.1 0.13.2 0.13.3 0.14.0 0.14.1 0.14.2 0.14.3 0.15.0 
0.15.1 1.0.0 1.0.0-otp-17 1.0.0-rc1 1.0.0-rc1-otp-17 1.0.0-rc2 1.0.0-rc2-otp-17 
1.0.1 1.0.1-otp-17 1.0.2 1.0.2-otp-17 1.0.3 1.0.3-otp-17 1.0.4 1.0.4-otp-17 
1.0.5 1.0.5-otp-17 1.0.5-otp-18 1.1.0 1.1.0-otp-17 1.1.0-otp-18 1.1.0-rc.0 
1.1.0-rc.0-otp-17 1.1.0-rc.0-otp-18 1.1.1 1.1.1-otp-17 1.1.1-otp-18 1.2.0 
1.2.0-otp-18 1.2.0-rc.0 1.2.0-rc.0-otp-18 1.2.0-rc.1 1.2.0-rc.1-otp-18 1.2.1 
1.2.1-otp-18 1.2.2 1.2.2-otp-18 1.2.3 1.2.3-otp-18 1.2.4 1.2.4-otp-18 1.2.5 
1.2.5-otp-18 1.2.6 1.2.6-otp-18 1.2.6-otp-19 1.3.0 1.3.0-otp-18 1.3.0-otp-19 
1.3.0-rc.0 1.3.0-rc.0-otp-18 1.3.0-rc.0-otp-19 1.3.0-rc.1 1.3.0-rc.1-otp-18 
1.3.0-rc.1-otp-19 1.3.1 1.3.1-otp-18 1.3.1-otp-19 1.3.2 1.3.2-otp-18 
1.3.2-otp-19 1.3.3 1.3.3-otp-18 1.3.3-otp-19 1.3.4 1.3.4-otp-18 1.3.4-otp-19 
1.4.0 1.4.0-otp-18 1.4.0-otp-19 1.4.0-rc.0 1.4.0-rc.0-otp-18 1.4.0-rc.0-otp-19 
1.4.0-rc.0-otp-20 1.4.0-rc.1 1.4.0-rc.1-otp-18 1.4.0-rc.1-otp-19 
1.4.0-rc.1-otp-20 1
 .4.1 1.4.1-otp-18 1.4.1-otp-19 1.4.2 1.4.2-otp-18 1.4.2-otp-19 1.4.3 
1.4.3-otp-18 1.4.3-otp-19 1.4.4 1.4.4-otp-18 1.4.4-otp-19 1.4.5 1.4.5-otp-18 
1.4.5-otp-19 1.4.5-otp-20 1.5.0 1.5.0-otp-18 1.5.0-otp-19 1.5.0-otp-20 
1.5.0-rc.0 1.5.0-rc.0-otp-18 1.5.0-rc.0-otp-19 1.5.0-rc.0-otp-20 1.5.0-rc.1 
1.5.0-rc.1-otp-18 1.5.0-rc.1-otp-19 1.5.0-rc.1-otp-20 1.5.0-rc.2 
1.5.0-rc.2-otp-18 1.5.0-rc.2-otp-19 1.5.0-rc.2-otp-20 1.5.1 1.5.1-otp-18 
1.5.1-otp-19 1.5.1-otp-20 1.5.2 1.5.2-otp-18 1.5.2-otp-19 1.5.2-otp-20 1.5.3 
1.5.3-otp-18 1.5.3-otp-19 1.5.3-otp-20 1.6.0 1.6.0-otp-19 1.6.0-otp-20 
1.6.0-rc.0 1.6.0-rc.0-otp-19 1.6.0-rc.0-otp-20 1.6.0-rc.1 1.6.0-rc.1-otp-19 
1.6.0-rc.1-otp-20 1.6.1 1.6.1-otp-19 1.6.1-otp-20 1.6.2 1.6.2-otp-19 
1.6.2-otp-20 1.6.3 1.6.3-otp-19 1.6.3-otp-20 1.6.4 1.6.4-otp-19 1.6.4-otp-20 
1.6.5 1.6.5-otp-19 1.6.5-otp-20 1.6.5-otp-21 1.6.6 1.6.6-otp-19 1.6.6-otp-20 
1.6.6-otp-21 1.7.0 1.7.0-otp-19 1.7.0-otp-20 1.7.0-otp-21 1.7.0-otp-22 
1.7.0-rc.0 1.7.0-rc.0-otp-19 1.7.0-rc.0-otp-20 1
 .7.0-rc.0-otp-21 1.7.0-rc.0-otp-22 1.7.0-rc.1 1.7.0-rc.1-otp-19 
1.7.0-rc.1-otp-20 1.7.0-rc.1-otp-21 1.7.0-rc.1-otp-22 1.7.1 1.7.1-otp-19 
1.7.1-otp-20 1.7.1-otp-21 1.7.1-otp-22 1.7.2 1.7.2-otp-19 1.7.2-otp-20 
1.7.2-otp-21 1.7.2-otp-22 1.7.3 1.7.3-otp-19 1.7.3-otp-20 1.7.3-otp-21 
1.7.3-otp-22 1.7.4 1.7.4-otp-19 1.7.4-otp-20 1.7.4-otp-21 1.7.4-otp-22 1.8.0 
1.8.0-otp-20 1.8.0-otp-21 1.8.0-otp-22 1.8.0-rc.0 1.8.0-rc.0-otp-20 
1.8.0-rc.0-otp-21 1.8.0-rc.0-otp-22 1.8.0-rc.1 1.8.0-rc.1-otp-20 
1.8.0-rc.1-otp-21 1.8.0-rc.1-otp-22 1.8.1 1.8.1-otp-20 1.8.1-otp-21 
1.8.1-otp-22 1.8.2 1.8.2-otp-20 1.8.2-otp-21 1.8.2-otp-22 1.9.0 1.9.0-otp-20 
1.9.0-otp-21 1.9.0-otp-22 1.9.0-rc.0 1.9.0-rc.0-otp-20 1.9.0-rc.0-otp-21 
1.9.0-rc.0-otp-22 1.9.1 1.9.1-otp-20 1.9.1-otp-21 1.9.1-otp-22 1.9.2 
1.9.2-otp-20 1.9.2-otp-21 1.9.2-otp-22 1.9.3 1.9.3-otp-20 1.9.3-otp-21 
1.9.3-otp-22 1.9.4 1.9.4-otp-20 1.9.4-otp-21 1.9.4-otp-22 1.10.0 1.10.0-otp-21 
1.10.0-otp-22 1.10.0-rc.0 1.10.0-rc.0-otp-21 1.10.0-rc.0-otp-22 1.10.1 
 1.10.1-otp-21 1.10.1-otp-22 1.10.2 1.10.2-otp-21 1.10.2-otp-22 1.10.3 
1.10.3-otp-21 1.10.3-otp-22 1.10.3-otp-23 1.10.4 1.10.4-otp-21 1.10.4-otp-22 
1.10.4-otp-23 1.11.0 1.11.0-otp-21 1.11.0-otp-22 1.11.0-otp-23 1.11.0-rc.0 
1.11.0-rc.0-otp-21 1.11.0-rc.0-otp-22 1.11.0-rc.0-otp-23 1.11.1 1.11.1-otp-21 
1.11.1-otp-22 1.11.1-otp-23 1.11.2 1.11.2-otp-21 1.11.2-otp-22 1.11.2-otp-23 
1.11.3 1.11.3-otp-21 1.11.3-otp-22 1.11.3-otp-23 1.11.4 1.11.4-otp-21 
1.11.4-otp-22 1.11.4-otp-23 1.11.4-otp-24 1.12.0 1.12.0-otp-22 1.12.0-otp-23 
1.12.0-otp-24 1.12.0-rc.0 1.12.0-rc.0-otp-21 1.12.0-rc.0-otp-22 
1.12.0-rc.0-otp-23 1.12.0-rc.0-otp-24 1.12.0-rc.1 1.12.0-rc.1-otp-22 
1.12.0-rc.1-otp-23 1.12.0-rc.1-otp-24 1.12.1 1.12.1-otp-22 1.12.1-otp-23 
1.12.1-otp-24 1.12.2 1.12.2-otp-22 1.12.2-otp-23 1.12.2-otp-24 1.12.3 
1.12.3-otp-22 1.12.3-otp-23 1.12.3-otp-24 1.13.0 1.13.0-otp-22 1.13.0-otp-23 
1.13.0-otp-24 1.13.0-otp-25 1.13.0-rc.0 1.13.0-rc.0-otp-22 1.13.0-rc.0-otp-23 
1.13.0-rc.0-otp-24 1.13.0-rc.0-otp-25 1.13
 .0-rc.1 1.13.0-rc.1-otp-22 1.13.0-rc.1-otp-23 1.13.0-rc.1-otp-24 
1.13.0-rc.1-otp-25 1.13.1 1.13.1-otp-22 1.13.1-otp-23 1.13.1-otp-24 
1.13.1-otp-25 1.13.2 1.13.2-otp-22 1.13.2-otp-23 1.13.2-otp-24 1.13.2-otp-25 
1.13.3 1.13.3-otp-22 1.13.3-otp-23 1.13.3-otp-24 1.13.3-otp-25 1.13.4 
1.13.4-otp-22 1.13.4-otp-23 1.13.4-otp-24 1.13.4-otp-25 1.14.0 1.14.0-otp-23 
1.14.0-otp-24 1.14.0-otp-25 1.14.0-rc.0 1.14.0-rc.0-otp-23 1.14.0-rc.0-otp-24 
1.14.0-rc.0-otp-25 1.14.0-rc.1 1.14.0-rc.1-otp-23 1.14.0-rc.1-otp-24 
1.14.0-rc.1-otp-25 1.14.1 1.14.1-otp-23 1.14.1-otp-24 1.14.1-otp-25 1.14.2 
1.14.2-otp-23 1.14.2-otp-24 1.14.2-otp-25 1.14.3 1.14.3-otp-23 1.14.3-otp-24 
1.14.3-otp-25 1.14.4 1.14.4-otp-23 1.14.4-otp-24 1.14.4-otp-25 1.14.4-otp-26 
1.14.5 1.14.5-otp-23 1.14.5-otp-24 1.14.5-otp-25 1.14.5-otp-26 1.15.0 
1.15.0-otp-24 1.15.0-otp-25 1.15.0-otp-26 1.15.0-rc.0 1.15.0-rc.0-otp-24 
1.15.0-rc.0-otp-25 1.15.0-rc.0-otp-26 1.15.0-rc.1 1.15.0-rc.1-otp-24 
1.15.0-rc.1-otp-25 1.15.0-rc.1-otp-26 1.15.0-rc.2 1.
 15.0-rc.2-otp-24 1.15.0-rc.2-otp-25 1.15.0-rc.2-otp-26 1.15.1 1.15.1-otp-24 
1.15.1-otp-25 1.15.1-otp-26 1.15.2 1.15.2-otp-24 1.15.2-otp-25 1.15.2-otp-26 
1.15.3 1.15.3-otp-24 1.15.3-otp-25 1.15.3-otp-26 1.15.4 1.15.4-otp-24 
1.15.4-otp-25 1.15.4-otp-26 1.15.5 1.15.5-otp-24 1.15.5-otp-25 1.15.5-otp-26 
1.15.6 1.15.6-otp-24 1.15.6-otp-25 1.15.6-otp-26 1.15.7 1.15.7-otp-24 
1.15.7-otp-25 1.15.7-otp-26 1.15.8 1.15.8-otp-24 1.15.8-otp-25 1.15.8-otp-26 
1.16.0 1.16.0-otp-24 1.16.0-otp-25 1.16.0-otp-26 1.16.0-rc.0 1.16.0-rc.0-otp-24 
1.16.0-rc.0-otp-25 1.16.0-rc.0-otp-26 1.16.0-rc.1 1.16.0-rc.1-otp-24 
1.16.0-rc.1-otp-25 1.16.0-rc.1-otp-26 1.16.1 1.16.1-otp-24 1.16.1-otp-25 
1.16.1-otp-26 1.16.2 1.16.2-otp-24 1.16.2-otp-25 1.16.2-otp-26 1.16.3 
1.16.3-otp-24 1.16.3-otp-25 1.16.3-otp-26 1.17.0 1.17.0-otp-25 1.17.0-otp-26 
1.17.0-otp-27 1.17.0-rc.0 1.17.0-rc.0-otp-25 1.17.0-rc.0-otp-26 
1.17.0-rc.0-otp-27 1.17.0-rc.1 1.17.0-rc.1-otp-25 1.17.0-rc.1-otp-26 
1.17.0-rc.1-otp-27 1.17.1 1.17.1-otp-25 1.17.1-o
 tp-26 1.17.1-otp-27 1.17.2 1.17.2-otp-25 1.17.2-otp-26 1.17.2-otp-27 1.17.3 
1.17.3-otp-25 1.17.3-otp-26 1.17.3-otp-27 1.18.0 1.18.0-otp-25 1.18.0-otp-26 
1.18.0-otp-27 1.18.0-rc.0 1.18.0-rc.0-otp-25 1.18.0-rc.0-otp-26 
1.18.0-rc.0-otp-27 1.18.1 1.18.1-otp-25 1.18.1-otp-26 1.18.1-otp-27 1.18.2 
1.18.2-otp-25 1.18.2-otp-26 1.18.2-otp-27 main main-otp-22 main-otp-23 
main-otp-24 main-otp-25 main-otp-26 main-otp-27 master master-otp-21 
master-otp-22 master-otp-23 master-otp-24 
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/asdf-0.16.4/internal/versions/testdata/list-all-python 
new/asdf-0.16.5/internal/versions/testdata/list-all-python
--- old/asdf-0.16.4/internal/versions/testdata/list-all-python  1970-01-01 
01:00:00.000000000 +0100
+++ new/asdf-0.16.5/internal/versions/testdata/list-all-python  2025-03-04 
15:00:54.000000000 +0100
@@ -0,0 +1 @@
+2.1.3 2.2.3 2.3.7 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.5.0 2.5.1 2.5.2 
2.5.3 2.5.4 2.5.5 2.5.6 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.6.6 2.6.7 2.6.8 
2.6.9 2.7.0 2.7-dev 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 2.7.8 2.7.9 
2.7.10 2.7.11 2.7.12 2.7.13 2.7.14 2.7.15 2.7.16 2.7.17 2.7.18 3.0.1 3.1.0 
3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.3.0 
3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.4.0 3.4-dev 3.4.1 3.4.2 3.4.3 3.4.4 
3.4.5 3.4.6 3.4.7 3.4.8 3.4.9 3.4.10 3.5.0 3.5-dev 3.5.1 3.5.2 3.5.3 3.5.4 
3.5.5 3.5.6 3.5.7 3.5.8 3.5.9 3.5.10 3.6.0 3.6-dev 3.6.1 3.6.2 3.6.3 3.6.4 
3.6.5 3.6.6 3.6.7 3.6.8 3.6.9 3.6.10 3.6.11 3.6.12 3.6.13 3.6.14 3.6.15 3.7.0 
3.7-dev 3.7.1 3.7.2 3.7.3 3.7.4 3.7.5 3.7.6 3.7.7 3.7.8 3.7.9 3.7.10 3.7.11 
3.7.12 3.7.13 3.7.14 3.7.15 3.7.16 3.7.17 3.8.0 3.8-dev 3.8.1 3.8.2 3.8.3 3.8.4 
3.8.5 3.8.6 3.8.7 3.8.8 3.8.9 3.8.10 3.8.11 3.8.12 3.8.13 3.8.14 3.8.15 3.8.16 
3.8.17 3.8.18 3.8.19 3.8.20 3.9.0 3.9-dev 3.9.1 3.9.2 3.9.4 3.9.5 3.9.6
  3.9.7 3.9.8 3.9.9 3.9.10 3.9.11 3.9.12 3.9.13 3.9.14 3.9.15 3.9.16 3.9.17 
3.9.18 3.9.19 3.9.20 3.9.21 3.10.0 3.10-dev 3.10.1 3.10.2 3.10.3 3.10.4 3.10.5 
3.10.6 3.10.7 3.10.8 3.10.9 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 
3.10.16 3.11.0 3.11-dev 3.11.1 3.11.2 3.11.3 3.11.4 3.11.5 3.11.6 3.11.7 3.11.8 
3.11.9 3.11.10 3.11.11 3.12.0 3.12-dev 3.12.1 3.12.2 3.12.3 3.12.4 3.12.5 
3.12.6 3.12.7 3.12.8 3.12.9 3.13.0 3.13.0t 3.13-dev 3.13t-dev 3.13.1 3.13.1t 
3.13.2 3.13.2t 3.14.0a5 3.14.0a5t 3.14-dev 3.14t-dev activepython-2.7.14 
activepython-3.5.4 activepython-3.6.0 anaconda-1.4.0 anaconda-1.5.0 
anaconda-1.5.1 anaconda-1.6.0 anaconda-1.6.1 anaconda-1.7.0 anaconda-1.8.0 
anaconda-1.9.0 anaconda-1.9.1 anaconda-1.9.2 anaconda-2.0.0 anaconda-2.0.1 
anaconda-2.1.0 anaconda-2.2.0 anaconda-2.3.0 anaconda-2.4.0 anaconda-4.0.0 
anaconda2-2.4.0 anaconda2-2.4.1 anaconda2-2.5.0 anaconda2-4.0.0 anaconda2-4.1.0 
anaconda2-4.1.1 anaconda2-4.2.0 anaconda2-4.3.0 anaconda2-4.3.1 anaconda2-4.4.0 
anaconda2-
 5.0.0 anaconda2-5.0.1 anaconda2-5.1.0 anaconda2-5.2.0 anaconda2-5.3.0 
anaconda2-5.3.1 anaconda2-2018.12 anaconda2-2019.03 anaconda2-2019.07 
anaconda2-2019.10 anaconda3-2.0.0 anaconda3-2.0.1 anaconda3-2.1.0 
anaconda3-2.2.0 anaconda3-2.3.0 anaconda3-2.4.0 anaconda3-2.4.1 anaconda3-2.5.0 
anaconda3-4.0.0 anaconda3-4.1.0 anaconda3-4.1.1 anaconda3-4.2.0 anaconda3-4.3.0 
anaconda3-4.3.1 anaconda3-4.4.0 anaconda3-5.0.0 anaconda3-5.0.1 anaconda3-5.1.0 
anaconda3-5.2.0 anaconda3-5.3.0 anaconda3-5.3.1 anaconda3-2018.12 
anaconda3-2019.03 anaconda3-2019.07 anaconda3-2019.10 anaconda3-2020.02 
anaconda3-2020.07 anaconda3-2020.11 anaconda3-2021.04 anaconda3-2021.05 
anaconda3-2021.11 anaconda3-2022.05 anaconda3-2022.10 anaconda3-2023.03-0 
anaconda3-2023.03 anaconda3-2023.03-1 anaconda3-2023.07-0 anaconda3-2023.07-1 
anaconda3-2023.07-2 anaconda3-2023.09-0 anaconda3-2024.02-1 anaconda3-2024.06-1 
anaconda3-2024.10-1 cinder-3.8-dev cinder-3.10-dev graalpy-dev 
graalpy-community-23.1.0 graalpy-community-23.
 1.2 graalpy-community-24.0.0 graalpy-community-24.1.0 graalpy-community-24.1.1 
graalpy-community-24.1.2 graalpy-22.3.0 graalpy-23.0.0 graalpy-23.1.0 
graalpy-23.1.2 graalpy-24.0.0 graalpy-24.1.0 graalpy-24.1.1 graalpy-24.1.2 
graalpython-20.1.0 graalpython-20.2.0 graalpython-20.3.0 graalpython-21.0.0 
graalpython-21.1.0 graalpython-21.2.0 graalpython-21.3.0 graalpython-22.0.0 
graalpython-22.1.0 graalpython-22.2.0 ironpython-dev ironpython-2.7.4 
ironpython-2.7.5 ironpython-2.7.6.3 ironpython-2.7.7 jython-dev jython-2.5.0 
jython-2.5-dev jython-2.5.1 jython-2.5.2 jython-2.5.3 jython-2.5.4-rc1 
jython-2.7.0 jython-2.7.1 jython-2.7.2 jython-2.7.3 mambaforge-pypy3 mambaforge 
mambaforge-4.10.1-4 mambaforge-4.10.1-5 mambaforge-4.10.2-0 mambaforge-4.10.3-0 
mambaforge-4.10.3-1 mambaforge-4.10.3-2 mambaforge-4.10.3-3 mambaforge-4.10.3-4 
mambaforge-4.10.3-5 mambaforge-4.10.3-6 mambaforge-4.10.3-7 mambaforge-4.10.3-8 
mambaforge-4.10.3-9 mambaforge-4.10.3-10 mambaforge-4.11.0-0 
mambaforge-4.11.0-1 ma
 mbaforge-4.11.0-2 mambaforge-4.11.0-3 mambaforge-4.11.0-4 mambaforge-4.12.0-0 
mambaforge-4.12.0-1 mambaforge-4.12.0-2 mambaforge-4.12.0-3 mambaforge-4.13.0-1 
mambaforge-4.14.0-0 mambaforge-4.14.0-1 mambaforge-4.14.0-2 mambaforge-22.9.0-0 
mambaforge-22.9.0-1 mambaforge-22.9.0-2 mambaforge-22.9.0-3 
mambaforge-22.11.1-3 mambaforge-22.11.1-4 mambaforge-23.1.0-0 
mambaforge-23.1.0-1 mambaforge-23.1.0-2 mambaforge-23.1.0-3 mambaforge-23.1.0-4 
mambaforge-23.3.0-0 mambaforge-23.3.1-0 mambaforge-23.3.1-1 
mambaforge-23.10.0-0 mambaforge-23.11.0-0 mambaforge-24.1.2-0 
mambaforge-24.3.0-0 mambaforge-24.5.0-0 mambaforge-24.7.1-0 mambaforge-24.7.1-1 
mambaforge-24.7.1-2 mambaforge-24.9.0-0 mambaforge-24.9.2-0 
mambaforge-24.11.0-0 mambaforge-24.11.0-1 micropython-dev micropython-1.9.3 
micropython-1.9.4 micropython-1.10 micropython-1.11 micropython-1.12 
micropython-1.13 micropython-1.14 micropython-1.15 micropython-1.16 
micropython-1.17 micropython-1.18 micropython-1.19.1 micropython-1.20.0 
micropytho
 n-1.21.0 miniconda-latest miniconda-2.2.2 miniconda-3.0.0 miniconda-3.0.4 
miniconda-3.0.5 miniconda-3.3.0 miniconda-3.4.2 miniconda-3.7.0 miniconda-3.8.3 
miniconda-3.9.1 miniconda-3.10.1 miniconda-3.16.0 miniconda-3.18.3 
miniconda2-latest miniconda2-2.7-4.8.3 miniconda2-3.18.3 miniconda2-3.19.0 
miniconda2-4.0.5 miniconda2-4.1.11 miniconda2-4.3.14 miniconda2-4.3.21 
miniconda2-4.3.27 miniconda2-4.3.30 miniconda2-4.3.31 miniconda2-4.4.10 
miniconda2-4.5.1 miniconda2-4.5.4 miniconda2-4.5.11 miniconda2-4.5.12 
miniconda2-4.6.14 miniconda2-4.7.10 miniconda2-4.7.12 miniconda3-latest 
miniconda3-2.2.2 miniconda3-3.0.0 miniconda3-3.0.4 miniconda3-3.0.5 
miniconda3-3.3.0 miniconda3-3.4.2 miniconda3-3.7.0 miniconda3-3.7-4.8.2 
miniconda3-3.7-4.8.3 miniconda3-3.7-4.9.2 miniconda3-3.7-4.10.1 
miniconda3-3.7-4.10.3 miniconda3-3.7-4.11.0 miniconda3-3.7-4.12.0 
miniconda3-3.7-22.11.1-1 miniconda3-3.7-23.1.0-1 miniconda3-3.8.3 
miniconda3-3.8-4.8.2 miniconda3-3.8-4.8.3 miniconda3-3.8-4.9.2 miniconda3-3.8-4.
 10.1 miniconda3-3.8-4.10.3 miniconda3-3.8-4.11.0 miniconda3-3.8-4.12.0 
miniconda3-3.8-22.11.1-1 miniconda3-3.8-23.1.0-1 miniconda3-3.8-23.3.1-0 
miniconda3-3.8-23.5.0-3 miniconda3-3.8-23.5.1-0 miniconda3-3.8-23.5.2-0 
miniconda3-3.8-23.9.0-0 miniconda3-3.8-23.10.0-1 miniconda3-3.8-23.11.0-1 
miniconda3-3.8-23.11.0-2 miniconda3-3.9.1 miniconda3-3.9-4.9.2 
miniconda3-3.9-4.10.1 miniconda3-3.9-4.10.3 miniconda3-3.9-4.11.0 
miniconda3-3.9-4.12.0 miniconda3-3.9-22.11.1-1 miniconda3-3.9-23.1.0-1 
miniconda3-3.9-23.3.1-0 miniconda3-3.9-23.5.0-3 miniconda3-3.9-23.5.1-0 
miniconda3-3.9-23.5.2-0 miniconda3-3.9-23.9.0-0 miniconda3-3.9-23.10.0-1 
miniconda3-3.9-23.11.0-1 miniconda3-3.9-23.11.0-2 miniconda3-3.9-24.1.2-0 
miniconda3-3.9-24.3.0-0 miniconda3-3.9-24.4.0-0 miniconda3-3.9-24.5.0-0 
miniconda3-3.9-24.7.1-0 miniconda3-3.9-24.9.2-0 miniconda3-3.9-24.11.1-0 
miniconda3-3.9-25.1.1-0 miniconda3-3.9-25.1.1-1 miniconda3-3.9-25.1.1-2 
miniconda3-3.10.1 miniconda3-3.10-22.11.1-1 miniconda3-3.10-23.1.0-1 mi
 niconda3-3.10-23.3.1-0 miniconda3-3.10-23.5.0-3 miniconda3-3.10-23.5.1-0 
miniconda3-3.10-23.5.2-0 miniconda3-3.10-23.9.0-0 miniconda3-3.10-23.10.0-1 
miniconda3-3.10-23.11.0-1 miniconda3-3.10-23.11.0-2 miniconda3-3.10-24.1.2-0 
miniconda3-3.10-24.3.0-0 miniconda3-3.10-24.4.0-0 miniconda3-3.10-24.5.0-0 
miniconda3-3.10-24.7.1-0 miniconda3-3.10-24.9.2-0 miniconda3-3.10-24.11.1-0 
miniconda3-3.10-25.1.1-0 miniconda3-3.10-25.1.1-1 miniconda3-3.10-25.1.1-2 
miniconda3-3.11-23.5.0-3 miniconda3-3.11-23.5.1-0 miniconda3-3.11-23.5.2-0 
miniconda3-3.11-23.9.0-0 miniconda3-3.11-23.10.0-1 miniconda3-3.11-23.11.0-1 
miniconda3-3.11-23.11.0-2 miniconda3-3.11-24.1.2-0 miniconda3-3.11-24.3.0-0 
miniconda3-3.11-24.4.0-0 miniconda3-3.11-24.5.0-0 miniconda3-3.11-24.7.1-0 
miniconda3-3.11-24.9.2-0 miniconda3-3.11-24.11.1-0 miniconda3-3.11-25.1.1-0 
miniconda3-3.11-25.1.1-1 miniconda3-3.11-25.1.1-2 miniconda3-3.12-24.1.2-0 
miniconda3-3.12-24.3.0-0 miniconda3-3.12-24.4.0-0 miniconda3-3.12-24.5.0-0 
miniconda3-3.12-
 24.7.1-0 miniconda3-3.12-24.9.2-0 miniconda3-3.12-24.11.1-0 
miniconda3-3.12-25.1.1-0 miniconda3-3.12-25.1.1-1 miniconda3-3.12-25.1.1-2 
miniconda3-3.16.0 miniconda3-3.18.3 miniconda3-3.19.0 miniconda3-4.0.5 
miniconda3-4.1.11 miniconda3-4.2.12 miniconda3-4.3.11 miniconda3-4.3.14 
miniconda3-4.3.21 miniconda3-4.3.27 miniconda3-4.3.30 miniconda3-4.3.31 
miniconda3-4.4.10 miniconda3-4.5.1 miniconda3-4.5.4 miniconda3-4.5.11 
miniconda3-4.5.12 miniconda3-4.6.14 miniconda3-4.7.10 miniconda3-4.7.12 
miniforge-pypy3 miniforge3-latest miniforge3-4.9.2 miniforge3-4.10 
miniforge3-4.10.1-1 miniforge3-4.10.1-3 miniforge3-4.10.1-5 miniforge3-4.10.2-0 
miniforge3-4.10.3-0 miniforge3-4.10.3-1 miniforge3-4.10.3-2 miniforge3-4.10.3-3 
miniforge3-4.10.3-4 miniforge3-4.10.3-5 miniforge3-4.10.3-6 miniforge3-4.10.3-7 
miniforge3-4.10.3-8 miniforge3-4.10.3-9 miniforge3-4.10.3-10 
miniforge3-4.11.0-0 miniforge3-4.11.0-1 miniforge3-4.11.0-2 miniforge3-4.11.0-3 
miniforge3-4.11.0-4 miniforge3-4.12.0-0 miniforge3-4.12.0
 -1 miniforge3-4.12.0-2 miniforge3-4.12.0-3 miniforge3-4.13.0-0 
miniforge3-4.13.0-1 miniforge3-4.14.0-0 miniforge3-4.14.0-1 miniforge3-4.14.0-2 
miniforge3-22.9.0-0 miniforge3-22.9.0-1 miniforge3-22.9.0-2 miniforge3-22.9.0-3 
miniforge3-22.11.1-3 miniforge3-22.11.1-4 miniforge3-23.1.0-0 
miniforge3-23.1.0-1 miniforge3-23.1.0-2 miniforge3-23.1.0-3 miniforge3-23.1.0-4 
miniforge3-23.3.0-0 miniforge3-23.3.1-0 miniforge3-23.3.1-1 
miniforge3-23.10.0-0 miniforge3-23.11.0-0 miniforge3-24.1.2-0 
miniforge3-24.3.0-0 miniforge3-24.5.0-0 miniforge3-24.7.1-0 miniforge3-24.7.1-1 
miniforge3-24.7.1-2 miniforge3-24.9.0-0 miniforge3-24.9.2-0 
miniforge3-24.11.0-0 miniforge3-24.11.0-1 miniforge3-24.11.2-0 
miniforge3-24.11.2-1 miniforge3-24.11.3-0 miniforge3-25.1.1-0 nogil-3.9.10 
nogil-3.9.10-1 pypy-c-jit-latest pypy-dev pypy-stm-2.3 pypy-stm-2.5.1 
pypy-1.5-src pypy-1.6 pypy-1.7 pypy-1.8 pypy-1.9 pypy-2.0-src pypy-2.0 
pypy-2.0.1-src pypy-2.0.1 pypy-2.0.2-src pypy-2.0.2 pypy-2.1-src pypy-2.1 
pypy-2.2-src pypy
 -2.2 pypy-2.2.1-src pypy-2.2.1 pypy-2.3-src pypy-2.3 pypy-2.3.1-src pypy-2.3.1 
pypy-2.4.0-src pypy-2.4.0 pypy-2.5.0-src pypy-2.5.0 pypy-2.5.1-src pypy-2.5.1 
pypy-2.6.0-src pypy-2.6.0 pypy-2.6.1-src pypy-2.6.1 pypy-4.0.0-src pypy-4.0.0 
pypy-4.0.1-src pypy-4.0.1 pypy-5.0.0-src pypy-5.0.0 pypy-5.0.1-src pypy-5.0.1 
pypy-5.1-src pypy-5.1 pypy-5.1.1-src pypy-5.1.1 pypy-5.3-src pypy-5.3 
pypy-5.3.1-src pypy-5.3.1 pypy-5.4-src pypy-5.4 pypy-5.4.1-src pypy-5.4.1 
pypy-5.6.0-src pypy-5.6.0 pypy-5.7.0-src pypy-5.7.0 pypy-5.7.1-src pypy-5.7.1 
pypy2-5.3-src pypy2-5.3 pypy2-5.3.1-src pypy2-5.3.1 pypy2-5.4-src pypy2-5.4 
pypy2-5.4.1-src pypy2-5.4.1 pypy2-5.6.0-src pypy2-5.6.0 pypy2-5.7.0-src 
pypy2-5.7.0 pypy2-5.7.1-src pypy2-5.7.1 pypy2.7-5.8.0-src pypy2.7-5.8.0 
pypy2.7-5.9.0-src pypy2.7-5.9.0 pypy2.7-5.10.0-src pypy2.7-5.10.0 
pypy2.7-6.0.0-src pypy2.7-6.0.0 pypy2.7-7.0.0-src pypy2.7-7.0.0 
pypy2.7-7.1.0-src pypy2.7-7.1.0 pypy2.7-7.1.1-src pypy2.7-7.1.1 
pypy2.7-7.2.0-src pypy2.7-7.2.0 pypy2.7-7.3.0-sr
 c pypy2.7-7.3.0 pypy2.7-7.3.1-src pypy2.7-7.3.1 pypy2.7-7.3.2-src 
pypy2.7-7.3.2 pypy2.7-7.3.3-src pypy2.7-7.3.3 pypy2.7-7.3.4-src pypy2.7-7.3.4 
pypy2.7-7.3.5-src pypy2.7-7.3.5 pypy2.7-7.3.6-src pypy2.7-7.3.6 
pypy2.7-7.3.8-src pypy2.7-7.3.8 pypy2.7-7.3.9-src pypy2.7-7.3.9 
pypy2.7-7.3.10-src pypy2.7-7.3.10 pypy2.7-7.3.11-src pypy2.7-7.3.11 
pypy2.7-7.3.12-src pypy2.7-7.3.12 pypy2.7-7.3.13-src pypy2.7-7.3.13 
pypy2.7-7.3.14-src pypy2.7-7.3.14 pypy2.7-7.3.15-src pypy2.7-7.3.15 
pypy2.7-7.3.16-src pypy2.7-7.3.16 pypy2.7-7.3.17-src pypy2.7-7.3.17 
pypy2.7-7.3.18-src pypy2.7-7.3.18 pypy3-2.3.1-src pypy3-2.3.1 pypy3-2.4.0-src 
pypy3-2.4.0 pypy3.3-5.2-alpha1-src pypy3.3-5.2-alpha1 pypy3.3-5.5-alpha-src 
pypy3.3-5.5-alpha pypy3.5-c-jit-latest pypy3.5-5.7-beta-src pypy3.5-5.7-beta 
pypy3.5-5.7.1-beta-src pypy3.5-5.7.1-beta pypy3.5-5.8.0-src pypy3.5-5.8.0 
pypy3.5-5.9.0-src pypy3.5-5.9.0 pypy3.5-5.10.0-src pypy3.5-5.10.0 
pypy3.5-5.10.1-src pypy3.5-5.10.1 pypy3.5-6.0.0-src pypy3.5-6.0.0 
pypy3.5-7.0.0-sr
 c pypy3.5-7.0.0 pypy3.6-7.0.0-src pypy3.6-7.0.0 pypy3.6-7.1.0-src 
pypy3.6-7.1.0 pypy3.6-7.1.1-src pypy3.6-7.1.1 pypy3.6-7.2.0-src pypy3.6-7.2.0 
pypy3.6-7.3.0-src pypy3.6-7.3.0 pypy3.6-7.3.1-src pypy3.6-7.3.1 
pypy3.6-7.3.2-src pypy3.6-7.3.2 pypy3.6-7.3.3-src pypy3.6-7.3.3 
pypy3.7-c-jit-latest pypy3.7-7.3.2-src pypy3.7-7.3.2 pypy3.7-7.3.3-src 
pypy3.7-7.3.3 pypy3.7-7.3.4-src pypy3.7-7.3.4 pypy3.7-7.3.5-src pypy3.7-7.3.5 
pypy3.7-7.3.6-src pypy3.7-7.3.6 pypy3.7-7.3.7-src pypy3.7-7.3.7 
pypy3.7-7.3.8-src pypy3.7-7.3.8 pypy3.7-7.3.9-src pypy3.7-7.3.9 
pypy3.8-7.3.6-src pypy3.8-7.3.6 pypy3.8-7.3.7-src pypy3.8-7.3.7 
pypy3.8-7.3.8-src pypy3.8-7.3.8 pypy3.8-7.3.9-src pypy3.8-7.3.9 
pypy3.8-7.3.10-src pypy3.8-7.3.10 pypy3.8-7.3.11-src pypy3.8-7.3.11 
pypy3.9-7.3.8-src pypy3.9-7.3.8 pypy3.9-7.3.9-src pypy3.9-7.3.9 
pypy3.9-7.3.10-src pypy3.9-7.3.10 pypy3.9-7.3.11-src pypy3.9-7.3.11 
pypy3.9-7.3.12-src pypy3.9-7.3.12 pypy3.9-7.3.13-src pypy3.9-7.3.13 
pypy3.9-7.3.14-src pypy3.9-7.3.14 pypy3.9-7.3.15-src
  pypy3.9-7.3.15 pypy3.9-7.3.16-src pypy3.9-7.3.16 pypy3.10-7.3.12-src 
pypy3.10-7.3.12 pypy3.10-7.3.13-src pypy3.10-7.3.13 pypy3.10-7.3.14-src 
pypy3.10-7.3.14 pypy3.10-7.3.15-src pypy3.10-7.3.15 pypy3.10-7.3.16-src 
pypy3.10-7.3.16 pypy3.10-7.3.17-src pypy3.10-7.3.17 pypy3.10-7.3.18-src 
pypy3.10-7.3.18 pypy3.11-7.3.18-src pypy3.11-7.3.18 pyston-2.2 pyston-2.3 
pyston-2.3.1 pyston-2.3.2 pyston-2.3.3 pyston-2.3.4 pyston-2.3.5 stackless-dev 
stackless-2.7-dev stackless-2.7.2 stackless-2.7.3 stackless-2.7.4 
stackless-2.7.5 stackless-2.7.6 stackless-2.7.7 stackless-2.7.8 stackless-2.7.9 
stackless-2.7.10 stackless-2.7.11 stackless-2.7.12 stackless-2.7.14 
stackless-2.7.16 stackless-3.2.2 stackless-3.2.5 stackless-3.3.5 
stackless-3.3.7 stackless-3.4-dev stackless-3.4.2 stackless-3.4.7 
stackless-3.5.4 stackless-3.7.5 
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/internal/versions/testdata/list-all-ruby 
new/asdf-0.16.5/internal/versions/testdata/list-all-ruby
--- old/asdf-0.16.4/internal/versions/testdata/list-all-ruby    1970-01-01 
01:00:00.000000000 +0100
+++ new/asdf-0.16.5/internal/versions/testdata/list-all-ruby    2025-03-04 
15:00:54.000000000 +0100
@@ -0,0 +1 @@
+1.8.5-p52 1.8.5-p113 1.8.5-p114 1.8.5-p115 1.8.5-p231 1.8.6 1.8.6-p36 
1.8.6-p110 1.8.6-p111 1.8.6-p114 1.8.6-p230 1.8.6-p286 1.8.6-p287 1.8.6-p368 
1.8.6-p369 1.8.6-p383 1.8.6-p388 1.8.6-p398 1.8.6-p399 1.8.6-p420 
1.8.7-preview1 1.8.7-preview2 1.8.7-preview3 1.8.7-preview4 1.8.7 1.8.7-p17 
1.8.7-p22 1.8.7-p71 1.8.7-p72 1.8.7-p160 1.8.7-p173 1.8.7-p174 1.8.7-p248 
1.8.7-p249 1.8.7-p299 1.8.7-p301 1.8.7-p302 1.8.7-p330 1.8.7-p334 1.8.7-p352 
1.8.7-p357 1.8.7-p358 1.8.7-p370 1.8.7-p371 1.8.7-p373 1.8.7-p374 1.9.0-0 
1.9.0-1 1.9.0-2 1.9.0-3 1.9.0-4 1.9.0-5 1.9.1-preview1 1.9.1-preview2 1.9.1-rc1 
1.9.1-rc2 1.9.1-p0 1.9.1-p129 1.9.1-p243 1.9.1-p376 1.9.1-p378 1.9.1-p429 
1.9.1-p430 1.9.1-p431 1.9.2-preview1 1.9.2-preview3 1.9.2-rc1 1.9.2-rc2 
1.9.2-p0 1.9.2-p136 1.9.2-p180 1.9.2-p290 1.9.2-p318 1.9.2-p320 1.9.2-p330 
1.9.3-dev 1.9.3-preview1 1.9.3-rc1 1.9.3-p0 1.9.3-p105 1.9.3-p125 1.9.3-p194 
1.9.3-p286 1.9.3-p327 1.9.3-p362 1.9.3-p374 1.9.3-p385 1.9.3-p392 1.9.3-p426 
1.9.3-p429 1.9.3-p448 1.9.3-
 p484 1.9.3-p545 1.9.3-p547 1.9.3-p550 1.9.3-p551 2.0.0-dev 2.0.0-preview1 
2.0.0-preview2 2.0.0-rc1 2.0.0-rc2 2.0.0-p0 2.0.0-p195 2.0.0-p247 2.0.0-p353 
2.0.0-p451 2.0.0-p481 2.0.0-p576 2.0.0-p594 2.0.0-p598 2.0.0-p643 2.0.0-p645 
2.0.0-p647 2.0.0-p648 2.1.0-preview1 2.1.0-preview2 2.1.0-rc1 2.1.0 2.1-dev 
2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.1.10 2.2.0-preview1 
2.2.0-preview2 2.2.0-rc1 2.2.0 2.2-dev 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 
2.2.7 2.2.8 2.2.9 2.2.10 2.3.0-preview1 2.3.0-preview2 2.3.0 2.3-dev 2.3.1 
2.3.2 2.3.3 2.3.4 2.3.5 2.3.6 2.3.7 2.3.8 2.4.0-preview1 2.4.0-preview2 
2.4.0-preview3 2.4.0-rc1 2.4.0 2.4-dev 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 
2.4.7 2.4.8 2.4.9 2.4.10 2.5.0-preview1 2.5.0-rc1 2.5.0 2.5-dev 2.5.1 2.5.2 
2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0-preview1 2.6.0-preview2 
2.6.0-preview3 2.6.0-rc1 2.6.0-rc2 2.6.0 2.6-dev 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 
2.6.6 2.6.7 2.6.8 2.6.9 2.6.10 2.7.0-preview1 2.7.0-preview2 2.7.0-preview3 
2.7.0-rc1 2.7.0-r
 c2 2.7.0 2.7-dev 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 2.7.8 
3.0.0-preview1 3.0.0-preview2 3.0.0-rc1 3.0.0 3.0-dev 3.0.1 3.0.2 3.0.3 3.0.4 
3.0.5 3.0.6 3.0.7 3.1.0-preview1 3.1.0 3.1-dev 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 
3.1.6 3.2.0-preview1 3.2.0-preview2 3.2.0-preview3 3.2.0-rc1 3.2.0 3.2-dev 
3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.3.0-preview1 3.3.0-preview2 
3.3.0-preview3 3.3.0-rc1 3.3.0 3.3-dev 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 
3.3.7 3.4.0-preview1 3.4.0-preview2 3.4.0-rc1 3.4.0 3.4-dev 3.4.1 3.4.2 3.5-dev 
artichoke-dev jruby-dev jruby-1.7.2 jruby-1.7.5 jruby-1.7.6 jruby-1.7.7 
jruby-1.7.8 jruby-1.7.9 jruby-1.7.10 jruby-1.7.11 jruby-1.7.12 jruby-1.7.13 
jruby-1.7.14 jruby-1.7.15 jruby-1.7.16 jruby-1.7.16.1 jruby-1.7.16.2 
jruby-1.7.17 jruby-1.7.18 jruby-1.7.19 jruby-1.7.20 jruby-1.7.20.1 jruby-1.7.21 
jruby-1.7.22 jruby-1.7.23 jruby-1.7.24 jruby-1.7.25 jruby-1.7.26 jruby-1.7.27 
jruby-9.0.0.0.pre1 jruby-9.0.0.0.pre2 jruby-9.0.0.0.rc1 jruby-9.0.0.0.rc2 
jruby-9.0.0.0 jruby-9.0.1.
 0 jruby-9.0.3.0 jruby-9.0.4.0 jruby-9.0.5.0 jruby-9.1.0.0-dev jruby-9.1.0.0 
jruby-9.1.1.0 jruby-9.1.2.0 jruby-9.1.3.0 jruby-9.1.4.0 jruby-9.1.5.0 
jruby-9.1.6.0 jruby-9.1.7.0 jruby-9.1.8.0 jruby-9.1.9.0 jruby-9.1.10.0 
jruby-9.1.11.0 jruby-9.1.12.0 jruby-9.1.13.0 jruby-9.1.14.0 jruby-9.1.15.0 
jruby-9.1.16.0 jruby-9.1.17.0 jruby-9.2.0.0-dev jruby-9.2.0.0 jruby-9.2.1.0-dev 
jruby-9.2.1.0 jruby-9.2.3.0 jruby-9.2.4.0 jruby-9.2.4.1 jruby-9.2.5.0 
jruby-9.2.6.0 jruby-9.2.7.0 jruby-9.2.8.0 jruby-9.2.9.0 jruby-9.2.10.0 
jruby-9.2.11.0 jruby-9.2.11.1 jruby-9.2.12.0 jruby-9.2.13.0 jruby-9.2.14.0 
jruby-9.2.15.0 jruby-9.2.16.0 jruby-9.2.17.0 jruby-9.2.18.0 jruby-9.2.19.0 
jruby-9.2.20.0 jruby-9.2.20.1 jruby-9.2.21.0 jruby-9.3.0.0 jruby-9.3.1.0 
jruby-9.3.2.0 jruby-9.3.3.0 jruby-9.3.4.0 jruby-9.3.6.0 jruby-9.3.7.0 
jruby-9.3.8.0 jruby-9.3.9.0 jruby-9.3.10.0 jruby-9.3.11.0 jruby-9.3.13.0 
jruby-9.3.14.0 jruby-9.3.15.0 jruby-9.4.0.0 jruby-9.4.1.0 jruby-9.4.2.0 
jruby-9.4.3.0 jruby-9.4.4.0 jruby-9.4.5.0 jrub
 y-9.4.6.0 jruby-9.4.7.0 jruby-9.4.8.0 jruby-9.4.9.0 jruby-9.4.10.0 
jruby-9.4.11.0 jruby-9.4.12.0 mruby-dev mruby-1.0.0 mruby-1.1.0 mruby-1.2.0 
mruby-1.3.0 mruby-1.4.0 mruby-1.4.1 mruby-2.0.0 mruby-2.0.1 mruby-2.1.0 
mruby-2.1.1 mruby-2.1.2 mruby-3.0.0 mruby-3.1.0 mruby-3.2.0 mruby-3.3.0 
picoruby-3.0.0 rbx-2.2.2 rbx-2.2.3 rbx-2.2.4 rbx-2.2.5 rbx-2.2.6 rbx-2.2.7 
rbx-2.2.8 rbx-2.2.9 rbx-2.2.10 rbx-2.3.0 rbx-2.4.0 rbx-2.4.1 rbx-2.5.0 
rbx-2.5.1 rbx-2.5.2 rbx-2.5.3 rbx-2.5.4 rbx-2.5.5 rbx-2.5.6 rbx-2.5.7 rbx-2.5.8 
rbx-2.6 rbx-2.7 rbx-2.8 rbx-2.9 rbx-2.10 rbx-2.11 rbx-2.71828182 rbx-3.0 
rbx-3.1 rbx-3.2 rbx-3.3 rbx-3.4 rbx-3.5 rbx-3.6 rbx-3.7 rbx-3.8 rbx-3.9 
rbx-3.10 rbx-3.11 rbx-3.12 rbx-3.13 rbx-3.14 rbx-3.15 rbx-3.16 rbx-3.17 
rbx-3.18 rbx-3.19 rbx-3.20 rbx-3.21 rbx-3.22 rbx-3.23 rbx-3.24 rbx-3.25 
rbx-3.26 rbx-3.27 rbx-3.28 rbx-3.29 rbx-3.30 rbx-3.31 rbx-3.32 rbx-3.33 
rbx-3.34 rbx-3.35 rbx-3.36 rbx-3.37 rbx-3.38 rbx-3.39 rbx-3.40 rbx-3.41 
rbx-3.42 rbx-3.43 rbx-3.44 rbx-3.45 rbx-3.46 rbx-3.
 47 rbx-3.48 rbx-3.49 rbx-3.50 rbx-3.51 rbx-3.52 rbx-3.53 rbx-3.54 rbx-3.55 
rbx-3.56 rbx-3.57 rbx-3.58 rbx-3.59 rbx-3.60 rbx-3.61 rbx-3.62 rbx-3.63 
rbx-3.64 rbx-3.65 rbx-3.66 rbx-3.67 rbx-3.68 rbx-3.69 rbx-3.70 rbx-3.71 
rbx-3.72 rbx-3.73 rbx-3.74 rbx-3.75 rbx-3.76 rbx-3.77 rbx-3.78 rbx-3.79 
rbx-3.80 rbx-3.81 rbx-3.82 rbx-3.83 rbx-3.84 rbx-3.85 rbx-3.86 rbx-3.87 
rbx-3.88 rbx-3.89 rbx-3.90 rbx-3.91 rbx-3.92 rbx-3.93 rbx-3.94 rbx-3.95 
rbx-3.96 rbx-3.97 rbx-3.98 rbx-3.99 rbx-3.100 rbx-3.101 rbx-3.102 rbx-3.103 
rbx-3.104 rbx-3.105 rbx-3.106 rbx-3.107 rbx-4.0 rbx-4.1 rbx-4.2 rbx-4.3 rbx-4.4 
rbx-4.5 rbx-4.6 rbx-4.7 rbx-4.8 rbx-4.9 rbx-4.10 rbx-4.11 rbx-4.12 rbx-4.13 
rbx-4.14 rbx-4.15 rbx-4.16 rbx-4.18 rbx-4.19 rbx-4.20 rbx-5.0 ree-1.8.7-2011.03 
ree-1.8.7-2011.12 ree-1.8.7-2012.01 ree-1.8.7-2012.02 ruby-dev truffleruby-dev 
truffleruby-1.0.0-rc10 truffleruby-1.0.0-rc11 truffleruby-1.0.0-rc12 
truffleruby-1.0.0-rc13 truffleruby-1.0.0-rc14 truffleruby-1.0.0-rc15 
truffleruby-1.0.0-rc16 trufflerub
 y-1.0.0-rc2 truffleruby-1.0.0-rc3 truffleruby-1.0.0-rc5 truffleruby-1.0.0-rc6 
truffleruby-1.0.0-rc7 truffleruby-1.0.0-rc8 truffleruby-1.0.0-rc9 
truffleruby-19.0.0 truffleruby-19.1.0 truffleruby-19.2.0 truffleruby-19.2.0.1 
truffleruby-19.3.0 truffleruby-19.3.0.2 truffleruby-19.3.1 truffleruby-20.0.0 
truffleruby-20.1.0 truffleruby-20.2.0 truffleruby-20.3.0 truffleruby-21.0.0 
truffleruby-21.1.0 truffleruby-21.2.0 truffleruby-21.2.0.1 truffleruby-21.3.0 
truffleruby-22.0.0.2 truffleruby-22.1.0 truffleruby-22.2.0 truffleruby-22.3.0 
truffleruby-22.3.1 truffleruby-23.0.0-preview1 truffleruby-23.0.0 
truffleruby-23.1.0 truffleruby-23.1.1 truffleruby-23.1.2 truffleruby-24.0.0 
truffleruby-24.0.1 truffleruby-24.0.2 truffleruby-24.1.0 truffleruby-24.1.1 
truffleruby-24.1.2 truffleruby+graalvm-dev truffleruby+graalvm-20.1.0 
truffleruby+graalvm-20.2.0 truffleruby+graalvm-20.3.0 
truffleruby+graalvm-21.0.0 truffleruby+graalvm-21.1.0 
truffleruby+graalvm-21.2.0 truffleruby+graalvm-21.3.0 truffleruby+gra
 alvm-22.0.0.2 truffleruby+graalvm-22.1.0 truffleruby+graalvm-22.2.0 
truffleruby+graalvm-22.3.0 truffleruby+graalvm-22.3.1 
truffleruby+graalvm-23.0.0-preview1 truffleruby+graalvm-23.0.0 
truffleruby+graalvm-23.1.0 truffleruby+graalvm-23.1.1 
truffleruby+graalvm-23.1.2 truffleruby+graalvm-24.0.0 
truffleruby+graalvm-24.0.1 truffleruby+graalvm-24.0.2 
truffleruby+graalvm-24.1.0 truffleruby+graalvm-24.1.1 truffleruby+graalvm-24.1.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/internal/versions/versions.go 
new/asdf-0.16.5/internal/versions/versions.go
--- old/asdf-0.16.4/internal/versions/versions.go       2025-02-22 
13:44:42.000000000 +0100
+++ new/asdf-0.16.5/internal/versions/versions.go       2025-03-04 
15:00:54.000000000 +0100
@@ -11,7 +11,6 @@
        "strings"
 
        "github.com/asdf-vm/asdf/internal/config"
-       "github.com/asdf-vm/asdf/internal/execenv"
        "github.com/asdf-vm/asdf/internal/hook"
        "github.com/asdf-vm/asdf/internal/installs"
        "github.com/asdf-vm/asdf/internal/plugins"
@@ -24,7 +23,8 @@
        systemVersion           = "system"
        latestVersion           = "latest"
        uninstallableVersionMsg = "uninstallable version: %s"
-       latestFilterRegex       = "(?i)(^Available 
versions:|-src|-dev|-latest|-stm|[-\\.]rc|-milestone|-alpha|-beta|[-\\.]pre|-next|(a|b|c)[0-9]+|snapshot|master)"
+       latestFilterRegex       = "(?i)(^Available 
versions:|-src|-dev|-latest|-stm|[-\\.]rc|-milestone|-alpha|-beta|[-\\.]pre|-next|(a|b|c)[0-9]+|snapshot|master|main)"
+       numericStartFilterRegex = "^\\s*[0-9]"
        noLatestVersionErrMsg   = "no latest version found"
 )
 
@@ -168,8 +168,6 @@
                "ASDF_CONCURRENCY":     asdfConcurrency(conf),
        }
 
-       env = execenv.MergeEnv(execenv.SliceToMap(os.Environ()), env)
-
        err = os.MkdirAll(downloadDir, 0o777)
        if err != nil {
                return fmt.Errorf("unable to create download dir: %w", err)
@@ -263,7 +261,8 @@
                        return version, err
                }
 
-               versions := filterOutByRegex(allVersions, latestFilterRegex)
+               versions := filterOutByRegex(allVersions, 
numericStartFilterRegex, true)
+               versions = filterOutByRegex(versions, latestFilterRegex, false)
 
                if len(versions) < 1 {
                        return version, errors.New(noLatestVersionErrMsg)
@@ -274,7 +273,8 @@
 
        // parse stdOut and return version
        allVersions := parseVersions(stdOut.String())
-       versions := filterOutByRegex(allVersions, latestFilterRegex)
+       versions := filterOutByRegex(allVersions, numericStartFilterRegex, true)
+       versions = filterOutByRegex(versions, latestFilterRegex, false)
        if len(versions) < 1 {
                return version, errors.New(noLatestVersionErrMsg)
        }
@@ -362,10 +362,11 @@
        return versions
 }
 
-func filterOutByRegex(allVersions []string, pattern string) (versions 
[]string) {
+func filterOutByRegex(allVersions []string, pattern string, keepMatch bool) 
(versions []string) {
+       regex, _ := regexp.Compile(pattern)
        for _, version := range allVersions {
-               match, _ := regexp.MatchString(pattern, version)
-               if !match {
+               match := regex.MatchString(version)
+               if match == keepMatch {
                        versions = append(versions, version)
                }
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/internal/versions/versions_test.go 
new/asdf-0.16.5/internal/versions/versions_test.go
--- old/asdf-0.16.4/internal/versions/versions_test.go  2025-02-22 
13:44:42.000000000 +0100
+++ new/asdf-0.16.5/internal/versions/versions_test.go  2025-03-04 
15:00:54.000000000 +0100
@@ -338,6 +338,43 @@
        })
 }
 
+func TestLatestWithSamples(t *testing.T) {
+       tests := []struct {
+               testFile       string
+               expectedOutput string
+       }{
+               {
+                       testFile:       "list-all-ruby",
+                       expectedOutput: "3.4.2",
+               },
+               {
+                       testFile:       "list-all-python",
+                       expectedOutput: "3.13.2t",
+               },
+               {
+                       testFile:       "list-all-elixir",
+                       expectedOutput: "1.18.2-otp-27",
+               },
+       }
+       for _, tt := range tests {
+               pluginName := "latest_test"
+               conf, _ := generateConfig(t)
+               pluginDir, err := repotest.InstallPlugin("dummy_legacy_plugin", 
conf.DataDir, pluginName)
+               assert.Nil(t, err)
+               versionsFilePath, err := filepath.Abs(filepath.Join("testdata", 
tt.testFile))
+               assert.Nil(t, err)
+               contents := "#!/usr/bin/env bash\ncat \"" + versionsFilePath + 
"\""
+               listAllPath := filepath.Join(pluginDir, "bin", "list-all")
+               err = os.WriteFile(listAllPath, []byte(contents), 0o777)
+               assert.Nil(t, err)
+
+               plugin := plugins.New(conf, pluginName)
+               version, err := Latest(plugin, "")
+               assert.Nil(t, err)
+               assert.Equal(t, tt.expectedOutput, version)
+       }
+}
+
 func TestAllVersions(t *testing.T) {
        pluginName := "list-all-test"
        conf, _ := generateConfig(t)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/test/non_existent_command.bats 
new/asdf-0.16.5/test/non_existent_command.bats
--- old/asdf-0.16.4/test/non_existent_command.bats      1970-01-01 
01:00:00.000000000 +0100
+++ new/asdf-0.16.5/test/non_existent_command.bats      2025-03-04 
15:00:54.000000000 +0100
@@ -0,0 +1,24 @@
+#!/usr/bin/env bats
+
+load test_helpers
+
+setup() {
+  setup_asdf_dir
+
+  PROJECT_DIR="$HOME/project"
+  mkdir -p "$PROJECT_DIR"
+}
+
+@test "should show help when no valid command is provided" {
+  cd "$PROJECT_DIR"
+
+  run asdf non-existent-command
+
+  [ "$status" -eq 1 ]
+  [[ $output == 'invalid command provided:'* ]]
+  [[ $output == *$'version: v'* ]]
+  [[ $output == *$'MANAGE PLUGINS\n'* ]]
+  [[ $output == *$'MANAGE TOOLS\n'* ]]
+  [[ $output == *$'UTILS\n'* ]]
+  [[ $output == *$'"Late but latest"\n-- Rajinikanth' ]]
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asdf-0.16.4/test/plugin_extension_command.bats 
new/asdf-0.16.5/test/plugin_extension_command.bats
--- old/asdf-0.16.4/test/plugin_extension_command.bats  2025-02-22 
13:44:42.000000000 +0100
+++ new/asdf-0.16.5/test/plugin_extension_command.bats  2025-03-04 
15:00:54.000000000 +0100
@@ -116,3 +116,22 @@
   [ "$status" -eq 0 ]
   [ "$output" = "$expected" ]
 }
+
+@test "asdf execute plugin default command unsets ASDF_INSTALL_TYPE 
ASDF_INSTALL_VERSION and ASDF_INSTALL_PATH env variables" {
+  export ASDF_INSTALL_VERSION=1.2.3
+  export ASDF_INSTALL_TYPE=version
+  export ASDF_INSTALL_PATH=/somewhere
+
+  plugin_path="$(get_plugin_path dummy)"
+
+  # this plugin defines a new `asdf dummy` command
+  cat <<'EOF' >"$plugin_path/lib/commands/command"
+#!/usr/bin/env bash
+/usr/bin/env
+EOF
+  chmod +x "$plugin_path/lib/commands/command"
+
+  run asdf cmd dummy
+  [ "$status" -eq 0 ]
+  [ "0" -eq "$(echo "$output" | grep -c "ASDF_INSTALL_")" ]
+}

++++++ asdf.obsinfo ++++++
--- /var/tmp/diff_new_pack.ki9xmk/_old  2025-03-04 20:33:40.413626321 +0100
+++ /var/tmp/diff_new_pack.ki9xmk/_new  2025-03-04 20:33:40.413626321 +0100
@@ -1,5 +1,5 @@
 name: asdf
-version: 0.16.4
-mtime: 1740228282
-commit: 4b9297b82df5a59fcce7f80bf8d92f8f8b07e38d
+version: 0.16.5
+mtime: 1741096854
+commit: 7352bf4890143184ba419392ca5e6204167c8306
 

++++++ vendor.tar.gz ++++++

Reply via email to