# nix-update Nix-update updates versions/source hashes of nix packages. It is designed to work with nixpkgs but also other package sets. ## Features | Feature | Details | | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | | Detect latest version automatically | BitBucket, Codeberg, crates.io, Gitea, GitHub, GitLab, npm, PyPi, Radicle, RubyGems.org, Sourcehut, Savannah | | Rust | `buildRustPackage`'s `cargoHash`/`cargoSha256`/`cargoLock` and `cargoSetupHook`'s `cargoDeps` | | Go | `buildGoModule`'s `vendorHash`/`vendorSha256` | | npm | `buildNpmPackage`'s `npmDepsHash` and `npmConfigHook`'s `npmDeps` | | pnpm | `pnpm.fetchDeps`'s `pnpmDeps` | | PHP | `buildComposerProject`'s `vendorHash` | | Maven | `buildMavenPackage`'s `mvnHash` | | Elixir | `mixRelease`'s `mixFodDeps` | | Yarn | `fetchYarnDeps`'s `yarnOfflineCache` (or `offlineCache`) output hash | | Yarn Berry | `fetchYarnBerryDeps`'s `yarnOfflineCache` (or `offlineCache`) output hash, `missingHashes` file | | Zig | `zigDeps` output hash | | .NET | `nugetDeps` | | Custom dependency hashes | see `--custom-dep` | | Update flake outputs | see `--flake` | | Generate lockfiles (`Cargo.lock`, `package-lock.json`) | see `--generate-lockfile` and `--lockfile-metadata-path` | | Build and run the resulting package | see `--build`, `--run` or `--shell` | | Commit updated files | see `--commit` | | Run update scripts (`passthru.updateScript`) | see `--use-update-script` | | Run package tests | see `--test` | | Review the update with nixpkgs-review | see `--review` | | Format the changed expression | see `--format` | | Specify the system to use | see `--system` | ## Installation `nix-update` is included in nixpkgs. To run without installing it, use: ```console $ nix-shell -p nix-update ``` To install it: ```console $ nix-env -f '' -iA nix-update ``` To run it from the git repository: ```console $ nix-build $ ./result/bin/nix-update ``` If you have nix flakes enabled you can also do: ```console $ nix run github:Mic92/nix-update ``` ## Usage First change to your directory containing the nix expression (Could be a nixpkgs or your own repository). Then run `nix-update` as follows ```console $ nix-update attribute [--version version] ``` If your package is defined in a flake use the `--flake` flag instead: ```console $ nix-update attribute --flake [--version version] ``` `nix-update` will then try to update either the `packages.{currentSystem}.{attribute}` or `{attribute}` output attribute of the given flake. To update a package in `legacyPackages`, pass the full path to that package including the platform: `legacyPackages.{platform}.{attribute}`. This example will fetch the latest github release: ```console $ nix-update nixpkgs-review ``` It is also possible to specify the version manually ```console $ nix-update --version=2.1.1 nixpkgs-review ``` To update an unstable package to the latest commit of the default branch: ```console $ nix-update --version=branch nixpkgs-review ``` To update an unstable package to the latest commit from a certain branch: ```console $ nix-update --version=branch=develop nixpkgs-review ``` To only update sources hashes without updating the version: ```console $ nix-update --version=skip nixpkgs-review ``` To extract version information from versions with prefixes or suffixes, a regex can be used ```console $ nix-update jq --version-regex 'jq-(.*)' ``` By default `nix-update` will locate the file that needs to be patched using the `src` attribute of a derivation. In some cases this heuristic is wrong. One can override the behavior like that: ```console $ nix-update hello --override-filename pkgs/applications/misc/hello/default.nix ``` The `nix-update` command checks for new releases of a package using the `src` attribute. However, in some cases a package may use a non-standard release URL that is not supported by `nix-update`, but still has a repository with release information. For example, the Signal Desktop package in Nixpkgs fetches updates from https://updates.signal.org/, but also publishes release information on its GitHub page. In such cases, use the `--url` parameter to direct nix-update to the correct repository: ```console nix-update --url https://github.com/signalapp/Signal-Desktop --override-filename pkgs/applications/networking/instant-messengers/signal-desktop/default.nix signal-desktop ``` With the `--shell`, `--build`, `--test` and `--run` flags the update can be tested. Additionally, the `--review` flag can be used to initiate a run of [nixpkgs-review](https://github.com/Mic92/nixpkgs-review), which will ensure all dependent packages can be built. In order to ensure consistent formatting, the `--format` flag will invoke [nixfmt](https://github.com/NixOS/nixfmt) (`nixfmt-rfc-style` in nixpkgs). ```console # Also runs nix-build $ nix-update --build nixpkgs-review # Also runs nix-build nixpkgs-review.tests $ nix-update --test nixpkgs-review # Also runs nix-shell $ nix-update --shell nixpkgs-review # Also runs nix run $ nix-update --run nixpkgs-review # Run `nixpkgs-review wip` to validate dependent packages $ nix-update --review nixpkgs-review # Format file $ nix-update --format nixpkgs-review ``` Nix-update also can optionally generate a commit message in the form `attribute: old_version -> new_version` with the applied version update: ```console $ nix-update --commit bitcoin-abc ... [master 53d68a6a5a9] bitcoin-abc: 0.21.1 -> 0.21.2 1 file changed, 2 insertions(+), 2 deletions(-) ``` By default, nix-update will attempt to update to the next stable version of a package. Alphas, betas, release candidates and similar unstable releases will be ignored. This can be affected by changing the parameter `version` from its default value `stable` to `unstable`. ```console $ nix-update sbt Not updating version, already 1.4.6 $ nix-update sbt --version=unstable Update 1.4.6 -> 1.5.0-M1 in sbt ``` Nix-update can also run the `passthru.updateScript` defined by the package. ```console $ nix-update sbt --use-update-script ``` Arguments can be passed to `nix-shell maintainers/scripts/update.nix` like so ```console $ nix-update sbt --use-update-script --update-script-args "--argstr skip-prompt true" ``` This also works outside of nixpkgs (with or without `--flake`). The script is executed from the repository root with `UPDATE_NIX_NAME`, `UPDATE_NIX_PNAME`, `UPDATE_NIX_OLD_VERSION` and `UPDATE_NIX_ATTR_PATH` set (plus `UPDATE_NIX_FLAKE=1` with `--flake`, which makes a nested `nix-update` run in flake mode as well), e.g.: ```nix passthru.updateScript = writeShellScript "update-mypkg" '' sed -i "s/version = \"$UPDATE_NIX_OLD_VERSION\";/version = \"2.0.0\";/" mypkg.nix ''; ``` In case your package has dependency fetchers with custom attribute names, you can pass them using `--custom-dep`: ``` $ nix-update openmetadata --custom-dep yarnOfflineCacheUi --custom-dep yarnOfflineCacheUiCore ``` ## Subpackages Some packages consist of multiple fixed-output derivations derived from the same upstream source. For example, a Go project with Go module dependencies might also include a JavaScript project with npm dependencies. To support such use cases, `nix-update` allows specifying subpackages directly in the command line. Consider a package accessible via the `some-package` attribute, which also provides a second fixed-output derivation as a subpackage named `web-ui`: ```nix { buildGoModule, fetchFromGitHub, buildNpmPackage, }: let pname = "some-package"; version = "1.0.0"; src = fetchFromGitHub { owner = "owner"; repo = "repo"; rev = "v${version}"; hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; }; web-ui = buildNpmPackage rec { ... npmDepsHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; }; in buildGoModule rec { inherit web-ui pname version src; vendorHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; preBuild = '' cp -r ${web-ui}/* web/dist ''; passthru = { inherit web-ui; }; } ``` Note that you must add the subpackage to passthrough in order for `nix-update` to be able to access it. You can update the package and its subpackage using `nix-update` as follows: ``` nix-update --subpackage web-ui some-package ``` The `--subpackage` option can be repeated to update multiple subpackages in the same derivation. ## Development setup First clone the repo to your preferred location (in the following, we assume `~/` - your home): ```console $ git clone https://github.com/Mic92/nix-update/ ~/git/nix-update ``` Then enter the dev shell: ```console $ cd ~/nix-update $ nix develop ``` Change to the repository that contains the nix files you want to update, i.e. nixpkgs: ```console $ cd nixpkgs ``` Now you can run `nix-update` just by specifying the full path to its executable wrapper: ```console $ ~/git/nix-update/bin/nix-update --commit hello ``` This project uses [treefmt-nix](https://github.com/numtide/treefmt-nix) for formatting. It can be run on the repository like that: ``` $ nix fmt ``` ## TODO - create pull requests ## Known Bugs nix-update might not work correctly if a file contains multiple packages as it performs naive search and replace to update version numbers. This might be a problem if: - `name` is used instead of `pname` and/or `${version}` is injected into `name`. Related discussions: - - ## Related projects: - [nixpkgs-update](https://github.com/ryantm/nixpkgs-update) is optimized for mass-updates in nixpkgs while nix-update is better suited for interactive usage that might require user-intervention i.e. fixing the build and testing the result. nix-update is also not limited to nixpkgs.