forked from lix-project/lix
Merge remote-tracking branch 'upstream/master' into indexed-store-path-outputs
This commit is contained in:
commit
6b61d7722d
|
@ -72,6 +72,7 @@
|
||||||
- [CLI guideline](contributing/cli-guideline.md)
|
- [CLI guideline](contributing/cli-guideline.md)
|
||||||
- [Release Notes](release-notes/release-notes.md)
|
- [Release Notes](release-notes/release-notes.md)
|
||||||
- [Release X.Y (202?-??-??)](release-notes/rl-next.md)
|
- [Release X.Y (202?-??-??)](release-notes/rl-next.md)
|
||||||
|
- [Release 2.8 (2022-04-19)](release-notes/rl-2.8.md)
|
||||||
- [Release 2.7 (2022-03-07)](release-notes/rl-2.7.md)
|
- [Release 2.7 (2022-03-07)](release-notes/rl-2.7.md)
|
||||||
- [Release 2.6 (2022-01-24)](release-notes/rl-2.6.md)
|
- [Release 2.6 (2022-01-24)](release-notes/rl-2.6.md)
|
||||||
- [Release 2.5 (2021-12-13)](release-notes/rl-2.5.md)
|
- [Release 2.5 (2021-12-13)](release-notes/rl-2.5.md)
|
||||||
|
|
53
doc/manual/src/release-notes/rl-2.8.md
Normal file
53
doc/manual/src/release-notes/rl-2.8.md
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
# Release 2.8 (2022-04-19)
|
||||||
|
|
||||||
|
* New experimental command: `nix fmt`, which applies a formatter
|
||||||
|
defined by the `formatter.<system>` flake output to the Nix
|
||||||
|
expressions in a flake.
|
||||||
|
|
||||||
|
* Various Nix commands can now read expressions from standard input
|
||||||
|
using `--file -`.
|
||||||
|
|
||||||
|
* New experimental builtin function `builtins.fetchClosure` that
|
||||||
|
copies a closure from a binary cache at evaluation time and rewrites
|
||||||
|
it to content-addressed form (if it isn't already). Like
|
||||||
|
`builtins.storePath`, this allows importing pre-built store paths;
|
||||||
|
the difference is that it doesn't require the user to configure
|
||||||
|
binary caches and trusted public keys.
|
||||||
|
|
||||||
|
This function is only available if you enable the experimental
|
||||||
|
feature `fetch-closure`.
|
||||||
|
|
||||||
|
* New experimental feature: *impure derivations*. These are
|
||||||
|
derivations that can produce a different result every time they're
|
||||||
|
built. Here is an example:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
name = "impure";
|
||||||
|
__impure = true; # marks this derivation as impure
|
||||||
|
buildCommand = "date > $out";
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Running `nix build` twice on this expression will build the
|
||||||
|
derivation twice, producing two different content-addressed store
|
||||||
|
paths. Like fixed-output derivations, impure derivations have access
|
||||||
|
to the network. Only fixed-output derivations and impure derivations
|
||||||
|
can depend on an impure derivation.
|
||||||
|
|
||||||
|
* `nix store make-content-addressable` has been renamed to `nix store
|
||||||
|
make-content-addressed`.
|
||||||
|
|
||||||
|
* The `nixosModule` flake output attribute has been renamed consistent
|
||||||
|
with the `.default` renames in Nix 2.7.
|
||||||
|
|
||||||
|
* `nixosModule` → `nixosModules.default`
|
||||||
|
|
||||||
|
As before, the old output will continue to work, but `nix flake check` will
|
||||||
|
issue a warning about it.
|
||||||
|
|
||||||
|
* `nix run` is now stricter in what it accepts: members of the `apps`
|
||||||
|
flake output are now required to be apps (as defined in [the
|
||||||
|
manual](https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-run.html#apps)),
|
||||||
|
and members of `packages` or `legacyPackages` must be derivations
|
||||||
|
(not apps).
|
|
@ -1,49 +1,4 @@
|
||||||
# Release X.Y (202?-??-??)
|
# Release X.Y (202?-??-??)
|
||||||
|
|
||||||
* Various nix commands can now read expressions from stdin with `--file -`.
|
|
||||||
|
|
||||||
* `nix store make-content-addressable` has been renamed to `nix store
|
|
||||||
make-content-addressed`.
|
|
||||||
|
|
||||||
* New experimental builtin function `builtins.fetchClosure` that
|
|
||||||
copies a closure from a binary cache at evaluation time and rewrites
|
|
||||||
it to content-addressed form (if it isn't already). Like
|
|
||||||
`builtins.storePath`, this allows importing pre-built store paths;
|
|
||||||
the difference is that it doesn't require the user to configure
|
|
||||||
binary caches and trusted public keys.
|
|
||||||
|
|
||||||
This function is only available if you enable the experimental
|
|
||||||
feature `fetch-closure`.
|
|
||||||
|
|
||||||
* New experimental feature: *impure derivations*. These are
|
|
||||||
derivations that can produce a different result every time they're
|
|
||||||
built. Here is an example:
|
|
||||||
|
|
||||||
```nix
|
|
||||||
stdenv.mkDerivation {
|
|
||||||
name = "impure";
|
|
||||||
__impure = true; # marks this derivation as impure
|
|
||||||
buildCommand = "date > $out";
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Running `nix build` twice on this expression will build the
|
|
||||||
derivation twice, producing two different content-addressed store
|
|
||||||
paths. Like fixed-output derivations, impure derivations have access
|
|
||||||
to the network. Only fixed-output derivations and impure derivations
|
|
||||||
can depend on an impure derivation.
|
|
||||||
|
|
||||||
* The `nixosModule` flake output attribute has been renamed consistent
|
|
||||||
with the `.default` renames in nix 2.7.
|
|
||||||
|
|
||||||
* `nixosModule` → `nixosModules.default`
|
|
||||||
|
|
||||||
As before, the old output will continue to work, but `nix flake check` will
|
|
||||||
issue a warning about it.
|
|
||||||
|
|
||||||
* `nix run` is now stricter wrt what it accepts:
|
|
||||||
* Members of `apps` are now required to be apps (as defined in [the manual](https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-run.html#apps))
|
|
||||||
* Member of `packages` or `legacyPackages` cannot be of type "app" when used by `nix run`.
|
|
||||||
|
|
||||||
* Add experimental *indexed store derivations* installable syntax, part of the
|
* Add experimental *indexed store derivations* installable syntax, part of the
|
||||||
the `computed-derivations` experimental feature.
|
the `computed-derivations` experimental feature.
|
||||||
|
|
|
@ -35,7 +35,7 @@ struct InstallableDerivedPath : Installable
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the rewrites that are needed to resolve a string whose context is
|
* Return the rewrites that are needed to resolve a string whose context is
|
||||||
* included in `dependencies`
|
* included in `dependencies`.
|
||||||
*/
|
*/
|
||||||
StringPairs resolveRewrites(Store & store, const BuiltPaths dependencies)
|
StringPairs resolveRewrites(Store & store, const BuiltPaths dependencies)
|
||||||
{
|
{
|
||||||
|
@ -51,7 +51,7 @@ StringPairs resolveRewrites(Store & store, const BuiltPaths dependencies)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resolve the given string assuming the given context
|
* Resolve the given string assuming the given context.
|
||||||
*/
|
*/
|
||||||
std::string resolveString(Store & store, const std::string & toResolve, const BuiltPaths dependencies)
|
std::string resolveString(Store & store, const std::string & toResolve, const BuiltPaths dependencies)
|
||||||
{
|
{
|
||||||
|
|
|
@ -528,6 +528,16 @@ struct CmdFlakeCheck : FlakeCommand
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (name == "formatter") {
|
||||||
|
state->forceAttrs(vOutput, pos);
|
||||||
|
for (auto & attr : *vOutput.attrs) {
|
||||||
|
checkSystemName(attr.name, *attr.pos);
|
||||||
|
checkApp(
|
||||||
|
fmt("%s.%s", name, attr.name),
|
||||||
|
*attr.value, *attr.pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
else if (name == "packages" || name == "devShells") {
|
else if (name == "packages" || name == "devShells") {
|
||||||
state->forceAttrs(vOutput, pos);
|
state->forceAttrs(vOutput, pos);
|
||||||
for (auto & attr : *vOutput.attrs) {
|
for (auto & attr : *vOutput.attrs) {
|
||||||
|
@ -1011,6 +1021,7 @@ struct CmdFlakeShow : FlakeCommand, MixJSON
|
||||||
|| (attrPath.size() == 1 && (
|
|| (attrPath.size() == 1 && (
|
||||||
attrPath[0] == "defaultPackage"
|
attrPath[0] == "defaultPackage"
|
||||||
|| attrPath[0] == "devShell"
|
|| attrPath[0] == "devShell"
|
||||||
|
|| attrPath[0] == "formatter"
|
||||||
|| attrPath[0] == "nixosConfigurations"
|
|| attrPath[0] == "nixosConfigurations"
|
||||||
|| attrPath[0] == "nixosModules"
|
|| attrPath[0] == "nixosModules"
|
||||||
|| attrPath[0] == "defaultApp"
|
|| attrPath[0] == "defaultApp"
|
||||||
|
@ -1027,7 +1038,7 @@ struct CmdFlakeShow : FlakeCommand, MixJSON
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (
|
else if (
|
||||||
(attrPath.size() == 2 && (attrPath[0] == "defaultPackage" || attrPath[0] == "devShell"))
|
(attrPath.size() == 2 && (attrPath[0] == "defaultPackage" || attrPath[0] == "devShell" || attrPath[0] == "formatter"))
|
||||||
|| (attrPath.size() == 3 && (attrPath[0] == "checks" || attrPath[0] == "packages" || attrPath[0] == "devShells"))
|
|| (attrPath.size() == 3 && (attrPath[0] == "checks" || attrPath[0] == "packages" || attrPath[0] == "devShells"))
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
53
src/nix/fmt.cc
Normal file
53
src/nix/fmt.cc
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
#include "command.hh"
|
||||||
|
#include "run.hh"
|
||||||
|
|
||||||
|
using namespace nix;
|
||||||
|
|
||||||
|
struct CmdFmt : SourceExprCommand {
|
||||||
|
std::vector<std::string> args;
|
||||||
|
|
||||||
|
CmdFmt() { expectArgs({.label = "args", .handler = {&args}}); }
|
||||||
|
|
||||||
|
std::string description() override {
|
||||||
|
return "reformat your code in the standard style";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string doc() override {
|
||||||
|
return
|
||||||
|
#include "fmt.md"
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
Category category() override { return catSecondary; }
|
||||||
|
|
||||||
|
Strings getDefaultFlakeAttrPaths() override {
|
||||||
|
return Strings{"formatter." + settings.thisSystem.get()};
|
||||||
|
}
|
||||||
|
|
||||||
|
Strings getDefaultFlakeAttrPathPrefixes() override { return Strings{}; }
|
||||||
|
|
||||||
|
void run(ref<Store> store) {
|
||||||
|
auto evalState = getEvalState();
|
||||||
|
auto evalStore = getEvalStore();
|
||||||
|
|
||||||
|
auto installable = parseInstallable(store, ".");
|
||||||
|
auto app = installable->toApp(*evalState).resolve(evalStore, store);
|
||||||
|
|
||||||
|
Strings programArgs{app.program};
|
||||||
|
|
||||||
|
// Propagate arguments from the CLI
|
||||||
|
if (args.empty()) {
|
||||||
|
// Format the current flake out of the box
|
||||||
|
programArgs.push_back(".");
|
||||||
|
} else {
|
||||||
|
// User wants more power, let them decide which paths to include/exclude
|
||||||
|
for (auto &i : args) {
|
||||||
|
programArgs.push_back(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
runProgramInStore(store, app.program, programArgs);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
static auto r2 = registerCommand<CmdFmt>("fmt");
|
53
src/nix/fmt.md
Normal file
53
src/nix/fmt.md
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
R""(
|
||||||
|
|
||||||
|
# Examples
|
||||||
|
|
||||||
|
With [nixpkgs-fmt](https://github.com/nix-community/nixpkgs-fmt):
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# flake.nix
|
||||||
|
{
|
||||||
|
outputs = { nixpkgs, self }: {
|
||||||
|
formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.nixpkgs-fmt;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Format the current flake: `$ nix fmt`
|
||||||
|
|
||||||
|
- Format a specific folder or file: `$ nix fmt ./folder ./file.nix`
|
||||||
|
|
||||||
|
With [nixfmt](https://github.com/serokell/nixfmt):
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# flake.nix
|
||||||
|
{
|
||||||
|
outputs = { nixpkgs, self }: {
|
||||||
|
formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.nixfmt;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Format specific files: `$ nix fmt ./file1.nix ./file2.nix`
|
||||||
|
|
||||||
|
With [Alejandra](https://github.com/kamadorueda/alejandra):
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# flake.nix
|
||||||
|
{
|
||||||
|
outputs = { nixpkgs, self }: {
|
||||||
|
formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.alejandra;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Format the current flake: `$ nix fmt`
|
||||||
|
|
||||||
|
- Format a specific folder or file: `$ nix fmt ./folder ./file.nix`
|
||||||
|
|
||||||
|
# Description
|
||||||
|
|
||||||
|
`nix fmt` will rewrite all Nix files (\*.nix) to a canonical format
|
||||||
|
using the formatter specified in your flake.
|
||||||
|
|
||||||
|
)""
|
30
tests/fmt.sh
Normal file
30
tests/fmt.sh
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
source common.sh
|
||||||
|
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
clearStore
|
||||||
|
rm -rf $TEST_HOME/.cache $TEST_HOME/.config $TEST_HOME/.local
|
||||||
|
|
||||||
|
cp ./simple.nix ./simple.builder.sh ./fmt.simple.sh ./config.nix $TEST_HOME
|
||||||
|
|
||||||
|
cd $TEST_HOME
|
||||||
|
|
||||||
|
nix fmt --help | grep "Format"
|
||||||
|
|
||||||
|
cat << EOF > flake.nix
|
||||||
|
{
|
||||||
|
outputs = _: {
|
||||||
|
formatter.$system =
|
||||||
|
with import ./config.nix;
|
||||||
|
mkDerivation {
|
||||||
|
name = "formatter";
|
||||||
|
buildCommand = "mkdir -p \$out/bin; cp \${./fmt.simple.sh} \$out/bin/formatter";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
nix fmt ./file ./folder | grep 'Formatting: ./file ./folder'
|
||||||
|
nix flake check
|
||||||
|
nix flake show | grep -P "package 'formatter'"
|
||||||
|
|
||||||
|
clearStore
|
1
tests/fmt.simple.sh
Executable file
1
tests/fmt.simple.sh
Executable file
|
@ -0,0 +1 @@
|
||||||
|
echo Formatting: "${@}"
|
|
@ -80,6 +80,7 @@ nix_tests = \
|
||||||
post-hook.sh \
|
post-hook.sh \
|
||||||
function-trace.sh \
|
function-trace.sh \
|
||||||
flake-local-settings.sh \
|
flake-local-settings.sh \
|
||||||
|
fmt.sh \
|
||||||
eval-store.sh \
|
eval-store.sh \
|
||||||
why-depends.sh \
|
why-depends.sh \
|
||||||
import-derivation.sh \
|
import-derivation.sh \
|
||||||
|
|
Loading…
Reference in a new issue