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 ++++++
