staging-nixos merge for 2026-03-25 (#503344)

This commit is contained in:
zowoq
2026-03-25 11:44:04 +00:00
committed by GitHub
20 changed files with 402 additions and 109 deletions
@@ -4,6 +4,32 @@
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
- The system.nix file has been added has an alternative entry point to configuration.nix (and flake.nix) that allows to configure NixOS without using `nix-channel`.
This file must evaluate to a NixOS system derivation or an attribute set of such derivations, in which case the attribute to build has to be selected with the `--attr` option of `nixos-rebuild` or `nixos-install`.
For example,
```nix
# system.nix
let
# Pinned Nixpkgs archive
#
# Use `curl -I https://channels.nixos.org/nixos-26.05` to get the
# latest commit of the stable channel and `nix-prefetch-url --unpack`
# to compute its sha256 hash.
nixpkgs = builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/c217913993d6.tar.gz";
sha256 = "026mprs324330pfazlgbw987qmsa8ligglarvqbcxzig2kgw0lqg";
};
in
import "${nixpkgs}/nixos" {
# Build NixOS using an external configuration.nix file,
# or directly set your options here
configuration = ./configuration.nix;
}
```
The default location of system.nix is `/etc/nixos/system.nix` and can be changed by setting the `<nixos-system>` search path.
`nixos-rebuild` and `nixos-install` can now also load a system.nix file in the current directory (only if `--attr` is used) or from a directory specified with `--file`.
- The default kernel package has been updated from 6.12 to 6.18. All supported kernels remain available.
## New Modules {#sec-release-26.05-new-modules}
+2 -2
View File
@@ -21,11 +21,11 @@
stdenv.mkDerivation (finalAttrs: {
pname = "btrfs-progs";
version = "6.19";
version = "6.19.1";
src = fetchurl {
url = "mirror://kernel/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v${finalAttrs.version}.tar.xz";
hash = "sha256-rWt5GmDrVj0zFLwY48R/awU6AyY5SItbCbnV55Id5rY=";
hash = "sha256-uyfh7FTnw8C3suWW+FOnPAej1y8hvJQEIHPCTb8EV5Y=";
};
nativeBuildInputs = [
@@ -56,9 +56,9 @@ in
'';
}
''
nixos-install --help | grep -F 'NixOS Reference Pages'
nixos-install --help | grep -F "System Manager's Manual"
nixos-install --help | grep -F 'configuration.nix'
nixos-generate-config --help | grep -F 'NixOS Reference Pages'
nixos-generate-config --help | grep -F "System Manager's Manual"
nixos-generate-config --help | grep -F 'hardware-configuration.nix'
# FIXME: Tries to call unshare, which it must not do for --help
+22 -12
View File
@@ -33,9 +33,19 @@
.Sh DESCRIPTION
This command installs NixOS in the file system mounted on
.Pa /mnt Ns
, based on the NixOS configuration specified in
.Pa /mnt/etc/nixos/configuration.nix Ns
\&. It performs the following steps:
, or defined through the
.Fl -root
option, based on the NixOS configuration specified in
.Pa /mnt/etc/nixos/system.nix Ns
,
.Pa /mnt/etc/nixos/configuration.nix
or specified through the
.Fl -file Ns
,
.Fl -attr Ns
or
.Fl -flake Ns
options. It performs the following steps:
.
.Bl -enum
.It
@@ -46,9 +56,7 @@ It copies Nix and its dependencies to
.It
It runs Nix in
.Pa /mnt
to build the NixOS configuration specified in
.Pa /mnt/etc/nixos/configuration.nix Ns
\&.
to build the given NixOS configuration.
.
.It
It installs the current channel
@@ -114,7 +122,7 @@ output named
\&.
.
.It Fl -file Ar path , Fl f Ar path
Enable and build the NixOS system from the specified file. The file must
Build the NixOS system from the specified file. The file must
evaluate to an attribute set, and it must contain a valid NixOS configuration
at attribute
.Va attrPath Ns
@@ -127,17 +135,19 @@ function in nixpkgs or importing and calling
from nixpkgs. If specified without
.Fl -attr
option, builds the configuration from the top-level
attribute of the file.
attribute set of the file.
.
.It Fl -attr Ar attrPath , Fl A Ar attrPath
Enable and build the NixOS system from nix file and use the specified attribute
Build the NixOS system from nix file and use the specified attribute
path from file specified by the
.Fl -file
option. If specified without
.Fl -file
option, uses
.Va [root] Ns Pa /etc/nixos/default.nix Ns
\&.
option, it tires to find
.Pa system.nix
in
.Va root Ns Pa /etc/nixos Ns
, in current directory and iteratively in parent directories.
.
.It Fl -channel Ar channel
If this option is provided, do not copy the current
+89 -26
View File
@@ -19,7 +19,8 @@ system=
verbosity=()
attr=
buildFile=
buildingAttribute=1
# keys: module, by-attrset, flake, system
declare -A requestedBuildMethods
while [ "$#" -gt 0 ]; do
i="$1"; shift 1
@@ -38,10 +39,12 @@ while [ "$#" -gt 0 ]; do
;;
--system|--closure|--store-path)
system="$1"; shift 1
requestedBuildMethods["system"]=1
;;
--flake)
flake="$1"
flakeFlags=(--extra-experimental-features 'nix-command flakes')
requestedBuildMethods["flake"]=1
shift 1
;;
--file|-f)
@@ -49,8 +52,14 @@ while [ "$#" -gt 0 ]; do
log "$0: '$i' requires an argument"
exit 1
fi
buildFile="$1"
buildingAttribute=
if [ -f "$1" ]; then
buildFile="$1"
elif [ -f "$1/system.nix" ]; then
buildFile="${1%/}/system.nix"
else
buildFile="${1%/}/default.nix"
fi
requestedBuildMethods["by-attrset"]=1
shift 1
;;
--attr|-A)
@@ -59,7 +68,7 @@ while [ "$#" -gt 0 ]; do
exit 1
fi
attr="$1"
buildingAttribute=
requestedBuildMethods["by-attrset"]=1
shift 1
;;
--recreate-lock-file|--no-update-lock-file|--no-write-lock-file|--no-registries|--commit-lock-file)
@@ -106,6 +115,20 @@ while [ "$#" -gt 0 ]; do
esac
done
# Finds a specific file in a directory or its parents
findInParents() {
local dir=$1
local filename=$2
while [[ ! -f "$dir/$filename" ]] && [[ "$dir" != / ]]; do
dir=$(dirname "$dir")
done
if [[ -f "$dir/$filename" ]]; then
echo "$dir/$filename"
else
return 1
fi
}
if ! test -e "$mountPoint"; then
echo "mount point $mountPoint doesn't exist"
exit 1
@@ -122,30 +145,61 @@ while [[ "$checkPath" != "/" ]]; do
checkPath="$(dirname "$checkPath")"
done
# Verify that user is not trying to use attribute building and flake
# at the same time
if [[ -z $buildingAttribute && -n $flake ]]; then
echo "$0: '--flake' cannot be used with '--file' or '--attr'"
# If user requested multiple build methods, abort
if [[ ${#requestedBuildMethods[@]} -gt 1 ]]; then
echo "error: multiple build methods requested: ${!requestedBuildMethods[@]}"
exit 1
fi
# Get the path of the NixOS configuration file.
if [[ -z $flake && -n $buildingAttribute ]]; then
if [[ -z $NIXOS_CONFIG ]]; then
NIXOS_CONFIG=$mountPoint/etc/nixos/configuration.nix
findByAttrset() {
# - From system.nix up from the current directory
# - Hardcoded to $mountPoint/etc/nixos/system.nix
# - Hardcoded to /etc/nixos/system.nix
# (default.nix is also searched for backward compatibility)
if resolvedBuildFile="$(findInParents "$PWD" system.nix)"; then
buildFile=$resolvedBuildFile
return 0
elif resolvedBuildFile="$(findInParents "$PWD" default.nix)"; then
buildFile=$resolvedBuildFile
return 0
elif [[ -f "/etc/nixos/system.nix" ]]; then
buildFile="/etc/nixos/system.nix"
return 0
elif [[ -f "/etc/nixos/default.nix" ]]; then
buildFile="/etc/nixos/default.nix"
return 0
fi
return 1
}
if [[ ${NIXOS_CONFIG:0:1} != / ]]; then
echo "$0: \$NIXOS_CONFIG is not an absolute path"
findModule() {
# - From NIXOS_CONFIG environment variable
# - hardcoded to $mountPoint/etc/nixos/configuration.nix
if [[ -n $NIXOS_CONFIG ]]; then
return 0
elif [[ -f "$mountPoint/etc/nixos/configuration.nix" ]]; then
NIXOS_CONFIG="$mountPoint/etc/nixos/configuration.nix"
return 0
fi
return 1
}
# If user didn't request a specific build method, try to find one
if [[ ${#requestedBuildMethods[@]} -eq 0 ]]; then
# Flakes cannot be resolved without knowing hostname
if findByAttrset; then
requestedBuildMethods["by-attrset"]=1
elif findModule; then
requestedBuildMethods["module"]=1
else
echo "error: no build method found"
exit 1
fi
elif [[ -z $buildingAttribute ]]; then
if [[ -z $buildFile ]]; then
buildFile="$mountPoint/etc/nixos/default.nix"
elif [[ -d $buildFile ]]; then
buildFile="$buildFile/default.nix"
fi
elif [[ -n $flake ]]; then
fi
# Find configuration files if not already found
if [[ -n "${requestedBuildMethods["flake"]}" ]]; then
if [[ $flake =~ ^(.*)\#([^\#\"]*)$ ]]; then
flake="${BASH_REMATCH[1]}"
flakeAttr="${BASH_REMATCH[2]}"
@@ -156,19 +210,28 @@ elif [[ -n $flake ]]; then
exit 1
fi
flakeAttr="nixosConfigurations.\"$flakeAttr\""
elif [[ -n "${requestedBuildMethods["by-attrset"]}" && -z $buildFile ]]; then
findByAttrset
elif [[ -n "${requestedBuildMethods["module"]}" && -z $NIXOS_CONFIG ]]; then
findModule
if [[ ${NIXOS_CONFIG:0:1} != / ]]; then
echo "$0: \$NIXOS_CONFIG is not an absolute path"
exit 1
fi
fi
# Resolve the flake.
if [[ -n $flake ]]; then
if [[ -n "${requestedBuildMethods["flake"]}" ]]; then
flake=$(nix "${flakeFlags[@]}" flake metadata --json "${extraBuildFlags[@]}" "${lockFlags[@]}" -- "$flake" | jq -r .url)
fi
if [[ ! -e $NIXOS_CONFIG && -z $system && -z $flake && -n $buildingAttribute ]]; then
if [[ ! -e $NIXOS_CONFIG && -n "${requestedBuildMethods["module"]}" ]]; then
echo "configuration file $NIXOS_CONFIG doesn't exist"
exit 1
fi
if [[ ! -z $buildingAttribute && -e $buildFile && -z $system ]]; then
if [[ ! -e $buildFile && -n "${requestedBuildMethods["by-attrset"]}" ]]; then
echo "configuration file $buildFile doesn't exist"
exit 1
fi
@@ -202,12 +265,12 @@ fi
# Build the system configuration in the target filesystem.
if [[ -z $system ]]; then
outLink="$tmpdir/system"
if [[ -z $flake && -n $buildingAttribute ]]; then
if [[ -n "${requestedBuildMethods["module"]}" ]]; then
echo "building the configuration in $NIXOS_CONFIG..."
nix-build --out-link "$outLink" --store "$mountPoint" "${extraBuildFlags[@]}" \
--extra-substituters "$sub" \
'<nixpkgs/nixos>' -A system -I "nixos-config=$NIXOS_CONFIG" "${verbosity[@]}"
elif [[ -z $buildingAttribute ]]; then
elif [[ -n "${requestedBuildMethods["by-attrset"]}" ]]; then
if [[ -n $attr ]]; then
echo "building the configuration in $buildFile and attribute $attr..."
else
@@ -216,7 +279,7 @@ if [[ -z $system ]]; then
nix-build --out-link "$outLink" --store "$mountPoint" "${extraBuildFlags[@]}" \
--extra-substituters "$sub" \
"$buildFile" -A "${attr:+$attr.}config.system.build.toplevel" "${verbosity[@]}"
else
else # [[ -n "${requestedBuildMethods["flake"]}" ]]
echo "building the flake in $flake..."
nix "${flakeFlags[@]}" build "$flake#$flakeAttr.config.system.build.toplevel" \
--store "$mountPoint" --extra-substituters "$sub" "${verbosity[@]}" \
@@ -28,11 +28,12 @@ _nixos-rebuild_ \[--verbose] [--quiet] [--max-jobs MAX_JOBS] [--cores CORES] [--
# DESCRIPTION
This command updates the system so that it corresponds to the configuration
specified in /etc/nixos/configuration.nix, /etc/nixos/flake.nix or the file and
attribute specified by the *--file* and/or *--attr* options. Thus, every
specified in /etc/nixos/configuration.nix, /etc/nixos/flake.nix,
/etc/nixos/system.nix or the file and attribute specified by the *--file*,
*--attr* or *--flake* options. Thus, every
time you modify the configuration or any other NixOS module, you must run
*nixos-rebuild* to make the changes take effect. It builds the new system in
/nix/store, runs its activation script, and stop and (re)starts any system
/nix/store, runs its activation script, stops and (re)starts any system
services if needed. Please note that user services need to be started manually
as they aren't detected by the activation script at the moment.
@@ -281,20 +282,21 @@ It must be one of the following:
Implies *--sudo*.
*--file* _path_, *-f* _path_
Enable and build the NixOS system from the specified file. The file must
Build the NixOS system from the specified file. The file must
evaluate to an attribute set, and it must contain a valid NixOS
configuration at attribute _attrPath_. This is useful for building a
NixOS system from a nix file that is not a flake or a NixOS
configuration module. Attribute set a with valid NixOS configuration can
be made using _nixos_ function in nixpkgs or importing and calling
nixos/lib/eval-config.nix from nixpkgs. If specified without *--attr*
option, builds the configuration from the top-level attribute of the
option, builds the configuration from the top-level attribute set of the
file.
*--attr* _attrPath_, *-A* _attrPath_
Enable and build the NixOS system from nix file and use the specified
attribute path from file specified by the *--file* option. If specified
without *--file* option, uses _default.nix_ in current directory.
Build the NixOS system from a nix file and use the specified
attribute path from the file specified by the *--file* option.
If specified without *--file* option, uses _system.nix_ in current directory,
the system-wide _<nixos-system>_ file, or finally, /etc/nixos/system.nix.
*--flake* _flake-uri[#name]_, *-F* _flake-uri[#name]_
Build the NixOS system from the specified flake. It defaults to the
@@ -355,6 +357,11 @@ NIX_SUDOOPTS
# FILES
/etc/nixos/system.nix
If this file exists, then *nixos-rebuild* will use it as if the
*--file* option was given. This allows to build a self-contained
system configuration, without requiring nixos channel.
/etc/nixos/flake.nix
If this file exists, then *nixos-rebuild* will use it as if the
*--flake* option was given. This file may be a symlink to a
@@ -7,6 +7,7 @@ from enum import Enum
from pathlib import Path
from typing import Any, ClassVar, Self, TypedDict, override
from . import nix
from .process import Remote, run_wrapper
from .utils import Args
@@ -58,9 +59,31 @@ class BuildAttr:
@classmethod
def from_arg(cls, attr: str | None, file: str | None) -> Self:
if not (attr or file):
return cls("<nixpkgs/nixos>", None)
return cls(Path(file or "default.nix"), attr)
# We use, in this order:
# 1. the --file argument (can be a directory, implying /system.nix)
# 2. system.nix in the cwd, but only if --attr is used
# 3. the <nixos-system> Nix path entry
# 4. /etc/nixos/system.nix
# 5. the <nixpkgs/nixos> Nix path entry (uses configuration.nix)
if file:
fpath = Path(file)
if fpath.is_dir() and (fpath / "system.nix").exists():
return cls(fpath / "system.nix", attr)
# Backward compatibility
elif fpath.is_dir() and (fpath / "default.nix").exists():
return cls(fpath / "default.nix", attr)
return cls(fpath, attr)
elif attr and Path("system.nix").exists():
return cls(Path("system.nix"), attr)
elif attr and Path("default.nix").exists():
# Backward compatibility
return cls(Path("default.nix"), attr)
elif nix.find_file("nixos-system"):
return cls("<nixos-system>", attr)
elif Path("/etc/nixos/system.nix").exists():
return cls(Path("/etc/nixos/system.nix"), attr)
return cls("<nixpkgs/nixos>", attr)
@dataclass(frozen=True)
@@ -270,8 +270,8 @@ def find_file(file: str, nix_flags: Args | None = None) -> Path | None:
"Find classic Nix file location."
r = run_wrapper(
["nix-instantiate", "--find-file", file, *dict_to_flags(nix_flags)],
stdout=PIPE,
check=False,
capture_output=True,
)
if r.returncode:
return None
@@ -670,6 +670,8 @@ def set_profile(
remote=target_host,
sudo=sudo,
)
def switch_to_configuration(
path_to_config: Path,
action: Literal[Action.SWITCH, Action.BOOT, Action.TEST, Action.DRY_ACTIVATE],
@@ -187,12 +187,18 @@ def test_execute_nix_boot(mock_run: Mock, tmp_path: Path) -> None:
nr.execute(["nixos-rebuild", "boot", "--no-flake", "-vvv", "--no-reexec"])
assert mock_run.call_count == 7
assert mock_run.call_count == 8
mock_run.assert_has_calls(
[
call(
["nix-instantiate", "--find-file", "nixos-system"],
capture_output=True,
check=False,
**DEFAULT_RUN_KWARGS,
),
call(
["nix-instantiate", "--find-file", "nixpkgs", "-vvv"],
stdout=PIPE,
capture_output=True,
check=False,
**DEFAULT_RUN_KWARGS,
),
@@ -210,7 +216,7 @@ def test_execute_nix_boot(mock_run: Mock, tmp_path: Path) -> None:
call(
[
"nix-build",
"<nixpkgs/nixos>",
"<nixos-system>",
"--attr",
"config.system.build.toplevel",
"--no-out-link",
@@ -278,9 +284,15 @@ def test_execute_nix_build(mock_run: Mock, tmp_path: Path) -> None:
]
)
assert mock_run.call_count == 1
assert mock_run.call_count == 2
mock_run.assert_has_calls(
[
call(
["nix-instantiate", "--find-file", "nixos-system"],
check=False,
capture_output=True,
**DEFAULT_RUN_KWARGS,
),
call(
[
"nix",
@@ -308,6 +320,8 @@ def test_execute_nix_build_vm(mock_run: Mock, tmp_path: Path) -> None:
def run_side_effect(args: list[str], **kwargs: Any) -> CompletedProcess[str]:
if args[0] == "nix-build":
return CompletedProcess([], 0, str(config_path))
elif args[0] == "nix-instantiate":
return CompletedProcess([], 1)
else:
return CompletedProcess([], 0)
@@ -326,9 +340,15 @@ def test_execute_nix_build_vm(mock_run: Mock, tmp_path: Path) -> None:
]
)
assert mock_run.call_count == 1
assert mock_run.call_count == 2
mock_run.assert_has_calls(
[
call(
["nix-instantiate", "--find-file", "nixos-system"],
check=False,
capture_output=True,
**DEFAULT_RUN_KWARGS,
),
call(
[
"nix-build",
@@ -343,7 +363,7 @@ def test_execute_nix_build_vm(mock_run: Mock, tmp_path: Path) -> None:
check=True,
stdout=PIPE,
**DEFAULT_RUN_KWARGS,
)
),
]
)
@@ -363,6 +383,8 @@ def test_execute_nix_build_image_flake(mock_run: Mock, tmp_path: Path) -> None:
)
elif args[0] == "nix":
return CompletedProcess([], 0, str(config_path))
elif args[0] == "nix-instantiate":
return CompletedProcess([], 1)
else:
return CompletedProcess([], 0)
@@ -379,9 +401,15 @@ def test_execute_nix_build_image_flake(mock_run: Mock, tmp_path: Path) -> None:
]
)
assert mock_run.call_count == 3
assert mock_run.call_count == 4
mock_run.assert_has_calls(
[
call(
["nix-instantiate", "--find-file", "nixos-system"],
check=False,
capture_output=True,
**DEFAULT_RUN_KWARGS,
),
call(
[
"nix",
@@ -440,6 +468,8 @@ def test_execute_nix_switch_flake(mock_run: Mock, tmp_path: Path) -> None:
def run_side_effect(args: list[str], **kwargs: Any) -> CompletedProcess[str]:
if args[0] == "nix":
return CompletedProcess([], 0, str(config_path))
elif args[0] == "nix-instantiate":
return CompletedProcess([], 1)
else:
return CompletedProcess([], 0)
@@ -462,9 +492,15 @@ def test_execute_nix_switch_flake(mock_run: Mock, tmp_path: Path) -> None:
]
)
assert mock_run.call_count == 4
assert mock_run.call_count == 5
mock_run.assert_has_calls(
[
call(
["nix-instantiate", "--find-file", "nixos-system"],
check=False,
capture_output=True,
**DEFAULT_RUN_KWARGS,
),
call(
[
"nix",
@@ -572,9 +608,15 @@ def test_execute_nix_switch_build_target_host(
]
)
assert mock_run.call_count == 11
assert mock_run.call_count == 12
mock_run.assert_has_calls(
[
call(
["nix-instantiate", "--find-file", "nixos-system"],
check=False,
capture_output=True,
**DEFAULT_RUN_KWARGS,
),
call(
[
"nix-instantiate",
@@ -586,7 +628,7 @@ def test_execute_nix_switch_build_target_host(
"nixpkgs=$HOME/.nix-defexpr/channels/pinned_nixpkgs",
],
check=False,
stdout=PIPE,
capture_output=True,
**DEFAULT_RUN_KWARGS,
),
call(
@@ -777,6 +819,8 @@ def test_execute_nix_switch_flake_target_host(
def run_side_effect(args: list[str], **kwargs: Any) -> CompletedProcess[str]:
if args[0] == "nix":
return CompletedProcess([], 0, str(config_path))
elif args[0] == "nix-instantiate":
return CompletedProcess([], 1)
else:
return CompletedProcess([], 0)
@@ -795,9 +839,15 @@ def test_execute_nix_switch_flake_target_host(
]
)
assert mock_run.call_count == 5
assert mock_run.call_count == 6
mock_run.assert_has_calls(
[
call(
["nix-instantiate", "--find-file", "nixos-system"],
check=False,
capture_output=True,
**DEFAULT_RUN_KWARGS,
),
call(
[
"nix",
@@ -896,6 +946,8 @@ def test_execute_nix_switch_flake_build_host(
return CompletedProcess([], 0, str(config_path))
elif args[0] == "ssh" and "nix" in args:
return CompletedProcess([], 0, str(config_path))
elif args[0] == "nix-instantiate":
return CompletedProcess([], 1)
else:
return CompletedProcess([], 0)
@@ -913,9 +965,15 @@ def test_execute_nix_switch_flake_build_host(
]
)
assert mock_run.call_count == 7
assert mock_run.call_count == 8
mock_run.assert_has_calls(
[
call(
["nix-instantiate", "--find-file", "nixos-system"],
check=False,
capture_output=True,
**DEFAULT_RUN_KWARGS,
),
call(
[
"nix",
@@ -1001,7 +1059,9 @@ def test_execute_switch_rollback(mock_run: Mock, tmp_path: Path) -> None:
(nixpkgs_path / ".git").mkdir(parents=True)
def run_side_effect(args: list[str], **kwargs: Any) -> CompletedProcess[str]:
if args[0] == "nix-instantiate":
if args[0] == "nix-instantiate" and "nixos-system" in args:
return CompletedProcess([], 1)
elif args[0] == "nix-instantiate":
return CompletedProcess([], 0, str(nixpkgs_path))
elif args[0] == "git":
return CompletedProcess([], 0, "")
@@ -1023,13 +1083,19 @@ def test_execute_switch_rollback(mock_run: Mock, tmp_path: Path) -> None:
]
)
assert mock_run.call_count == 5
assert mock_run.call_count == 6
mock_run.assert_has_calls(
[
call(
["nix-instantiate", "--find-file", "nixos-system"],
capture_output=True,
check=False,
**DEFAULT_RUN_KWARGS,
),
call(
["nix-instantiate", "--find-file", "nixpkgs"],
check=False,
stdout=PIPE,
capture_output=True,
**DEFAULT_RUN_KWARGS,
),
call(
@@ -1077,15 +1143,23 @@ def test_execute_build(mock_run: Mock, tmp_path: Path) -> None:
config_path = tmp_path / "test"
config_path.touch()
mock_run.side_effect = [
# nix-instantiate --find-file nixos-system
CompletedProcess([], 1),
# nixos_build_flake
CompletedProcess([], 0, str(config_path)),
]
nr.execute(["nixos-rebuild", "build", "--no-flake", "--no-reexec"])
assert mock_run.call_count == 1
assert mock_run.call_count == 2
mock_run.assert_has_calls(
[
call(
["nix-instantiate", "--find-file", "nixos-system"],
capture_output=True,
check=False,
**DEFAULT_RUN_KWARGS,
),
call(
[
"nix-build",
@@ -1096,7 +1170,7 @@ def test_execute_build(mock_run: Mock, tmp_path: Path) -> None:
check=True,
stdout=PIPE,
**DEFAULT_RUN_KWARGS,
)
),
]
)
@@ -1108,6 +1182,8 @@ def test_execute_build_dry_run_build_and_target_remote(
config_path = tmp_path / "test"
config_path.touch()
mock_run.side_effect = [
# nix-instantiate --find-file nixos-system
CompletedProcess([], 1),
CompletedProcess([], 0, str(config_path)),
CompletedProcess([], 0),
CompletedProcess([], 0, str(config_path)),
@@ -1126,9 +1202,15 @@ def test_execute_build_dry_run_build_and_target_remote(
]
)
assert mock_run.call_count == 3
assert mock_run.call_count == 4
mock_run.assert_has_calls(
[
call(
["nix-instantiate", "--find-file", "nixos-system"],
capture_output=True,
check=False,
**DEFAULT_RUN_KWARGS,
),
call(
[
"nix",
@@ -1181,6 +1263,8 @@ def test_execute_test_flake(mock_run: Mock, tmp_path: Path) -> None:
def run_side_effect(args: list[str], **kwargs: Any) -> CompletedProcess[str]:
if args[0] == "nix":
return CompletedProcess([], 0, str(config_path))
elif args[0] == "nix-instantiate":
return CompletedProcess([], 1)
elif args[0] == "test":
return CompletedProcess([], 1)
else:
@@ -1192,9 +1276,15 @@ def test_execute_test_flake(mock_run: Mock, tmp_path: Path) -> None:
["nixos-rebuild", "test", "--flake", "github:user/repo#hostname", "--no-reexec"]
)
assert mock_run.call_count == 3
assert mock_run.call_count == 4
mock_run.assert_has_calls(
[
call(
["nix-instantiate", "--find-file", "nixos-system"],
capture_output=True,
check=False,
**DEFAULT_RUN_KWARGS,
),
call(
[
"nix",
@@ -1242,6 +1332,8 @@ def test_execute_test_rollback(
2084 2024-11-07 23:54:17 (current)
"""),
)
elif args[0] == "nix-instantiate" and "nixos-system" in args:
return CompletedProcess([], 1)
elif args[0] == "test":
return CompletedProcess([], 1)
else:
@@ -1253,7 +1345,7 @@ def test_execute_test_rollback(
["nixos-rebuild", "test", "--rollback", "--profile-name", "foo", "--no-reexec"]
)
assert mock_run.call_count == 3
assert mock_run.call_count == 4
mock_run.assert_has_calls(
[
call(
@@ -1296,7 +1388,7 @@ def test_execute_switch_store_path(mock_run: Mock, tmp_path: Path) -> None:
config_path = tmp_path / "test-system"
config_path.mkdir()
mock_run.return_value = CompletedProcess([], 0)
mock_run.return_value = CompletedProcess([], 0, stdout="")
nr.execute(
[
@@ -1309,9 +1401,15 @@ def test_execute_switch_store_path(mock_run: Mock, tmp_path: Path) -> None:
)
# --store-path skips build and write_version_suffix, so only activation calls
assert mock_run.call_count == 3
assert mock_run.call_count == 4
mock_run.assert_has_calls(
[
call(
["nix-instantiate", "--find-file", "nixos-system"],
capture_output=True,
check=False,
**DEFAULT_RUN_KWARGS,
),
call(
[
"nix-env",
@@ -1359,7 +1457,7 @@ def test_execute_switch_store_path_target_host(
config_path = tmp_path / "test-system"
config_path.mkdir()
mock_run.return_value = CompletedProcess([], 0)
mock_run.return_value = CompletedProcess([], 0, stdout="")
nr.execute(
[
@@ -1375,7 +1473,7 @@ def test_execute_switch_store_path_target_host(
)
# --store-path skips build and write_version_suffix, so only copy/activation calls
assert mock_run.call_count == 5
assert mock_run.call_count == 6
mock_run.assert_has_calls(
[
call(
@@ -5,19 +5,57 @@ from unittest.mock import Mock, patch
from pytest import MonkeyPatch
import nixos_rebuild.models as m
import nixos_rebuild.nix as n
from .helpers import get_qualified_name
def test_build_attr_from_arg() -> None:
assert m.BuildAttr.from_arg(None, None) == m.BuildAttr("<nixpkgs/nixos>", None)
assert m.BuildAttr.from_arg("attr", None) == m.BuildAttr(
Path("default.nix"), "attr"
)
def test_build_attr_from_arg(tmp_path: Path) -> None:
assert m.BuildAttr.from_arg("attr", "file.nix") == m.BuildAttr(
Path("file.nix"), "attr"
)
assert m.BuildAttr.from_arg(None, "file.nix") == m.BuildAttr(Path("file.nix"), None)
with patch(
# system.nix exists
"pathlib.Path.exists",
autospec=True,
side_effect=[True],
):
assert m.BuildAttr.from_arg("attr", None) == m.BuildAttr(
Path("system.nix"), "attr"
)
with patch(
# <nixos-system> is defined
get_qualified_name(n.find_file),
autospec=True,
return_value=Path("/some/file.nix"),
):
assert m.BuildAttr.from_arg("attr", None) == m.BuildAttr(
"<nixos-system>", "attr"
)
with (
# <nixos-system> not defined
patch(get_qualified_name(n.find_file), autospec=True, return_value=None),
# system.nix does not exist, but /etc/nixos/system.nix does
patch(
"pathlib.Path.exists",
autospec=True,
side_effect=[True],
),
):
assert m.BuildAttr.from_arg(None, None) == m.BuildAttr(
Path("/etc/nixos/system.nix"), None
)
with patch(
# <nixos-system> not defined
get_qualified_name(n.find_file),
autospec=True,
return_value=None,
):
assert m.BuildAttr.from_arg(None, None) == m.BuildAttr("<nixpkgs/nixos>", None)
def test_build_attr_to_attr() -> None:
@@ -1,5 +1,6 @@
import os
from pathlib import Path
from subprocess import CompletedProcess
from unittest.mock import ANY, Mock, call, patch
from pytest import MonkeyPatch
@@ -12,8 +13,13 @@ from .helpers import get_qualified_name
@patch.dict(os.environ, {}, clear=True)
@patch("os.execve", autospec=True)
@patch(get_qualified_name(n.nix.run_wrapper, n.nix), autospec=True)
@patch(get_qualified_name(s.nix.build), autospec=True)
def test_reexec(mock_build: Mock, mock_execve: Mock, monkeypatch: MonkeyPatch) -> None:
def test_reexec(
mock_build: Mock, mock_run: Mock, mock_execve: Mock, monkeypatch: MonkeyPatch
) -> None:
mock_run.return_value = CompletedProcess([], 0, stdout="")
monkeypatch.setattr(s, "EXECUTABLE", "nixos-rebuild-ng")
argv = ["/path/bin/nixos-rebuild-ng", "switch", "--no-flake"]
args, _ = n.parse_args(argv)
+2 -2
View File
@@ -138,11 +138,11 @@ stdenv.mkDerivation (finalAttrs: {
+ lib.optionalString nixosTestRunner "-for-vm-tests"
+ lib.optionalString toolsOnly "-utils"
+ lib.optionalString userOnly "-user";
version = "10.2.1";
version = "10.2.2";
src = fetchurl {
url = "https://download.qemu.org/qemu-${finalAttrs.version}.tar.xz";
hash = "sha256-o3F0d9jiyE1jC//7wg9s0yk+tFqh5trG0MwnaJmRyeE=";
hash = "sha256-eEspb/KcFBeqcjI6vLLS6pq5dxck9Xfc14XDsE8h4XY=";
};
depsBuildBuild = [
+3 -3
View File
@@ -16,18 +16,18 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "ruff";
version = "0.15.6";
version = "0.15.7";
src = fetchFromGitHub {
owner = "astral-sh";
repo = "ruff";
tag = finalAttrs.version;
hash = "sha256-a8A9FdfrGCyg6TdunsZcXqAzeXb9pCWO/02f9Nl5juU=";
hash = "sha256-aDRFNJKvxuHPYaZtoM+93DxJGsTPMLKGBH5QhIiTh0Y=";
};
cargoBuildFlags = [ "--package=ruff" ];
cargoHash = "sha256-TD5FLdi4YJwDzJpCctNKYxUNj/VgMnB/OBp3exk3cZw=";
cargoHash = "sha256-m3VkHXhjemXVOFFVSUOVz0xD2Rc2pMsP+dnMYQD29uI=";
nativeBuildInputs = [ installShellFiles ];
+10 -5
View File
@@ -9,21 +9,21 @@
stdenv.mkDerivation (finalAttrs: {
pname = "unifont";
version = "16.0.03";
version = "17.0.04";
otf = fetchurl {
url = "mirror://gnu/unifont/unifont-${finalAttrs.version}/unifont-${finalAttrs.version}.otf";
hash = "sha256-9TnyHLrjkWoJP4GdNsR3EtVwGshtrO2KaOzPe9nTPAw=";
hash = "sha256-0fZkqXU7nGt/81cSh0njK10+7pDHwDYYNj+r1Do5tbc=";
};
pcf = fetchurl {
url = "mirror://gnu/unifont/unifont-${finalAttrs.version}/unifont-${finalAttrs.version}.pcf.gz";
hash = "sha256-ysKULOBusx4n7NfYRAzEoRfqaTNn5JtjigTVmb7wozY=";
hash = "sha256-21hNQMglGdfPrx8VWP3lMT+/Guga7uoKbm72MqXjxJY=";
};
bdf = fetchurl {
url = "mirror://gnu/unifont/unifont-${finalAttrs.version}/unifont-${finalAttrs.version}.bdf.gz";
hash = "sha256-fz0WZKwcBR9ZoaE2DdZU942CwkamiMNC6GPOx/a6ldQ=";
hash = "sha256-mi3kgmOIJCdxEhx/4A5BJSPDGDGLjuOOa+bNRU5+yAI=";
};
nativeBuildInputs = [
@@ -62,6 +62,8 @@ stdenv.mkDerivation (finalAttrs: {
runHook postInstall
'';
passthru.updateScript = ./update.sh;
meta = {
description = "Unicode font for Base Multilingual Plane";
homepage = "https://unifoundry.com/unifont/";
@@ -71,7 +73,10 @@ stdenv.mkDerivation (finalAttrs: {
gpl2Plus
fontException
];
maintainers = [ lib.maintainers.rycee ];
maintainers = with lib.maintainers; [
rycee
qweered
];
platforms = lib.platforms.all;
};
})
+10
View File
@@ -0,0 +1,10 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p curl common-updater-scripts
set -euo pipefail
latest=$(curl -sL "https://ftp.gnu.org/gnu/unifont/" | grep -oP 'unifont-\K\d+\.\d+\.\d+' | sort -V | tail -1)
update-source-version unifont "$latest" --ignore-same-version --source-key=otf
update-source-version unifont "$latest" --ignore-same-version --source-key=pcf
update-source-version unifont "$latest" --ignore-same-version --source-key=bdf
@@ -29,7 +29,7 @@ buildPythonPackage {
# to avoid rebuilding the ruff binary for every active python package set.
+ ''
substituteInPlace pyproject.toml \
--replace-fail 'requires = ["maturin>=1.9,<2.0"]' 'requires = ["hatchling"]' \
--replace-fail 'requires = ["maturin>=1.9.3,<2.0"]' 'requires = ["hatchling"]' \
--replace-fail 'build-backend = "maturin"' 'build-backend = "hatchling.build"'
cat >> pyproject.toml <<EOF
+1 -1
View File
@@ -69,7 +69,7 @@ stdenv.mkDerivation (finalAttrs: {
[ libcap ] ++ lib.optional (!stdenv.hostPlatform.isMusl) libidn2
)
}"
include <local/bin.ping>
include if exists <local/bin.ping>
capability net_raw,
network inet raw,
network inet6 raw,
+3
View File
@@ -438,6 +438,9 @@ lib.makeOverridable (
# Keep root and arch-specific Makefiles
chmod u-w Makefile arch/*/Makefile*
# Keep rust Makefile
${lib.optionalString withRust "chmod u-w rust/Makefile"}
# Keep whole scripts dir
chmod u-w -R scripts
@@ -685,6 +685,8 @@ let
FANOTIFY = yes;
FANOTIFY_ACCESS_PERMISSIONS = yes;
FS_DAX = yes;
TMPFS = yes;
TMPFS_POSIX_ACL = yes;
FS_ENCRYPTION = yes;
+12 -12
View File
@@ -1,12 +1,12 @@
{
"testing": {
"version": "7.0-rc4",
"hash": "sha256:1954j1rlzv3qqmk8a96gvmcwsji5rjdzdm7yhjfs3jyrdahz37pz",
"version": "7.0-rc5",
"hash": "sha256:00q4scz3kyrbd8v23pjdzgmaz9scmxg10cqlfwrrd7xj0hxp3pah",
"lts": false
},
"6.1": {
"version": "6.1.166",
"hash": "sha256:0jcl12gjlfdf9pwqg1m84rzwnrj3grxxgk5blrq8zlaq45sgr3c1",
"version": "6.1.167",
"hash": "sha256:1jwqwp2fg3wdsh9w663rbnbv1rvsvksv1pj4bzns8swp0wy0a618",
"lts": true
},
"5.15": {
@@ -20,23 +20,23 @@
"lts": true
},
"6.6": {
"version": "6.6.129",
"hash": "sha256:12j42awg44w97zq8fzifpm300jm9q9ya7qkpn7xbnkr2480qz86a",
"version": "6.6.130",
"hash": "sha256:139480lyi3if8pd2j3yld5a01lk7113kbcn2kxpzyk29p5kslq14",
"lts": true
},
"6.12": {
"version": "6.12.77",
"hash": "sha256:0rzz5hdixa5xmr99gja3xr9nxgpmrpxyg4llmvkl3vyawpmkd21m",
"version": "6.12.78",
"hash": "sha256:0gdgykr4nqk1dzb5ms2m07saxx58zvacpfv8ynhfrv7snjs835vi",
"lts": true
},
"6.18": {
"version": "6.18.19",
"hash": "sha256:0309xd8ifsy9pa19s8qnsyxkmcqq4z3p16jckjnnhz6h3hkpibza",
"version": "6.18.20",
"hash": "sha256:0lrm76rdlr92kjq3g410qdff9v49mpdf400lmsh7hq74k2ymlyl3",
"lts": true
},
"6.19": {
"version": "6.19.9",
"hash": "sha256:1gsmklhqpx5k9wca3gr8j439q8khr9byy7ivxqyr9qqjmyinhq61",
"version": "6.19.10",
"hash": "sha256:072s76238rnf87yhdy15nbxfyq7x3ch7p2v14dq4pq551qd48va6",
"lts": false
}
}