├── web ├── .gitignore ├── vendor-hash ├── use_nix_tools.sh ├── go.mod ├── main.go └── go.sum ├── .envrc ├── docs ├── getting-started │ ├── cli-help.ansi.bash │ ├── emacs-all.ansi.bash │ ├── cargo-star.ansi.bash │ ├── emacs-local.ansi.bash │ ├── bin-cargo-star.ansi.bash │ ├── emacsclient-one.ansi.bash │ ├── find-ruby-program.ansi.bash │ ├── emacs-27-29-all.ansi.bash │ ├── emacs-27-29-one.ansi.bash │ ├── leanify-regexp-all.ansi.bash │ ├── versions-backends-lazamar.ansi.bash │ ├── emacs-27-29.ansi.bash │ ├── lazamar-channels.ansi.bash │ ├── find-gleam-program.ansi.bash │ ├── emacs-all-backends.ansi.bash │ ├── cli-help.md │ ├── nix-search-cli-pip.ansi.html │ ├── emacs-local.ansi.html │ ├── emacs-27-29-one.ansi.html │ ├── versions-backends-lazamar.ansi.html │ ├── leanify-regexp-all.ansi.html │ ├── lazamar-channels.ansi.html │ ├── find-gleam-program.ansi.html │ ├── installing.md │ ├── emacs-27-29.ansi.html │ ├── emacsclient-one.ansi.html │ ├── emacs-all-backends.ansi.html │ ├── cli-help.ansi.html │ ├── emacs-27-29-all.ansi.html │ ├── emacs-all.ansi.html │ ├── cargo-star.ansi.html │ ├── bin-cargo-star.ansi.html │ ├── listing-versions.md │ ├── finding-packages.md │ └── find-ruby-program.ansi.html ├── vendor-hash ├── .gitignore ├── .vuepress │ ├── styles │ │ ├── config.scss │ │ └── index.scss │ └── config.js ├── flake-zip-cowsay-develop.ansi.html ├── package.json ├── patches │ └── sass-embedded+1.93.2.patch ├── non-flake-environments.md ├── installing-packages-on-profiles.md ├── README.md ├── flake-generator.md └── tools-version-manager.md ├── cli ├── vendor-hash ├── main.go ├── go.mod └── go.sum ├── nix ├── default.nix ├── treefmt.nix ├── web.bash ├── docs.bash ├── packages.nix └── devshell.nix ├── .tangled └── workflows │ └── mirror.yml ├── .github ├── workflows │ ├── test.yml │ ├── docs.yml │ └── web.yml └── FUNDING.yml ├── .gitignore ├── flake.nix ├── README.md ├── flake.lock └── LICENSE /web/.gitignore: -------------------------------------------------------------------------------- 1 | web 2 | vendor 3 | -------------------------------------------------------------------------------- /.envrc: -------------------------------------------------------------------------------- 1 | source_env_if_exists .envrc.private 2 | use flake 3 | -------------------------------------------------------------------------------- /docs/getting-started/cli-help.ansi.bash: -------------------------------------------------------------------------------- 1 | nix-versions --help 2 | -------------------------------------------------------------------------------- /docs/getting-started/emacs-all.ansi.bash: -------------------------------------------------------------------------------- 1 | nix-versions 'emacs@*' 2 | -------------------------------------------------------------------------------- /cli/vendor-hash: -------------------------------------------------------------------------------- 1 | sha256-+XvS0KPoXu9drXFvVFbqx9Yr6EfiVEYQN0Q0mP3I3hI= 2 | -------------------------------------------------------------------------------- /docs/getting-started/cargo-star.ansi.bash: -------------------------------------------------------------------------------- 1 | nix-versions 'cargo-*' --one -------------------------------------------------------------------------------- /docs/getting-started/emacs-local.ansi.bash: -------------------------------------------------------------------------------- 1 | nix-versions system:emacs 2 | -------------------------------------------------------------------------------- /docs/vendor-hash: -------------------------------------------------------------------------------- 1 | sha256-a7ve9oq7uZwfPtVFjY7bEExJShqigbZ10BndWa9f05I= 2 | -------------------------------------------------------------------------------- /web/vendor-hash: -------------------------------------------------------------------------------- 1 | sha256-Z87j9yYKe0AdxJMptanx8tii1eCIn6XpeFYOPlKO398= 2 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .temp 4 | cache 5 | .cache 6 | -------------------------------------------------------------------------------- /docs/getting-started/bin-cargo-star.ansi.bash: -------------------------------------------------------------------------------- 1 | nix-versions 'bin/cargo*' --one -------------------------------------------------------------------------------- /docs/getting-started/emacsclient-one.ansi.bash: -------------------------------------------------------------------------------- 1 | nix-versions bin/emacsclient@28 -------------------------------------------------------------------------------- /docs/getting-started/find-ruby-program.ansi.bash: -------------------------------------------------------------------------------- 1 | nix-versions bin/ruby 2 | -------------------------------------------------------------------------------- /docs/getting-started/emacs-27-29-all.ansi.bash: -------------------------------------------------------------------------------- 1 | nix-versions 'emacs@~27 || ~29' --all 2 | -------------------------------------------------------------------------------- /docs/getting-started/emacs-27-29-one.ansi.bash: -------------------------------------------------------------------------------- 1 | nix-versions 'emacs@~27 || ~29' --one 2 | -------------------------------------------------------------------------------- /docs/getting-started/leanify-regexp-all.ansi.bash: -------------------------------------------------------------------------------- 1 | nix-versions 'leanify@^\d+-12-\d+$' --all -------------------------------------------------------------------------------- /docs/getting-started/versions-backends-lazamar.ansi.bash: -------------------------------------------------------------------------------- 1 | nix-versions --lazamar emacs --one 2 | -------------------------------------------------------------------------------- /docs/getting-started/emacs-27-29.ansi.bash: -------------------------------------------------------------------------------- 1 | # show only emacs 27 and 29 release series. 2 | nix-versions 'emacs@~27 || ~29' 3 | -------------------------------------------------------------------------------- /docs/getting-started/lazamar-channels.ansi.bash: -------------------------------------------------------------------------------- 1 | nix-versions lazamar:nixos-21.05:emacs lazamar:nixos-23.05:emacs lazamar:emacs --one 2 | -------------------------------------------------------------------------------- /docs/getting-started/find-gleam-program.ansi.bash: -------------------------------------------------------------------------------- 1 | # Packages that provide a program named exactly `gleam` 2 | nix-versions bin/gleam@'>1.6' 3 | -------------------------------------------------------------------------------- /docs/getting-started/emacs-all-backends.ansi.bash: -------------------------------------------------------------------------------- 1 | nix-versions --one system:emacs emacs nixhub:emacs lazamar:emacs lazamar:nixos-23.05:emacs history:emacs -------------------------------------------------------------------------------- /docs/.vuepress/styles/config.scss: -------------------------------------------------------------------------------- 1 | 2 | 3 | $theme-color: rebeccapurple; 4 | 5 | $theme-colors: #2196f3, #f26d6d, #3eaf7c, #fb9b5f; 6 | 7 | // $code-color: #f1eff8; 8 | // $code-bg-color: rgb(242, 242, 242); 9 | -------------------------------------------------------------------------------- /nix/default.nix: -------------------------------------------------------------------------------- 1 | inputs: 2 | inputs.flake-parts.lib.mkFlake { inherit inputs; } { 3 | systems = import inputs.systems; 4 | imports = [ 5 | ./packages.nix 6 | ./treefmt.nix 7 | ./devshell.nix 8 | ]; 9 | } 10 | -------------------------------------------------------------------------------- /docs/getting-started/cli-help.md: -------------------------------------------------------------------------------- 1 | --- 2 | order: -1 3 | --- 4 | # CLI Options 5 | 6 | ```shell 7 | 8 | ``` 9 |
10 | 
11 | 
12 | 13 | -------------------------------------------------------------------------------- /.tangled/workflows/mirror.yml: -------------------------------------------------------------------------------- 1 | when: 2 | - event: ["push"] 3 | branch: ["*"] 4 | engine: "nixery" 5 | clone: 6 | skip: true 7 | dependencies: 8 | nixpkgs: 9 | - gh 10 | steps: 11 | - name: mirror 12 | command: gh -R vic/vic issue comment 3 -b nix-versions 13 | -------------------------------------------------------------------------------- /docs/.vuepress/styles/index.scss: -------------------------------------------------------------------------------- 1 | .vp-feature { 2 | text-wrap: balance; 3 | } 4 | 5 | .ansi-to-html { 6 | background-color: rgb(59, 32, 85); 7 | color: #f1eff8; 8 | padding: 15px; 9 | border-radius: 5px; 10 | font-family: var(--vp-font-mono); 11 | font-size: var(--code-font-size); 12 | overflow-x: scroll; 13 | } 14 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | on: 2 | pull_request: 3 | push: 4 | branches: [main] 5 | jobs: 6 | flake-check: 7 | name: nix flake check 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v4 11 | - uses: cachix/install-nix-action@v30 12 | - run: nix flake check 13 | - run: nix run . -- --help 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Devenv 2 | .devenv* 3 | devenv.local.nix 4 | 5 | # Use this for your local environment. 6 | .envrc.private 7 | 8 | # direnv 9 | .direnv 10 | 11 | # pre-commit 12 | .pre-commit-config.yaml 13 | 14 | # executable 15 | nix-versions 16 | result 17 | 18 | # go 19 | vendor 20 | nix-versions 21 | REVISION 22 | 23 | .nix-versions 24 | foo 25 | chale 26 | -------------------------------------------------------------------------------- /docs/getting-started/nix-search-cli-pip.ansi.html: -------------------------------------------------------------------------------- 1 | python313Packages.pip @ 25.0.1 : pip pip3 2 | python312Packages.pip @ 25.0.1 : pip pip3 3 | pipx @ 1.7.1 : pipx 4 | -------------------------------------------------------------------------------- /docs/flake-zip-cowsay-develop.ansi.html: -------------------------------------------------------------------------------- 1 | 🔨 Welcome to devshell 2 | 3 | [[general commands]] 4 | 5 | cowsay - Program which generates ASCII pictures of a cow with a message 6 | go - Go Programming language 7 | menu - prints this menu 8 | 9 | [devshell]$ go version 10 | go version go1.24.1 linux/amd64 11 | 12 | [devshell]$ 13 | -------------------------------------------------------------------------------- /docs/getting-started/emacs-local.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | emacs 30.1 nixpkgs#emacs system 3 | 4 | -------------------------------------------------------------------------------- /nix/treefmt.nix: -------------------------------------------------------------------------------- 1 | { inputs, ... }: 2 | { 3 | imports = [ inputs.treefmt-nix.flakeModule ]; 4 | perSystem.treefmt = { 5 | projectRootFile = "flake.nix"; 6 | programs.nixfmt.enable = true; 7 | programs.nixfmt.excludes = [ ".direnv" ]; 8 | programs.deadnix.enable = true; 9 | programs.mdformat.enable = true; 10 | programs.mdformat.excludes = [ "docs/**" ]; 11 | programs.yamlfmt.enable = true; 12 | programs.gofmt.enable = true; 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /.github/workflows/docs.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: [main] 4 | paths: ["docs/**"] 5 | jobs: 6 | docs: 7 | name: docs 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v4 11 | - uses: cachix/install-nix-action@v30 12 | - name: docs 13 | env: 14 | WEB_ADMIN_DEPLOY_KEY: ${{secrets.WEB_ADMIN_DEPLOY_KEY}} 15 | WEB_ADMIN_HOST: ${{secrets.WEB_ADMIN_HOST}} 16 | run: nix run .#deploy-docs 17 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | outputs = inputs: import ./nix inputs; 3 | inputs = { 4 | nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; 5 | systems.url = "github:nix-systems/default"; 6 | treefmt-nix.url = "github:numtide/treefmt-nix"; 7 | treefmt-nix.inputs.nixpkgs.follows = "nixpkgs"; 8 | flake-parts.url = "github:hercules-ci/flake-parts"; 9 | devshell.url = "github:numtide/devshell"; 10 | devshell.inputs.nixpkgs.follows = "nixpkgs"; 11 | }; 12 | } 13 | -------------------------------------------------------------------------------- /cli/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "log" 5 | "os" 6 | "os/exec" 7 | 8 | list "github.com/vic/ntv/packages/app/list" 9 | ) 10 | 11 | func main() { 12 | args, err := list.Help.ParseAndRun(os.Args) 13 | if err == nil { 14 | err = list.NewListArgs().ParseAndRun(args) 15 | } 16 | if err != nil { 17 | if ee, ok := err.(*exec.ExitError); ok { 18 | log.Fatal(string(ee.Stderr)) 19 | os.Exit(ee.ExitCode()) 20 | } 21 | log.Fatal(err) 22 | os.Exit(2) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /docs/getting-started/emacs-27-29-one.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | emacs 29.4 nixpkgs/b58e19b#emacs nixhub 3 | 4 | -------------------------------------------------------------------------------- /docs/getting-started/versions-backends-lazamar.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | emacs 30.0.93 nixpkgs/21808d2#emacs30 lazamar:nixpkgs-unstable 3 | 4 | -------------------------------------------------------------------------------- /nix/web.bash: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -e -a -u -o pipefail 3 | 4 | # Only run on CI 5 | if [ -z "${CI:-}" ]; then 6 | echo "This script is meant to be run on CI only" 7 | exit 1 8 | fi 9 | 10 | mkdir -p $HOME/.ssh 11 | echo "StrictHostKeyChecking no" >>$HOME/.ssh/config 12 | ssh-add <(echo "$WEB_ADMIN_DEPLOY_KEY") 2>&1 >/dev/null 13 | scp "$WEB/bin/web" "$WEB_ADMIN_HOST":"~/new" 14 | ssh "$WEB_ADMIN_HOST" -C "mv ~/new ~/web" 15 | sleep 3 16 | curl --basic --user "$WEB_ADMIN_API_KEY account=nix-versions:" -X POST "$WEB_ADMIN_API_URL" 17 | -------------------------------------------------------------------------------- /nix/docs.bash: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -e -a -u -o pipefail 3 | 4 | # Only run on CI 5 | if [ -z "${CI:-}" ]; then 6 | echo "This script is meant to be run on CI only" 7 | exit 1 8 | fi 9 | 10 | mkdir -p "$HOME"/.ssh 11 | echo "StrictHostKeyChecking no" >> "$HOME"/.ssh/config 12 | 13 | # Until we fix the nix builder, since esbuild hangs on the sandbox. 14 | DOCS="$PWD/docs/.vuepress/dist" 15 | rm -rf "$DOCS" 16 | cd docs 17 | npm ci 18 | npm run build 19 | 20 | ssh-add <(echo "$WEB_ADMIN_DEPLOY_KEY") 2>&1>/dev/null 21 | rsync -avPz -e ssh --delete "$DOCS"/* "$WEB_ADMIN_HOST":"~/www" 22 | -------------------------------------------------------------------------------- /.github/workflows/web.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: [main] 4 | paths: ["web/**"] 5 | jobs: 6 | web: 7 | name: web 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v4 11 | - uses: cachix/install-nix-action@v30 12 | - name: web 13 | env: 14 | WEB_ADMIN_DEPLOY_KEY: ${{secrets.WEB_ADMIN_DEPLOY_KEY}} 15 | WEB_ADMIN_API_KEY: ${{secrets.WEB_ADMIN_API_KEY}} 16 | WEB_ADMIN_API_URL: ${{secrets.WEB_ADMIN_API_URL}} 17 | WEB_ADMIN_HOST: ${{secrets.WEB_ADMIN_HOST}} 18 | run: nix run .#deploy-web 19 | -------------------------------------------------------------------------------- /web/use_nix_tools.sh: -------------------------------------------------------------------------------- 1 | # -*- mode: sh -*- 2 | # shellcheck shell=bash 3 | 4 | use_nix_installables() { 5 | direnv_load nix shell "${@}" -c $direnv dump 6 | } 7 | 8 | use_nix_tools() { 9 | declare -a args 10 | if test -z "${1:-}"; then 11 | watch_file "$PWD/.nix_tools" 12 | args+=("--read" "$PWD/.nix_tools") 13 | fi 14 | while test -n "$1"; do 15 | if test -f "$1"; then 16 | watch_file "$1" 17 | args+=("--read" $1) 18 | else 19 | args+=("$1") 20 | fi 21 | shift 22 | done 23 | use_nix_installables $(nix-versions --installable "${args[@]}") 24 | } 25 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nix-versions", 3 | "description": "Install any version of nixpkgs", 4 | "version": "0.0.1", 5 | "license": "Apache-2.0", 6 | "type": "module", 7 | "scripts": { 8 | "postinstall": "patch-package", 9 | "build": "vuepress build .", 10 | "clean-dev": "vuepress dev . --clean-cache", 11 | "dev": "vuepress dev .", 12 | "update-package": "npx vp-update" 13 | }, 14 | "devDependencies": { 15 | "@vuepress/bundler-vite": "2.0.0-rc.24", 16 | "esbuild": "^0.25.2", 17 | "patch-package": "^8.0.0", 18 | "sass-embedded": "^1.86.0", 19 | "sass-loader": "^16.0.5", 20 | "vue": "^3.5.21", 21 | "vuepress": "2.0.0-rc.24", 22 | "vuepress-theme-hope": "2.0.0-rc.94" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /docs/patches/sass-embedded+1.93.2.patch: -------------------------------------------------------------------------------- 1 | diff --git a/node_modules/sass-embedded/dist/lib/src/compiler-path.js b/node_modules/sass-embedded/dist/lib/src/compiler-path.js 2 | index 07dbb00..a5096cb 100644 3 | --- a/node_modules/sass-embedded/dist/lib/src/compiler-path.js 4 | +++ b/node_modules/sass-embedded/dist/lib/src/compiler-path.js 5 | @@ -8,6 +8,10 @@ const p = require("path"); 6 | const compiler_module_1 = require("./compiler-module"); 7 | /** The full command for the embedded compiler executable. */ 8 | exports.compilerCommand = (() => { 9 | + const binPath = process.env.SASS_EMBEDDED_BIN_PATH; 10 | + if (binPath) { 11 | + return [binPath]; 12 | + } 13 | try { 14 | return [ 15 | require.resolve(`${compiler_module_1.compilerModule}/dart-sass/src/dart` + 16 | -------------------------------------------------------------------------------- /docs/non-flake-environments.md: -------------------------------------------------------------------------------- 1 | --- 2 | order: -1 3 | --- 4 | 5 | # Compatibility with non-flakes 6 | 7 | We also provide a couple of experimental endpoints, `default.{nix,zip}`. 8 | 9 | They are intended for usage on non-flake environments. 10 | 11 | ```shell 12 | curl https://nix-versions.oeiuwq.com/default.nix/ruby@latest -o default.nix 13 | 14 | nix-shell https://nix-versions.oeiuwq.com/default.zip/ruby@latest -A devShell 15 | ``` 16 | The reason we mention them as *experimental* is because generating a `default.nix` file 17 | requires our server to download and generate a sri-checksum for fetching each tools' 18 | nixpkgs with `fetchurl`. Doing so can consume resources (time&network) on our server. 19 | And given that many people is moving to using flakes, we are marking non-flakes features 20 | as _experimental_ :). 21 | 22 | 23 | -------------------------------------------------------------------------------- /docs/.vuepress/config.js: -------------------------------------------------------------------------------- 1 | import { hopeTheme} from "vuepress-theme-hope"; 2 | import { defineUserConfig } from 'vuepress' 3 | import { viteBundler } from '@vuepress/bundler-vite' 4 | 5 | export default defineUserConfig({ 6 | lang: 'en-US', 7 | 8 | title: '> nix-versions', 9 | description: 'Any version of 200_000+ nix packages at your fingerprints.', 10 | 11 | theme: hopeTheme({ 12 | // logo: 'https://github.com/user-attachments/assets/307fd2a5-7bf5-45bc-8436-ce6fec1f914a', 13 | navbar: ['/', '/getting-started/listing-versions.html', '/tools-version-manager.html', '/flake-generator.html'], 14 | outline: [1, 2, 3], 15 | pagePatterns: ["**/*.md", "!**/*.snippet.md", "!**/*.ansi.html", "!.vuepress", "!node_modules"], 16 | markdown: { 17 | include: true, 18 | }, 19 | }), 20 | 21 | bundler: viteBundler(), 22 | }) 23 | -------------------------------------------------------------------------------- /docs/getting-started/leanify-regexp-all.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | leanify 2022-12-04 nixpkgs/10b8130#leanify nixhub 3 | leanify 2023-10-19 nixpkgs/92d295f#leanify nixhub 4 | leanify 2023-12-17 nixpkgs/0d53485#leanify nixhub 5 | 6 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 3 | patreon: # Replace with a single Patreon username 4 | open_collective: # Replace with a single Open Collective username 5 | ko_fi: oeiuwq # Replace with a single Ko-fi username 6 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 7 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 8 | liberapay: # Replace with a single Liberapay username 9 | issuehunt: # Replace with a single IssueHunt username 10 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 11 | polar: # Replace with a single Polar username 12 | buy_me_a_coffee: # Replace with a single Buy Me a Coffee username 13 | thanks_dev: # Replace with a single thanks.dev username 14 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 15 | -------------------------------------------------------------------------------- /docs/getting-started/lazamar-channels.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | emacs 27.2 nixpkgs/903b8cc#emacs lazamar:nixos-21.05 3 | emacs 29.1 nixpkgs/157de78#emacs29 lazamar:nixos-23.05 4 | emacs 30.0.93 nixpkgs/21808d2#emacs30 lazamar:nixpkgs-unstable 5 | 6 | -------------------------------------------------------------------------------- /cli/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/vic/nix-versions 2 | 3 | go 1.24.1 4 | 5 | require github.com/vic/ntv v1.0.1 6 | 7 | require ( 8 | github.com/Masterminds/semver/v3 v3.4.0 // indirect 9 | github.com/antchfx/htmlquery v1.3.4 // indirect 10 | github.com/antchfx/xpath v1.3.5 // indirect 11 | github.com/carlmjohnson/requests v0.25.1 // indirect 12 | github.com/fatih/color v1.18.0 // indirect 13 | github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect 14 | github.com/hashicorp/go-cleanhttp v0.5.2 // indirect 15 | github.com/hashicorp/go-retryablehttp v0.7.8 // indirect 16 | github.com/jessevdk/go-flags v1.6.1 // indirect 17 | github.com/mattn/go-colorable v0.1.14 // indirect 18 | github.com/mattn/go-isatty v0.0.20 // indirect 19 | github.com/peterldowns/nix-search-cli v0.3.0 // indirect 20 | github.com/rodaine/table v1.3.0 // indirect 21 | golang.org/x/net v0.44.0 // indirect 22 | golang.org/x/sync v0.17.0 // indirect 23 | golang.org/x/sys v0.36.0 // indirect 24 | golang.org/x/text v0.29.0 // indirect 25 | ) 26 | -------------------------------------------------------------------------------- /web/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/vic/nix-versions/web 2 | 3 | go 1.24.1 4 | 5 | require ( 6 | github.com/vic/ntv v1.0.1 7 | golang.org/x/sync v0.17.0 8 | ) 9 | 10 | require ( 11 | github.com/Masterminds/semver/v3 v3.4.0 // indirect 12 | github.com/antchfx/htmlquery v1.3.4 // indirect 13 | github.com/antchfx/xpath v1.3.5 // indirect 14 | github.com/carlmjohnson/requests v0.25.1 // indirect 15 | github.com/fatih/color v1.18.0 // indirect 16 | github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect 17 | github.com/hashicorp/go-cleanhttp v0.5.2 // indirect 18 | github.com/hashicorp/go-retryablehttp v0.7.8 // indirect 19 | github.com/jessevdk/go-flags v1.6.1 // indirect 20 | github.com/mattn/go-colorable v0.1.14 // indirect 21 | github.com/mattn/go-isatty v0.0.20 // indirect 22 | github.com/peterldowns/nix-search-cli v0.3.0 // indirect 23 | github.com/rodaine/table v1.3.0 // indirect 24 | golang.org/x/net v0.44.0 // indirect 25 | golang.org/x/sys v0.36.0 // indirect 26 | golang.org/x/text v0.29.0 // indirect 27 | ) 28 | -------------------------------------------------------------------------------- /docs/installing-packages-on-profiles.md: -------------------------------------------------------------------------------- 1 | --- 2 | order: -3 3 | --- 4 | 5 | # Installing packages 6 | 7 | As shown in the previous section, you can produce a list of Nix installables by using the `--installable` [option](getting-started/cli-help.html). 8 | 9 | Not only you can feed that list into `nix shell` but also to any other nix-cli like `nix profile install`. 10 | Allowing you to install a set of tools into a directory of your choose along with all its dependencies in just one command. 11 | 12 | 13 | The following example will install `cargo` and `glibc`. Notice that for packages providing many outputs (like glibc `static`, and `dev` headers) 14 | you can specify [output selectors](https://nix.dev/manual/nix/2.18/command-ref/new-cli/nix.html?highlight=installable#derivation-output-selection). 15 | 16 | 17 | ```shell 18 | > mkdir tmp 19 | > nix profile install --profile $PWD/tmp/my-tools $(nix-versions -i cargo@latest glibc^static,dev@latest) 20 | > export PATH=$PWD/tmp/my-tools/bin:$PATH 21 | > which cargo 22 | /home/foo/tmp/my-tools/bin/cargo 23 | ``` 24 | -------------------------------------------------------------------------------- /docs/getting-started/find-gleam-program.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | gleam 1.7.0 nixpkgs/e8d0b02#gleam nixhub 3 | gleam 1.8.0 nixpkgs/fa35a3c#gleam nixhub 4 | gleam 1.8.1 nixpkgs/ed0b188#gleam nixhub 5 | gleam 1.9.1 nixpkgs/bfa9810#gleam nixhub 6 | 7 | -------------------------------------------------------------------------------- /docs/getting-started/installing.md: -------------------------------------------------------------------------------- 1 | --- 2 | order: 1 3 | --- 4 | 5 | # All you need is Nix 6 | 7 | Since you will be installing packages from the [nixpkgs repository](https://github.com/nixos/nixpkgs), 8 | the only requirement is to have the `nix` command on your system. 9 | 10 | If you are running on a [NixOS System](https://nixos.org/download/) you are all set. 11 | 12 | Otherwise you can install it on any Linux, MacOS, Windows-WSL2. We recommend either the [Lix](https://git.lix.systems/lix-project/lix-installer) or [Determinate](https://github.com/DeterminateSystems/nix-installer) nix installers. 13 | 14 | ## Running `nix-versions` directly. 15 | 16 | Just run this command and skip all of this section. 17 | 18 | ```shell 19 | nix run github:vic/nix-versions 20 | ``` 21 | 22 | ::: note Enabling Nix Flakes and the Modern Nix command. 23 | If this is your first time using nix, it's possible that you might need to enable: 24 | `--extra-experimental-features 'flakes nix-command'` 25 | at the command line or [enable those features at your nix.conf file](https://www.tweag.io/blog/2020-05-25-flakes/#trying-out-flakes) 26 | ::: 27 | 28 | ## Installing on your system. 29 | 30 | If you want to avoid typing `nix run` everytime, you might consider 31 | installing `nix-versions` on your profile. 32 | 33 | ```shell 34 | nix profile install github:vic/nix-versions 35 | nix-versions --help 36 | ``` 37 | 38 | -------------------------------------------------------------------------------- /docs/getting-started/emacs-27-29.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | emacs 27.1 nixpkgs/54c1e44#emacs nixhub 3 | emacs 27.2 nixpkgs/4c3c80d#emacs nixhub 4 | emacs 29.1 nixpkgs/160b762#emacs nixhub 5 | emacs 29.2 nixpkgs/a3ed740#emacs nixhub 6 | emacs 29.3 nixpkgs/a985888#emacs nixhub 7 | emacs 29.4 nixpkgs/b58e19b#emacs nixhub 8 | 9 | -------------------------------------------------------------------------------- /docs/getting-started/emacsclient-one.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | emacs-nox 28.1 nixpkgs/994df04#emacs-nox nixhub 3 | emacs-nox 28.2 nixpkgs/09ec6a0#emacs-nox nixhub 4 | emacs-gtk 28.1 nixpkgs/994df04#emacs-gtk nixhub 5 | emacs-gtk 28.2 nixpkgs/09ec6a0#emacs-gtk nixhub 6 | emacs 28.1 nixpkgs/994df04#emacs nixhub 7 | emacs 28.2 nixpkgs/09ec6a0#emacs nixhub 8 | 9 | -------------------------------------------------------------------------------- /docs/getting-started/emacs-all-backends.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | emacs 30.1 nixpkgs#emacs system 3 | emacs 30.1 nixpkgs/0740f6f#emacs nixhub 4 | emacs 30.1 nixpkgs/0740f6f#emacs nixhub 5 | emacs 30.0.93 nixpkgs/21808d2#emacs30 lazamar:nixpkgs-unstable 6 | emacs 29.1 nixpkgs/157de78#emacs29 lazamar:nixos-23.05 7 | emacs 29.4 nixpkgs/83c6601#emacs history 8 | 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `nix-versions` - All versions of nixpkgs at your fingerprints. 2 | 3 | `nix-versions` is a CLI tool that can help you [find the nixpkgs revision for historical versions of a package](https://nix-versions.oeiuwq.com/getting-started/listing-versions.html). 4 | 5 | It does so by integrating the following services available to the nix ecosystem: 6 | 7 | - https://search.nixos.org (via the [nix-search-cli](https://github.com/peterldowns/nix-search-cli) elastic-search client). Used to search packages by program name or attribute name wildcards. 8 | 9 | - https://nixhub.io - as default backend for package version resolution. 10 | 11 | - https://lazamar.co.uk/nix-versions/ - search package versions by nixpkgs channel. 12 | 13 | - https://history.nix-packages.con - another community provided versions index. 14 | 15 | Any of these backends can be selected as default or combined on a per-package basis. 16 | 17 | It also features [version constraint](https://github.com/Masterminds/semver?tab=readme-ov-file#hyphen-range-comparisons) filters, allowing you to restrict packages to a known set of compatible/stable versions that work with you. 18 | 19 | When used in conjuction with `nix shell` and `direnv`, `nix-versions`, it can also double as a plain-text [development shell and tools version manager with automatic environment loading](https://nix-versions.oeiuwq.com/tools-version-manager.html) targeting people new to nix, but familiar with tools like npm, rvm, asdf, mise. 20 | 21 | Our website provides a flakes generator for version-pinned packages. You can use these generated flakes as inputs on your own flakes, [allowing version constrained package updates](https://nix-versions.oeiuwq.com/flake-generator.html). 22 | 23 | Read more at our [website](https://nix-versions.oeiuwq.com/) 24 | 25 | ### https://nix-versions.oeiuwq.com 26 | -------------------------------------------------------------------------------- /docs/getting-started/cli-help.ansi.html: -------------------------------------------------------------------------------- 1 | NAME 2 | 3 | nix-versions - List Nix packages versions. 4 | 5 | SYNOPSIS 6 | 7 | nix-versions [<options>] <package-spec>... 8 | 9 | DESCRIPTION 10 | 11 | List available package versions. 12 | 13 | See https://nix-versions.oeiuwq.com for a complete guide. 14 | 15 | OPTIONS 16 | 17 | --help -h Print this help and exit. 18 | 19 | --read -r FILE Package specs are read from FILE. 20 | 21 | SEARCH BACKEND 22 | 23 | --nixhub Will default to https://nixhub.io for version search. 24 | 25 | --history Will default to https://history.nix-packages.com for version search. 26 | 27 | --lazamar Will default to https://lazamar.co.uk/nix-versions/. 28 | 29 | --channel CHAN Use CHAN as when searching with Lazamar. 30 | Default is `nixpkgs-unstable`. 31 | 32 | OUTPUT FORMAT 33 | 34 | --json -j Output a JSON array of resolved packages. 35 | 36 | --text -t Output as a text table. [default] 37 | 38 | --installable -i Print as a list of Nix installables. 39 | 40 | --flake -f Generate a flake. See also: `ntv init` 41 | 42 | TEXT OUTPUT OPTIONS 43 | 44 | --color -C Use colors on text table to highlight selected versions. 45 | 46 | --all -a Show all versions even those not matching a constraint 47 | 48 | --one -1 Show only the latest version matching a constraint. 49 | 50 | 51 | NTV 52 | 53 | `nix-versions` is part of the [ntv](https://github.com/vic/ntv) suite, 54 | Made with Love(tm) by [vic](https://x.com/oeiuwq). 55 | -------------------------------------------------------------------------------- /docs/getting-started/emacs-27-29-all.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | emacs 26.3 nixpkgs/e5b91d9#emacs nixhub 3 | emacs 27.1 nixpkgs/54c1e44#emacs nixhub 4 | emacs 27.2 nixpkgs/4c3c80d#emacs nixhub 5 | emacs 28.1 nixpkgs/994df04#emacs nixhub 6 | emacs 28.2 nixpkgs/09ec6a0#emacs nixhub 7 | emacs 29.1 nixpkgs/160b762#emacs nixhub 8 | emacs 29.2 nixpkgs/a3ed740#emacs nixhub 9 | emacs 29.3 nixpkgs/a985888#emacs nixhub 10 | emacs 29.4 nixpkgs/b58e19b#emacs nixhub 11 | emacs 30.1 nixpkgs/0740f6f#emacs nixhub 12 | 13 | -------------------------------------------------------------------------------- /docs/getting-started/emacs-all.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | emacs 26.3 nixpkgs/e5b91d9#emacs nixhub 3 | emacs 27.1 nixpkgs/54c1e44#emacs nixhub 4 | emacs 27.2 nixpkgs/4c3c80d#emacs nixhub 5 | emacs 28.1 nixpkgs/994df04#emacs nixhub 6 | emacs 28.2 nixpkgs/09ec6a0#emacs nixhub 7 | emacs 29.1 nixpkgs/160b762#emacs nixhub 8 | emacs 29.2 nixpkgs/a3ed740#emacs nixhub 9 | emacs 29.3 nixpkgs/a985888#emacs nixhub 10 | emacs 29.4 nixpkgs/b58e19b#emacs nixhub 11 | emacs 30.1 nixpkgs/0740f6f#emacs nixhub 12 | 13 | -------------------------------------------------------------------------------- /docs/getting-started/cargo-star.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | cargo-zigbuild 0.19.8 nixpkgs/0d53485#cargo-zigbuild nixhub 3 | cargo-xwin 0.18.4 nixpkgs/0d53485#cargo-xwin nixhub 4 | cargo-xbuild 0.6.6 nixpkgs/0d53485#cargo-xbuild nixhub 5 | cargo-workspaces 0.3.6 nixpkgs/0d53485#cargo-workspaces nixhub 6 | cargo-wizard 0.2.2 nixpkgs/0d53485#cargo-wizard nixhub 7 | cargo-wipe 0.3.3 nixpkgs/0d53485#cargo-wipe nixhub 8 | cargo-whatfeatures 0.9.13 nixpkgs/0d53485#cargo-whatfeatures nixhub 9 | cargo-watch 8.5.3 nixpkgs/0d53485#cargo-watch nixhub 10 | cargo-wasi 0.1.28 nixpkgs/0d53485#cargo-wasi nixhub 11 | cargo-vibe 2022-12-29 nixpkgs/0d53485#cargo-vibe nixhub 12 | 13 | -------------------------------------------------------------------------------- /docs/getting-started/bin-cargo-star.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | steel 0.6.0-unstable-2025-03-17 nixpkgs/44e422b#steel nixhub 3 | sqlx-cli 0.8.3 nixpkgs/0d53485#sqlx-cli nixhub 4 | solana-cli 1.18.26 nixpkgs/573c650#solana-cli nixhub 5 | rustup 1.27.1 nixpkgs/0d53485#rustup nixhub 6 | rustfmt 1.85.0 nixpkgs/0d53485#rustfmt nixhub 7 | probe-rs-tools 0.27.0 nixpkgs/0d53485#probe-rs-tools nixhub 8 | espflash 3.3.0 nixpkgs/0d53485#espflash nixhub 9 | clippy 1.85.0 nixpkgs/0d53485#clippy nixhub 10 | cargonode 0.1.3 nixpkgs/0d53485#cargonode nixhub 11 | cargo2junit 0.1.13 nixpkgs/0d53485#cargo2junit nixhub 12 | 13 | -------------------------------------------------------------------------------- /nix/packages.nix: -------------------------------------------------------------------------------- 1 | { 2 | perSystem = 3 | { pkgs, ... }: 4 | let 5 | 6 | nix-versions = pkgs.buildGoModule { 7 | pname = "nix-versions"; 8 | src = ./../cli; 9 | version = "1.0.1"; 10 | vendorHash = builtins.readFile ./../cli/vendor-hash; 11 | meta = with pkgs.lib; { 12 | description = "Go CLI for searching nix packages versions using lazamar or nixhub"; 13 | homepage = "https://nix-versions.oeiuwq.com"; 14 | mainProgram = "nix-versions"; 15 | }; 16 | }; 17 | 18 | # Fix me, esbuild hangs, dunno why. 19 | docs = pkgs.buildNpmPackage { 20 | name = "nix-versions-site"; 21 | src = ./../docs; 22 | npmDepsHash = builtins.readFile ./../docs/vendor-hash; 23 | buildPhase = '' 24 | export SASS_EMBEDDED_BIN_PATH="${pkgs.dart-sass}/bin/sass" 25 | mkdir -p $HOME/{temp,cache} 26 | npm run build -- --debug --clean-cache --clean-temp --temp $HOME/temp --cache $HOME/cache --dest $out 27 | ''; 28 | dontInstall = true; 29 | meta = with pkgs.lib; { 30 | description = "Site for docs and flake generation services."; 31 | homepage = "https://nix-versions.oeiuwq.com"; 32 | }; 33 | }; 34 | 35 | web = pkgs.buildGoModule { 36 | pname = "nix-versions-web"; 37 | src = ./../web; 38 | version = "1.0.1"; 39 | vendorHash = builtins.readFile ./../web/vendor-hash; 40 | env.CGO_ENABLED = 0; # static build 41 | meta = with pkgs.lib; { 42 | description = "Web UI for docs and flake generation services."; 43 | homepage = "https://nix-versions.oeiuwq.com"; 44 | mainProgram = "web"; 45 | }; 46 | }; 47 | 48 | deploy-docs = pkgs.writeShellApplication { 49 | name = "deploy-docs"; 50 | meta.description = "Deploy docs"; 51 | runtimeInputs = with pkgs; [ 52 | nodejs 53 | rsync 54 | openssh 55 | ]; 56 | #runtimeEnv.DOCS = docs; 57 | text = '' 58 | ${pkgs.openssh}/bin/ssh-agent ${pkgs.bash}/bin/bash ${./docs.bash} 59 | ''; 60 | }; 61 | 62 | deploy-web = pkgs.writeShellApplication { 63 | name = "deploy-web"; 64 | meta.description = "Deploy web"; 65 | runtimeInputs = with pkgs; [ 66 | curl 67 | openssh 68 | ]; 69 | runtimeEnv.WEB = web; 70 | text = '' 71 | ${pkgs.openssh}/bin/ssh-agent ${pkgs.bash}/bin/bash ${./web.bash} 72 | ''; 73 | }; 74 | 75 | in 76 | { 77 | 78 | packages = { 79 | default = nix-versions; 80 | nix-versions-web = web; 81 | nix-versions-docs = docs; 82 | 83 | inherit 84 | nix-versions 85 | deploy-docs 86 | deploy-web 87 | ; 88 | }; 89 | 90 | checks = { 91 | inherit web nix-versions; 92 | }; 93 | 94 | }; 95 | } 96 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | home: true 3 | title: Home 4 | 5 | actions: 6 | - text: Get Started 7 | link: /getting-started/installing.html 8 | type: primary 9 | 10 | - text: Visit at GitHub 11 | link: https://github.com/vic/nix-versions 12 | type: secondary 13 | 14 | features: 15 | - title: Works for everyone, at any level. 16 | details: | 17 |
18 | As a friendly CLI to explore available versions.

19 | As a tools version manager and development shell.

20 | As a flake generator for pinned-version packages. 21 | - title: Combine latest and dependable, stable versions. 22 | details: | 23 |
24 | Keep your compilers and tooling at known, stable releases that work with your current code.

25 | And use the most recent version for other nixpkgs. 26 | - title: Plays well with existing tools. 27 | details: | 28 |
29 | Friendly with nix shell, direnv and advanced nix environments like devenv and devshell.

30 | Usable as an input for any Flake and with fetchurl for non-flakes. 31 | - title: Powered by nix but requires no-wizardy™ 32 | details: | 33 |
34 | All the advantages of Nix without much effort. 35 | Reproducibility, security checksums, sandboxed builds, caching, 36 | remote building. 37 |
38 |
39 | Re-use your existing .ruby-version, .node-version project files. 40 | 41 | footer: Kindly hosted by AlwaysData | Made with <3 by @oeiuwq and contributors. 42 | --- 43 | 44 |
45 |
46 | 47 | # Try it now. 48 |
49 | 50 | ### As a command line utility 51 | ```shell 52 | nix run github:vic/nix-versions -- 'emacs@~27 || ~29' --all 53 | ``` 54 |
see command output 55 |
56 | 
57 | 
58 |
59 | 60 | 61 | ### As a flake.nix generator 62 | > You can use our `flake.zip` endpoint as an input on your own `flake.nix` or `devenv.yaml`.
63 | > There's also `flake.nix` endpoint that outputs a text file. 64 | ```shell 65 | nix develop 'https://nix-versions.oeiuwq.com/flake.zip/cowsay@latest/go@1.24.x' --output-lock-file /dev/null 66 | ``` 67 |
see command output 68 |
69 | 
70 | 
71 |
72 | 73 | ### As a direnv shell generator 74 | > Our `use_nix_tools.sh` endpoint can get you a `direnv` shell in no time!
75 | > You don't even need `nix-versions` installed, just `nix` and `direnv`. 76 | ```shell 77 | direnv fetchurl "https://nix-versions.oeiuwq.com/use_nix_tools.sh/ruby/cowsay" 78 | ``` 79 | -------------------------------------------------------------------------------- /docs/flake-generator.md: -------------------------------------------------------------------------------- 1 | --- 2 | order: -2 3 | --- 4 | 5 | # Flake Generator Endpoint 6 | 7 | We provide a couple of flake related endpoints that can generate a fully working flake with 8 | the package specs you provide. 9 | 10 | These endpoints are located at the `flake.nix` and `flake.zip` paths: 11 | 12 | 13 | ```shell 14 | # Generate a flake.nix containing latest ruby and nodejs. 15 | curl https://nix-versions.oeiuwq.com/flake.nix/ruby@latest/nodejs@latest -o flake.nix 16 | 17 | # An archive containing flake.nix. This is useful as input for your own flakes. 18 | curl https://nix-versions.oeiuwq.com/flake.zip/ruby@latest/nodejs@latest -o flake.zip 19 | ``` 20 | 21 | ## Keeping up to date with versioned packages 22 | 23 | One advantage of using pinned-versions flakes as inputs for your own flakes is that if you have: 24 | 25 | ```nix 26 | { 27 | inputs.tools.url = "https://nix-versions.oeiuwq.com/flake.zip/go@~1.24/*.pip@25"; 28 | } 29 | ``` 30 | 31 | then, every time you do `nix flake update tools` you are certain that if new versions of go or pip are 32 | available matching their respective constraint, you will get the new versions. But if an incompatible 33 | version is availabe you wont get that update, preventing potential problems in your dev environment. 34 | 35 | This ensures your packages are still updated but compatible with the version constraint you 36 | identify as stable releases. 37 | 38 | 39 | ## Generated Flake outputs 40 | 41 | You can inspect the content of generated flake.zip with the following command: 42 | 43 | ```shell 44 | nix flake show https://nix-versions.oeiuwq.com/flake.zip/go@1.24.x/ruby@~3.4 --no-write-lock-file 45 | ``` 46 | 47 | Requesting for `go@1.24.x` and `ruby@~3.4` will generate a flake with the following structure: 48 | 49 | ```nix 50 | { 51 | overlays.default # An overlay containing `{ ruby = ...; go = ...; }` at their respective versions. 52 | packages.${system} = { 53 | go = ...; # Go package at specified version 54 | ruby = ...; # Ruby package at specified version 55 | default = ...; # An envrionment (`buildEnv`) contaning the paths of specified tools. 56 | }; 57 | devShells.${system} = { 58 | default = ...; # A numtide/devshell with the specified tools. 59 | }; 60 | } 61 | ``` 62 | 63 | The flake itself is generated by using [ntv](https://github.com/vic/ntv) and uses its [flakeModules](https://github.com/vic/ntv/tree/main/nix/flakeModules) to create flake outputs. 64 | 65 | 66 | ## Using `nix develop` with `flake.zip` endpoint. 67 | 68 | You can create quick one-shot environments by using the following command: 69 | 70 | ``` 71 | nix develop https://nix-versions.oeiuwq.com/flake.zip/go@1.24.x/ruby@~3.4 --no-write-lock-file 72 | ``` 73 | 74 | ## Using as `input` on your own flakes. 75 | 76 | If you need to pin some tools to specific versions on your own flakes, just use our `flake.zip` endpoint. 77 | 78 | ```nix 79 | { 80 | inputs.tools.url = "https://nix-versions.oeiuwq.com/flake.zip/go@~1.24"; 81 | outputs = inputs: { 82 | # Go 1.24 is available at: 83 | # inputs.tools.packages.${system}.go 84 | }; 85 | } 86 | ``` 87 | 88 | ## Using as `input` on devenv environments. 89 | 90 | On your `devenv.yaml` file define an [input](https://devenv.sh/inputs/): 91 | 92 | ```yaml 93 | inputs: 94 | tools: 95 | url: "https://nix-versions.oeiuwq.com/flake.zip/go@~1.24" 96 | ``` 97 | -------------------------------------------------------------------------------- /nix/devshell.nix: -------------------------------------------------------------------------------- 1 | { inputs, ... }: 2 | 3 | { 4 | imports = [ inputs.devshell.flakeModule ]; 5 | 6 | perSystem = 7 | { pkgs, self', ... }: 8 | let 9 | go-nix-versions = pkgs.writeShellApplication { 10 | name = "nix-versions"; 11 | runtimeInputs = [ 12 | pkgs.go 13 | ]; 14 | text = '' 15 | ( 16 | cd "''${PROJECT_ROOT:-"$(git rev-parse --show-toplevel)"}"/cli 17 | go build 18 | env PATH="$PWD:$PATH" nix-versions --color=true "$@" 19 | ) 20 | ''; 21 | meta.description = "nix-versions (development version)"; 22 | }; 23 | 24 | go-web = pkgs.writeShellApplication { 25 | name = "web"; 26 | runtimeInputs = [ 27 | pkgs.go 28 | ]; 29 | text = '' 30 | ( 31 | cd "''${PROJECT_ROOT:-"$(git rev-parse --show-toplevel)"}"/web 32 | go run main.go "$@" 33 | ) 34 | ''; 35 | meta.description = "Go web backend (development version)"; 36 | }; 37 | 38 | develop-docs = pkgs.writeShellApplication { 39 | name = "docs"; 40 | runtimeInputs = [ 41 | pkgs.go 42 | ]; 43 | text = '' 44 | ( 45 | cd "''${PROJECT_ROOT:-"$(git rev-parse --show-toplevel)"}"/docs 46 | npm run dev 47 | ) 48 | ''; 49 | meta.description = "Docs devserver"; 50 | }; 51 | 52 | gen-ansi-html = pkgs.writeShellApplication { 53 | name = "gen-ansi-html"; 54 | runtimeInputs = [ 55 | go-nix-versions 56 | pkgs.nodejs 57 | pkgs.findutils 58 | pkgs.ansi2html 59 | ]; 60 | text = '' 61 | # shellcheck disable=SC2016 62 | find . -name '*.ansi.bash' -print0 | xargs -0 -I FILE bash -v -c 'bash FILE 2>&1 | ansi2html -i -a -p > $(echo FILE | sed -e s/.bash/.html/)' 63 | ''; 64 | meta.description = "Generate HTML from ANSI (*.ansi.bash -> *.ansi.html)"; 65 | }; 66 | 67 | restart-web = pkgs.writeShellApplication { 68 | name = "restart-web"; 69 | text = '' 70 | curl --basic --user "$WEB_ADMIN_API_KEY account=nix-versions:" -X POST "$WEB_ADMIN_API_URL" "$@" 71 | ''; 72 | meta.description = "Restart production web server"; 73 | }; 74 | in 75 | { 76 | devshells.default = 77 | { ... }: 78 | { 79 | imports = [ "${inputs.devshell}/extra/git/hooks.nix" ]; 80 | 81 | git.hooks.enable = true; 82 | git.hooks.pre-push.text = "nix flake check"; 83 | 84 | commands = [ 85 | { package = go-nix-versions; } 86 | { package = go-web; } 87 | { package = develop-docs; } 88 | { package = gen-ansi-html; } 89 | { package = restart-web; } 90 | ]; 91 | 92 | env = [ 93 | { 94 | # Otherwise the sass compiler fails on nixos. 95 | # See patches/sass-embedded-1.62.0.patch 96 | name = "SASS_EMBEDDED_BIN_PATH"; 97 | value = "${pkgs.dart-sass}/bin/sass"; 98 | } 99 | ]; 100 | 101 | packages = [ 102 | pkgs.gopls 103 | pkgs.go 104 | pkgs.nodejs 105 | ]; 106 | 107 | packagesFrom = [ 108 | self'.packages.default 109 | ]; 110 | }; 111 | }; 112 | } 113 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "devshell": { 4 | "inputs": { 5 | "nixpkgs": [ 6 | "nixpkgs" 7 | ] 8 | }, 9 | "locked": { 10 | "lastModified": 1741473158, 11 | "narHash": "sha256-kWNaq6wQUbUMlPgw8Y+9/9wP0F8SHkjy24/mN3UAppg=", 12 | "owner": "numtide", 13 | "repo": "devshell", 14 | "rev": "7c9e793ebe66bcba8292989a68c0419b737a22a0", 15 | "type": "github" 16 | }, 17 | "original": { 18 | "owner": "numtide", 19 | "repo": "devshell", 20 | "type": "github" 21 | } 22 | }, 23 | "flake-parts": { 24 | "inputs": { 25 | "nixpkgs-lib": "nixpkgs-lib" 26 | }, 27 | "locked": { 28 | "lastModified": 1756770412, 29 | "narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=", 30 | "owner": "hercules-ci", 31 | "repo": "flake-parts", 32 | "rev": "4524271976b625a4a605beefd893f270620fd751", 33 | "type": "github" 34 | }, 35 | "original": { 36 | "owner": "hercules-ci", 37 | "repo": "flake-parts", 38 | "type": "github" 39 | } 40 | }, 41 | "nixpkgs": { 42 | "locked": { 43 | "lastModified": 1758446476, 44 | "narHash": "sha256-5rdAi7CTvM/kSs6fHe1bREIva5W3TbImsto+dxG4mBo=", 45 | "owner": "nixos", 46 | "repo": "nixpkgs", 47 | "rev": "a1f79a1770d05af18111fbbe2a3ab2c42c0f6cd0", 48 | "type": "github" 49 | }, 50 | "original": { 51 | "owner": "nixos", 52 | "ref": "nixpkgs-unstable", 53 | "repo": "nixpkgs", 54 | "type": "github" 55 | } 56 | }, 57 | "nixpkgs-lib": { 58 | "locked": { 59 | "lastModified": 1754788789, 60 | "narHash": "sha256-x2rJ+Ovzq0sCMpgfgGaaqgBSwY+LST+WbZ6TytnT9Rk=", 61 | "owner": "nix-community", 62 | "repo": "nixpkgs.lib", 63 | "rev": "a73b9c743612e4244d865a2fdee11865283c04e6", 64 | "type": "github" 65 | }, 66 | "original": { 67 | "owner": "nix-community", 68 | "repo": "nixpkgs.lib", 69 | "type": "github" 70 | } 71 | }, 72 | "root": { 73 | "inputs": { 74 | "devshell": "devshell", 75 | "flake-parts": "flake-parts", 76 | "nixpkgs": "nixpkgs", 77 | "systems": "systems", 78 | "treefmt-nix": "treefmt-nix" 79 | } 80 | }, 81 | "systems": { 82 | "locked": { 83 | "lastModified": 1681028828, 84 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 85 | "owner": "nix-systems", 86 | "repo": "default", 87 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 88 | "type": "github" 89 | }, 90 | "original": { 91 | "owner": "nix-systems", 92 | "repo": "default", 93 | "type": "github" 94 | } 95 | }, 96 | "treefmt-nix": { 97 | "inputs": { 98 | "nixpkgs": [ 99 | "nixpkgs" 100 | ] 101 | }, 102 | "locked": { 103 | "lastModified": 1758206697, 104 | "narHash": "sha256-/DbPkh6PZOgfueCbs3uzlk4ASU2nPPsiVWhpMCNkAd0=", 105 | "owner": "numtide", 106 | "repo": "treefmt-nix", 107 | "rev": "128222dc911b8e2e18939537bed1762b7f3a04aa", 108 | "type": "github" 109 | }, 110 | "original": { 111 | "owner": "numtide", 112 | "repo": "treefmt-nix", 113 | "type": "github" 114 | } 115 | } 116 | }, 117 | "root": "root", 118 | "version": 7 119 | } 120 | -------------------------------------------------------------------------------- /docs/getting-started/listing-versions.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Listing package versions 3 | order: 2 4 | --- 5 | 6 | # Listing package versions. 7 | 8 | In the following example, `emacs@*` is a package spec. Requesting emacs at any version. 9 | And is equivalent to just `emacs` or `emacs@` with an empty constraint. 10 | 11 | ```shell 12 | 13 | ``` 14 |
see command output 15 |
 16 | 
 17 | 
18 |
19 | 20 | If you want to know the emacs version available on your system's nixpkgs tree, 21 | use the `system:` backend prefix. More on backend prefixes [here](./finding-packages.html#backend-prefixes). 22 | 23 | ```shell 24 | 25 | ``` 26 |
see command output 27 |
 28 | 
 29 | 
30 |
31 | 32 | 33 | ## Semantic Version Constraints. 34 | 35 | A version constraint lets you filter by only those versions that match a particular release set. 36 | 37 | This is a very useful feature when you need to keep your tools in a range of known, stable versions. 38 | For example, you might need that your compiler/interpreter is always compatible with your current code, even if the nixpkgs tree is bleeding edge and contains latest versions that you might be not be ready to use. 39 | 40 | ### SemVer Constraint Syntax 41 | 42 | ::: tip [SemVer Documentation](https://github.com/Masterminds/semver?tab=readme-ov-file#basic-comparisons). 43 | 44 | For more information on the supported constraint syntax, read the documentation of the library we use: [semver constraints](https://github.com/Masterminds/semver?tab=readme-ov-file#checking-version-constraints). 45 | 46 | ::: 47 | 48 | Using the previous emacs example, lets filter by just a pair of release series. 49 | 50 | ```shell 51 | 52 | ``` 53 |
see command output 54 |
 55 | 
 56 | 
57 |
58 | 59 | ### `--all` (short `-a`) 60 | Use `--all` to visualize the matching versions compared to all others. 61 | 62 | ```shell 63 | nix-versions 'emacs@~27 || ~29' --all 64 | ``` 65 |
see command output 66 |
 67 | 
 68 | 
69 |
70 | 71 | 72 | As you can see, coloring can help visualising the selected versions matching an specified constraint and also 73 | the latest version in all the set. You can turn off colors using the `--color=false` [option](cli-help.html). 74 | 75 | 76 | ### `--one` (short `-1`) 77 | 78 | Use `--one` to show only the latest version that matches an specified constraint. 79 | 80 | ```shell 81 | 82 | ``` 83 |
see command output 84 |
 85 | 
 86 | 
87 |
88 | 89 | 90 | ## Regexp Version Constraints 91 | 92 | Sometimes packages do not follow SemVer conventions. In those cases you can specify 93 | a regular expression to match on versions. 94 | 95 | ::: info Enable Regexps by ending your constraint with the `$` symbol. 96 | 97 | Since `$` is an invalid character on SemVer constraint syntax, we use it to identify 98 | when a constraint should be matched as a regexp. So, always try to start your regexp 99 | expression with `^` and end it with `$`. 100 | ::: 101 | 102 | 103 | ```shell 104 | 105 | ``` 106 |
see command output 107 |
108 | 
109 | 
110 |
111 | 112 | -------------------------------------------------------------------------------- /docs/getting-started/finding-packages.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Finding packages 3 | order: 3 4 | --- 5 | 6 | # Finding packages 7 | 8 | In order to install a package, you need to know its attribute-path. 9 | 10 | `nix-versions` is only possible thanks to the awesome people who have built public web services that allow us to search 11 | not only historic versions, but also packages by matching on their attribute-path, and provided programs. 12 | 13 | ::: note On nixpkgs attribute-paths 14 | You can think of the nixpkgs collection as a tree of json-like objects but implemented in the nix-language. Installable packages (`derivations`) are leafs of that tree. An `attribute-path` is an string of dot-separated keys leading to an installable package. 15 | 16 | Most of the installable packages have pretty much simple guessable attribute-paths, available from the root of the tree, like: 17 | 18 | > `emacs`, `ruby`, `go`, `cargo`, `zig`, `nodejs` 19 | 20 | However other packages like `pip` are accessible under a nested package-set, and their attribute-path looks like `python312Packages.pip`. This is because sometimes a package is bound to a particular version of their runtime or simply organized as part of a particular package set, eg. there's also `rubyPackages_3_4.*`, `kdePackages.*`, etc. It pretty much depends on how the package maintainers decide to organize that tree of 200_000+ packages. 21 | ::: 22 | 23 | ## Search Backends 24 | 25 | Currently, `nix-versions` can interface to the following backends: 26 | 27 | - [search.nixos.org](https://search.nixos.org) - This is the official NixOS website used to search for packages. Most people use it via ther web interface, but thanks to [nix-search-cli](https://github.com/peterldowns/nix-search-cli) we can query their ElasticSearch database and find packages by name or provided programs (more on this bellow). 28 | 29 | - [Lazamar index](https://lazamar.co.uk/nix-versions/) - Thanks to Lazamar, people can search historical versions of packages by channel. (You can think of a nixpkgs channel as a particular branch, eg `nixpkgs-unstable` or a particular release `nixos-24.05`, see their website for available channels.) 30 | 31 | - [NixHub API](https://www.nixhub.io/) - The nice guys at [Jetify](https://www.jetify.com/) built this versions index for their wesome [devbox](https://www.jetify.com/devbox) product. And kindly have provided a public [API](https://www.jetify.com/docs/nixhub/). 32 | 33 | - [history.nix-packages.com API](https://history.nix-packages.com) - Another community provided API providing historic versions for nixpkgs. 34 | 35 | 36 | When searching for packages by wildcards on their attribute-name or provided program-names, we use `search.nixos.org`. 37 | 38 | For searching versions, we can use any of the other backends. 39 | NixHub is pre-selected as default versions backend, since it seems to be updated more frequently. 40 | 41 | ## Backend Prefixes 42 | 43 | For each package spec it is possible to specify the backend that will be used to search for versions of it 44 | by using a prefix like `nixhub:`, `lazamar:`, `history:`, `system:`. 45 | 46 | Of these `system:` is the only one that is not a remote service. It will query your local `nixpkgs` tree and return the current version 47 | that is available for some package. 48 | 49 | You can mix them on a single command line to compare version availability on the different indexes: 50 | 51 | ```shell 52 | 53 | ``` 54 |
see command output 55 |
 56 | 
 57 | 
58 |
59 | 60 | 61 | You can also change the default backend for those that do not use a particular backend-prefix by using the `--nixhub`, `--lazamar` and `--history` [options](cli-help.html). 62 | 63 | #### Interlude (`nix-search-cli`) 64 | 65 | We recommend the amazing [nix-search-cli](https://github.com/peterldowns/nix-search-cli) tool 66 | which we use internally to interact with [search.nixos.org](https://search.nixos.org), but that 67 | you can use from your terminal to search for packages by name, description, programs, license, homepage, and more. 68 | 69 | ```shell 70 | # Search programs whose name matches pip 71 | nix run nixpkgs#nix-search-cli -- --name pip --max-results 3 72 | ``` 73 |
see command output 74 |
 75 | 
 76 | 
77 |
78 | 79 | Be sure to checkout their help documentation `nix-search-cli --help` for more advanced examples. 80 | 81 | ## Wildcards in package names 82 | 83 | Thanks to our integration with `nix-search-cli`, 84 | It is possible to include the `*` wildcard in a package name. 85 | 86 | ```shell 87 | 88 | ``` 89 |
see command output 90 |
 91 | 
 92 | 
93 |
94 | 95 | 96 | 97 | ## Packages by program name 98 | 99 | It is possible to list packages that provide a given program by 100 | prefixing with `bin/`. 101 | 102 | ```shell 103 | 104 | ``` 105 |
see command output 106 |
107 | 
108 | 
109 |
110 | 111 | 112 | Listing different ruby implementations. 113 | ```shell 114 | 115 | ``` 116 |
see command output 117 |
118 | 
119 | 
120 |
121 | 122 | 123 | ## Packages by program wildcard 124 | 125 | The program can also include `*` wildcards. 126 | 127 | ```shell 128 | 129 | ``` 130 |
see command output 131 |
132 | 
133 | 
134 |
135 | 136 | ## Finding versions on a particular nixpkgs channel. 137 | 138 | Using the Lazamar index, you can search for versions of programs at a particular NixOS release or nixpkgs branch. See [their webpage](https://lazamar.co.uk/nix-versions/) for existing channels you can use. 139 | 140 | The following example lists the latest versions of emacs at `nixos-21.05`, `nixos-23.05` and `nixpkgs-unstable`. 141 | 142 | ```shell 143 | 144 | ``` 145 |
see command output 146 |
147 | 
148 | 
149 |
150 | 151 | 152 | ## Setting default versions backend 153 | 154 | If no prefix has been specified, the default versions backend is used (NixHub). But you can also 155 | override the default backend via the `--nixhub`, `--history`, `--channel ` [options](cli-help.html). 156 | 157 | ```shell 158 | 159 | ``` 160 |
see command output 161 |
162 | 
163 | 
164 |
165 | -------------------------------------------------------------------------------- /docs/tools-version-manager.md: -------------------------------------------------------------------------------- 1 | --- 2 | order: -4 3 | --- 4 | 5 | # Tools Version Manager 6 | 7 | The nix-versions tool-manager is so simple that it does not exist. It is more of a pattern of usage when 8 | combined with [`nix shell`](https://nix.dev/manual/nix/2.26/command-ref/nix-shell.html) and [`direnv`](https://direnv.net/). 9 | 10 | The idea is simple: 11 | No nix-wizardy required, just use plain-text files to specify your tool requirements and let `nix-versions` produce output that `nix shell` and `direnv` can use to give you an stable development environment. 12 | 13 | 14 | ::: info [Flake Generator](flake-generator.html) For Advanced Nix users 15 | If you already know Nix, and want to use pinned-version packages as inputs for your own Nix Flake 16 | or integrate with state-of-the-art Nix environments like 17 | [devenv](https://devenv.sh/) or [devshell](https://github.com/numtide/devshell), `NixOS/nix-darwin/home-manager` or any other nix module class. 18 | See our [flake generator](flake-generator.html) service. 19 | ::: 20 | 21 | #### Target Audience 22 | 23 | As a Tools Version Manager, the pattern presented on this page can replace 90% of what tools like [asdf-vm](https://asdf-vm.com/) do, 24 | but with all the benefits you can get from Nix: 25 | All installable tools from Nixpkgs at your fingerprints, Reproducibility, Security Checksums, Sandboxed Builds, Remote Builders, Caching, etc. 26 | And of course, pinned version packages by `nix-versions`. 27 | 28 | If you are new to Nix but have used other version managers like `nvm`, `rvm`, `asdf`, `mise` we want to provide you with an integrated toolset that lets you take advantage of Nix 29 | without mandating you to learn the nix-language. By editing plain-text files and reusing your existing `.ruby-version`, `.node-version`, etc files, you can cover most of your needs. 30 | 31 | ::: info ⚡ Fast Track ⚡ - 🏃 The quick-n-dirty `use_nix_tools.sh` endpoint. 32 | 33 | If you already have Nix and direnv installed, you can quickly get an environment ready in no time. 34 | Note that you don't even need `nix-versions` installed locally for this to work. 35 | Because the endpoint already resolves the nix-installales for you. 36 | (read bellow if you want to know more on how it works). 37 | 38 | We recommend you to look at the downloaded script beforehand. 39 | You will notice a `use_nix_installables` function, that you can use independently of `nix-versions`. 40 | 41 | ```bash 42 | # Place this on your .envrc 43 | source_url "https://nix-versions.oeiuwq.com/use_nix_tools.sh/go/ruby" HASH 44 | ``` 45 | 46 | Where `HASH` can be obtained with: 47 | 48 | ```bash 49 | direnv fetchurl "https://nix-versions.oeiuwq.com/use_nix_tools.sh/go/ruby" 50 | ``` 51 | 52 | You can obtian package updates by doing `direnv reload`. 53 | ::: 54 | 55 | ## How it works 56 | 57 | By playing well with others. Following the UNIX philosophy of doing just ONE thing (listing package versions) and produce plain-text output that can be used by other programs to become part of something bigger. 58 | 59 | #### The `Nix Installables` output format 60 | 61 | By using the `--installable` (short: `-i`) [option](../getting-started/cli-help.html), `nix-versions` can produce a list of [Nix Installables (flake-output-attribute)](https://nix.dev/manual/nix/2.24/command-ref/new-cli/nix#flake-output-attribute) that can be read by `nix shell`. 62 | 63 | ```shell 64 | nix-versions --installable go@1.24.x ruby@latest 65 | ``` 66 |
see command output 67 |
 68 | nixpkgs/de0fe301211c267807afd11b12613f5511ff7433#go_1_24
 69 | nixpkgs/0d534853a55b5d02a4ababa1d71921ce8f0aee4c#ruby_3_4
 70 | 
71 |
72 | 73 | #### Reading package specs from a plain-text file 74 | 75 | Instead of giving package specs as command line arguments you can use the `--read` (short `-r`) [option](../getting-started/cli-help.html) for reading them from a file. 76 | 77 | Name of the file is not special to `nix-versions`, but we use the convention of having a `.nix_tools` file. 78 | 79 | ```shell 80 | nix-versions --read .nix_tools --installable 81 | ``` 82 | 83 | The `.nix_tools` file can look like this: 84 | ```text 85 | # shell-like comments are ignored. 86 | # You can use `pkg@version` as in nix-versions command line 87 | ruby@latest # same as `ruby@` or `ruby@*`, ie. no version restriction. 88 | 89 | # You can use spaces/tabs after the package name, just like .tool-versions files from asdf. 90 | # And it also looks much cleaner. 91 | 92 | go >= 1.24 <1.26 # white space/tabs are not significant. 93 | nodejs .node-version # read version constraint from an existing file. 94 | ``` 95 | 96 | As you can see from the previous example, you can re-use your existing `.ruby-version`, `.node-version`, `.tool-versions`, etc files that might be already in use in your project. 97 | 98 | 99 | ## Entering a `nix shell` environment 100 | 101 | Now that you have some files like `.nix_tools`, `.node-version` from the previous examples, you are ready to enter a nix development shell containing those tools, pinned to their constrained versions. 102 | 103 | ```shell 104 | nix shell $(nix-versions -ir .nix_tools) 105 | ``` 106 | 107 | ## Automatic environment loading with `direnv` 108 | 109 | Now you might want to load the environment into your existing shell automatically, every time you enter your project directory. 110 | The right tool for doing this is [direnv](https://direnv.net). 111 | 112 | ::: tip Quick direnv setup 113 | If you are new to direnv. Read their [Getting-Started](https://direnv.net/#getting-started) documentation. 114 | Or you can try using the following instructions to set it up: 115 | 116 | ```shell 117 | nix profile install nixpkgs#direnv # install direnv on your local profile. 118 | echo 'eval "$(direnv hook bash)"' >> $HOME/.bashrc # hook on your shell 119 | ``` 120 | ::: 121 | 122 | 123 | All you need now is to create the following file `$HOME/.config/direnv/lib/use_nix_tools.sh`. This file 124 | will install a function that all your projects can use to load their respective environment. 125 | 126 | ```shell 127 | mkdir -p ~/.config/direnv/lib 128 | # You can always inspect the downloaded function before installing it 129 | curl "https://nix-versions.oeiuwq.com/use_nix_tools.sh" -o ~/.config/direnv/lib/use_nix_tools.sh 130 | ``` 131 | 132 | Then, on your project directory, besides your `.nix_tools` file, create an `.envrc` file that will be 133 | detected by `direnv`. 134 | 135 | ```bash 136 | # .envrc 137 | use nix_tools 138 | ``` 139 | 140 | ::: tip Arguments to the `use_nix_tools` function. 141 | If given no arguments, a `$PWD/.nix_tools` file will be read. But you can provide any 142 | other file with the same format as described above or any package-spec as expected by the `nix-versions` cli. 143 | ::: 144 | 145 | And you are set!, just `direnv allow` and enjoy using your tools. 146 | 147 | 148 | ## More advanced environments. 149 | 150 | The Nix ecosystem has much more advanced development environments that those produced by `nix shell`. 151 | A couple of them are [devenv](https://devenv.sh/) and [devshell](https://github.com/numtide/devshell), 152 | that provide more advanced features than simply loading environment variables. 153 | 154 | They have different features depending on your needs, but they can do process management, services, deployment of containers, git workflow hooks, and much more. Be sure to read their webpages for more info. 155 | 156 | If you happen to need any of this features, `nix-versions` can provide pinned-packages inputs for them. Be sure to read our [Flake Generator](flake-generator.html) documentation. 157 | -------------------------------------------------------------------------------- /web/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "archive/zip" 5 | "bytes" 6 | "context" 7 | "crypto/sha256" 8 | _ "embed" 9 | "encoding/base64" 10 | "encoding/hex" 11 | "fmt" 12 | "io" 13 | "net/http" 14 | "os" 15 | "slices" 16 | "strings" 17 | 18 | "golang.org/x/sync/errgroup" 19 | 20 | "github.com/vic/ntv/packages/flake" 21 | "github.com/vic/ntv/packages/search" 22 | "github.com/vic/ntv/packages/search_spec" 23 | ) 24 | 25 | //go:embed use_nix_tools.sh 26 | var use_nix_tools_bash string 27 | 28 | func main() { 29 | http.HandleFunc("/use_nix_tools.sh", HandleUseNixToolsBash) 30 | http.HandleFunc("/use_nix_tools.sh/", HandleUseNixToolsBash) 31 | http.HandleFunc("/flake.nix/", HandleFlakeNix) 32 | http.HandleFunc("/flake.zip/", HandleFlakeZip) 33 | http.HandleFunc("/default.nix/", HandleDefaultNix) 34 | http.HandleFunc("/default.zip/", HandleDefaultZip) 35 | http.HandleFunc("/nixpkgs-sri/", HandleSri) 36 | fs := http.FileServer(http.Dir("www/")) 37 | http.Handle("/", http.StripPrefix("/", fs)) 38 | addr := os.ExpandEnv(":$PORT") 39 | if addr == ":" { 40 | addr = ":8080" 41 | } 42 | fmt.Println("Listening on", addr) 43 | http.ListenAndServe(addr, nil) 44 | } 45 | 46 | func getParts(path string) []string { 47 | parts := strings.Split(path, "/") 48 | parts = slices.DeleteFunc(parts, func(p string) bool { 49 | return len(strings.TrimSpace(p)) == 0 50 | }) 51 | return parts 52 | } 53 | 54 | func HandleUseNixToolsBash(w http.ResponseWriter, r *http.Request) { 55 | werr := func(err error) { 56 | http.Error(w, err.Error(), http.StatusInternalServerError) 57 | } 58 | path := strings.TrimPrefix(r.URL.Path, "/use_nix_tools.sh") 59 | parts := getParts(path) 60 | fmt.Println("Gen use_nix_tools_bash: ", parts) 61 | installables := make([]string, 0) 62 | 63 | if len(parts) > 0 { 64 | fmt.Println("Searching ", parts) 65 | results, err := searchSpecs(parts) 66 | if err != nil { 67 | werr(err) 68 | return 69 | } 70 | for _, res := range results { 71 | installables = append(installables, res.Installable(res.Selected)) 72 | } 73 | } 74 | 75 | w.Header().Set("Content-Type", "application/x-shellscript") 76 | w.Header().Set("Content-Disposition", "attachment; filename=use_nix_tools.sh") 77 | w.Header().Set("Cache-Control", "no-cache") 78 | w.Header().Set("Pragma", "no-cache") 79 | w.Header().Set("Expires", "0") 80 | fmt.Fprint(w, use_nix_tools_bash) 81 | 82 | if len(installables) > 0 { 83 | fmt.Fprintf(w, "\nuse nix_installables %s\n", strings.Join(installables, " ")) 84 | } 85 | } 86 | 87 | func searchSpecs(args []string) (search.PackageSearchResults, error) { 88 | backend := search_spec.VersionsBackend{ 89 | NixHub: &search_spec.Unit{}, 90 | } 91 | specs, err := search_spec.ParseSearchSpecs(args, backend) 92 | if err != nil { 93 | return nil, err 94 | } 95 | 96 | res, err := search.PackageSearchSpecs(specs).Search() 97 | if err != nil { 98 | return nil, err 99 | } 100 | 101 | if err := res.EnsureOneSelected(); err != nil { 102 | return nil, err 103 | } 104 | if err := res.EnsureUniquePackageNames(); err != nil { 105 | return nil, err 106 | } 107 | return res, nil 108 | } 109 | 110 | func createFlake(args []string) (*flake.Context, error) { 111 | res, err := searchSpecs(args) 112 | if err != nil { 113 | return nil, err 114 | } 115 | 116 | f := flake.New() 117 | for _, r := range res { 118 | f.AddTool(r) 119 | } 120 | 121 | return f, nil 122 | } 123 | 124 | func renderFlake(args []string) (string, error) { 125 | f, err := createFlake(args) 126 | if err != nil { 127 | return "", err 128 | } 129 | 130 | code, err := f.Render(false) 131 | if err != nil { 132 | return "", err 133 | } 134 | 135 | return code, nil 136 | } 137 | 138 | type Prefetch struct { 139 | tool *search.PackageSearchResult 140 | Url string 141 | Hash string 142 | } 143 | 144 | func prefetch(res search.PackageSearchResults) ([]Prefetch, error) { 145 | group, _ := errgroup.WithContext(context.Background()) 146 | results := make([]Prefetch, len(res)) 147 | for i, s := range res { 148 | i, s := i, s 149 | group.Go(func() error { 150 | // url := "https://codeload.github.com/nixos/nixpkgs/tar.gz/refs/" + s.Selected.Revision 151 | url := "https://github.com/NixOS/nixpkgs/archive/" + s.Selected.Revision + ".tar.gz" 152 | hash, err := Sri(url) 153 | if err != nil { 154 | return err 155 | } 156 | results[i] = Prefetch{ 157 | Url: url, 158 | Hash: hash, 159 | tool: s, 160 | } 161 | return nil 162 | }) 163 | } 164 | if err := group.Wait(); err != nil { 165 | return nil, err 166 | } 167 | return results, nil 168 | } 169 | 170 | func unpackArray[S ~[]E, E any](s S) []any { 171 | r := make([]any, len(s)) 172 | for i, e := range s { 173 | r[i] = e 174 | } 175 | return r 176 | } 177 | func writeIndent(buff *bytes.Buffer) func(int, string, ...string) { 178 | return func(i int, s string, x ...string) { 179 | if len(x) == 0 { 180 | buff.WriteString((strings.Repeat(" ", i)) + s + "\n") 181 | } else { 182 | buff.WriteString((strings.Repeat(" ", i)) + fmt.Sprintf(s, unpackArray(x)...) + "\n") 183 | } 184 | } 185 | } 186 | 187 | func renderDefaultNix(args []string) (string, error) { 188 | res, err := searchSpecs(args) 189 | if err != nil { 190 | return "", err 191 | } 192 | 193 | fetched, err := prefetch(res) 194 | if err != nil { 195 | return "", err 196 | } 197 | 198 | buff := bytes.Buffer{} 199 | w := writeIndent(&buff) 200 | w(0, "{ pkgs ? import {} }:") 201 | w(0, "let") 202 | for _, p := range fetched { 203 | w(1, "tools.\"%s\" = {", p.tool.Selected.Name) 204 | w(2, "url = \"%s\";", p.Url) 205 | w(2, "hash = \"%s\";", p.Hash) 206 | w(2, "version = \"%s\";", p.tool.Selected.Version) 207 | w(2, "attrPath = \"%s\";", p.tool.Selected.Attribute) 208 | w(1, "};") 209 | } 210 | outs := ` 211 | nixpkgs = pkgs.lib.mapAttrs (name: tool: 212 | let 213 | archive = pkgs.fetchurl { 214 | name = "${name}-${tool.version}-nixpkgs.tar.gz"; 215 | url = tool.url; 216 | hash = tool.hash; 217 | }; 218 | # since our sri was computed on the tarball, we need to unpack it 219 | # we could use fetchzip, but we'd have to extract the tarball on 220 | # the server to compute recursive sri (which we wont do). 221 | unpacked = pkgs.stdenvNoCC.mkDerivation { 222 | name = "${name}-${tool.version}-nixpkgs"; 223 | phases = [ "unpackPhase" ]; 224 | unpackPhase = '' 225 | unpackFile ${archive} 226 | mv nixpkgs-* $out 227 | ''; 228 | }; 229 | in unpacked 230 | ) tools; 231 | packages = pkgs.lib.mapAttrs (name: tool: 232 | let 233 | pkgs' = import nixpkgs.${name} { inherit (pkgs) system config; }; 234 | path = pkgs.lib.splitString "." tool.attrPath; 235 | pkg = pkgs.lib.getAttrFromPath path pkgs'; 236 | in pkg 237 | ) tools; 238 | pkgsEnv = pkgs.buildEnv { name = "tools"; paths = pkgs.lib.attrValues packages; }; 239 | devShell = pkgs.mkShell { buildInputs = [ pkgsEnv ]; }; 240 | ` 241 | w(0, strings.ReplaceAll(outs, "\t", " ")) 242 | w(0, "in { inherit tools nixpkgs packages pkgsEnv devShell; }") 243 | 244 | return buff.String(), nil 245 | } 246 | 247 | func HandleDefaultNix(w http.ResponseWriter, r *http.Request) { 248 | werr := func(err error) { 249 | http.Error(w, err.Error(), http.StatusInternalServerError) 250 | } 251 | path := strings.TrimPrefix(r.URL.Path, "/default.nix/") 252 | parts := getParts(path) 253 | fmt.Println("Gen default.nix: ", parts) 254 | 255 | nix, err := renderDefaultNix(parts) 256 | if err != nil { 257 | werr(err) 258 | return 259 | } 260 | 261 | w.Header().Set("Content-Type", "text/x-nix") 262 | w.Header().Set("Content-Disposition", "attachment; filename=default.nix") 263 | w.Header().Set("Cache-Control", "no-cache") 264 | w.Header().Set("Pragma", "no-cache") 265 | w.Header().Set("Expires", "0") 266 | fmt.Fprint(w, nix) 267 | } 268 | 269 | func HandleFlakeNix(w http.ResponseWriter, r *http.Request) { 270 | werr := func(err error) { 271 | http.Error(w, err.Error(), http.StatusInternalServerError) 272 | } 273 | path := strings.TrimPrefix(r.URL.Path, "/flake.nix/") 274 | parts := getParts(path) 275 | fmt.Println("Gen flake.nix: ", parts) 276 | 277 | flake, err := renderFlake(parts) 278 | if err != nil { 279 | werr(err) 280 | return 281 | } 282 | 283 | w.Header().Set("Content-Type", "text/x-nix") 284 | w.Header().Set("Content-Disposition", "attachment; filename=flake.nix") 285 | w.Header().Set("Cache-Control", "no-cache") 286 | w.Header().Set("Pragma", "no-cache") 287 | w.Header().Set("Expires", "0") 288 | fmt.Fprint(w, flake) 289 | } 290 | 291 | func HandleDefaultZip(w http.ResponseWriter, r *http.Request) { 292 | werr := func(err error) { 293 | http.Error(w, err.Error(), http.StatusInternalServerError) 294 | } 295 | path := strings.TrimPrefix(r.URL.Path, "/default.zip/") 296 | parts := getParts(path) 297 | fmt.Println("Gen default.zip: ", parts) 298 | 299 | nix, err := renderDefaultNix(parts) 300 | if err != nil { 301 | werr(err) 302 | return 303 | } 304 | 305 | w.Header().Set("Content-Type", "application/zip") 306 | w.Header().Set("Content-Disposition", "attachment; filename=default.zip") 307 | w.Header().Set("Cache-Control", "no-cache") 308 | w.Header().Set("Pragma", "no-cache") 309 | w.Header().Set("Expires", "0") 310 | 311 | zw := zip.NewWriter(w) 312 | defer zw.Close() 313 | err = writeFileToZip(zw, "default.nix", []byte(nix)) 314 | if err != nil { 315 | werr(err) 316 | return 317 | } 318 | } 319 | 320 | func HandleFlakeZip(w http.ResponseWriter, r *http.Request) { 321 | werr := func(err error) { 322 | http.Error(w, err.Error(), http.StatusInternalServerError) 323 | } 324 | path := strings.TrimPrefix(r.URL.Path, "/flake.zip/") 325 | parts := getParts(path) 326 | fmt.Println("Gen flake.zip: ", parts) 327 | 328 | flake, err := renderFlake(parts) 329 | if err != nil { 330 | werr(err) 331 | return 332 | } 333 | 334 | w.Header().Set("Content-Type", "application/zip") 335 | w.Header().Set("Content-Disposition", "attachment; filename=flake.zip") 336 | w.Header().Set("Cache-Control", "no-cache") 337 | w.Header().Set("Pragma", "no-cache") 338 | w.Header().Set("Expires", "0") 339 | 340 | zw := zip.NewWriter(w) 341 | defer zw.Close() 342 | err = writeFileToZip(zw, "flake.nix", []byte(flake)) 343 | if err != nil { 344 | werr(err) 345 | return 346 | } 347 | } 348 | 349 | func writeFileToZip(zw *zip.Writer, path string, content []byte) error { 350 | w, err := zw.Create(path) 351 | if err != nil { 352 | return err 353 | } 354 | _, err = w.Write(content) 355 | return err 356 | } 357 | 358 | func HandleSri(w http.ResponseWriter, r *http.Request) { 359 | rev := strings.TrimPrefix(r.URL.Path, "/nixpkgs-sri/") 360 | sri, err := Sri("https://codeload.github.com/nixos/nixpkgs/zip/refs/heads/" + rev) 361 | if err != nil { 362 | http.Error(w, err.Error(), http.StatusInternalServerError) 363 | return 364 | } 365 | fmt.Fprint(w, sri) 366 | } 367 | 368 | func Sri(url string) (string, error) { 369 | resp, err := http.Get(url) 370 | if err != nil { 371 | return "", err 372 | } 373 | defer resp.Body.Close() 374 | h := sha256.New() 375 | _, err = io.Copy(h, resp.Body) 376 | if err != nil { 377 | return "", err 378 | } 379 | sum := h.Sum(nil) 380 | base64Url := base64.URLEncoding.EncodeToString(sum) 381 | sri := "sha256-" + strings.ReplaceAll(base64Url, "-", "+") 382 | return sri, nil 383 | } 384 | 385 | func Sha256(url string) (string, error) { 386 | resp, err := http.Get(url) 387 | if err != nil { 388 | return "", err 389 | } 390 | defer resp.Body.Close() 391 | h := sha256.New() 392 | _, err = io.Copy(h, resp.Body) 393 | if err != nil { 394 | return "", err 395 | } 396 | sum := h.Sum(nil) 397 | return hex.EncodeToString(sum), nil 398 | } 399 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /web/go.sum: -------------------------------------------------------------------------------- 1 | github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= 2 | github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= 3 | github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= 4 | github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= 5 | github.com/antchfx/htmlquery v1.3.4 h1:Isd0srPkni2iNTWCwVj/72t7uCphFeor5Q8nCzj1jdQ= 6 | github.com/antchfx/htmlquery v1.3.4/go.mod h1:K9os0BwIEmLAvTqaNSua8tXLWRWZpocZIH73OzWQbwM= 7 | github.com/antchfx/xpath v1.3.3 h1:tmuPQa1Uye0Ym1Zn65vxPgfltWb/Lxu2jeqIGteJSRs= 8 | github.com/antchfx/xpath v1.3.3/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= 9 | github.com/antchfx/xpath v1.3.5 h1:PqbXLC3TkfeZyakF5eeh3NTWEbYl4VHNVeufANzDbKQ= 10 | github.com/antchfx/xpath v1.3.5/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= 11 | github.com/carlmjohnson/requests v0.24.3 h1:LYcM/jVIVPkioigMjEAnBACXl2vb42TVqiC8EYNoaXQ= 12 | github.com/carlmjohnson/requests v0.24.3/go.mod h1:duYA/jDnyZ6f3xbcF5PpZ9N8clgopubP2nK5i6MVMhU= 13 | github.com/carlmjohnson/requests v0.25.1 h1:17zNRLecxtAjhtdEIV+F+wrYfe+AGZUjWJtpndcOUYA= 14 | github.com/carlmjohnson/requests v0.25.1/go.mod h1:z3UEf8IE4sZxZ78spW6/tLdqBkfCu1Fn4RaYMnZ8SRM= 15 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 16 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 17 | github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= 18 | github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= 19 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= 20 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 21 | github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= 22 | github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= 23 | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 24 | github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= 25 | github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= 26 | github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= 27 | github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= 28 | github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= 29 | github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= 30 | github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= 31 | github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= 32 | github.com/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4= 33 | github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc= 34 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= 35 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= 36 | github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= 37 | github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= 38 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 39 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 40 | github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 41 | github.com/peterldowns/nix-search-cli v0.2.0 h1:e3K1SOyH1ZfN0Lz3WEtqQSXu0JDlxIkwPAmo9K9I4SU= 42 | github.com/peterldowns/nix-search-cli v0.2.0/go.mod h1:oiHS+WiGbQW3qjon8+UEPnTB8RK9M0XdufwGGsogjtg= 43 | github.com/peterldowns/nix-search-cli v0.3.0 h1:OGODtl9HjmWnHVJc2L2gsbNxwyur1XzIzC6E/p5pe3o= 44 | github.com/peterldowns/nix-search-cli v0.3.0/go.mod h1:xscZkw4ALg5pLM3ib9EhpwneAngakUBNGxprpTW3ZtM= 45 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 46 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 47 | github.com/rodaine/table v1.3.0 h1:4/3S3SVkHnVZX91EHFvAMV7K42AnJ0XuymRR2C5HlGE= 48 | github.com/rodaine/table v1.3.0/go.mod h1:47zRsHar4zw0jgxGxL9YtFfs7EGN6B/TaS+/Dmk4WxU= 49 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 50 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 51 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 52 | github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 53 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 54 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 55 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 56 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 57 | github.com/vic/ntv v0.0.0-20250401182447-792d4321b68b h1:uBKQCcOwnVLFur5BSJVf20l3hKW5g+YIU6Olsu5PRWY= 58 | github.com/vic/ntv v0.0.0-20250401182447-792d4321b68b/go.mod h1:NPx4zbfuDbbfeQBIbOZT48C1olVHry8beztxtTY555U= 59 | github.com/vic/ntv v1.0.1 h1:u7saGRM7XuYDlBwaDzKF2wQAHWj+4MvtVyHUGNLHXjw= 60 | github.com/vic/ntv v1.0.1/go.mod h1:3YVNFyaRYM4jtdFC68GGWRuFISWn5gmRaCjMPV3eKa8= 61 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 62 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 63 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 64 | golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= 65 | golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= 66 | golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= 67 | golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= 68 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 69 | golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 70 | golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 71 | golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 72 | golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 73 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 74 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 75 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 76 | golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 77 | golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 78 | golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= 79 | golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= 80 | golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= 81 | golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= 82 | golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= 83 | golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= 84 | golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= 85 | golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= 86 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 87 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 88 | golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 89 | golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= 90 | golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 91 | golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 92 | golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 93 | golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= 94 | golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= 95 | golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= 96 | golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= 97 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 98 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 99 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 100 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 101 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 102 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 103 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 104 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 105 | golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 106 | golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 107 | golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 108 | golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 109 | golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= 110 | golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 111 | golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= 112 | golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= 113 | golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= 114 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 115 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 116 | golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 117 | golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= 118 | golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= 119 | golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= 120 | golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= 121 | golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= 122 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 123 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 124 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 125 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 126 | golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 127 | golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 128 | golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 129 | golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 130 | golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 131 | golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= 132 | golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= 133 | golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= 134 | golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= 135 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 136 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 137 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 138 | golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 139 | golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 140 | golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= 141 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 142 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 143 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 144 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 145 | -------------------------------------------------------------------------------- /cli/go.sum: -------------------------------------------------------------------------------- 1 | github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= 2 | github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= 3 | github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= 4 | github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= 5 | github.com/antchfx/htmlquery v1.3.4 h1:Isd0srPkni2iNTWCwVj/72t7uCphFeor5Q8nCzj1jdQ= 6 | github.com/antchfx/htmlquery v1.3.4/go.mod h1:K9os0BwIEmLAvTqaNSua8tXLWRWZpocZIH73OzWQbwM= 7 | github.com/antchfx/xpath v1.3.3 h1:tmuPQa1Uye0Ym1Zn65vxPgfltWb/Lxu2jeqIGteJSRs= 8 | github.com/antchfx/xpath v1.3.3/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= 9 | github.com/antchfx/xpath v1.3.5 h1:PqbXLC3TkfeZyakF5eeh3NTWEbYl4VHNVeufANzDbKQ= 10 | github.com/antchfx/xpath v1.3.5/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= 11 | github.com/carlmjohnson/requests v0.24.3 h1:LYcM/jVIVPkioigMjEAnBACXl2vb42TVqiC8EYNoaXQ= 12 | github.com/carlmjohnson/requests v0.24.3/go.mod h1:duYA/jDnyZ6f3xbcF5PpZ9N8clgopubP2nK5i6MVMhU= 13 | github.com/carlmjohnson/requests v0.25.1 h1:17zNRLecxtAjhtdEIV+F+wrYfe+AGZUjWJtpndcOUYA= 14 | github.com/carlmjohnson/requests v0.25.1/go.mod h1:z3UEf8IE4sZxZ78spW6/tLdqBkfCu1Fn4RaYMnZ8SRM= 15 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 16 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 17 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 18 | github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= 19 | github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= 20 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 21 | github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= 22 | github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= 23 | github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= 24 | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 25 | github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= 26 | github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= 27 | github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= 28 | github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= 29 | github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= 30 | github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= 31 | github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= 32 | github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= 33 | github.com/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4= 34 | github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc= 35 | github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= 36 | github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= 37 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 38 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 39 | github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= 40 | github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 41 | github.com/peterldowns/nix-search-cli v0.2.0 h1:e3K1SOyH1ZfN0Lz3WEtqQSXu0JDlxIkwPAmo9K9I4SU= 42 | github.com/peterldowns/nix-search-cli v0.2.0/go.mod h1:oiHS+WiGbQW3qjon8+UEPnTB8RK9M0XdufwGGsogjtg= 43 | github.com/peterldowns/nix-search-cli v0.3.0 h1:OGODtl9HjmWnHVJc2L2gsbNxwyur1XzIzC6E/p5pe3o= 44 | github.com/peterldowns/nix-search-cli v0.3.0/go.mod h1:xscZkw4ALg5pLM3ib9EhpwneAngakUBNGxprpTW3ZtM= 45 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 46 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 47 | github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= 48 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 49 | github.com/rodaine/table v1.3.0 h1:4/3S3SVkHnVZX91EHFvAMV7K42AnJ0XuymRR2C5HlGE= 50 | github.com/rodaine/table v1.3.0/go.mod h1:47zRsHar4zw0jgxGxL9YtFfs7EGN6B/TaS+/Dmk4WxU= 51 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 52 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 53 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 54 | github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 55 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 56 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 57 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 58 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= 59 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 60 | github.com/vic/ntv v0.0.0-20250401182447-792d4321b68b h1:uBKQCcOwnVLFur5BSJVf20l3hKW5g+YIU6Olsu5PRWY= 61 | github.com/vic/ntv v0.0.0-20250401182447-792d4321b68b/go.mod h1:NPx4zbfuDbbfeQBIbOZT48C1olVHry8beztxtTY555U= 62 | github.com/vic/ntv v1.0.1 h1:u7saGRM7XuYDlBwaDzKF2wQAHWj+4MvtVyHUGNLHXjw= 63 | github.com/vic/ntv v1.0.1/go.mod h1:3YVNFyaRYM4jtdFC68GGWRuFISWn5gmRaCjMPV3eKa8= 64 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 65 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 66 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 67 | golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= 68 | golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= 69 | golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= 70 | golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= 71 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 72 | golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 73 | golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 74 | golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 75 | golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 76 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 77 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 78 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 79 | golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 80 | golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 81 | golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= 82 | golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= 83 | golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= 84 | golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= 85 | golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= 86 | golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= 87 | golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= 88 | golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= 89 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 90 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 91 | golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 92 | golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= 93 | golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 94 | golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 95 | golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 96 | golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= 97 | golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= 98 | golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= 99 | golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= 100 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 101 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 102 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 103 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 104 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 105 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 106 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 107 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 108 | golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 109 | golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 110 | golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 111 | golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 112 | golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= 113 | golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 114 | golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= 115 | golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= 116 | golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= 117 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 118 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 119 | golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 120 | golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= 121 | golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= 122 | golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= 123 | golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= 124 | golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= 125 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 126 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 127 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 128 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 129 | golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 130 | golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 131 | golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 132 | golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 133 | golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 134 | golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= 135 | golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= 136 | golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= 137 | golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= 138 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 139 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 140 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 141 | golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 142 | golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 143 | golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= 144 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 145 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 146 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 147 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 148 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 149 | -------------------------------------------------------------------------------- /docs/getting-started/find-ruby-program.ansi.html: -------------------------------------------------------------------------------- 1 | Name Version NixInstallable VerBackend 2 | ruby_3_4 3.4.0-preview2 nixpkgs/de18642#ruby_3_4 nixhub 3 | ruby_3_4 3.4.1 nixpkgs/2d068ae#ruby_3_4 nixhub 4 | ruby_3_4 3.4.2 nixpkgs/0d53485#ruby_3_4 nixhub 5 | ruby_3_2 3.2.1 nixpkgs/98f3b08#ruby_3_2 nixhub 6 | ruby_3_2 3.2.2 nixpkgs/dd5621d#ruby_3_2 nixhub 7 | ruby_3_2 3.2.3 nixpkgs/92d295f#ruby_3_2 nixhub 8 | ruby_3_2 3.2.4 nixpkgs/4ae2e64#ruby_3_2 nixhub 9 | ruby_3_2 3.2.5 nixpkgs/2262165#ruby_3_2 nixhub 10 | ruby_3_2 3.2.6 nixpkgs/0d53485#ruby_3_2 nixhub 11 | ruby_3_1 3.1.0 nixpkgs/3a641de#ruby_3_1 nixhub 12 | ruby_3_1 3.1.1 nixpkgs/4c3c80d#ruby_3_1 nixhub 13 | ruby_3_1 3.1.2 nixpkgs/194c2aa#ruby_3_1 nixhub 14 | ruby_3_1 3.1.3 nixpkgs/98f3b08#ruby_3_1 nixhub 15 | ruby_3_1 3.1.4 nixpkgs/96ba1c5#ruby_3_1 nixhub 16 | ruby_3_1 3.1.6 nixpkgs/0d53485#ruby_3_1 nixhub 17 | ruby 2.5.8 nixpkgs/b76d44b#ruby_2_5 nixhub 18 | ruby 2.6.6 nixpkgs/1184852#ruby_2_6 nixhub 19 | ruby 2.6.7 nixpkgs/3e0ce8c#ruby_2_6 nixhub 20 | ruby 2.6.8 nixpkgs/718895c#ruby_2_6 nixhub 21 | ruby 2.7.1 nixpkgs/83162ab#ruby_2_7 nixhub 22 | ruby 2.7.2 nixpkgs/1184852#ruby_2_7 nixhub 23 | ruby 2.7.3 nixpkgs/3e0ce8c#ruby_2_7 nixhub 24 | ruby 2.7.4 nixpkgs/f366af7#ruby_2_7 nixhub 25 | ruby 2.7.5 nixpkgs/0343e34#ruby nixhub 26 | ruby 2.7.6 nixpkgs/e394505#ruby nixhub 27 | ruby 2.7.7 nixpkgs/98f3b08#ruby nixhub 28 | ruby 2.7.8 nixpkgs/fd04bea#ruby_2_7 nixhub 29 | ruby 3.0.0 nixpkgs/54c1e44#ruby_3_0 nixhub 30 | ruby 3.0.1 nixpkgs/3e0ce8c#ruby_3_0 nixhub 31 | ruby 3.0.2 nixpkgs/f366af7#ruby_3_0 nixhub 32 | ruby 3.0.3 nixpkgs/4c3c80d#ruby_3_0 nixhub 33 | ruby 3.0.4 nixpkgs/e394505#ruby_3_0 nixhub 34 | ruby 3.0.5 nixpkgs/98f3b08#ruby_3_0 nixhub 35 | ruby 3.0.6 nixpkgs/a71323f#ruby_3_0 nixhub 36 | ruby 3.1.0 nixpkgs/3a641de#ruby_3_1 nixhub 37 | ruby 3.1.1 nixpkgs/4c3c80d#ruby_3_1 nixhub 38 | ruby 3.1.2 nixpkgs/194c2aa#ruby_3_1 nixhub 39 | ruby 3.1.3 nixpkgs/98f3b08#ruby_3_1 nixhub 40 | ruby 3.1.4 nixpkgs/96ba1c5#ruby_3_1 nixhub 41 | ruby 3.1.5 nixpkgs/038fb46#ruby nixhub 42 | ruby 3.1.6 nixpkgs/0d53485#ruby_3_1 nixhub 43 | ruby 3.2.1 nixpkgs/98f3b08#ruby_3_2 nixhub 44 | ruby 3.2.2 nixpkgs/dd5621d#ruby_3_2 nixhub 45 | ruby 3.2.3 nixpkgs/92d295f#ruby_3_2 nixhub 46 | ruby 3.2.4 nixpkgs/4ae2e64#ruby_3_2 nixhub 47 | ruby 3.2.5 nixpkgs/2262165#ruby_3_2 nixhub 48 | ruby 3.2.6 nixpkgs/0d53485#ruby_3_2 nixhub 49 | ruby 3.3.0-preview1 nixpkgs/46688f8#ruby_3_3 nixhub 50 | ruby 3.3.0-preview2 nixpkgs/75a5226#ruby_3_3 nixhub 51 | ruby 3.3.0-preview3 nixpkgs/fd04bea#ruby_3_3 nixhub 52 | ruby 3.3.0-rc1 nixpkgs/ca16221#ruby_3_3 nixhub 53 | ruby 3.3.0 nixpkgs/1c74cc2#ruby_3_3 nixhub 54 | ruby 3.3.1 nixpkgs/3f316d2#ruby_3_3 nixhub 55 | ruby 3.3.2 nixpkgs/038fb46#ruby_3_3 nixhub 56 | ruby 3.3.4 nixpkgs/0cb2fd7#ruby_3_3 nixhub 57 | ruby 3.3.5 nixpkgs/566e53c#ruby nixhub 58 | ruby 3.3.6 nixpkgs/0d53485#ruby nixhub 59 | ruby 3.4.0-preview2 nixpkgs/de18642#ruby_3_4 nixhub 60 | ruby 3.4.1 nixpkgs/2d068ae#ruby_3_4 nixhub 61 | ruby 3.4.2 nixpkgs/0d53485#ruby_3_4 nixhub 62 | logstash7-oss 7.5.1 nixpkgs/14b0f20#logstash7-oss nixhub 63 | logstash7-oss 7.10.2 nixpkgs/481afad#logstash7-oss nixhub 64 | logstash7-oss 7.11.1 nixpkgs/2df15ba#logstash7-oss nixhub 65 | logstash7-oss 7.16.1 nixpkgs/059530f#logstash7-oss nixhub 66 | logstash7-oss 7.17.4 nixpkgs/3007746#logstash7-oss nixhub 67 | logstash7-oss 7.17.9 nixpkgs/9f9fcc1#logstash7-oss nixhub 68 | logstash7-oss 7.17.10 nixpkgs/dd5621d#logstash7-oss nixhub 69 | logstash7-oss 7.17.16 nixpkgs/0d53485#logstash7-oss nixhub 70 | logstash7-oss 7.17.27 nixpkgs/0740f6f#logstash7-oss nixhub 71 | jruby 9.2.18.0 nixpkgs/fdb42a7#jruby nixhub 72 | jruby 9.2.14.0 nixpkgs/b4e193a#jruby nixhub 73 | jruby 9.4.8.0 nixpkgs/34a6264#jruby nixhub 74 | jruby 9.3.2.0 nixpkgs/98bb5b7#jruby nixhub 75 | jruby 9.2.19.0 nixpkgs/2df15ba#jruby nixhub 76 | jruby 9.4.6.0 nixpkgs/5fd8536#jruby nixhub 77 | jruby 9.2.17.0 nixpkgs/f36a65f#jruby nixhub 78 | jruby 9.4.11.0 nixpkgs/e8d0b02#jruby nixhub 79 | jruby 9.4.4.0 nixpkgs/a71323f#jruby nixhub 80 | jruby 9.3.9.0 nixpkgs/932fc16#jruby nixhub 81 | jruby 9.2.12.0 nixpkgs/2b7c0dc#jruby nixhub 82 | jruby 9.2.11.1 nixpkgs/e912fb8#jruby nixhub 83 | jruby 9.4.3.0 nixpkgs/75a5226#jruby nixhub 84 | jruby 9.3.6.0 nixpkgs/6c6409e#jruby nixhub 85 | jruby 9.4.9.0 nixpkgs/50165c4#jruby nixhub 86 | jruby 9.4.12.0 nixpkgs/0d53485#jruby nixhub 87 | jruby 9.3.8.0 nixpkgs/31acb60#jruby nixhub 88 | jruby 9.4.10.0 nixpkgs/d98abf5#jruby nixhub 89 | jruby 9.3.3.0 nixpkgs/52dc75a#jruby nixhub 90 | jruby 9.3.4.0 nixpkgs/1a1bd86#jruby nixhub 91 | jruby 9.2.13.0 nixpkgs/5101b35#jruby nixhub 92 | jruby 9.4.5.0 nixpkgs/10b8130#jruby nixhub 93 | jruby 9.4.7.0 nixpkgs/b60793b#jruby nixhub 94 | jruby 9.2.16.0 nixpkgs/316b825#jruby nixhub 95 | jruby 9.2.15.0 nixpkgs/0867f62#jruby nixhub 96 | jruby 9.3.7.0 nixpkgs/994df04#jruby nixhub 97 | graalvmPackages.truffleruby 24.1.1 nixpkgs/2d068ae#graalvmPackages.truffleruby nixhub 98 | graalvmPackages.truffleruby 24.1.2 nixpkgs/0d53485#graalvmPackages.truffleruby nixhub 99 | 100 | --------------------------------------------------------------------------------