├── 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 |
--------------------------------------------------------------------------------