aboutsummaryrefslogtreecommitdiff
path: root/src/nix
diff options
context:
space:
mode:
Diffstat (limited to 'src/nix')
-rw-r--r--src/nix/flake-lock.md48
-rw-r--r--src/nix/flake-update.md64
-rw-r--r--src/nix/flake.cc33
3 files changed, 99 insertions, 46 deletions
diff --git a/src/nix/flake-lock.md b/src/nix/flake-lock.md
index 2af0ad81e..6d10258e3 100644
--- a/src/nix/flake-lock.md
+++ b/src/nix/flake-lock.md
@@ -2,37 +2,39 @@ R""(
# Examples
-* Update the `nixpkgs` and `nix` inputs of the flake in the current
- directory:
+* Create the lock file for the flake in the current directory:
```console
- # nix flake lock --update-input nixpkgs --update-input nix
- * Updated 'nix': 'github:NixOS/nix/9fab14adbc3810d5cc1f88672fde1eee4358405c' -> 'github:NixOS/nix/8927cba62f5afb33b01016d5c4f7f8b7d0adde3c'
- * Updated 'nixpkgs': 'github:NixOS/nixpkgs/3d2d8f281a27d466fa54b469b5993f7dde198375' -> 'github:NixOS/nixpkgs/a3a3dda3bacf61e8a39258a0ed9c924eeca8e293'
+ # nix flake lock
+ warning: creating lock file '/home/myself/repos/testflake/flake.lock':
+ • Added input 'nix':
+ 'github:NixOS/nix/9fab14adbc3810d5cc1f88672fde1eee4358405c' (2023-06-28)
+ • Added input 'nixpkgs':
+ 'github:NixOS/nixpkgs/3d2d8f281a27d466fa54b469b5993f7dde198375' (2023-06-30)
```
-# Description
-
-This command updates the lock file of a flake (`flake.lock`) so that
-it contains a lock for every flake input specified in
-`flake.nix`. Existing lock file entries are not updated unless
-required by a flag such as `--update-input`.
+* Add missing inputs to the lock file for a flake in a different directory:
-Note that every command that operates on a flake will also update the
-lock file if needed, and supports the same flags. Therefore,
+ ```console
+ # nix flake lock ~/repos/another
+ warning: updating lock file '/home/myself/repos/another/flake.lock':
+ • Added input 'nixpkgs':
+ 'github:NixOS/nixpkgs/3d2d8f281a27d466fa54b469b5993f7dde198375' (2023-06-30)
+ ```
-```console
-# nix flake lock --update-input nixpkgs
-# nix build
-```
+ > **Note**
+ >
+ > When trying to refer to a flake in a subdirectory, write `./another`
+ > instead of `another`.
+ > Otherwise Nix will try to look up the flake in the registry.
-is equivalent to:
+# Description
-```console
-# nix build --update-input nixpkgs
-```
+This command adds inputs to the lock file of a flake (`flake.lock`)
+so that it contains a lock for every flake input specified in
+`flake.nix`. Existing lock file entries are not updated.
-Thus, this command is only useful if you want to update the lock file
-separately from any other action such as building.
+If you want to update existing lock entries, use
+[`nix flake update`](@docroot@/command-ref/new-cli/nix3-flake-update.md)
)""
diff --git a/src/nix/flake-update.md b/src/nix/flake-update.md
index 8c6042d94..63df3b12a 100644
--- a/src/nix/flake-update.md
+++ b/src/nix/flake-update.md
@@ -2,33 +2,57 @@ R""(
# Examples
-* Recreate the lock file (i.e. update all inputs) and commit the new
- lock file:
+* Update all inputs (i.e. recreate the lock file from scratch):
```console
- # nix flake update --commit-lock-file
- * Updated 'nix': 'github:NixOS/nix/9fab14adbc3810d5cc1f88672fde1eee4358405c' -> 'github:NixOS/nix/8927cba62f5afb33b01016d5c4f7f8b7d0adde3c'
- * Updated 'nixpkgs': 'github:NixOS/nixpkgs/3d2d8f281a27d466fa54b469b5993f7dde198375' -> 'github:NixOS/nixpkgs/a3a3dda3bacf61e8a39258a0ed9c924eeca8e293'
- …
- warning: committed new revision '158bcbd9d6cc08ab859c0810186c1beebc982aad'
+ # nix flake update
+ warning: updating lock file '/home/myself/repos/testflake/flake.lock':
+ • Updated input 'nix':
+ 'github:NixOS/nix/9fab14adbc3810d5cc1f88672fde1eee4358405c' (2023-06-28)
+ → 'github:NixOS/nix/8927cba62f5afb33b01016d5c4f7f8b7d0adde3c' (2023-07-11)
+ • Updated input 'nixpkgs':
+ 'github:NixOS/nixpkgs/3d2d8f281a27d466fa54b469b5993f7dde198375' (2023-06-30)
+ → 'github:NixOS/nixpkgs/a3a3dda3bacf61e8a39258a0ed9c924eeca8e293' (2023-07-05)
```
-# Description
+* Update only a single input:
+
+ ```console
+ # nix flake update nixpkgs
+ warning: updating lock file '/home/myself/repos/testflake/flake.lock':
+ • Updated input 'nixpkgs':
+ 'github:NixOS/nixpkgs/3d2d8f281a27d466fa54b469b5993f7dde198375' (2023-06-30)
+ → 'github:NixOS/nixpkgs/a3a3dda3bacf61e8a39258a0ed9c924eeca8e293' (2023-07-05)
+ ```
+
+* Update only a single input of a flake in a different directory:
-This command recreates the lock file of a flake (`flake.lock`), thus
-updating the lock for every unlocked input (like `nixpkgs`) to its
-current version. This is equivalent to passing `--recreate-lock-file`
-to any command that operates on a flake. That is,
+ ```console
+ # nix flake update nixpkgs --flake ~/repos/another
+ warning: updating lock file '/home/myself/repos/another/flake.lock':
+ • Updated input 'nixpkgs':
+ 'github:NixOS/nixpkgs/3d2d8f281a27d466fa54b469b5993f7dde198375' (2023-06-30)
+ → 'github:NixOS/nixpkgs/a3a3dda3bacf61e8a39258a0ed9c924eeca8e293' (2023-07-05)
+ ```
+
+ > **Note**
+ >
+ > When trying to refer to a flake in a subdirectory, write `./another`
+ > instead of `another`.
+ > Otherwise Nix will try to look up the flake in the registry.
+
+# Description
-```console
-# nix flake update
-# nix build
-```
+This command updates the inputs in a lock file (`flake.lock`).
+**By default, all inputs are updated**. If the lock file doesn't exist
+yet, it will be created. If inputs are not in the lock file yet, they will be added.
-is equivalent to:
+Unlike other `nix flake` commands, `nix flake update` takes a list of names of inputs
+to update as its positional arguments and operates on the flake in the current directory.
+You can pass a different flake-url with `--flake` to override that default.
-```console
-# nix build --recreate-lock-file
-```
+The related command [`nix flake lock`](@docroot@/command-ref/new-cli/nix3-flake-lock.md)
+also creates lock files and adds missing inputs, but is safer as it
+will never update inputs already in the lock file.
)""
diff --git a/src/nix/flake.cc b/src/nix/flake.cc
index dde4b43bd..7b5d8096a 100644
--- a/src/nix/flake.cc
+++ b/src/nix/flake.cc
@@ -24,8 +24,10 @@ using namespace nix;
using namespace nix::flake;
using json = nlohmann::json;
+struct CmdFlakeUpdate;
class FlakeCommand : virtual Args, public MixFlakeOptions
{
+protected:
std::string flakeUrl = ".";
public:
@@ -63,6 +65,8 @@ public:
struct CmdFlakeUpdate : FlakeCommand
{
+public:
+
std::string description() override
{
return "update flake lock file";
@@ -70,9 +74,31 @@ struct CmdFlakeUpdate : FlakeCommand
CmdFlakeUpdate()
{
+ expectedArgs.clear();
+ addFlag({
+ .longName="flake",
+ .description="The flake to operate on. Default is the current directory.",
+ .labels={"flake-url"},
+ .handler={&flakeUrl},
+ .completer = {[&](AddCompletions & completions, size_t, std::string_view prefix) {
+ completeFlakeRef(completions, getStore(), prefix);
+ }}
+ });
+ expectArgs({
+ .label="inputs",
+ .optional=true,
+ .handler={[&](std::string inputToUpdate){
+ auto inputPath = flake::parseInputPath(inputToUpdate);
+ if (lockFlags.inputUpdates.contains(inputPath))
+ warn("Input '%s' was specified multiple times. You may have done this by accident.");
+ lockFlags.inputUpdates.insert(inputPath);
+ }},
+ .completer = {[&](AddCompletions & completions, size_t, std::string_view prefix) {
+ completeFlakeInputPath(completions, getEvalState(), getFlakeRefsForCompletion(), prefix);
+ }}
+ });
+
/* Remove flags that don't make sense. */
- removeFlag("recreate-lock-file");
- removeFlag("update-input");
removeFlag("no-update-lock-file");
removeFlag("no-write-lock-file");
}
@@ -87,8 +113,9 @@ struct CmdFlakeUpdate : FlakeCommand
void run(nix::ref<nix::Store> store) override
{
settings.tarballTtl = 0;
+ auto updateAll = lockFlags.inputUpdates.empty();
- lockFlags.recreateLockFile = true;
+ lockFlags.recreateLockFile = updateAll;
lockFlags.writeLockFile = true;
lockFlags.applyNixConfig = true;