Merge staging-next into staging
This commit is contained in:
commit
6de655cb49
@ -507,6 +507,16 @@ This allows the function to produce reproducible images.
|
|||||||
|
|
||||||
_Default value:_ `"1970-01-01T00:00:01Z"`.
|
_Default value:_ `"1970-01-01T00:00:01Z"`.
|
||||||
|
|
||||||
|
`uid` (Number; _optional_) []{#dockerTools-buildLayeredImage-arg-uid}
|
||||||
|
`gid` (Number; _optional_) []{#dockerTools-buildLayeredImage-arg-gid}
|
||||||
|
`uname` (String; _optional_) []{#dockerTools-buildLayeredImage-arg-uname}
|
||||||
|
`gname` (String; _optional_) []{#dockerTools-buildLayeredImage-arg-gname}
|
||||||
|
|
||||||
|
: Credentials for Nix store ownership.
|
||||||
|
Can be overridden to e.g. `1000` / `1000` / `"user"` / `"user"` to enable building a container where Nix can be used as an unprivileged user in single-user mode.
|
||||||
|
|
||||||
|
_Default value:_ `0` / `0` / `"root"` / `"root"`
|
||||||
|
|
||||||
`maxLayers` (Number; _optional_) []{#dockerTools-buildLayeredImage-arg-maxLayers}
|
`maxLayers` (Number; _optional_) []{#dockerTools-buildLayeredImage-arg-maxLayers}
|
||||||
|
|
||||||
: The maximum number of layers that will be used by the generated image.
|
: The maximum number of layers that will be used by the generated image.
|
||||||
|
@ -345,13 +345,17 @@ checkFileset() {
|
|||||||
|
|
||||||
#### Error messages #####
|
#### Error messages #####
|
||||||
|
|
||||||
|
# We're using [[:blank:]] here instead of \s, because only the former is POSIX
|
||||||
|
# (see https://pubs.opengroup.org/onlinepubs/007908799/xbd/re.html#tag_007_003_005).
|
||||||
|
# And indeed, Darwin's bash only supports the former
|
||||||
|
|
||||||
# Absolute paths in strings cannot be passed as `root`
|
# Absolute paths in strings cannot be passed as `root`
|
||||||
expectFailure 'toSource { root = "/nix/store/foobar"; fileset = ./.; }' 'lib.fileset.toSource: `root` \(/nix/store/foobar\) is a string-like value, but it should be a path instead.
|
expectFailure 'toSource { root = "/nix/store/foobar"; fileset = ./.; }' 'lib.fileset.toSource: `root` \(/nix/store/foobar\) is a string-like value, but it should be a path instead.
|
||||||
\s*Paths in strings are not supported by `lib.fileset`, use `lib.sources` or derivations instead.'
|
[[:blank:]]*Paths in strings are not supported by `lib.fileset`, use `lib.sources` or derivations instead.'
|
||||||
|
|
||||||
expectFailure 'toSource { root = cleanSourceWith { src = ./.; }; fileset = ./.; }' 'lib.fileset.toSource: `root` is a `lib.sources`-based value, but it should be a path instead.
|
expectFailure 'toSource { root = cleanSourceWith { src = ./.; }; fileset = ./.; }' 'lib.fileset.toSource: `root` is a `lib.sources`-based value, but it should be a path instead.
|
||||||
\s*To use a `lib.sources`-based value, convert it to a file set using `lib.fileset.fromSource` and pass it as `fileset`.
|
[[:blank:]]*To use a `lib.sources`-based value, convert it to a file set using `lib.fileset.fromSource` and pass it as `fileset`.
|
||||||
\s*Note that this only works for sources created from paths.'
|
[[:blank:]]*Note that this only works for sources created from paths.'
|
||||||
|
|
||||||
# Only paths are accepted as `root`
|
# Only paths are accepted as `root`
|
||||||
expectFailure 'toSource { root = 10; fileset = ./.; }' 'lib.fileset.toSource: `root` is of type int, but it should be a path instead.'
|
expectFailure 'toSource { root = 10; fileset = ./.; }' 'lib.fileset.toSource: `root` is of type int, but it should be a path instead.'
|
||||||
@ -361,9 +365,9 @@ mkdir -p {foo,bar}/mock-root
|
|||||||
expectFailure 'with ((import <nixpkgs/lib>).extend (import <nixpkgs/lib/fileset/mock-splitRoot.nix>)).fileset;
|
expectFailure 'with ((import <nixpkgs/lib>).extend (import <nixpkgs/lib/fileset/mock-splitRoot.nix>)).fileset;
|
||||||
toSource { root = ./foo/mock-root; fileset = ./bar/mock-root; }
|
toSource { root = ./foo/mock-root; fileset = ./bar/mock-root; }
|
||||||
' 'lib.fileset.toSource: Filesystem roots are not the same for `fileset` and `root` \('"$work"'/foo/mock-root\):
|
' 'lib.fileset.toSource: Filesystem roots are not the same for `fileset` and `root` \('"$work"'/foo/mock-root\):
|
||||||
\s*`root`: Filesystem root is "'"$work"'/foo/mock-root"
|
[[:blank:]]*`root`: Filesystem root is "'"$work"'/foo/mock-root"
|
||||||
\s*`fileset`: Filesystem root is "'"$work"'/bar/mock-root"
|
[[:blank:]]*`fileset`: Filesystem root is "'"$work"'/bar/mock-root"
|
||||||
\s*Different filesystem roots are not supported.'
|
[[:blank:]]*Different filesystem roots are not supported.'
|
||||||
rm -rf -- *
|
rm -rf -- *
|
||||||
|
|
||||||
# `root` needs to exist
|
# `root` needs to exist
|
||||||
@ -372,8 +376,8 @@ expectFailure 'toSource { root = ./a; fileset = ./.; }' 'lib.fileset.toSource: `
|
|||||||
# `root` needs to be a file
|
# `root` needs to be a file
|
||||||
touch a
|
touch a
|
||||||
expectFailure 'toSource { root = ./a; fileset = ./a; }' 'lib.fileset.toSource: `root` \('"$work"'/a\) is a file, but it should be a directory instead. Potential solutions:
|
expectFailure 'toSource { root = ./a; fileset = ./a; }' 'lib.fileset.toSource: `root` \('"$work"'/a\) is a file, but it should be a directory instead. Potential solutions:
|
||||||
\s*- If you want to import the file into the store _without_ a containing directory, use string interpolation or `builtins.path` instead of this function.
|
[[:blank:]]*- If you want to import the file into the store _without_ a containing directory, use string interpolation or `builtins.path` instead of this function.
|
||||||
\s*- If you want to import the file into the store _with_ a containing directory, set `root` to the containing directory, such as '"$work"', and set `fileset` to the file path.'
|
[[:blank:]]*- If you want to import the file into the store _with_ a containing directory, set `root` to the containing directory, such as '"$work"', and set `fileset` to the file path.'
|
||||||
rm -rf -- *
|
rm -rf -- *
|
||||||
|
|
||||||
# The fileset argument should be evaluated, even if the directory is empty
|
# The fileset argument should be evaluated, even if the directory is empty
|
||||||
@ -382,36 +386,36 @@ expectFailure 'toSource { root = ./.; fileset = abort "This should be evaluated"
|
|||||||
# Only paths under `root` should be able to influence the result
|
# Only paths under `root` should be able to influence the result
|
||||||
mkdir a
|
mkdir a
|
||||||
expectFailure 'toSource { root = ./a; fileset = ./.; }' 'lib.fileset.toSource: `fileset` could contain files in '"$work"', which is not under the `root` \('"$work"'/a\). Potential solutions:
|
expectFailure 'toSource { root = ./a; fileset = ./.; }' 'lib.fileset.toSource: `fileset` could contain files in '"$work"', which is not under the `root` \('"$work"'/a\). Potential solutions:
|
||||||
\s*- Set `root` to '"$work"' or any directory higher up. This changes the layout of the resulting store path.
|
[[:blank:]]*- Set `root` to '"$work"' or any directory higher up. This changes the layout of the resulting store path.
|
||||||
\s*- Set `fileset` to a file set that cannot contain files outside the `root` \('"$work"'/a\). This could change the files included in the result.'
|
[[:blank:]]*- Set `fileset` to a file set that cannot contain files outside the `root` \('"$work"'/a\). This could change the files included in the result.'
|
||||||
rm -rf -- *
|
rm -rf -- *
|
||||||
|
|
||||||
# non-regular and non-symlink files cannot be added to the Nix store
|
# non-regular and non-symlink files cannot be added to the Nix store
|
||||||
mkfifo a
|
mkfifo a
|
||||||
expectFailure 'toSource { root = ./.; fileset = ./a; }' 'lib.fileset.toSource: `fileset` contains a file that cannot be added to the store: '"$work"'/a
|
expectFailure 'toSource { root = ./.; fileset = ./a; }' 'lib.fileset.toSource: `fileset` contains a file that cannot be added to the store: '"$work"'/a
|
||||||
\s*This file is neither a regular file nor a symlink, the only file types supported by the Nix store.
|
[[:blank:]]*This file is neither a regular file nor a symlink, the only file types supported by the Nix store.
|
||||||
\s*Therefore the file set cannot be added to the Nix store as is. Make sure to not include that file to avoid this error.'
|
[[:blank:]]*Therefore the file set cannot be added to the Nix store as is. Make sure to not include that file to avoid this error.'
|
||||||
rm -rf -- *
|
rm -rf -- *
|
||||||
|
|
||||||
# Path coercion only works for paths
|
# Path coercion only works for paths
|
||||||
expectFailure 'toSource { root = ./.; fileset = 10; }' 'lib.fileset.toSource: `fileset` is of type int, but it should be a file set or a path instead.'
|
expectFailure 'toSource { root = ./.; fileset = 10; }' 'lib.fileset.toSource: `fileset` is of type int, but it should be a file set or a path instead.'
|
||||||
expectFailure 'toSource { root = ./.; fileset = "/some/path"; }' 'lib.fileset.toSource: `fileset` \("/some/path"\) is a string-like value, but it should be a file set or a path instead.
|
expectFailure 'toSource { root = ./.; fileset = "/some/path"; }' 'lib.fileset.toSource: `fileset` \("/some/path"\) is a string-like value, but it should be a file set or a path instead.
|
||||||
\s*Paths represented as strings are not supported by `lib.fileset`, use `lib.sources` or derivations instead.'
|
[[:blank:]]*Paths represented as strings are not supported by `lib.fileset`, use `lib.sources` or derivations instead.'
|
||||||
expectFailure 'toSource { root = ./.; fileset = cleanSourceWith { src = ./.; }; }' 'lib.fileset.toSource: `fileset` is a `lib.sources`-based value, but it should be a file set or a path instead.
|
expectFailure 'toSource { root = ./.; fileset = cleanSourceWith { src = ./.; }; }' 'lib.fileset.toSource: `fileset` is a `lib.sources`-based value, but it should be a file set or a path instead.
|
||||||
\s*To convert a `lib.sources`-based value to a file set you can use `lib.fileset.fromSource`.
|
[[:blank:]]*To convert a `lib.sources`-based value to a file set you can use `lib.fileset.fromSource`.
|
||||||
\s*Note that this only works for sources created from paths.'
|
[[:blank:]]*Note that this only works for sources created from paths.'
|
||||||
|
|
||||||
# Path coercion errors for non-existent paths
|
# Path coercion errors for non-existent paths
|
||||||
expectFailure 'toSource { root = ./.; fileset = ./a; }' 'lib.fileset.toSource: `fileset` \('"$work"'/a\) is a path that does not exist.
|
expectFailure 'toSource { root = ./.; fileset = ./a; }' 'lib.fileset.toSource: `fileset` \('"$work"'/a\) is a path that does not exist.
|
||||||
\s*To create a file set from a path that may not exist, use `lib.fileset.maybeMissing`.'
|
[[:blank:]]*To create a file set from a path that may not exist, use `lib.fileset.maybeMissing`.'
|
||||||
|
|
||||||
# File sets cannot be evaluated directly
|
# File sets cannot be evaluated directly
|
||||||
expectFailure 'union ./. ./.' 'lib.fileset: Directly evaluating a file set is not supported.
|
expectFailure 'union ./. ./.' 'lib.fileset: Directly evaluating a file set is not supported.
|
||||||
\s*To turn it into a usable source, use `lib.fileset.toSource`.
|
[[:blank:]]*To turn it into a usable source, use `lib.fileset.toSource`.
|
||||||
\s*To pretty-print the contents, use `lib.fileset.trace` or `lib.fileset.traceVal`.'
|
[[:blank:]]*To pretty-print the contents, use `lib.fileset.trace` or `lib.fileset.traceVal`.'
|
||||||
expectFailure '_emptyWithoutBase' 'lib.fileset: Directly evaluating a file set is not supported.
|
expectFailure '_emptyWithoutBase' 'lib.fileset: Directly evaluating a file set is not supported.
|
||||||
\s*To turn it into a usable source, use `lib.fileset.toSource`.
|
[[:blank:]]*To turn it into a usable source, use `lib.fileset.toSource`.
|
||||||
\s*To pretty-print the contents, use `lib.fileset.trace` or `lib.fileset.traceVal`.'
|
[[:blank:]]*To pretty-print the contents, use `lib.fileset.trace` or `lib.fileset.traceVal`.'
|
||||||
|
|
||||||
# Past versions of the internal representation are supported
|
# Past versions of the internal representation are supported
|
||||||
expectEqual '_coerce "<tests>: value" { _type = "fileset"; _internalVersion = 0; _internalBase = ./.; }' \
|
expectEqual '_coerce "<tests>: value" { _type = "fileset"; _internalVersion = 0; _internalBase = ./.; }' \
|
||||||
@ -423,9 +427,9 @@ expectEqual '_coerce "<tests>: value" { _type = "fileset"; _internalVersion = 2;
|
|||||||
|
|
||||||
# Future versions of the internal representation are unsupported
|
# Future versions of the internal representation are unsupported
|
||||||
expectFailure '_coerce "<tests>: value" { _type = "fileset"; _internalVersion = 4; }' '<tests>: value is a file set created from a future version of the file set library with a different internal representation:
|
expectFailure '_coerce "<tests>: value" { _type = "fileset"; _internalVersion = 4; }' '<tests>: value is a file set created from a future version of the file set library with a different internal representation:
|
||||||
\s*- Internal version of the file set: 4
|
[[:blank:]]*- Internal version of the file set: 4
|
||||||
\s*- Internal version of the library: 3
|
[[:blank:]]*- Internal version of the library: 3
|
||||||
\s*Make sure to update your Nixpkgs to have a newer version of `lib.fileset`.'
|
[[:blank:]]*Make sure to update your Nixpkgs to have a newer version of `lib.fileset`.'
|
||||||
|
|
||||||
# _create followed by _coerce should give the inputs back without any validation
|
# _create followed by _coerce should give the inputs back without any validation
|
||||||
expectEqual '{
|
expectEqual '{
|
||||||
@ -539,16 +543,16 @@ mkdir -p {foo,bar}/mock-root
|
|||||||
expectFailure 'with ((import <nixpkgs/lib>).extend (import <nixpkgs/lib/fileset/mock-splitRoot.nix>)).fileset;
|
expectFailure 'with ((import <nixpkgs/lib>).extend (import <nixpkgs/lib/fileset/mock-splitRoot.nix>)).fileset;
|
||||||
toSource { root = ./.; fileset = union ./foo/mock-root ./bar/mock-root; }
|
toSource { root = ./.; fileset = union ./foo/mock-root ./bar/mock-root; }
|
||||||
' 'lib.fileset.union: Filesystem roots are not the same:
|
' 'lib.fileset.union: Filesystem roots are not the same:
|
||||||
\s*First argument: Filesystem root is "'"$work"'/foo/mock-root"
|
[[:blank:]]*First argument: Filesystem root is "'"$work"'/foo/mock-root"
|
||||||
\s*Second argument: Filesystem root is "'"$work"'/bar/mock-root"
|
[[:blank:]]*Second argument: Filesystem root is "'"$work"'/bar/mock-root"
|
||||||
\s*Different filesystem roots are not supported.'
|
[[:blank:]]*Different filesystem roots are not supported.'
|
||||||
|
|
||||||
expectFailure 'with ((import <nixpkgs/lib>).extend (import <nixpkgs/lib/fileset/mock-splitRoot.nix>)).fileset;
|
expectFailure 'with ((import <nixpkgs/lib>).extend (import <nixpkgs/lib/fileset/mock-splitRoot.nix>)).fileset;
|
||||||
toSource { root = ./.; fileset = unions [ ./foo/mock-root ./bar/mock-root ]; }
|
toSource { root = ./.; fileset = unions [ ./foo/mock-root ./bar/mock-root ]; }
|
||||||
' 'lib.fileset.unions: Filesystem roots are not the same:
|
' 'lib.fileset.unions: Filesystem roots are not the same:
|
||||||
\s*Element 0: Filesystem root is "'"$work"'/foo/mock-root"
|
[[:blank:]]*Element 0: Filesystem root is "'"$work"'/foo/mock-root"
|
||||||
\s*Element 1: Filesystem root is "'"$work"'/bar/mock-root"
|
[[:blank:]]*Element 1: Filesystem root is "'"$work"'/bar/mock-root"
|
||||||
\s*Different filesystem roots are not supported.'
|
[[:blank:]]*Different filesystem roots are not supported.'
|
||||||
rm -rf -- *
|
rm -rf -- *
|
||||||
|
|
||||||
# Coercion errors show the correct context
|
# Coercion errors show the correct context
|
||||||
@ -652,9 +656,9 @@ mkdir -p {foo,bar}/mock-root
|
|||||||
expectFailure 'with ((import <nixpkgs/lib>).extend (import <nixpkgs/lib/fileset/mock-splitRoot.nix>)).fileset;
|
expectFailure 'with ((import <nixpkgs/lib>).extend (import <nixpkgs/lib/fileset/mock-splitRoot.nix>)).fileset;
|
||||||
toSource { root = ./.; fileset = intersection ./foo/mock-root ./bar/mock-root; }
|
toSource { root = ./.; fileset = intersection ./foo/mock-root ./bar/mock-root; }
|
||||||
' 'lib.fileset.intersection: Filesystem roots are not the same:
|
' 'lib.fileset.intersection: Filesystem roots are not the same:
|
||||||
\s*First argument: Filesystem root is "'"$work"'/foo/mock-root"
|
[[:blank:]]*First argument: Filesystem root is "'"$work"'/foo/mock-root"
|
||||||
\s*Second argument: Filesystem root is "'"$work"'/bar/mock-root"
|
[[:blank:]]*Second argument: Filesystem root is "'"$work"'/bar/mock-root"
|
||||||
\s*Different filesystem roots are not supported.'
|
[[:blank:]]*Different filesystem roots are not supported.'
|
||||||
rm -rf -- *
|
rm -rf -- *
|
||||||
|
|
||||||
# Coercion errors show the correct context
|
# Coercion errors show the correct context
|
||||||
@ -761,8 +765,8 @@ rm -rf -- *
|
|||||||
# Also not the other way around
|
# Also not the other way around
|
||||||
mkdir a
|
mkdir a
|
||||||
expectFailure 'toSource { root = ./a; fileset = difference ./. ./a; }' 'lib.fileset.toSource: `fileset` could contain files in '"$work"', which is not under the `root` \('"$work"'/a\). Potential solutions:
|
expectFailure 'toSource { root = ./a; fileset = difference ./. ./a; }' 'lib.fileset.toSource: `fileset` could contain files in '"$work"', which is not under the `root` \('"$work"'/a\). Potential solutions:
|
||||||
\s*- Set `root` to '"$work"' or any directory higher up. This changes the layout of the resulting store path.
|
[[:blank:]]*- Set `root` to '"$work"' or any directory higher up. This changes the layout of the resulting store path.
|
||||||
\s*- Set `fileset` to a file set that cannot contain files outside the `root` \('"$work"'/a\). This could change the files included in the result.'
|
[[:blank:]]*- Set `fileset` to a file set that cannot contain files outside the `root` \('"$work"'/a\). This could change the files included in the result.'
|
||||||
rm -rf -- *
|
rm -rf -- *
|
||||||
|
|
||||||
# Difference actually works
|
# Difference actually works
|
||||||
@ -839,7 +843,7 @@ expectFailure 'fileFilter null (abort "this is not needed")' 'lib.fileset.fileFi
|
|||||||
|
|
||||||
# The second argument needs to be an existing path
|
# The second argument needs to be an existing path
|
||||||
expectFailure 'fileFilter (file: abort "this is not needed") _emptyWithoutBase' 'lib.fileset.fileFilter: Second argument is a file set, but it should be a path instead.
|
expectFailure 'fileFilter (file: abort "this is not needed") _emptyWithoutBase' 'lib.fileset.fileFilter: Second argument is a file set, but it should be a path instead.
|
||||||
\s*If you need to filter files in a file set, use `intersection fileset \(fileFilter pred \./\.\)` instead.'
|
[[:blank:]]*If you need to filter files in a file set, use `intersection fileset \(fileFilter pred \./\.\)` instead.'
|
||||||
expectFailure 'fileFilter (file: abort "this is not needed") null' 'lib.fileset.fileFilter: Second argument is of type null, but it should be a path instead.'
|
expectFailure 'fileFilter (file: abort "this is not needed") null' 'lib.fileset.fileFilter: Second argument is of type null, but it should be a path instead.'
|
||||||
expectFailure 'fileFilter (file: abort "this is not needed") ./a' 'lib.fileset.fileFilter: Second argument \('"$work"'/a\) is a path that does not exist.'
|
expectFailure 'fileFilter (file: abort "this is not needed") ./a' 'lib.fileset.fileFilter: Second argument \('"$work"'/a\) is a path that does not exist.'
|
||||||
|
|
||||||
@ -1103,7 +1107,7 @@ rm -rf -- *
|
|||||||
|
|
||||||
# String-like values are not supported
|
# String-like values are not supported
|
||||||
expectFailure 'fromSource (lib.cleanSource "")' 'lib.fileset.fromSource: The source origin of the argument is a string-like value \(""\), but it should be a path instead.
|
expectFailure 'fromSource (lib.cleanSource "")' 'lib.fileset.fromSource: The source origin of the argument is a string-like value \(""\), but it should be a path instead.
|
||||||
\s*Sources created from paths in strings cannot be turned into file sets, use `lib.sources` or derivations instead.'
|
[[:blank:]]*Sources created from paths in strings cannot be turned into file sets, use `lib.sources` or derivations instead.'
|
||||||
|
|
||||||
# Wrong type
|
# Wrong type
|
||||||
expectFailure 'fromSource null' 'lib.fileset.fromSource: The source origin of the argument is of type null, but it should be a path instead.'
|
expectFailure 'fromSource null' 'lib.fileset.fromSource: The source origin of the argument is of type null, but it should be a path instead.'
|
||||||
@ -1420,10 +1424,10 @@ expectEqual '(import '"$storePath"' { fs = lib.fileset; }).outPath' \""$storePat
|
|||||||
|
|
||||||
## But it fails if the path is imported with a fetcher that doesn't remove .git (like just using "${./.}")
|
## But it fails if the path is imported with a fetcher that doesn't remove .git (like just using "${./.}")
|
||||||
expectFailure 'import "${./.}" { fs = lib.fileset; }' 'lib.fileset.gitTracked: The argument \(.*\) is a store path within a working tree of a Git repository.
|
expectFailure 'import "${./.}" { fs = lib.fileset; }' 'lib.fileset.gitTracked: The argument \(.*\) is a store path within a working tree of a Git repository.
|
||||||
\s*This indicates that a source directory was imported into the store using a method such as `import "\$\{./.\}"` or `path:.`.
|
[[:blank:]]*This indicates that a source directory was imported into the store using a method such as `import "\$\{./.\}"` or `path:.`.
|
||||||
\s*This function currently does not support such a use case, since it currently relies on `builtins.fetchGit`.
|
[[:blank:]]*This function currently does not support such a use case, since it currently relies on `builtins.fetchGit`.
|
||||||
\s*You could make this work by using a fetcher such as `fetchGit` instead of copying the whole repository.
|
[[:blank:]]*You could make this work by using a fetcher such as `fetchGit` instead of copying the whole repository.
|
||||||
\s*If you can'\''t avoid copying the repo to the store, see https://github.com/NixOS/nix/issues/9292.'
|
[[:blank:]]*If you can'\''t avoid copying the repo to the store, see https://github.com/NixOS/nix/issues/9292.'
|
||||||
|
|
||||||
## Even with submodules
|
## Even with submodules
|
||||||
if [[ -n "$fetchGitSupportsSubmodules" ]]; then
|
if [[ -n "$fetchGitSupportsSubmodules" ]]; then
|
||||||
@ -1447,15 +1451,15 @@ if [[ -n "$fetchGitSupportsSubmodules" ]]; then
|
|||||||
|
|
||||||
## But it fails if the path is imported with a fetcher that doesn't remove .git (like just using "${./.}")
|
## But it fails if the path is imported with a fetcher that doesn't remove .git (like just using "${./.}")
|
||||||
expectFailure 'import "${./.}" { fs = lib.fileset; }' 'lib.fileset.gitTrackedWith: The second argument \(.*\) is a store path within a working tree of a Git repository.
|
expectFailure 'import "${./.}" { fs = lib.fileset; }' 'lib.fileset.gitTrackedWith: The second argument \(.*\) is a store path within a working tree of a Git repository.
|
||||||
\s*This indicates that a source directory was imported into the store using a method such as `import "\$\{./.\}"` or `path:.`.
|
[[:blank:]]*This indicates that a source directory was imported into the store using a method such as `import "\$\{./.\}"` or `path:.`.
|
||||||
\s*This function currently does not support such a use case, since it currently relies on `builtins.fetchGit`.
|
[[:blank:]]*This function currently does not support such a use case, since it currently relies on `builtins.fetchGit`.
|
||||||
\s*You could make this work by using a fetcher such as `fetchGit` instead of copying the whole repository.
|
[[:blank:]]*You could make this work by using a fetcher such as `fetchGit` instead of copying the whole repository.
|
||||||
\s*If you can'\''t avoid copying the repo to the store, see https://github.com/NixOS/nix/issues/9292.'
|
[[:blank:]]*If you can'\''t avoid copying the repo to the store, see https://github.com/NixOS/nix/issues/9292.'
|
||||||
expectFailure 'import "${./.}/sub" { fs = lib.fileset; }' 'lib.fileset.gitTracked: The argument \(.*/sub\) is a store path within a working tree of a Git repository.
|
expectFailure 'import "${./.}/sub" { fs = lib.fileset; }' 'lib.fileset.gitTracked: The argument \(.*/sub\) is a store path within a working tree of a Git repository.
|
||||||
\s*This indicates that a source directory was imported into the store using a method such as `import "\$\{./.\}"` or `path:.`.
|
[[:blank:]]*This indicates that a source directory was imported into the store using a method such as `import "\$\{./.\}"` or `path:.`.
|
||||||
\s*This function currently does not support such a use case, since it currently relies on `builtins.fetchGit`.
|
[[:blank:]]*This function currently does not support such a use case, since it currently relies on `builtins.fetchGit`.
|
||||||
\s*You could make this work by using a fetcher such as `fetchGit` instead of copying the whole repository.
|
[[:blank:]]*You could make this work by using a fetcher such as `fetchGit` instead of copying the whole repository.
|
||||||
\s*If you can'\''t avoid copying the repo to the store, see https://github.com/NixOS/nix/issues/9292.'
|
[[:blank:]]*If you can'\''t avoid copying the repo to the store, see https://github.com/NixOS/nix/issues/9292.'
|
||||||
fi
|
fi
|
||||||
rm -rf -- *
|
rm -rf -- *
|
||||||
|
|
||||||
|
@ -17174,6 +17174,12 @@
|
|||||||
fingerprint = "E173 237A C782 296D 98F5 ADAC E13D FD4B 4712 7951";
|
fingerprint = "E173 237A C782 296D 98F5 ADAC E13D FD4B 4712 7951";
|
||||||
}];
|
}];
|
||||||
};
|
};
|
||||||
|
sdht0 = {
|
||||||
|
email = "nixpkgs@sdht.in";
|
||||||
|
github = "sdht0";
|
||||||
|
githubId = 867424;
|
||||||
|
name = "Siddhartha Sahu";
|
||||||
|
};
|
||||||
sdier = {
|
sdier = {
|
||||||
email = "scott@dier.name";
|
email = "scott@dier.name";
|
||||||
matrix = "@sdier:matrix.org";
|
matrix = "@sdier:matrix.org";
|
||||||
|
@ -283,6 +283,10 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m
|
|||||||
|
|
||||||
- Cinnamon has been updated to 6.0. Please beware that the [Wayland session](https://blog.linuxmint.com/?p=4591) is still experimental in this release.
|
- Cinnamon has been updated to 6.0. Please beware that the [Wayland session](https://blog.linuxmint.com/?p=4591) is still experimental in this release.
|
||||||
|
|
||||||
|
- New `boot.loader.systemd-boot.xbootldrMountPoint` allows setting up a separate [XBOOTLDR partition](https://uapi-group.org/specifications/specs/boot_loader_specification/) to store boot files. Useful on systems with a small EFI System partition that cannot be easily repartitioned.
|
||||||
|
|
||||||
|
- `boot.loader.systemd-boot` will now verify that `efiSysMountPoint` (and `xbootldrMountPoint` if configured) are mounted partitions.
|
||||||
|
|
||||||
- `services.postgresql.extraPlugins` changed its type from just a list of packages to also a function that returns such a list.
|
- `services.postgresql.extraPlugins` changed its type from just a list of packages to also a function that returns such a list.
|
||||||
For example a config line like ``services.postgresql.extraPlugins = with pkgs.postgresql_11.pkgs; [ postgis ];`` is recommended to be changed to ``services.postgresql.extraPlugins = ps: with ps; [ postgis ];``;
|
For example a config line like ``services.postgresql.extraPlugins = with pkgs.postgresql_11.pkgs; [ postgis ];`` is recommended to be changed to ``services.postgresql.extraPlugins = ps: with ps; [ postgis ];``;
|
||||||
|
|
||||||
@ -386,6 +390,11 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m
|
|||||||
|
|
||||||
- The `mpich` package expression now requires `withPm` to be a list, e.g. `"hydra:gforker"` becomes `[ "hydra" "gforker" ]`.
|
- The `mpich` package expression now requires `withPm` to be a list, e.g. `"hydra:gforker"` becomes `[ "hydra" "gforker" ]`.
|
||||||
|
|
||||||
|
- When merging systemd unit options (of type `unitOption`),
|
||||||
|
if at least one definition is a list, all those which aren't are now lifted into a list,
|
||||||
|
making it possible to accumulate definitions without resorting to `mkForce`,
|
||||||
|
hence to retain the definitions not anticipating that need.
|
||||||
|
|
||||||
- YouTrack is bumped to 2023.3. The update is not performed automatically, it requires manual interaction. See the YouTrack section in the manual for details.
|
- YouTrack is bumped to 2023.3. The update is not performed automatically, it requires manual interaction. See the YouTrack section in the manual for details.
|
||||||
|
|
||||||
- QtMultimedia has changed its default backend to `QT_MEDIA_BACKEND=ffmpeg` (previously `gstreamer` on Linux or `darwin` on MacOS).
|
- QtMultimedia has changed its default backend to `QT_MEDIA_BACKEND=ffmpeg` (previously `gstreamer` on Linux or `darwin` on MacOS).
|
||||||
|
@ -56,6 +56,14 @@ This partition table type uses GPT and:
|
|||||||
- creates an FAT32 ESP partition from 8MiB to specified `bootSize` parameter (256MiB by default), set it bootable ;
|
- creates an FAT32 ESP partition from 8MiB to specified `bootSize` parameter (256MiB by default), set it bootable ;
|
||||||
- creates an primary ext4 partition starting after the boot partition and extending to the full disk image
|
- creates an primary ext4 partition starting after the boot partition and extending to the full disk image
|
||||||
|
|
||||||
|
#### `efixbootldr`
|
||||||
|
|
||||||
|
This partition table type uses GPT and:
|
||||||
|
|
||||||
|
- creates an FAT32 ESP partition from 8MiB to 100MiB, set it bootable ;
|
||||||
|
- creates an FAT32 BOOT partition from 100MiB to specified `bootSize` parameter (256MiB by default), set `bls_boot` flag ;
|
||||||
|
- creates an primary ext4 partition starting after the boot partition and extending to the full disk image
|
||||||
|
|
||||||
#### `hybrid`
|
#### `hybrid`
|
||||||
|
|
||||||
This partition table type uses GPT and:
|
This partition table type uses GPT and:
|
||||||
@ -111,19 +119,7 @@ To solve this, you can run `fdisk -l $image` and generate `dd if=$image of=$imag
|
|||||||
# When setting one of `user' or `group', the other needs to be set too.
|
# When setting one of `user' or `group', the other needs to be set too.
|
||||||
contents ? []
|
contents ? []
|
||||||
|
|
||||||
, # Type of partition table to use; either "legacy", "efi", or "none".
|
, # Type of partition table to use; described in the `Image Partitioning` section above.
|
||||||
# For "efi" images, the GPT partition table is used and a mandatory ESP
|
|
||||||
# partition of reasonable size is created in addition to the root partition.
|
|
||||||
# For "legacy", the msdos partition table is used and a single large root
|
|
||||||
# partition is created.
|
|
||||||
# For "legacy+gpt", the GPT partition table is used, a 1MiB no-fs partition for
|
|
||||||
# use by the bootloader is created, and a single large root partition is
|
|
||||||
# created.
|
|
||||||
# For "hybrid", the GPT partition table is used and a mandatory ESP
|
|
||||||
# partition of reasonable size is created in addition to the root partition.
|
|
||||||
# Also a legacy MBR will be present.
|
|
||||||
# For "none", no partition table is created. Enabling `installBootLoader`
|
|
||||||
# most likely fails as GRUB will probably refuse to install.
|
|
||||||
partitionTableType ? "legacy"
|
partitionTableType ? "legacy"
|
||||||
|
|
||||||
, # Whether to invoke `switch-to-configuration boot` during image creation
|
, # Whether to invoke `switch-to-configuration boot` during image creation
|
||||||
@ -193,11 +189,11 @@ To solve this, you can run `fdisk -l $image` and generate `dd if=$image of=$imag
|
|||||||
additionalPaths ? []
|
additionalPaths ? []
|
||||||
}:
|
}:
|
||||||
|
|
||||||
assert (lib.assertOneOf "partitionTableType" partitionTableType [ "legacy" "legacy+gpt" "efi" "hybrid" "none" ]);
|
assert (lib.assertOneOf "partitionTableType" partitionTableType [ "legacy" "legacy+gpt" "efi" "efixbootldr" "hybrid" "none" ]);
|
||||||
assert (lib.assertMsg (fsType == "ext4" && deterministic -> rootFSUID != null) "In deterministic mode with a ext4 partition, rootFSUID must be non-null, by default, it is equal to rootGPUID.");
|
assert (lib.assertMsg (fsType == "ext4" && deterministic -> rootFSUID != null) "In deterministic mode with a ext4 partition, rootFSUID must be non-null, by default, it is equal to rootGPUID.");
|
||||||
# We use -E offset=X below, which is only supported by e2fsprogs
|
# We use -E offset=X below, which is only supported by e2fsprogs
|
||||||
assert (lib.assertMsg (partitionTableType != "none" -> fsType == "ext4") "to produce a partition table, we need to use -E offset flag which is support only for fsType = ext4");
|
assert (lib.assertMsg (partitionTableType != "none" -> fsType == "ext4") "to produce a partition table, we need to use -E offset flag which is support only for fsType = ext4");
|
||||||
assert (lib.assertMsg (touchEFIVars -> partitionTableType == "hybrid" || partitionTableType == "efi" || partitionTableType == "legacy+gpt") "EFI variables can be used only with a partition table of type: hybrid, efi or legacy+gpt.");
|
assert (lib.assertMsg (touchEFIVars -> partitionTableType == "hybrid" || partitionTableType == "efi" || partitionTableType == "efixbootldr" || partitionTableType == "legacy+gpt") "EFI variables can be used only with a partition table of type: hybrid, efi, efixbootldr, or legacy+gpt.");
|
||||||
# If only Nix store image, then: contents must be empty, configFile must be unset, and we should no install bootloader.
|
# If only Nix store image, then: contents must be empty, configFile must be unset, and we should no install bootloader.
|
||||||
assert (lib.assertMsg (onlyNixStore -> contents == [] && configFile == null && !installBootLoader) "In a only Nix store image, the contents must be empty, no configuration must be provided and no bootloader should be installed.");
|
assert (lib.assertMsg (onlyNixStore -> contents == [] && configFile == null && !installBootLoader) "In a only Nix store image, the contents must be empty, no configuration must be provided and no bootloader should be installed.");
|
||||||
# Either both or none of {user,group} need to be set
|
# Either both or none of {user,group} need to be set
|
||||||
@ -225,6 +221,7 @@ let format' = format; in let
|
|||||||
legacy = "1";
|
legacy = "1";
|
||||||
"legacy+gpt" = "2";
|
"legacy+gpt" = "2";
|
||||||
efi = "2";
|
efi = "2";
|
||||||
|
efixbootldr = "3";
|
||||||
hybrid = "3";
|
hybrid = "3";
|
||||||
}.${partitionTableType};
|
}.${partitionTableType};
|
||||||
|
|
||||||
@ -266,6 +263,23 @@ let format' = format; in let
|
|||||||
$diskImage
|
$diskImage
|
||||||
''}
|
''}
|
||||||
'';
|
'';
|
||||||
|
efixbootldr = ''
|
||||||
|
parted --script $diskImage -- \
|
||||||
|
mklabel gpt \
|
||||||
|
mkpart ESP fat32 8MiB 100MiB \
|
||||||
|
set 1 boot on \
|
||||||
|
mkpart BOOT fat32 100MiB ${bootSize} \
|
||||||
|
set 2 bls_boot on \
|
||||||
|
mkpart ROOT ext4 ${bootSize} -1
|
||||||
|
${optionalString deterministic ''
|
||||||
|
sgdisk \
|
||||||
|
--disk-guid=97FD5997-D90B-4AA3-8D16-C1723AEA73C \
|
||||||
|
--partition-guid=1:1C06F03B-704E-4657-B9CD-681A087A2FDC \
|
||||||
|
--partition-guid=2:970C694F-AFD0-4B99-B750-CDB7A329AB6F \
|
||||||
|
--partition-guid=3:${rootGPUID} \
|
||||||
|
$diskImage
|
||||||
|
''}
|
||||||
|
'';
|
||||||
hybrid = ''
|
hybrid = ''
|
||||||
parted --script $diskImage -- \
|
parted --script $diskImage -- \
|
||||||
mklabel gpt \
|
mklabel gpt \
|
||||||
@ -436,7 +450,7 @@ let format' = format; in let
|
|||||||
diskImage=nixos.raw
|
diskImage=nixos.raw
|
||||||
|
|
||||||
${if diskSize == "auto" then ''
|
${if diskSize == "auto" then ''
|
||||||
${if partitionTableType == "efi" || partitionTableType == "hybrid" then ''
|
${if partitionTableType == "efi" || partitionTableType == "efixbootldr" || partitionTableType == "hybrid" then ''
|
||||||
# Add the GPT at the end
|
# Add the GPT at the end
|
||||||
gptSpace=$(( 512 * 34 * 1 ))
|
gptSpace=$(( 512 * 34 * 1 ))
|
||||||
# Normally we'd need to account for alignment and things, if bootSize
|
# Normally we'd need to account for alignment and things, if bootSize
|
||||||
@ -570,6 +584,15 @@ let format' = format; in let
|
|||||||
|
|
||||||
${optionalString touchEFIVars "mount -t efivarfs efivarfs /sys/firmware/efi/efivars"}
|
${optionalString touchEFIVars "mount -t efivarfs efivarfs /sys/firmware/efi/efivars"}
|
||||||
''}
|
''}
|
||||||
|
${optionalString (partitionTableType == "efixbootldr") ''
|
||||||
|
mkdir -p /mnt/{boot,efi}
|
||||||
|
mkfs.vfat -n ESP /dev/vda1
|
||||||
|
mkfs.vfat -n BOOT /dev/vda2
|
||||||
|
mount /dev/vda1 /mnt/efi
|
||||||
|
mount /dev/vda2 /mnt/boot
|
||||||
|
|
||||||
|
${optionalString touchEFIVars "mount -t efivarfs efivarfs /sys/firmware/efi/efivars"}
|
||||||
|
''}
|
||||||
|
|
||||||
# Install a configuration.nix
|
# Install a configuration.nix
|
||||||
mkdir -p /mnt/etc/nixos
|
mkdir -p /mnt/etc/nixos
|
||||||
|
@ -21,14 +21,8 @@ in rec {
|
|||||||
let
|
let
|
||||||
defs' = filterOverrides defs;
|
defs' = filterOverrides defs;
|
||||||
in
|
in
|
||||||
if isList (head defs').value
|
if any (def: isList def.value) defs'
|
||||||
then concatMap (def:
|
then concatMap (def: toList def.value) defs'
|
||||||
if builtins.typeOf def.value == "list"
|
|
||||||
then def.value
|
|
||||||
else
|
|
||||||
throw "The definitions for systemd unit options should be either all lists, representing repeatable options, or all non-lists, but for the option ${showOption loc}, the definitions are a mix of list and non-list ${lib.options.showDefs defs'}"
|
|
||||||
) defs'
|
|
||||||
|
|
||||||
else mergeEqualOption loc defs';
|
else mergeEqualOption loc defs';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -331,7 +331,7 @@ let
|
|||||||
formatListener = idx: listener:
|
formatListener = idx: listener:
|
||||||
[
|
[
|
||||||
"listener ${toString listener.port} ${toString listener.address}"
|
"listener ${toString listener.port} ${toString listener.address}"
|
||||||
"acl_file /etc/mosquitto/mosquitto-acl-${toString idx}.conf"
|
"acl_file /etc/mosquitto/acl-${toString idx}.conf"
|
||||||
]
|
]
|
||||||
++ optional (! listener.omitPasswordAuth) "password_file ${cfg.dataDir}/passwd-${toString idx}"
|
++ optional (! listener.omitPasswordAuth) "password_file ${cfg.dataDir}/passwd-${toString idx}"
|
||||||
++ formatFreeform {} listener.settings
|
++ formatFreeform {} listener.settings
|
||||||
@ -690,7 +690,7 @@ in
|
|||||||
environment.etc = listToAttrs (
|
environment.etc = listToAttrs (
|
||||||
imap0
|
imap0
|
||||||
(idx: listener: {
|
(idx: listener: {
|
||||||
name = "mosquitto/mosquitto-acl-${toString idx}.conf";
|
name = "mosquitto/acl-${toString idx}.conf";
|
||||||
value = {
|
value = {
|
||||||
user = config.users.users.mosquitto.name;
|
user = config.users.users.mosquitto.name;
|
||||||
group = config.users.users.mosquitto.group;
|
group = config.users.users.mosquitto.group;
|
||||||
|
@ -17,6 +17,9 @@ from dataclasses import dataclass
|
|||||||
|
|
||||||
# These values will be replaced with actual values during the package build
|
# These values will be replaced with actual values during the package build
|
||||||
EFI_SYS_MOUNT_POINT = "@efiSysMountPoint@"
|
EFI_SYS_MOUNT_POINT = "@efiSysMountPoint@"
|
||||||
|
BOOT_MOUNT_POINT = "@bootMountPoint@"
|
||||||
|
LOADER_CONF = f"{EFI_SYS_MOUNT_POINT}/loader/loader.conf" # Always stored on the ESP
|
||||||
|
NIXOS_DIR = "@nixosDir@"
|
||||||
TIMEOUT = "@timeout@"
|
TIMEOUT = "@timeout@"
|
||||||
EDITOR = "@editor@" == "1"
|
EDITOR = "@editor@" == "1"
|
||||||
CONSOLE_MODE = "@consoleMode@"
|
CONSOLE_MODE = "@consoleMode@"
|
||||||
@ -28,6 +31,7 @@ CONFIGURATION_LIMIT = int("@configurationLimit@")
|
|||||||
CAN_TOUCH_EFI_VARIABLES = "@canTouchEfiVariables@"
|
CAN_TOUCH_EFI_VARIABLES = "@canTouchEfiVariables@"
|
||||||
GRACEFUL = "@graceful@"
|
GRACEFUL = "@graceful@"
|
||||||
COPY_EXTRA_FILES = "@copyExtraFiles@"
|
COPY_EXTRA_FILES = "@copyExtraFiles@"
|
||||||
|
CHECK_MOUNTPOINTS = "@checkMountpoints@"
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class BootSpec:
|
class BootSpec:
|
||||||
@ -87,7 +91,7 @@ def generation_conf_filename(profile: str | None, generation: int, specialisatio
|
|||||||
|
|
||||||
|
|
||||||
def write_loader_conf(profile: str | None, generation: int, specialisation: str | None) -> None:
|
def write_loader_conf(profile: str | None, generation: int, specialisation: str | None) -> None:
|
||||||
with open(f"{EFI_SYS_MOUNT_POINT}/loader/loader.conf.tmp", 'w') as f:
|
with open(f"{LOADER_CONF}.tmp", 'w') as f:
|
||||||
if TIMEOUT != "":
|
if TIMEOUT != "":
|
||||||
f.write(f"timeout {TIMEOUT}\n")
|
f.write(f"timeout {TIMEOUT}\n")
|
||||||
f.write("default %s\n" % generation_conf_filename(profile, generation, specialisation))
|
f.write("default %s\n" % generation_conf_filename(profile, generation, specialisation))
|
||||||
@ -96,7 +100,7 @@ def write_loader_conf(profile: str | None, generation: int, specialisation: str
|
|||||||
f.write(f"console-mode {CONSOLE_MODE}\n")
|
f.write(f"console-mode {CONSOLE_MODE}\n")
|
||||||
f.flush()
|
f.flush()
|
||||||
os.fsync(f.fileno())
|
os.fsync(f.fileno())
|
||||||
os.rename(f"{EFI_SYS_MOUNT_POINT}/loader/loader.conf.tmp", f"{EFI_SYS_MOUNT_POINT}/loader/loader.conf")
|
os.rename(f"{LOADER_CONF}.tmp", LOADER_CONF)
|
||||||
|
|
||||||
|
|
||||||
def get_bootspec(profile: str | None, generation: int) -> BootSpec:
|
def get_bootspec(profile: str | None, generation: int) -> BootSpec:
|
||||||
@ -126,9 +130,9 @@ def copy_from_file(file: str, dry_run: bool = False) -> str:
|
|||||||
store_file_path = os.path.realpath(file)
|
store_file_path = os.path.realpath(file)
|
||||||
suffix = os.path.basename(store_file_path)
|
suffix = os.path.basename(store_file_path)
|
||||||
store_dir = os.path.basename(os.path.dirname(store_file_path))
|
store_dir = os.path.basename(os.path.dirname(store_file_path))
|
||||||
efi_file_path = "/efi/nixos/%s-%s.efi" % (store_dir, suffix)
|
efi_file_path = f"{NIXOS_DIR}/{store_dir}-{suffix}.efi"
|
||||||
if not dry_run:
|
if not dry_run:
|
||||||
copy_if_not_exists(store_file_path, f"{EFI_SYS_MOUNT_POINT}%s" % (efi_file_path))
|
copy_if_not_exists(store_file_path, f"{BOOT_MOUNT_POINT}{efi_file_path}")
|
||||||
return efi_file_path
|
return efi_file_path
|
||||||
|
|
||||||
def write_entry(profile: str | None, generation: int, specialisation: str | None,
|
def write_entry(profile: str | None, generation: int, specialisation: str | None,
|
||||||
@ -145,7 +149,7 @@ def write_entry(profile: str | None, generation: int, specialisation: str | None
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
if bootspec.initrdSecrets is not None:
|
if bootspec.initrdSecrets is not None:
|
||||||
subprocess.check_call([bootspec.initrdSecrets, f"{EFI_SYS_MOUNT_POINT}%s" % (initrd)])
|
subprocess.check_call([bootspec.initrdSecrets, f"{BOOT_MOUNT_POINT}%s" % (initrd)])
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
if current:
|
if current:
|
||||||
print("failed to create initrd secrets!", file=sys.stderr)
|
print("failed to create initrd secrets!", file=sys.stderr)
|
||||||
@ -155,7 +159,7 @@ def write_entry(profile: str | None, generation: int, specialisation: str | None
|
|||||||
f'for "{title} - Configuration {generation}", an older generation', file=sys.stderr)
|
f'for "{title} - Configuration {generation}", an older generation', file=sys.stderr)
|
||||||
print("note: this is normal after having removed "
|
print("note: this is normal after having removed "
|
||||||
"or renamed a file in `boot.initrd.secrets`", file=sys.stderr)
|
"or renamed a file in `boot.initrd.secrets`", file=sys.stderr)
|
||||||
entry_file = f"{EFI_SYS_MOUNT_POINT}/loader/entries/%s" % (
|
entry_file = f"{BOOT_MOUNT_POINT}/loader/entries/%s" % (
|
||||||
generation_conf_filename(profile, generation, specialisation))
|
generation_conf_filename(profile, generation, specialisation))
|
||||||
tmp_path = "%s.tmp" % (entry_file)
|
tmp_path = "%s.tmp" % (entry_file)
|
||||||
kernel_params = "init=%s " % bootspec.init
|
kernel_params = "init=%s " % bootspec.init
|
||||||
@ -202,14 +206,14 @@ def get_generations(profile: str | None = None) -> list[SystemIdentifier]:
|
|||||||
|
|
||||||
|
|
||||||
def remove_old_entries(gens: list[SystemIdentifier]) -> None:
|
def remove_old_entries(gens: list[SystemIdentifier]) -> None:
|
||||||
rex_profile = re.compile(r"^" + re.escape(EFI_SYS_MOUNT_POINT) + "/loader/entries/nixos-(.*)-generation-.*\.conf$")
|
rex_profile = re.compile(r"^" + re.escape(BOOT_MOUNT_POINT) + "/loader/entries/nixos-(.*)-generation-.*\.conf$")
|
||||||
rex_generation = re.compile(r"^" + re.escape(EFI_SYS_MOUNT_POINT) + "/loader/entries/nixos.*-generation-([0-9]+)(-specialisation-.*)?\.conf$")
|
rex_generation = re.compile(r"^" + re.escape(BOOT_MOUNT_POINT) + "/loader/entries/nixos.*-generation-([0-9]+)(-specialisation-.*)?\.conf$")
|
||||||
known_paths = []
|
known_paths = []
|
||||||
for gen in gens:
|
for gen in gens:
|
||||||
bootspec = get_bootspec(gen.profile, gen.generation)
|
bootspec = get_bootspec(gen.profile, gen.generation)
|
||||||
known_paths.append(copy_from_file(bootspec.kernel, True))
|
known_paths.append(copy_from_file(bootspec.kernel, True))
|
||||||
known_paths.append(copy_from_file(bootspec.initrd, True))
|
known_paths.append(copy_from_file(bootspec.initrd, True))
|
||||||
for path in glob.iglob(f"{EFI_SYS_MOUNT_POINT}/loader/entries/nixos*-generation-[1-9]*.conf"):
|
for path in glob.iglob(f"{BOOT_MOUNT_POINT}/loader/entries/nixos*-generation-[1-9]*.conf"):
|
||||||
if rex_profile.match(path):
|
if rex_profile.match(path):
|
||||||
prof = rex_profile.sub(r"\1", path)
|
prof = rex_profile.sub(r"\1", path)
|
||||||
else:
|
else:
|
||||||
@ -220,11 +224,18 @@ def remove_old_entries(gens: list[SystemIdentifier]) -> None:
|
|||||||
continue
|
continue
|
||||||
if not (prof, gen_number, None) in gens:
|
if not (prof, gen_number, None) in gens:
|
||||||
os.unlink(path)
|
os.unlink(path)
|
||||||
for path in glob.iglob(f"{EFI_SYS_MOUNT_POINT}/efi/nixos/*"):
|
for path in glob.iglob(f"{BOOT_MOUNT_POINT}/{NIXOS_DIR}/*"):
|
||||||
if not path in known_paths and not os.path.isdir(path):
|
if not path in known_paths and not os.path.isdir(path):
|
||||||
os.unlink(path)
|
os.unlink(path)
|
||||||
|
|
||||||
|
|
||||||
|
def cleanup_esp() -> None:
|
||||||
|
for path in glob.iglob(f"{EFI_SYS_MOUNT_POINT}/loader/entries/nixos*"):
|
||||||
|
os.unlink(path)
|
||||||
|
if os.path.isdir(f"{EFI_SYS_MOUNT_POINT}/{NIXOS_DIR}"):
|
||||||
|
shutil.rmtree(f"{EFI_SYS_MOUNT_POINT}/{NIXOS_DIR}")
|
||||||
|
|
||||||
|
|
||||||
def get_profiles() -> list[str]:
|
def get_profiles() -> list[str]:
|
||||||
if os.path.isdir("/nix/var/nix/profiles/system-profiles/"):
|
if os.path.isdir("/nix/var/nix/profiles/system-profiles/"):
|
||||||
return [x
|
return [x
|
||||||
@ -255,6 +266,9 @@ def install_bootloader(args: argparse.Namespace) -> None:
|
|||||||
# flags to pass to bootctl install/update
|
# flags to pass to bootctl install/update
|
||||||
bootctl_flags = []
|
bootctl_flags = []
|
||||||
|
|
||||||
|
if BOOT_MOUNT_POINT != EFI_SYS_MOUNT_POINT:
|
||||||
|
bootctl_flags.append(f"--boot-path={BOOT_MOUNT_POINT}")
|
||||||
|
|
||||||
if CAN_TOUCH_EFI_VARIABLES != "1":
|
if CAN_TOUCH_EFI_VARIABLES != "1":
|
||||||
bootctl_flags.append("--no-variables")
|
bootctl_flags.append("--no-variables")
|
||||||
|
|
||||||
@ -263,8 +277,8 @@ def install_bootloader(args: argparse.Namespace) -> None:
|
|||||||
|
|
||||||
if os.getenv("NIXOS_INSTALL_BOOTLOADER") == "1":
|
if os.getenv("NIXOS_INSTALL_BOOTLOADER") == "1":
|
||||||
# bootctl uses fopen() with modes "wxe" and fails if the file exists.
|
# bootctl uses fopen() with modes "wxe" and fails if the file exists.
|
||||||
if os.path.exists(f"{EFI_SYS_MOUNT_POINT}/loader/loader.conf"):
|
if os.path.exists(LOADER_CONF):
|
||||||
os.unlink(f"{EFI_SYS_MOUNT_POINT}/loader/loader.conf")
|
os.unlink(LOADER_CONF)
|
||||||
|
|
||||||
subprocess.check_call([f"{SYSTEMD}/bin/bootctl", f"--esp-path={EFI_SYS_MOUNT_POINT}"] + bootctl_flags + ["install"])
|
subprocess.check_call([f"{SYSTEMD}/bin/bootctl", f"--esp-path={EFI_SYS_MOUNT_POINT}"] + bootctl_flags + ["install"])
|
||||||
else:
|
else:
|
||||||
@ -291,13 +305,15 @@ def install_bootloader(args: argparse.Namespace) -> None:
|
|||||||
print("updating systemd-boot from %s to %s" % (installed_version, available_version))
|
print("updating systemd-boot from %s to %s" % (installed_version, available_version))
|
||||||
subprocess.check_call([f"{SYSTEMD}/bin/bootctl", f"--esp-path={EFI_SYS_MOUNT_POINT}"] + bootctl_flags + ["update"])
|
subprocess.check_call([f"{SYSTEMD}/bin/bootctl", f"--esp-path={EFI_SYS_MOUNT_POINT}"] + bootctl_flags + ["update"])
|
||||||
|
|
||||||
os.makedirs(f"{EFI_SYS_MOUNT_POINT}/efi/nixos", exist_ok=True)
|
os.makedirs(f"{BOOT_MOUNT_POINT}/{NIXOS_DIR}", exist_ok=True)
|
||||||
os.makedirs(f"{EFI_SYS_MOUNT_POINT}/loader/entries", exist_ok=True)
|
os.makedirs(f"{BOOT_MOUNT_POINT}/loader/entries", exist_ok=True)
|
||||||
|
|
||||||
gens = get_generations()
|
gens = get_generations()
|
||||||
for profile in get_profiles():
|
for profile in get_profiles():
|
||||||
gens += get_generations(profile)
|
gens += get_generations(profile)
|
||||||
|
|
||||||
remove_old_entries(gens)
|
remove_old_entries(gens)
|
||||||
|
|
||||||
for gen in gens:
|
for gen in gens:
|
||||||
try:
|
try:
|
||||||
bootspec = get_bootspec(gen.profile, gen.generation)
|
bootspec = get_bootspec(gen.profile, gen.generation)
|
||||||
@ -315,9 +331,15 @@ def install_bootloader(args: argparse.Namespace) -> None:
|
|||||||
else:
|
else:
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
for root, _, files in os.walk(f"{EFI_SYS_MOUNT_POINT}/efi/nixos/.extra-files", topdown=False):
|
if BOOT_MOUNT_POINT != EFI_SYS_MOUNT_POINT:
|
||||||
relative_root = root.removeprefix(f"{EFI_SYS_MOUNT_POINT}/efi/nixos/.extra-files").removeprefix("/")
|
# Cleanup any entries in ESP if xbootldrMountPoint is set.
|
||||||
actual_root = os.path.join(f"{EFI_SYS_MOUNT_POINT}", relative_root)
|
# If the user later unsets xbootldrMountPoint, entries in XBOOTLDR will not be cleaned up
|
||||||
|
# automatically, as we don't have information about the mount point anymore.
|
||||||
|
cleanup_esp()
|
||||||
|
|
||||||
|
for root, _, files in os.walk(f"{BOOT_MOUNT_POINT}/{NIXOS_DIR}/.extra-files", topdown=False):
|
||||||
|
relative_root = root.removeprefix(f"{BOOT_MOUNT_POINT}/{NIXOS_DIR}/.extra-files").removeprefix("/")
|
||||||
|
actual_root = os.path.join(f"{BOOT_MOUNT_POINT}", relative_root)
|
||||||
|
|
||||||
for file in files:
|
for file in files:
|
||||||
actual_file = os.path.join(actual_root, file)
|
actual_file = os.path.join(actual_root, file)
|
||||||
@ -330,7 +352,7 @@ def install_bootloader(args: argparse.Namespace) -> None:
|
|||||||
os.rmdir(actual_root)
|
os.rmdir(actual_root)
|
||||||
os.rmdir(root)
|
os.rmdir(root)
|
||||||
|
|
||||||
os.makedirs(f"{EFI_SYS_MOUNT_POINT}/efi/nixos/.extra-files", exist_ok=True)
|
os.makedirs(f"{BOOT_MOUNT_POINT}/{NIXOS_DIR}/.extra-files", exist_ok=True)
|
||||||
|
|
||||||
subprocess.check_call(COPY_EXTRA_FILES)
|
subprocess.check_call(COPY_EXTRA_FILES)
|
||||||
|
|
||||||
@ -340,6 +362,8 @@ def main() -> None:
|
|||||||
parser.add_argument('default_config', metavar='DEFAULT-CONFIG', help=f"The default {DISTRO_NAME} config to boot")
|
parser.add_argument('default_config', metavar='DEFAULT-CONFIG', help=f"The default {DISTRO_NAME} config to boot")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
subprocess.check_call(CHECK_MOUNTPOINTS)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
install_bootloader(args)
|
install_bootloader(args)
|
||||||
finally:
|
finally:
|
||||||
@ -347,9 +371,14 @@ def main() -> None:
|
|||||||
# it can leave the system in an unbootable state, when a crash/outage
|
# it can leave the system in an unbootable state, when a crash/outage
|
||||||
# happens shortly after an update. To decrease the likelihood of this
|
# happens shortly after an update. To decrease the likelihood of this
|
||||||
# event sync the efi filesystem after each update.
|
# event sync the efi filesystem after each update.
|
||||||
rc = libc.syncfs(os.open(f"{EFI_SYS_MOUNT_POINT}", os.O_RDONLY))
|
rc = libc.syncfs(os.open(f"{BOOT_MOUNT_POINT}", os.O_RDONLY))
|
||||||
if rc != 0:
|
if rc != 0:
|
||||||
print(f"could not sync {EFI_SYS_MOUNT_POINT}: {os.strerror(rc)}", file=sys.stderr)
|
print(f"could not sync {BOOT_MOUNT_POINT}: {os.strerror(rc)}", file=sys.stderr)
|
||||||
|
|
||||||
|
if BOOT_MOUNT_POINT != EFI_SYS_MOUNT_POINT:
|
||||||
|
rc = libc.syncfs(os.open(EFI_SYS_MOUNT_POINT, os.O_RDONLY))
|
||||||
|
if rc != 0:
|
||||||
|
print(f"could not sync {EFI_SYS_MOUNT_POINT}: {os.strerror(rc)}", file=sys.stderr)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
@ -7,7 +7,7 @@ let
|
|||||||
|
|
||||||
efi = config.boot.loader.efi;
|
efi = config.boot.loader.efi;
|
||||||
|
|
||||||
systemdBootBuilder = pkgs.substituteAll {
|
systemdBootBuilder = pkgs.substituteAll rec {
|
||||||
src = ./systemd-boot-builder.py;
|
src = ./systemd-boot-builder.py;
|
||||||
|
|
||||||
isExecutable = true;
|
isExecutable = true;
|
||||||
@ -28,23 +28,40 @@ let
|
|||||||
|
|
||||||
inherit (efi) efiSysMountPoint canTouchEfiVariables;
|
inherit (efi) efiSysMountPoint canTouchEfiVariables;
|
||||||
|
|
||||||
|
bootMountPoint = if cfg.xbootldrMountPoint != null
|
||||||
|
then cfg.xbootldrMountPoint
|
||||||
|
else efi.efiSysMountPoint;
|
||||||
|
|
||||||
|
nixosDir = "/EFI/nixos";
|
||||||
|
|
||||||
inherit (config.system.nixos) distroName;
|
inherit (config.system.nixos) distroName;
|
||||||
|
|
||||||
memtest86 = optionalString cfg.memtest86.enable pkgs.memtest86plus;
|
memtest86 = optionalString cfg.memtest86.enable pkgs.memtest86plus;
|
||||||
|
|
||||||
netbootxyz = optionalString cfg.netbootxyz.enable pkgs.netbootxyz-efi;
|
netbootxyz = optionalString cfg.netbootxyz.enable pkgs.netbootxyz-efi;
|
||||||
|
|
||||||
|
checkMountpoints = pkgs.writeShellScript "check-mountpoints" ''
|
||||||
|
fail() {
|
||||||
|
echo "$1 = '$2' is not a mounted partition. Is the path configured correctly?" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
${pkgs.util-linuxMinimal}/bin/findmnt ${efiSysMountPoint} > /dev/null || fail efiSysMountPoint ${efiSysMountPoint}
|
||||||
|
${lib.optionalString
|
||||||
|
(cfg.xbootldrMountPoint != null)
|
||||||
|
"${pkgs.util-linuxMinimal}/bin/findmnt ${cfg.xbootldrMountPoint} > /dev/null || fail xbootldrMountPoint ${cfg.xbootldrMountPoint}"}
|
||||||
|
'';
|
||||||
|
|
||||||
copyExtraFiles = pkgs.writeShellScript "copy-extra-files" ''
|
copyExtraFiles = pkgs.writeShellScript "copy-extra-files" ''
|
||||||
empty_file=$(${pkgs.coreutils}/bin/mktemp)
|
empty_file=$(${pkgs.coreutils}/bin/mktemp)
|
||||||
|
|
||||||
${concatStrings (mapAttrsToList (n: v: ''
|
${concatStrings (mapAttrsToList (n: v: ''
|
||||||
${pkgs.coreutils}/bin/install -Dp "${v}" "${efi.efiSysMountPoint}/"${escapeShellArg n}
|
${pkgs.coreutils}/bin/install -Dp "${v}" "${bootMountPoint}/"${escapeShellArg n}
|
||||||
${pkgs.coreutils}/bin/install -D $empty_file "${efi.efiSysMountPoint}/efi/nixos/.extra-files/"${escapeShellArg n}
|
${pkgs.coreutils}/bin/install -D $empty_file "${bootMountPoint}/${nixosDir}/.extra-files/"${escapeShellArg n}
|
||||||
'') cfg.extraFiles)}
|
'') cfg.extraFiles)}
|
||||||
|
|
||||||
${concatStrings (mapAttrsToList (n: v: ''
|
${concatStrings (mapAttrsToList (n: v: ''
|
||||||
${pkgs.coreutils}/bin/install -Dp "${pkgs.writeText n v}" "${efi.efiSysMountPoint}/loader/entries/"${escapeShellArg n}
|
${pkgs.coreutils}/bin/install -Dp "${pkgs.writeText n v}" "${bootMountPoint}/loader/entries/"${escapeShellArg n}
|
||||||
${pkgs.coreutils}/bin/install -D $empty_file "${efi.efiSysMountPoint}/efi/nixos/.extra-files/loader/entries/"${escapeShellArg n}
|
${pkgs.coreutils}/bin/install -D $empty_file "${bootMountPoint}/${nixosDir}/.extra-files/loader/entries/"${escapeShellArg n}
|
||||||
'') cfg.extraEntries)}
|
'') cfg.extraEntries)}
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
@ -99,6 +116,18 @@ in {
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
xbootldrMountPoint = mkOption {
|
||||||
|
default = null;
|
||||||
|
type = types.nullOr types.str;
|
||||||
|
description = lib.mdDoc ''
|
||||||
|
Where the XBOOTLDR partition is mounted.
|
||||||
|
|
||||||
|
If set, this partition will be used as $BOOT to store boot loader entries and extra files
|
||||||
|
instead of the EFI partition. As per the bootloader specification, it is recommended that
|
||||||
|
the EFI and XBOOTLDR partitions be mounted at `/efi` and `/boot`, respectively.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
configurationLimit = mkOption {
|
configurationLimit = mkOption {
|
||||||
default = null;
|
default = null;
|
||||||
example = 120;
|
example = 120;
|
||||||
@ -108,7 +137,7 @@ in {
|
|||||||
Useful to prevent boot partition running out of disk space.
|
Useful to prevent boot partition running out of disk space.
|
||||||
|
|
||||||
`null` means no limit i.e. all generations
|
`null` means no limit i.e. all generations
|
||||||
that were not garbage collected yet.
|
that have not been garbage collected yet.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -200,7 +229,7 @@ in {
|
|||||||
'';
|
'';
|
||||||
description = lib.mdDoc ''
|
description = lib.mdDoc ''
|
||||||
Any additional entries you want added to the `systemd-boot` menu.
|
Any additional entries you want added to the `systemd-boot` menu.
|
||||||
These entries will be copied to {file}`/boot/loader/entries`.
|
These entries will be copied to {file}`$BOOT/loader/entries`.
|
||||||
Each attribute name denotes the destination file name,
|
Each attribute name denotes the destination file name,
|
||||||
and the corresponding attribute value is the contents of the entry.
|
and the corresponding attribute value is the contents of the entry.
|
||||||
|
|
||||||
@ -217,9 +246,9 @@ in {
|
|||||||
{ "efi/memtest86/memtest.efi" = "''${pkgs.memtest86plus}/memtest.efi"; }
|
{ "efi/memtest86/memtest.efi" = "''${pkgs.memtest86plus}/memtest.efi"; }
|
||||||
'';
|
'';
|
||||||
description = lib.mdDoc ''
|
description = lib.mdDoc ''
|
||||||
A set of files to be copied to {file}`/boot`.
|
A set of files to be copied to {file}`$BOOT`.
|
||||||
Each attribute name denotes the destination file name in
|
Each attribute name denotes the destination file name in
|
||||||
{file}`/boot`, while the corresponding
|
{file}`$BOOT`, while the corresponding
|
||||||
attribute value specifies the source file.
|
attribute value specifies the source file.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
@ -243,6 +272,18 @@ in {
|
|||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
assertions = [
|
assertions = [
|
||||||
|
{
|
||||||
|
assertion = (hasPrefix "/" efi.efiSysMountPoint);
|
||||||
|
message = "The ESP mount point '${efi.efiSysMountPoint}' must be an absolute path";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
assertion = cfg.xbootldrMountPoint == null || (hasPrefix "/" cfg.xbootldrMountPoint);
|
||||||
|
message = "The XBOOTLDR mount point '${cfg.xbootldrMountPoint}' must be an absolute path";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
assertion = cfg.xbootldrMountPoint != efi.efiSysMountPoint;
|
||||||
|
message = "The XBOOTLDR mount point '${cfg.xbootldrMountPoint}' cannot be the same as the ESP mount point '${efi.efiSysMountPoint}'";
|
||||||
|
}
|
||||||
{
|
{
|
||||||
assertion = (config.boot.kernelPackages.kernel.features or { efiBootStub = true; }) ? efiBootStub;
|
assertion = (config.boot.kernelPackages.kernel.features or { efiBootStub = true; }) ? efiBootStub;
|
||||||
message = "This kernel does not support the EFI boot stub";
|
message = "This kernel does not support the EFI boot stub";
|
||||||
|
@ -647,9 +647,9 @@ let
|
|||||||
"BatmanAdvanced"
|
"BatmanAdvanced"
|
||||||
])
|
])
|
||||||
# Note: For DHCP the values both, none, v4, v6 are deprecated
|
# Note: For DHCP the values both, none, v4, v6 are deprecated
|
||||||
(assertValueOneOf "DHCP" ["yes" "no" "ipv4" "ipv6"])
|
(assertValueOneOf "DHCP" (boolValues ++ ["ipv4" "ipv6"]))
|
||||||
(assertValueOneOf "DHCPServer" boolValues)
|
(assertValueOneOf "DHCPServer" boolValues)
|
||||||
(assertValueOneOf "LinkLocalAddressing" ["yes" "no" "ipv4" "ipv6" "fallback" "ipv4-fallback"])
|
(assertValueOneOf "LinkLocalAddressing" (boolValues ++ ["ipv4" "ipv6" "fallback" "ipv4-fallback"]))
|
||||||
(assertValueOneOf "IPv6LinkLocalAddressGenerationMode" ["eui64" "none" "stable-privacy" "random"])
|
(assertValueOneOf "IPv6LinkLocalAddressGenerationMode" ["eui64" "none" "stable-privacy" "random"])
|
||||||
(assertValueOneOf "IPv4LLRoute" boolValues)
|
(assertValueOneOf "IPv4LLRoute" boolValues)
|
||||||
(assertValueOneOf "DefaultRouteOnDevice" boolValues)
|
(assertValueOneOf "DefaultRouteOnDevice" boolValues)
|
||||||
|
@ -10,6 +10,20 @@ let
|
|||||||
"repart.d"
|
"repart.d"
|
||||||
format
|
format
|
||||||
(lib.mapAttrs (_n: v: { Partition = v; }) cfg.partitions);
|
(lib.mapAttrs (_n: v: { Partition = v; }) cfg.partitions);
|
||||||
|
|
||||||
|
partitionAssertions = lib.mapAttrsToList (fileName: definition:
|
||||||
|
let
|
||||||
|
maxLabelLength = 36; # GPT_LABEL_MAX defined in systemd's gpt.h
|
||||||
|
labelLength = builtins.stringLength definition.Label;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
assertion = definition ? Label -> maxLabelLength >= labelLength;
|
||||||
|
message = ''
|
||||||
|
The partition label '${definition.Label}' defined for '${fileName}' is ${toString labelLength}
|
||||||
|
characters long, but the maximum label length supported by systemd is ${toString maxLabelLength}.
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
) cfg.partitions;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options = {
|
options = {
|
||||||
@ -81,7 +95,7 @@ in
|
|||||||
'boot.initrd.systemd.repart.enable' requires 'boot.initrd.systemd.enable' to be enabled.
|
'boot.initrd.systemd.repart.enable' requires 'boot.initrd.systemd.enable' to be enabled.
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
];
|
] ++ partitionAssertions;
|
||||||
|
|
||||||
# systemd-repart uses loopback devices for partition creation
|
# systemd-repart uses loopback devices for partition creation
|
||||||
boot.initrd.availableKernelModules = lib.optional initrdCfg.enable "loop";
|
boot.initrd.availableKernelModules = lib.optional initrdCfg.enable "loop";
|
||||||
|
@ -347,24 +347,12 @@ in
|
|||||||
removeLinuxDRM = lib.mkOption {
|
removeLinuxDRM = lib.mkOption {
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
default = false;
|
default = false;
|
||||||
description = lib.mdDoc ''
|
description = ''
|
||||||
Linux 6.2 dropped some kernel symbols required on aarch64 required by zfs.
|
Patch the kernel to change symbols needed by ZFS from
|
||||||
Enabling this option will bring them back to allow this kernel version.
|
EXPORT_SYMBOL_GPL to EXPORT_SYMBOL.
|
||||||
Note that in some jurisdictions this may be illegal as it might be considered
|
|
||||||
removing copyright protection from the code.
|
|
||||||
See https://www.ifross.org/?q=en/artikel/ongoing-dispute-over-value-exportsymbolgpl-function for further information.
|
|
||||||
|
|
||||||
If configure your kernel package with `zfs.latestCompatibleLinuxPackages`, you will need to also pass removeLinuxDRM to that package like this:
|
Currently has no effect, but may again in future if a kernel
|
||||||
|
update breaks ZFS due to symbols being newly changed to GPL.
|
||||||
```
|
|
||||||
{ pkgs, ... }: {
|
|
||||||
boot.kernelPackages = (pkgs.zfs.override {
|
|
||||||
removeLinuxDRM = pkgs.hostPlatform.isAarch64;
|
|
||||||
}).latestCompatibleLinuxPackages;
|
|
||||||
|
|
||||||
boot.zfs.removeLinuxDRM = true;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -588,9 +576,7 @@ in
|
|||||||
kernelParams = lib.optionals (!config.boot.zfs.allowHibernation) [ "nohibernate" ];
|
kernelParams = lib.optionals (!config.boot.zfs.allowHibernation) [ "nohibernate" ];
|
||||||
|
|
||||||
extraModulePackages = [
|
extraModulePackages = [
|
||||||
(cfgZfs.modulePackage.override
|
cfgZfs.modulePackage
|
||||||
(lib.optionalAttrs (lib.versionOlder cfgZfs.package.version "2.2.3")
|
|
||||||
{ inherit (cfgZfs) removeLinuxDRM; }))
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -727,21 +713,6 @@ in
|
|||||||
services.udev.packages = [ cfgZfs.package ]; # to hook zvol naming, etc.
|
services.udev.packages = [ cfgZfs.package ]; # to hook zvol naming, etc.
|
||||||
systemd.packages = [ cfgZfs.package ];
|
systemd.packages = [ cfgZfs.package ];
|
||||||
|
|
||||||
# Export kernel_neon_* symbols again.
|
|
||||||
# This change is necessary until ZFS figures out a solution
|
|
||||||
# with upstream or in their build system to fill the gap for
|
|
||||||
# this symbol.
|
|
||||||
# In the meantime, we restore what was once a working piece of code
|
|
||||||
# in the kernel.
|
|
||||||
boot.kernelPatches = lib.optional (lib.versionOlder cfgZfs.package.version "2.2.3" && cfgZfs.removeLinuxDRM && pkgs.stdenv.hostPlatform.system == "aarch64-linux") {
|
|
||||||
name = "export-neon-symbols-as-gpl";
|
|
||||||
patch = pkgs.fetchpatch {
|
|
||||||
url = "https://github.com/torvalds/linux/commit/aaeca98456431a8d9382ecf48ac4843e252c07b3.patch";
|
|
||||||
hash = "sha256-L2g4G1tlWPIi/QRckMuHDcdWBcKpObSWSRTvbHRIwIk=";
|
|
||||||
revert = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services = let
|
systemd.services = let
|
||||||
createImportService' = pool: createImportService {
|
createImportService' = pool: createImportService {
|
||||||
inherit pool;
|
inherit pool;
|
||||||
|
@ -58,6 +58,20 @@ let
|
|||||||
'';
|
'';
|
||||||
config.Cmd = [ "${pkgs.coreutils}/bin/stat" "-c" "%u:%g" "/testfile" ];
|
config.Cmd = [ "${pkgs.coreutils}/bin/stat" "-c" "%u:%g" "/testfile" ];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
nonRootTestImage =
|
||||||
|
pkgs.dockerTools.streamLayeredImage rec {
|
||||||
|
name = "non-root-test";
|
||||||
|
tag = "latest";
|
||||||
|
uid = 1000;
|
||||||
|
gid = 1000;
|
||||||
|
uname = "user";
|
||||||
|
gname = "user";
|
||||||
|
config = {
|
||||||
|
User = "user";
|
||||||
|
Cmd = [ "${pkgs.coreutils}/bin/stat" "-c" "%u:%g" "${pkgs.coreutils}/bin/stat" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
in {
|
in {
|
||||||
name = "docker-tools";
|
name = "docker-tools";
|
||||||
meta = with pkgs.lib.maintainers; {
|
meta = with pkgs.lib.maintainers; {
|
||||||
@ -181,7 +195,7 @@ in {
|
|||||||
):
|
):
|
||||||
docker.succeed(
|
docker.succeed(
|
||||||
"docker load --input='${examples.bashLayeredWithUser}'",
|
"docker load --input='${examples.bashLayeredWithUser}'",
|
||||||
"docker run -u somebody --rm ${examples.bashLayeredWithUser.imageName} ${pkgs.bash}/bin/bash -c 'test 555 == $(stat --format=%a /nix) && test 555 == $(stat --format=%a /nix/store)'",
|
"docker run -u somebody --rm ${examples.bashLayeredWithUser.imageName} ${pkgs.bash}/bin/bash -c 'test 755 == $(stat --format=%a /nix) && test 755 == $(stat --format=%a /nix/store)'",
|
||||||
"docker rmi ${examples.bashLayeredWithUser.imageName}",
|
"docker rmi ${examples.bashLayeredWithUser.imageName}",
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -604,5 +618,11 @@ in {
|
|||||||
"${chownTestImage} | docker load",
|
"${chownTestImage} | docker load",
|
||||||
"docker run --rm ${chownTestImage.imageName} | diff /dev/stdin <(echo 12345:12345)"
|
"docker run --rm ${chownTestImage.imageName} | diff /dev/stdin <(echo 12345:12345)"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
with subtest("streamLayeredImage: with non-root user"):
|
||||||
|
docker.succeed(
|
||||||
|
"${nonRootTestImage} | docker load",
|
||||||
|
"docker run --rm ${chownTestImage.imageName} | diff /dev/stdin <(echo 12345:12345)"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -14,6 +14,72 @@ let
|
|||||||
boot.loader.efi.canTouchEfiVariables = true;
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
environment.systemPackages = [ pkgs.efibootmgr ];
|
environment.systemPackages = [ pkgs.efibootmgr ];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
commonXbootldr = { config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
diskImage = import ../lib/make-disk-image.nix {
|
||||||
|
inherit config lib pkgs;
|
||||||
|
label = "nixos";
|
||||||
|
format = "qcow2";
|
||||||
|
partitionTableType = "efixbootldr";
|
||||||
|
touchEFIVars = true;
|
||||||
|
installBootLoader = true;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [ common ];
|
||||||
|
virtualisation.useBootLoader = lib.mkForce false; # Only way to tell qemu-vm not to create the default system image
|
||||||
|
virtualisation.directBoot.enable = false; # But don't direct boot either because we're testing systemd-boot
|
||||||
|
|
||||||
|
system.build.diskImage = diskImage; # Use custom disk image with an XBOOTLDR partition
|
||||||
|
virtualisation.efi.variables = "${diskImage}/efi-vars.fd";
|
||||||
|
|
||||||
|
virtualisation.useDefaultFilesystems = false; # Needs custom setup for `diskImage`
|
||||||
|
virtualisation.bootPartition = null;
|
||||||
|
virtualisation.fileSystems = {
|
||||||
|
"/" = {
|
||||||
|
device = "/dev/vda3";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
"/boot" = {
|
||||||
|
device = "/dev/vda2";
|
||||||
|
fsType = "vfat";
|
||||||
|
noCheck = true;
|
||||||
|
};
|
||||||
|
"/efi" = {
|
||||||
|
device = "/dev/vda1";
|
||||||
|
fsType = "vfat";
|
||||||
|
noCheck = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
boot.loader.efi.efiSysMountPoint = "/efi";
|
||||||
|
boot.loader.systemd-boot.xbootldrMountPoint = "/boot";
|
||||||
|
};
|
||||||
|
|
||||||
|
customDiskImage = nodes: ''
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import tempfile
|
||||||
|
|
||||||
|
tmp_disk_image = tempfile.NamedTemporaryFile()
|
||||||
|
|
||||||
|
subprocess.run([
|
||||||
|
"${nodes.machine.virtualisation.qemu.package}/bin/qemu-img",
|
||||||
|
"create",
|
||||||
|
"-f",
|
||||||
|
"qcow2",
|
||||||
|
"-b",
|
||||||
|
"${nodes.machine.system.build.diskImage}/nixos.qcow2",
|
||||||
|
"-F",
|
||||||
|
"qcow2",
|
||||||
|
tmp_disk_image.name,
|
||||||
|
])
|
||||||
|
|
||||||
|
# Set NIX_DISK_IMAGE so that the qemu script finds the right disk image.
|
||||||
|
os.environ['NIX_DISK_IMAGE'] = tmp_disk_image.name
|
||||||
|
'';
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
basic = makeTest {
|
basic = makeTest {
|
||||||
@ -65,6 +131,32 @@ in
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
basicXbootldr = makeTest {
|
||||||
|
name = "systemd-boot-xbootldr";
|
||||||
|
meta.maintainers = with pkgs.lib.maintainers; [ sdht0 ];
|
||||||
|
|
||||||
|
nodes.machine = commonXbootldr;
|
||||||
|
|
||||||
|
testScript = { nodes, ... }: ''
|
||||||
|
${customDiskImage nodes}
|
||||||
|
|
||||||
|
machine.start()
|
||||||
|
machine.wait_for_unit("multi-user.target")
|
||||||
|
|
||||||
|
machine.succeed("test -e /efi/EFI/systemd/systemd-bootx64.efi")
|
||||||
|
machine.succeed("test -e /boot/loader/entries/nixos-generation-1.conf")
|
||||||
|
|
||||||
|
# Ensure we actually booted using systemd-boot
|
||||||
|
# Magic number is the vendor UUID used by systemd-boot.
|
||||||
|
machine.succeed(
|
||||||
|
"test -e /sys/firmware/efi/efivars/LoaderEntrySelected-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f"
|
||||||
|
)
|
||||||
|
|
||||||
|
# "bootctl install" should have created an EFI entry
|
||||||
|
machine.succeed('efibootmgr | grep "Linux Boot Manager"')
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
# Check that specialisations create corresponding boot entries.
|
# Check that specialisations create corresponding boot entries.
|
||||||
specialisation = makeTest {
|
specialisation = makeTest {
|
||||||
name = "systemd-boot-specialisation";
|
name = "systemd-boot-specialisation";
|
||||||
@ -184,6 +276,29 @@ in
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
entryFilenameXbootldr = makeTest {
|
||||||
|
name = "systemd-boot-entry-filename-xbootldr";
|
||||||
|
meta.maintainers = with pkgs.lib.maintainers; [ sdht0 ];
|
||||||
|
|
||||||
|
nodes.machine = { pkgs, lib, ... }: {
|
||||||
|
imports = [ commonXbootldr ];
|
||||||
|
boot.loader.systemd-boot.memtest86.enable = true;
|
||||||
|
boot.loader.systemd-boot.memtest86.entryFilename = "apple.conf";
|
||||||
|
};
|
||||||
|
|
||||||
|
testScript = { nodes, ... }: ''
|
||||||
|
${customDiskImage nodes}
|
||||||
|
|
||||||
|
machine.start()
|
||||||
|
machine.wait_for_unit("multi-user.target")
|
||||||
|
|
||||||
|
machine.succeed("test -e /efi/EFI/systemd/systemd-bootx64.efi")
|
||||||
|
machine.fail("test -e /boot/loader/entries/memtest86.conf")
|
||||||
|
machine.succeed("test -e /boot/loader/entries/apple.conf")
|
||||||
|
machine.succeed("test -e /boot/EFI/memtest86/memtest.efi")
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
extraEntries = makeTest {
|
extraEntries = makeTest {
|
||||||
name = "systemd-boot-extra-entries";
|
name = "systemd-boot-extra-entries";
|
||||||
meta.maintainers = with pkgs.lib.maintainers; [ Enzime julienmalka ];
|
meta.maintainers = with pkgs.lib.maintainers; [ Enzime julienmalka ];
|
||||||
|
@ -49,13 +49,13 @@ in
|
|||||||
|
|
||||||
stdenv.mkDerivation (finalAttrs: {
|
stdenv.mkDerivation (finalAttrs: {
|
||||||
pname = "imagemagick";
|
pname = "imagemagick";
|
||||||
version = "7.1.1-28";
|
version = "7.1.1-29";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "ImageMagick";
|
owner = "ImageMagick";
|
||||||
repo = "ImageMagick";
|
repo = "ImageMagick";
|
||||||
rev = finalAttrs.version;
|
rev = finalAttrs.version;
|
||||||
hash = "sha256-WT058DZzMrNKn9E56dH476iCgeOi7QQ3jNBxKAqT6h4=";
|
hash = "sha256-W9WbHzmTa0dA9+mOxXu88qmN1mO9ORaH0Nj6r2s1Q+E=";
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = [ "out" "dev" "doc" ]; # bin/ isn't really big
|
outputs = [ "out" "dev" "doc" ]; # bin/ isn't really big
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -21,14 +21,14 @@
|
|||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
pname = "flare";
|
pname = "flare";
|
||||||
version = "0.12.0";
|
version = "0.13.0";
|
||||||
|
|
||||||
src = fetchFromGitLab {
|
src = fetchFromGitLab {
|
||||||
domain = "gitlab.com";
|
domain = "gitlab.com";
|
||||||
owner = "schmiddi-on-mobile";
|
owner = "schmiddi-on-mobile";
|
||||||
repo = "flare";
|
repo = "flare";
|
||||||
rev = version;
|
rev = version;
|
||||||
hash = "sha256-Dg5UhVTmxiwPIbU8fG/ehX9Zp8WI2V+JoOEI7P1Way4=";
|
hash = "sha256-WfW2xUlF1vCaYFVP6ds06+niULKZgMMxgAOm66LK2xQ=";
|
||||||
};
|
};
|
||||||
|
|
||||||
cargoDeps = rustPlatform.importCargoLock {
|
cargoDeps = rustPlatform.importCargoLock {
|
||||||
@ -36,8 +36,8 @@ stdenv.mkDerivation rec {
|
|||||||
outputHashes = {
|
outputHashes = {
|
||||||
"curve25519-dalek-4.0.0" = "sha256-KUXvYXeVvJEQ/+dydKzXWCZmA2bFa2IosDzaBL6/Si0=";
|
"curve25519-dalek-4.0.0" = "sha256-KUXvYXeVvJEQ/+dydKzXWCZmA2bFa2IosDzaBL6/Si0=";
|
||||||
"libsignal-protocol-0.1.0" = "sha256-FCrJO7porlY5FrwZ2c67UPd4tgN7cH2/3DTwfPjihwM=";
|
"libsignal-protocol-0.1.0" = "sha256-FCrJO7porlY5FrwZ2c67UPd4tgN7cH2/3DTwfPjihwM=";
|
||||||
"libsignal-service-0.1.0" = "sha256-lzyUUP1mhxxIU+xCr+5VAoeEO6FlDgeEJtWhm9avJb8=";
|
"libsignal-service-0.1.0" = "sha256-XkCb83IvlnmvhHD8Vi9D5fNuBOoR9yX0/Vlb+YhrDz8=";
|
||||||
"presage-0.6.0-dev" = "sha256-PqMz6jJuL/4LVY3kNFQ9NmKt3D6cwQkGiPs2QJsL01A=";
|
"presage-0.6.0-dev" = "sha256-zot92dlGtB7B423BU74oqpPzQKvLm2Dw9P8lCWkbsoE=";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
callPackage ./generic.nix {} rec {
|
callPackage ./generic.nix {} rec {
|
||||||
pname = "signal-desktop-beta";
|
pname = "signal-desktop-beta";
|
||||||
dir = "Signal Beta";
|
dir = "Signal Beta";
|
||||||
version = "7.0.0-beta.1";
|
version = "7.0.0-beta.2";
|
||||||
url = "https://updates.signal.org/desktop/apt/pool/s/signal-desktop-beta/signal-desktop-beta_${version}_amd64.deb";
|
url = "https://updates.signal.org/desktop/apt/pool/s/signal-desktop-beta/signal-desktop-beta_${version}_amd64.deb";
|
||||||
hash = "sha256-mMwOQVPihko/+ukEsaSu8l2u7obuY6gkTLAhSoWAVLo=";
|
hash = "sha256-yfa82JI/CKyQNT+oq0laupLyMIrq9Xs99M/xxgM9eQs=";
|
||||||
}
|
}
|
||||||
|
@ -11,16 +11,16 @@
|
|||||||
|
|
||||||
buildGoModule rec {
|
buildGoModule rec {
|
||||||
pname = "lima";
|
pname = "lima";
|
||||||
version = "0.19.1";
|
version = "0.20.1";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "lima-vm";
|
owner = "lima-vm";
|
||||||
repo = pname;
|
repo = pname;
|
||||||
rev = "v${version}";
|
rev = "v${version}";
|
||||||
sha256 = "sha256-0EKVWXNxOnz7j+f1ExkwQW69khhazj2Uz7RBAvwSjmQ=";
|
sha256 = "sha256-MeTFATaAGRSaUXmC1fv9/gMFWafvkteKVJS6MHaqt8A=";
|
||||||
};
|
};
|
||||||
|
|
||||||
vendorHash = "sha256-SfN4gj5nC9TEVD7aogsUv1um5w5Hvdy1eOSSNjGmnEw=";
|
vendorHash = "sha256-wd7YiEo4Gy2kHF7aCRoNGlbOQUxqQnKqP3znzMqS2PI=";
|
||||||
|
|
||||||
nativeBuildInputs = [ makeWrapper installShellFiles ]
|
nativeBuildInputs = [ makeWrapper installShellFiles ]
|
||||||
++ lib.optionals stdenv.isDarwin [ xcbuild.xcrun sigtool ];
|
++ lib.optionals stdenv.isDarwin [ xcbuild.xcrun sigtool ];
|
||||||
|
@ -890,41 +890,26 @@ rec {
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
# Arguments are documented in ../../../doc/build-helpers/images/dockertools.section.md
|
||||||
streamLayeredImage = lib.makeOverridable (
|
streamLayeredImage = lib.makeOverridable (
|
||||||
{
|
{
|
||||||
# Image Name
|
|
||||||
name
|
name
|
||||||
, # Image tag, the Nix's output hash will be used if null
|
, tag ? null
|
||||||
tag ? null
|
, fromImage ? null
|
||||||
, # Parent image, to append to.
|
, contents ? [ ]
|
||||||
fromImage ? null
|
, config ? { }
|
||||||
, # Files to put on the image (a nix store path or list of paths).
|
, architecture ? defaultArchitecture
|
||||||
contents ? [ ]
|
, created ? "1970-01-01T00:00:01Z"
|
||||||
, # Docker config; e.g. what command to run on the container.
|
, uid ? 0
|
||||||
config ? { }
|
, gid ? 0
|
||||||
, # Image architecture, defaults to the architecture of the `hostPlatform` when unset
|
, uname ? "root"
|
||||||
architecture ? defaultArchitecture
|
, gname ? "root"
|
||||||
, # Time of creation of the image. Passing "now" will make the
|
, maxLayers ? 100
|
||||||
# created date be the time of building.
|
, extraCommands ? ""
|
||||||
created ? "1970-01-01T00:00:01Z"
|
, fakeRootCommands ? ""
|
||||||
, # Optional bash script to run on the files prior to fixturizing the layer.
|
, enableFakechroot ? false
|
||||||
extraCommands ? ""
|
, includeStorePaths ? true
|
||||||
, # Optional bash script to run inside fakeroot environment.
|
, passthru ? {}
|
||||||
# Could be used for changing ownership of files in customisation layer.
|
|
||||||
fakeRootCommands ? ""
|
|
||||||
, # Whether to run fakeRootCommands in fakechroot as well, so that they
|
|
||||||
# appear to run inside the image, but have access to the normal Nix store.
|
|
||||||
# Perhaps this could be enabled on by default on pkgs.stdenv.buildPlatform.isLinux
|
|
||||||
enableFakechroot ? false
|
|
||||||
, # We pick 100 to ensure there is plenty of room for extension. I
|
|
||||||
# believe the actual maximum is 128.
|
|
||||||
maxLayers ? 100
|
|
||||||
, # Whether to include store paths in the image. You generally want to leave
|
|
||||||
# this on, but tooling may disable this to insert the store paths more
|
|
||||||
# efficiently via other means, such as bind mounting the host store.
|
|
||||||
includeStorePaths ? true
|
|
||||||
, # Passthru arguments for the underlying derivation.
|
|
||||||
passthru ? {}
|
|
||||||
,
|
,
|
||||||
}:
|
}:
|
||||||
assert
|
assert
|
||||||
@ -1007,7 +992,7 @@ rec {
|
|||||||
|
|
||||||
conf = runCommand "${baseName}-conf.json"
|
conf = runCommand "${baseName}-conf.json"
|
||||||
{
|
{
|
||||||
inherit fromImage maxLayers created;
|
inherit fromImage maxLayers created uid gid uname gname;
|
||||||
imageName = lib.toLower name;
|
imageName = lib.toLower name;
|
||||||
preferLocalBuild = true;
|
preferLocalBuild = true;
|
||||||
passthru.imageTag =
|
passthru.imageTag =
|
||||||
@ -1086,14 +1071,22 @@ rec {
|
|||||||
"store_layers": $store_layers[0],
|
"store_layers": $store_layers[0],
|
||||||
"customisation_layer", $customisation_layer,
|
"customisation_layer", $customisation_layer,
|
||||||
"repo_tag": $repo_tag,
|
"repo_tag": $repo_tag,
|
||||||
"created": $created
|
"created": $created,
|
||||||
|
"uid": $uid,
|
||||||
|
"gid": $gid,
|
||||||
|
"uname": $uname,
|
||||||
|
"gname": $gname
|
||||||
}
|
}
|
||||||
' --arg store_dir "${storeDir}" \
|
' --arg store_dir "${storeDir}" \
|
||||||
--argjson from_image ${if fromImage == null then "null" else "'\"${fromImage}\"'"} \
|
--argjson from_image ${if fromImage == null then "null" else "'\"${fromImage}\"'"} \
|
||||||
--slurpfile store_layers store_layers.json \
|
--slurpfile store_layers store_layers.json \
|
||||||
--arg customisation_layer ${customisationLayer} \
|
--arg customisation_layer ${customisationLayer} \
|
||||||
--arg repo_tag "$imageName:$imageTag" \
|
--arg repo_tag "$imageName:$imageTag" \
|
||||||
--arg created "$created" |
|
--arg created "$created" \
|
||||||
|
--arg uid "$uid" \
|
||||||
|
--arg gid "$gid" \
|
||||||
|
--arg uname "$uname" \
|
||||||
|
--arg gname "$gname" |
|
||||||
tee $out
|
tee $out
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
@ -9,6 +9,8 @@ image as an uncompressed tarball to stdout:
|
|||||||
the fields with the same name on the image spec [2].
|
the fields with the same name on the image spec [2].
|
||||||
* "created" can be "now".
|
* "created" can be "now".
|
||||||
* "created" is also used as mtime for files added to the image.
|
* "created" is also used as mtime for files added to the image.
|
||||||
|
* "uid", "gid", "uname", "gname" is the file ownership, for example,
|
||||||
|
0, 0, "root", "root".
|
||||||
* "store_layers" is a list of layers in ascending order, where each
|
* "store_layers" is a list of layers in ascending order, where each
|
||||||
layer is the list of store paths to include in that layer.
|
layer is the list of store paths to include in that layer.
|
||||||
|
|
||||||
@ -45,7 +47,7 @@ from datetime import datetime, timezone
|
|||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
|
|
||||||
def archive_paths_to(obj, paths, mtime):
|
def archive_paths_to(obj, paths, mtime, uid, gid, uname, gname):
|
||||||
"""
|
"""
|
||||||
Writes the given store paths as a tar file to the given stream.
|
Writes the given store paths as a tar file to the given stream.
|
||||||
|
|
||||||
@ -61,14 +63,14 @@ def archive_paths_to(obj, paths, mtime):
|
|||||||
|
|
||||||
def apply_filters(ti):
|
def apply_filters(ti):
|
||||||
ti.mtime = mtime
|
ti.mtime = mtime
|
||||||
ti.uid = 0
|
ti.uid = uid
|
||||||
ti.gid = 0
|
ti.gid = gid
|
||||||
ti.uname = "root"
|
ti.uname = uname
|
||||||
ti.gname = "root"
|
ti.gname = gname
|
||||||
return ti
|
return ti
|
||||||
|
|
||||||
def nix_root(ti):
|
def nix_root(ti):
|
||||||
ti.mode = 0o0555 # r-xr-xr-x
|
ti.mode = 0o0755 # rwxr-xr-x
|
||||||
return ti
|
return ti
|
||||||
|
|
||||||
def dir(path):
|
def dir(path):
|
||||||
@ -208,7 +210,7 @@ def overlay_base_config(from_image, final_config):
|
|||||||
return final_config
|
return final_config
|
||||||
|
|
||||||
|
|
||||||
def add_layer_dir(tar, paths, store_dir, mtime):
|
def add_layer_dir(tar, paths, store_dir, mtime, uid, gid, uname, gname):
|
||||||
"""
|
"""
|
||||||
Appends given store paths to a TarFile object as a new layer.
|
Appends given store paths to a TarFile object as a new layer.
|
||||||
|
|
||||||
@ -231,7 +233,7 @@ def add_layer_dir(tar, paths, store_dir, mtime):
|
|||||||
archive_paths_to(
|
archive_paths_to(
|
||||||
extract_checksum,
|
extract_checksum,
|
||||||
paths,
|
paths,
|
||||||
mtime=mtime,
|
mtime, uid, gid, uname, gname
|
||||||
)
|
)
|
||||||
(checksum, size) = extract_checksum.extract()
|
(checksum, size) = extract_checksum.extract()
|
||||||
|
|
||||||
@ -247,7 +249,7 @@ def add_layer_dir(tar, paths, store_dir, mtime):
|
|||||||
archive_paths_to(
|
archive_paths_to(
|
||||||
write,
|
write,
|
||||||
paths,
|
paths,
|
||||||
mtime=mtime,
|
mtime, uid, gid, uname, gname
|
||||||
)
|
)
|
||||||
write.close()
|
write.close()
|
||||||
|
|
||||||
@ -324,6 +326,10 @@ def main():
|
|||||||
else datetime.fromisoformat(conf["created"])
|
else datetime.fromisoformat(conf["created"])
|
||||||
)
|
)
|
||||||
mtime = int(created.timestamp())
|
mtime = int(created.timestamp())
|
||||||
|
uid = int(conf["uid"])
|
||||||
|
gid = int(conf["gid"])
|
||||||
|
uname = conf["uname"]
|
||||||
|
gname = conf["gname"]
|
||||||
store_dir = conf["store_dir"]
|
store_dir = conf["store_dir"]
|
||||||
|
|
||||||
from_image = load_from_image(conf["from_image"])
|
from_image = load_from_image(conf["from_image"])
|
||||||
@ -336,7 +342,8 @@ def main():
|
|||||||
for num, store_layer in enumerate(conf["store_layers"], start=start):
|
for num, store_layer in enumerate(conf["store_layers"], start=start):
|
||||||
print("Creating layer", num, "from paths:", store_layer,
|
print("Creating layer", num, "from paths:", store_layer,
|
||||||
file=sys.stderr)
|
file=sys.stderr)
|
||||||
info = add_layer_dir(tar, store_layer, store_dir, mtime=mtime)
|
info = add_layer_dir(tar, store_layer, store_dir,
|
||||||
|
mtime, uid, gid, uname, gname)
|
||||||
layers.append(info)
|
layers.append(info)
|
||||||
|
|
||||||
print("Creating layer", len(layers) + 1, "with customisation...",
|
print("Creating layer", len(layers) + 1, "with customisation...",
|
||||||
|
@ -6,16 +6,16 @@
|
|||||||
|
|
||||||
buildGoModule rec {
|
buildGoModule rec {
|
||||||
pname = "bitmagnet";
|
pname = "bitmagnet";
|
||||||
version = "0.6.2";
|
version = "0.7.0";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "bitmagnet-io";
|
owner = "bitmagnet-io";
|
||||||
repo = "bitmagnet";
|
repo = "bitmagnet";
|
||||||
rev = "v${version}";
|
rev = "v${version}";
|
||||||
hash = "sha256-17jRktEqBCAXiddx8FnqHg3+c/03nqKHC8BQc9AhQA0=";
|
hash = "sha256-lomTfG6Fo4IywI8VMRvv4mBNRxLCq6IQGIuaR61UwOE=";
|
||||||
};
|
};
|
||||||
|
|
||||||
vendorHash = "sha256-YfsSz72CeHdrh5610Ilo1NYxlCT993hxWRWh0OsvEQc=";
|
vendorHash = "sha256-tKU4GoaEwwdbpWjojx+Z/mWxXKjceJPYRg5UTpYzad4=";
|
||||||
|
|
||||||
ldflags = [ "-s" "-w" ];
|
ldflags = [ "-s" "-w" ];
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ let
|
|||||||
icon = "bitwarden";
|
icon = "bitwarden";
|
||||||
electron = electron_28;
|
electron = electron_28;
|
||||||
in buildNpmPackage rec {
|
in buildNpmPackage rec {
|
||||||
pname = "bitwarden";
|
pname = "bitwarden-desktop";
|
||||||
version = "2024.2.0";
|
version = "2024.2.0";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
@ -41,8 +41,7 @@ in buildNpmPackage rec {
|
|||||||
|
|
||||||
patches = [
|
patches = [
|
||||||
(fetchpatch2 {
|
(fetchpatch2 {
|
||||||
# https://github.com/bitwarden/clients/pull/7508
|
url = "https://github.com/bitwarden/clients/commit/746bf0a4745423b9e70c2c54dcf76a95ffb62e11.patch";
|
||||||
url = "https://github.com/amarshall/bitwarden-clients/commit/e85fa4ef610d9dd05bd22a9b93d54b0c7901776d.patch";
|
|
||||||
hash = "sha256-P9MTsiNbAb2kKo/PasIm9kGm0lQjuVUxAJ3Fh1DfpzY=";
|
hash = "sha256-P9MTsiNbAb2kKo/PasIm9kGm0lQjuVUxAJ3Fh1DfpzY=";
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
@ -68,7 +67,7 @@ in buildNpmPackage rec {
|
|||||||
patches;
|
patches;
|
||||||
patchFlags = [ "-p4" ];
|
patchFlags = [ "-p4" ];
|
||||||
sourceRoot = "${src.name}/${cargoRoot}";
|
sourceRoot = "${src.name}/${cargoRoot}";
|
||||||
hash = "sha256-KJUz5hvdsurnohUWRZedXvuWMnLtR0dcdTeHtJGrZBs=";
|
hash = "sha256-LjwtOmIJlwtOiy36Y0pP+jJEwfmCGTN4RhqgmD3Yj6E=";
|
||||||
};
|
};
|
||||||
cargoRoot = "apps/desktop/desktop_native";
|
cargoRoot = "apps/desktop/desktop_native";
|
||||||
|
|
@ -23,10 +23,9 @@ stdenv.mkDerivation (finalAttrs: {
|
|||||||
|
|
||||||
makeFlags = [
|
makeFlags = [
|
||||||
"PREFIX=$out"
|
"PREFIX=$out"
|
||||||
|
"CC=${stdenv.cc.targetPrefix}cc"
|
||||||
];
|
];
|
||||||
|
|
||||||
configureFlags = lib.optionals (stdenv.hostPlatform.isAarch32 || stdenv.hostPlatform.isAarch64) [ "--build=arm" ];
|
|
||||||
|
|
||||||
enableParallelBuilding = true;
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
@ -34,8 +33,7 @@ stdenv.mkDerivation (finalAttrs: {
|
|||||||
mainProgram = "dc3dd";
|
mainProgram = "dc3dd";
|
||||||
homepage = "https://sourceforge.net/projects/dc3dd/";
|
homepage = "https://sourceforge.net/projects/dc3dd/";
|
||||||
maintainers = with maintainers; [ d3vil0p3r ];
|
maintainers = with maintainers; [ d3vil0p3r ];
|
||||||
platforms = platforms.unix;
|
platforms = platforms.linux;
|
||||||
license = licenses.gpl3Plus; # Refer to https://sourceforge.net/p/dc3dd/code/HEAD/tree/COPYING
|
license = licenses.gpl3Plus; # Refer to https://sourceforge.net/p/dc3dd/code/HEAD/tree/COPYING
|
||||||
broken = stdenv.isDarwin;
|
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
|
@ -1,15 +1,74 @@
|
|||||||
{ lib
|
{ lib
|
||||||
, stdenvNoCC
|
, stdenvNoCC
|
||||||
|
, stdenv
|
||||||
, fetchurl
|
, fetchurl
|
||||||
|
, autoPatchelfHook
|
||||||
, undmg
|
, undmg
|
||||||
|
, zstd
|
||||||
|
, curl
|
||||||
|
, fontconfig
|
||||||
|
, libglvnd
|
||||||
|
, libxkbcommon
|
||||||
|
, vulkan-loader
|
||||||
|
, xdg-utils
|
||||||
|
, xorg
|
||||||
|
, zlib
|
||||||
}:
|
}:
|
||||||
stdenvNoCC.mkDerivation (finalAttrs: {
|
|
||||||
pname = "warp-terminal";
|
|
||||||
version = "0.2023.12.05.08.02.stable_00";
|
|
||||||
|
|
||||||
|
let
|
||||||
|
pname = "warp-terminal";
|
||||||
|
version = "0.2024.02.20.08.01.stable_01";
|
||||||
|
|
||||||
|
linux = stdenv.mkDerivation (finalAttrs: {
|
||||||
|
inherit pname version meta;
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://releases.warp.dev/stable/v${finalAttrs.version}/warp-terminal-v${finalAttrs.version}-1-x86_64.pkg.tar.zst";
|
||||||
|
hash = "sha256-L8alnqSE4crrDozRfPaAAMkLc+5+8d9XBKd5ddsxmD0=";
|
||||||
|
};
|
||||||
|
|
||||||
|
sourceRoot = ".";
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
substituteInPlace usr/bin/warp-terminal \
|
||||||
|
--replace-fail /opt/ $out/opt/
|
||||||
|
'';
|
||||||
|
|
||||||
|
nativeBuildInputs = [ autoPatchelfHook zstd ];
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
curl
|
||||||
|
fontconfig
|
||||||
|
stdenv.cc.cc.lib # libstdc++.so libgcc_s.so
|
||||||
|
zlib
|
||||||
|
];
|
||||||
|
|
||||||
|
runtimeDependencies = [
|
||||||
|
libglvnd # for libegl
|
||||||
|
libxkbcommon
|
||||||
|
stdenv.cc.libc
|
||||||
|
vulkan-loader
|
||||||
|
xdg-utils
|
||||||
|
xorg.libX11
|
||||||
|
xorg.libxcb
|
||||||
|
xorg.libXcursor
|
||||||
|
xorg.libXi
|
||||||
|
];
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
mkdir $out
|
||||||
|
cp -r opt usr/* $out
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
|
||||||
|
darwin = stdenvNoCC.mkDerivation (finalAttrs: {
|
||||||
|
inherit pname version meta;
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "https://releases.warp.dev/stable/v${finalAttrs.version}/Warp.dmg";
|
url = "https://releases.warp.dev/stable/v${finalAttrs.version}/Warp.dmg";
|
||||||
hash = "sha256-9olAmczIPRXV15NYCOYmwuEmJ7lMeaQRTTfukaYXMR0=";
|
hash = "sha256-tFtoD8URMFfJ3HRkyKStuDStFkoRIV97y9kV4pbDPro=";
|
||||||
};
|
};
|
||||||
|
|
||||||
sourceRoot = ".";
|
sourceRoot = ".";
|
||||||
@ -24,13 +83,18 @@ stdenvNoCC.mkDerivation (finalAttrs: {
|
|||||||
|
|
||||||
runHook postInstall
|
runHook postInstall
|
||||||
'';
|
'';
|
||||||
|
});
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
description = "Rust-based terminal";
|
description = "Rust-based terminal";
|
||||||
homepage = "https://www.warp.dev";
|
homepage = "https://www.warp.dev";
|
||||||
license = licenses.unfree;
|
license = licenses.unfree;
|
||||||
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
|
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
|
||||||
maintainers = with maintainers; [ emilytrau Enzime ];
|
maintainers = with maintainers; [ emilytrau Enzime ];
|
||||||
platforms = platforms.darwin;
|
platforms = platforms.darwin ++ [ "x86_64-linux" ];
|
||||||
};
|
};
|
||||||
})
|
|
||||||
|
in
|
||||||
|
if stdenvNoCC.isDarwin
|
||||||
|
then darwin
|
||||||
|
else linux
|
||||||
|
@ -14,14 +14,14 @@
|
|||||||
|
|
||||||
buildPythonPackage rec {
|
buildPythonPackage rec {
|
||||||
pname = "cohere";
|
pname = "cohere";
|
||||||
version = "4.49";
|
version = "4.51";
|
||||||
pyproject = true;
|
pyproject = true;
|
||||||
|
|
||||||
disabled = pythonOlder "3.7";
|
disabled = pythonOlder "3.7";
|
||||||
|
|
||||||
src = fetchPypi {
|
src = fetchPypi {
|
||||||
inherit pname version;
|
inherit pname version;
|
||||||
hash = "sha256-UJ6BxE+OG06zGyfY6jiOeeBMW+6DCKwaM3pgU90/Woc=";
|
hash = "sha256-AfsJLqkDjdT7Ng77NQb60kUe0jHLZ3TjJLmTyTdKVQo=";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
, fetchFromGitHub
|
, fetchFromGitHub
|
||||||
, fetchpatch
|
, fetchpatch
|
||||||
, substituteAll
|
, substituteAll
|
||||||
, graphviz
|
, graphviz-nox
|
||||||
, xdg-utils
|
, xdg-utils
|
||||||
, makeFontsConf
|
, makeFontsConf
|
||||||
, freefont_ttf
|
, freefont_ttf
|
||||||
@ -34,7 +34,7 @@ buildPythonPackage rec {
|
|||||||
patches = [
|
patches = [
|
||||||
(substituteAll {
|
(substituteAll {
|
||||||
src = ./paths.patch;
|
src = ./paths.patch;
|
||||||
inherit graphviz;
|
graphviz = graphviz-nox;
|
||||||
xdgutils = xdg-utils;
|
xdgutils = xdg-utils;
|
||||||
})
|
})
|
||||||
# https://github.com/xflr6/graphviz/issues/209
|
# https://github.com/xflr6/graphviz/issues/209
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
, geopandas
|
, geopandas
|
||||||
, google-cloud-bigquery
|
, google-cloud-bigquery
|
||||||
, google-cloud-bigquery-storage
|
, google-cloud-bigquery-storage
|
||||||
, graphviz-nox
|
, graphviz
|
||||||
, hypothesis
|
, hypothesis
|
||||||
, multipledispatch
|
, multipledispatch
|
||||||
, numpy
|
, numpy
|
||||||
@ -25,15 +25,17 @@
|
|||||||
, packaging
|
, packaging
|
||||||
, pandas
|
, pandas
|
||||||
, parsy
|
, parsy
|
||||||
|
, pins
|
||||||
, poetry-core
|
, poetry-core
|
||||||
, poetry-dynamic-versioning
|
, poetry-dynamic-versioning
|
||||||
, polars
|
, polars
|
||||||
, pooch
|
|
||||||
, psycopg2
|
, psycopg2
|
||||||
, pyarrow
|
, pyarrow
|
||||||
|
, pyarrow-hotfix
|
||||||
, pydata-google-auth
|
, pydata-google-auth
|
||||||
, pydruid
|
, pydruid
|
||||||
, pymysql
|
, pymysql
|
||||||
|
, pyodbc
|
||||||
, pyspark
|
, pyspark
|
||||||
, pytest-benchmark
|
, pytest-benchmark
|
||||||
, pytest-httpserver
|
, pytest-httpserver
|
||||||
@ -63,7 +65,7 @@ let
|
|||||||
name = "ibis-testing-data";
|
name = "ibis-testing-data";
|
||||||
owner = "ibis-project";
|
owner = "ibis-project";
|
||||||
repo = "testing-data";
|
repo = "testing-data";
|
||||||
# https://github.com/ibis-project/ibis/blob/7.1.0/nix/overlay.nix#L20-L26
|
# https://github.com/ibis-project/ibis/blob/8.0.0/nix/overlay.nix#L20-L26
|
||||||
rev = "2c6a4bb5d5d525058d8d5b2312a9fee5dafc5476";
|
rev = "2c6a4bb5d5d525058d8d5b2312a9fee5dafc5476";
|
||||||
hash = "sha256-Lq503bqh9ESZJSk6yVq/uZwkAubzmSmoTBZSsqMm0DY=";
|
hash = "sha256-Lq503bqh9ESZJSk6yVq/uZwkAubzmSmoTBZSsqMm0DY=";
|
||||||
};
|
};
|
||||||
@ -71,8 +73,8 @@ in
|
|||||||
|
|
||||||
buildPythonPackage rec {
|
buildPythonPackage rec {
|
||||||
pname = "ibis-framework";
|
pname = "ibis-framework";
|
||||||
version = "7.1.0";
|
version = "8.0.0";
|
||||||
format = "pyproject";
|
pyproject = true;
|
||||||
|
|
||||||
disabled = pythonOlder "3.9";
|
disabled = pythonOlder "3.9";
|
||||||
|
|
||||||
@ -81,7 +83,7 @@ buildPythonPackage rec {
|
|||||||
repo = "ibis";
|
repo = "ibis";
|
||||||
owner = "ibis-project";
|
owner = "ibis-project";
|
||||||
rev = "refs/tags/${version}";
|
rev = "refs/tags/${version}";
|
||||||
hash = "sha256-E7jryoidw6+CjTIex4wcTXcU+8Kg8LDwg7wJvcwj+7Q=";
|
hash = "sha256-KcNZslqmSbu8uPYKpkyvd7d8Fsf0nQt80y0auXsI8fs=";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
@ -94,25 +96,24 @@ buildPythonPackage rec {
|
|||||||
propagatedBuildInputs = [
|
propagatedBuildInputs = [
|
||||||
atpublic
|
atpublic
|
||||||
bidict
|
bidict
|
||||||
filelock
|
|
||||||
multipledispatch
|
multipledispatch
|
||||||
numpy
|
numpy
|
||||||
pandas
|
pandas
|
||||||
parsy
|
parsy
|
||||||
pooch
|
|
||||||
pyarrow
|
pyarrow
|
||||||
|
pyarrow-hotfix
|
||||||
python-dateutil
|
python-dateutil
|
||||||
pytz
|
pytz
|
||||||
rich
|
rich
|
||||||
sqlglot
|
sqlglot
|
||||||
toolz
|
toolz
|
||||||
typing-extensions
|
typing-extensions
|
||||||
]
|
];
|
||||||
++ pooch.optional-dependencies.progress
|
|
||||||
++ pooch.optional-dependencies.xxhash;
|
|
||||||
|
|
||||||
nativeCheckInputs = [
|
nativeCheckInputs = [
|
||||||
pytestCheckHook
|
pytestCheckHook
|
||||||
|
black
|
||||||
|
filelock
|
||||||
hypothesis
|
hypothesis
|
||||||
pytest-benchmark
|
pytest-benchmark
|
||||||
pytest-httpserver
|
pytest-httpserver
|
||||||
@ -126,35 +127,28 @@ buildPythonPackage rec {
|
|||||||
"--dist=loadgroup"
|
"--dist=loadgroup"
|
||||||
"-m"
|
"-m"
|
||||||
"'${lib.concatStringsSep " or " testBackends} or core'"
|
"'${lib.concatStringsSep " or " testBackends} or core'"
|
||||||
|
];
|
||||||
|
|
||||||
|
disabledTests = [
|
||||||
# breakage from sqlalchemy2 truediv changes
|
# breakage from sqlalchemy2 truediv changes
|
||||||
"--deselect=ibis/tests/sql/test_sqlalchemy.py::test_tpc_h17"
|
"test_tpc_h17"
|
||||||
# tries to download duckdb extensions
|
# tries to download duckdb extensions
|
||||||
"--deselect=ibis/backends/duckdb/tests/test_register.py::test_register_sqlite"
|
"test_register_sqlite"
|
||||||
"--deselect=ibis/backends/duckdb/tests/test_register.py::test_read_sqlite"
|
"test_read_sqlite"
|
||||||
|
|
||||||
# duckdb does not respect sample_size=2 (reads 3 lines of csv).
|
# duckdb does not respect sample_size=2 (reads 3 lines of csv).
|
||||||
"--deselect=ibis/backends/tests/test_register.py::test_csv_reregister_schema"
|
"test_csv_reregister_schema"
|
||||||
|
|
||||||
# duckdb fails with:
|
# duckdb fails with:
|
||||||
# "This function can not be called with an active transaction!, commit or abort the existing one first"
|
# "This function can not be called with an active transaction!, commit or abort the existing one first"
|
||||||
"--deselect=ibis/backends/tests/test_udf.py::test_vectorized_udf"
|
"test_vectorized_udf"
|
||||||
"--deselect=ibis/backends/tests/test_udf.py::test_map_merge_udf"
|
"test_s3_403_fallback"
|
||||||
"--deselect=ibis/backends/tests/test_udf.py::test_udf"
|
"test_map_merge_udf"
|
||||||
"--deselect=ibis/backends/tests/test_udf.py::test_map_udf"
|
"test_udf"
|
||||||
|
"test_map_udf"
|
||||||
# pyarrow13 is not supported yet.
|
# DataFusion error
|
||||||
"--deselect=ibis/backends/tests/test_temporal.py::test_date_truncate"
|
"datafusion"
|
||||||
"--deselect=ibis/backends/tests/test_temporal.py::test_integer_to_interval_timestamp"
|
# pluggy.PluggyTeardownRaisedWarning
|
||||||
"--deselect=ibis/backends/tests/test_temporal.py::test_integer_to_interval_timestamp"
|
"test_repr_png_is_not_none_in_not_interactive"
|
||||||
"--deselect=ibis/backends/tests/test_temporal.py::test_interval_add_cast_column"
|
"test_interval_arithmetic"
|
||||||
"--deselect=ibis/backends/tests/test_temporal.py::test_integer_to_interval_timestamp"
|
|
||||||
"--deselect=ibis/backends/tests/test_temporal.py::test_integer_to_interval_timestamp"
|
|
||||||
"--deselect=ibis/backends/tests/test_temporal.py::test_integer_to_interval_timestamp"
|
|
||||||
"--deselect=ibis/backends/tests/test_temporal.py::test_integer_to_interval_timestamp"
|
|
||||||
"--deselect=ibis/backends/tests/test_timecontext.py::test_context_adjustment_filter_before_window"
|
|
||||||
"--deselect=ibis/backends/tests/test_timecontext.py::test_context_adjustment_window_udf"
|
|
||||||
"--deselect=ibis/backends/tests/test_timecontext.py::test_context_adjustment_window_udf"
|
|
||||||
"--deselect=ibis/backends/tests/test_aggregation.py::test_aggregate_grouped"
|
|
||||||
];
|
];
|
||||||
|
|
||||||
# patch out tests that check formatting with black
|
# patch out tests that check formatting with black
|
||||||
@ -162,7 +156,6 @@ buildPythonPackage rec {
|
|||||||
find ibis/tests -type f -name '*.py' -exec sed -i \
|
find ibis/tests -type f -name '*.py' -exec sed -i \
|
||||||
-e '/^ *assert_decompile_roundtrip/d' \
|
-e '/^ *assert_decompile_roundtrip/d' \
|
||||||
-e 's/^\( *\)code = ibis.decompile(expr, format=True)/\1code = ibis.decompile(expr)/g' {} +
|
-e 's/^\( *\)code = ibis.decompile(expr, format=True)/\1code = ibis.decompile(expr)/g' {} +
|
||||||
substituteInPlace pyproject.toml --replace 'sqlglot = ">=10.4.3,<12"' 'sqlglot = "*"'
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
preCheck = ''
|
preCheck = ''
|
||||||
@ -188,20 +181,22 @@ buildPythonPackage rec {
|
|||||||
dask = [ dask regex ];
|
dask = [ dask regex ];
|
||||||
datafusion = [ datafusion ];
|
datafusion = [ datafusion ];
|
||||||
druid = [ pydruid sqlalchemy ];
|
druid = [ pydruid sqlalchemy ];
|
||||||
duckdb = [ duckdb duckdb-engine packaging sqlalchemy sqlalchemy-views ];
|
duckdb = [ duckdb duckdb-engine sqlalchemy sqlalchemy-views ];
|
||||||
flink = [ ];
|
flink = [ ];
|
||||||
geospatial = [ geoalchemy2 geopandas shapely ];
|
geospatial = [ geoalchemy2 geopandas shapely ];
|
||||||
|
mssql = [ sqlalchemy pyodbc sqlalchemy-views ];
|
||||||
mysql = [ sqlalchemy pymysql sqlalchemy-views ];
|
mysql = [ sqlalchemy pymysql sqlalchemy-views ];
|
||||||
oracle = [ sqlalchemy oracledb packaging sqlalchemy-views ];
|
oracle = [ sqlalchemy oracledb packaging sqlalchemy-views ];
|
||||||
pandas = [ regex ];
|
pandas = [ regex ];
|
||||||
polars = [ polars ];
|
polars = [ polars packaging ];
|
||||||
postgres = [ psycopg2 sqlalchemy sqlalchemy-views ];
|
postgres = [ psycopg2 sqlalchemy sqlalchemy-views ];
|
||||||
pyspark = [ pyspark sqlalchemy ];
|
pyspark = [ pyspark sqlalchemy packaging ];
|
||||||
snowflake = [ snowflake-connector-python snowflake-sqlalchemy sqlalchemy-views ];
|
snowflake = [ snowflake-connector-python snowflake-sqlalchemy sqlalchemy-views packaging ];
|
||||||
sqlite = [ regex sqlalchemy sqlite sqlalchemy-views ];
|
sqlite = [ regex sqlalchemy sqlalchemy-views ];
|
||||||
trino = [ trino-python-client sqlalchemy sqlalchemy-views ];
|
trino = [ trino-python-client sqlalchemy sqlalchemy-views ];
|
||||||
visualization = [ graphviz-nox ];
|
visualization = [ graphviz ];
|
||||||
decompiler = [ black ];
|
decompiler = [ black ];
|
||||||
|
examples = [ pins ] ++ pins.optional-dependencies.gcs;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
{ lib
|
{ lib
|
||||||
, blas
|
, blas
|
||||||
, buildPythonPackage
|
, buildPythonPackage
|
||||||
|
, callPackage
|
||||||
, setuptools
|
, setuptools
|
||||||
, importlib-metadata
|
, importlib-metadata
|
||||||
, fetchFromGitHub
|
, fetchFromGitHub
|
||||||
@ -126,6 +127,23 @@ buildPythonPackage rec {
|
|||||||
|
|
||||||
pythonImportsCheck = [ "jax" ];
|
pythonImportsCheck = [ "jax" ];
|
||||||
|
|
||||||
|
# Test CUDA-enabled jax and jaxlib. Running CUDA-enabled tests is not
|
||||||
|
# currently feasible within the nix build environment so we have to maintain
|
||||||
|
# this script separately. See https://github.com/NixOS/nixpkgs/pull/256230
|
||||||
|
# for a possible remedy to this situation.
|
||||||
|
#
|
||||||
|
# Run these tests with eg
|
||||||
|
#
|
||||||
|
# NIXPKGS_ALLOW_UNFREE=1 nixglhost -- nix run --impure .#python3Packages.jax.passthru.tests.test_cuda_jaxlibBin
|
||||||
|
passthru.tests = {
|
||||||
|
test_cuda_jaxlibSource = callPackage ./test-cuda.nix {
|
||||||
|
jaxlib = jaxlib.override { cudaSupport = true; };
|
||||||
|
};
|
||||||
|
test_cuda_jaxlibBin = callPackage ./test-cuda.nix {
|
||||||
|
jaxlib = jaxlib-bin.override { cudaSupport = true; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
description = "Differentiate, compile, and transform Numpy code";
|
description = "Differentiate, compile, and transform Numpy code";
|
||||||
homepage = "https://github.com/google/jax";
|
homepage = "https://github.com/google/jax";
|
||||||
|
17
pkgs/development/python-modules/jax/test-cuda.nix
Normal file
17
pkgs/development/python-modules/jax/test-cuda.nix
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{ jax
|
||||||
|
, jaxlib
|
||||||
|
, pkgs
|
||||||
|
}:
|
||||||
|
|
||||||
|
pkgs.writers.writePython3Bin "jax-test-cuda" { libraries = [ jax jaxlib ]; } ''
|
||||||
|
import jax
|
||||||
|
from jax import random
|
||||||
|
|
||||||
|
assert jax.devices()[0].platform == "gpu"
|
||||||
|
|
||||||
|
rng = random.PRNGKey(0)
|
||||||
|
x = random.normal(rng, (100, 100))
|
||||||
|
x @ x
|
||||||
|
|
||||||
|
print("success!")
|
||||||
|
''
|
@ -2,16 +2,7 @@
|
|||||||
# backend will require some additional work. Those wheels are located here:
|
# backend will require some additional work. Those wheels are located here:
|
||||||
# https://storage.googleapis.com/jax-releases/libtpu_releases.html.
|
# https://storage.googleapis.com/jax-releases/libtpu_releases.html.
|
||||||
|
|
||||||
# For future reference, the easiest way to test the GPU backend is to run
|
# See `python3Packages.jax.passthru` for CUDA tests.
|
||||||
# NIX_PATH=.. nix-shell -p python3 python3Packages.jax "python3Packages.jaxlib-bin.override { cudaSupport = true; }"
|
|
||||||
# export XLA_FLAGS=--xla_gpu_force_compilation_parallelism=1
|
|
||||||
# python -c "from jax.lib import xla_bridge; assert xla_bridge.get_backend().platform == 'gpu'"
|
|
||||||
# python -c "from jax import random; random.PRNGKey(0)"
|
|
||||||
# python -c "from jax import random; x = random.normal(random.PRNGKey(0), (100, 100)); x @ x"
|
|
||||||
# There's no convenient way to test the GPU backend in the derivation since the
|
|
||||||
# nix build environment blocks access to the GPU. See also:
|
|
||||||
# * https://github.com/google/jax/issues/971#issuecomment-508216439
|
|
||||||
# * https://github.com/google/jax/issues/5723#issuecomment-913038780
|
|
||||||
|
|
||||||
{ absl-py
|
{ absl-py
|
||||||
, autoPatchelfHook
|
, autoPatchelfHook
|
||||||
@ -32,12 +23,21 @@
|
|||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
inherit (cudaPackagesGoogle) autoAddOpenGLRunpathHook cudatoolkit cudnn cudaVersion;
|
inherit (cudaPackagesGoogle) autoAddOpenGLRunpathHook cudaVersion;
|
||||||
|
|
||||||
version = "0.4.24";
|
version = "0.4.24";
|
||||||
|
|
||||||
inherit (python) pythonVersion;
|
inherit (python) pythonVersion;
|
||||||
|
|
||||||
|
cudaLibPath = lib.makeLibraryPath (with cudaPackagesGoogle; [
|
||||||
|
cuda_cudart.lib # libcudart.so
|
||||||
|
cuda_cupti.lib # libcupti.so
|
||||||
|
cudnn.lib # libcudnn.so
|
||||||
|
libcufft.lib # libcufft.so
|
||||||
|
libcusolver.lib # libcusolver.so
|
||||||
|
libcusparse.lib # libcusparse.so
|
||||||
|
]);
|
||||||
|
|
||||||
# As of 2023-06-06, google/jax upstream is no longer publishing CPU-only wheels to their GCS bucket. Instead the
|
# As of 2023-06-06, google/jax upstream is no longer publishing CPU-only wheels to their GCS bucket. Instead the
|
||||||
# official instructions recommend installing CPU-only versions via PyPI.
|
# official instructions recommend installing CPU-only versions via PyPI.
|
||||||
cpuSrcs =
|
cpuSrcs =
|
||||||
@ -189,18 +189,12 @@ buildPythonPackage {
|
|||||||
# autoPatchelfHook. That means we need to sneak them into rpath. This step
|
# autoPatchelfHook. That means we need to sneak them into rpath. This step
|
||||||
# must be done after autoPatchelfHook and the automatic stripping of
|
# must be done after autoPatchelfHook and the automatic stripping of
|
||||||
# artifacts. autoPatchelfHook runs in postFixup and auto-stripping runs in the
|
# artifacts. autoPatchelfHook runs in postFixup and auto-stripping runs in the
|
||||||
# patchPhase. Dependencies:
|
# patchPhase.
|
||||||
# * libcudart.so.11.0 -> cudatoolkit_11.lib
|
|
||||||
# * libcublas.so.11 -> cudatoolkit_11
|
|
||||||
# * libcuda.so.1 -> opengl driver in /run/opengl-driver/lib
|
|
||||||
preInstallCheck = lib.optional cudaSupport ''
|
preInstallCheck = lib.optional cudaSupport ''
|
||||||
shopt -s globstar
|
shopt -s globstar
|
||||||
|
|
||||||
for file in $out/**/*.so; do
|
for file in $out/**/*.so; do
|
||||||
rpath=$(patchelf --print-rpath $file)
|
patchelf --add-rpath "${cudaLibPath}" "$file"
|
||||||
# For some reason `makeLibraryPath` on `cudatoolkit_11` maps to
|
|
||||||
# <cudatoolkit_11.lib>/lib which is different from <cudatoolkit_11>/lib.
|
|
||||||
patchelf --set-rpath "$rpath:${cudatoolkit}/lib:${lib.makeLibraryPath [ cudatoolkit.lib cudnn ]}" $file
|
|
||||||
done
|
done
|
||||||
'';
|
'';
|
||||||
|
|
||||||
@ -211,12 +205,14 @@ buildPythonPackage {
|
|||||||
scipy
|
scipy
|
||||||
];
|
];
|
||||||
|
|
||||||
# Note that cudatoolkit is snecessary since jaxlib looks for "ptxas" in $PATH.
|
# jaxlib looks for ptxas at runtime, eg when running `jax.random.PRNGKey(0)`.
|
||||||
# See https://github.com/NixOS/nixpkgs/pull/164176#discussion_r828801621 for
|
# Linking into $out is the least bad solution. See
|
||||||
# more info.
|
# * https://github.com/NixOS/nixpkgs/pull/164176#discussion_r828801621
|
||||||
|
# * https://github.com/NixOS/nixpkgs/pull/288829#discussion_r1493852211
|
||||||
|
# for more info.
|
||||||
postInstall = lib.optional cudaSupport ''
|
postInstall = lib.optional cudaSupport ''
|
||||||
mkdir -p $out/bin
|
mkdir -p $out/${python.sitePackages}/jaxlib/cuda/bin
|
||||||
ln -s ${cudatoolkit}/bin/ptxas $out/bin/ptxas
|
ln -s ${lib.getExe' cudaPackagesGoogle.cuda_nvcc "ptxas"} $out/${python.sitePackages}/jaxlib/cuda/bin/ptxas
|
||||||
'';
|
'';
|
||||||
|
|
||||||
inherit (jaxlib-build) pythonImportsCheck;
|
inherit (jaxlib-build) pythonImportsCheck;
|
||||||
@ -229,8 +225,8 @@ buildPythonPackage {
|
|||||||
maintainers = with maintainers; [ samuela ];
|
maintainers = with maintainers; [ samuela ];
|
||||||
platforms = [ "aarch64-darwin" "x86_64-linux" "x86_64-darwin" ];
|
platforms = [ "aarch64-darwin" "x86_64-linux" "x86_64-darwin" ];
|
||||||
broken =
|
broken =
|
||||||
!(cudaSupport -> (cudaPackagesGoogle ? cudatoolkit) && lib.versionAtLeast cudatoolkit.version "11.1")
|
!(cudaSupport -> lib.versionAtLeast cudaVersion "11.1")
|
||||||
|| !(cudaSupport -> (cudaPackagesGoogle ? cudnn) && lib.versionAtLeast cudnn.version "8.2")
|
|| !(cudaSupport -> lib.versionAtLeast cudaPackagesGoogle.cudnn.version "8.2")
|
||||||
|| !(cudaSupport -> stdenv.isLinux)
|
|| !(cudaSupport -> stdenv.isLinux)
|
||||||
|| !(cudaSupport -> (gpuSrcs ? "cuda${cudaVersion}-${pythonVersion}"));
|
|| !(cudaSupport -> (gpuSrcs ? "cuda${cudaVersion}-${pythonVersion}"));
|
||||||
};
|
};
|
||||||
|
47
pkgs/development/python-modules/pyexiftool/default.nix
Normal file
47
pkgs/development/python-modules/pyexiftool/default.nix
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
{ lib
|
||||||
|
, buildPythonPackage
|
||||||
|
, pythonOlder
|
||||||
|
, fetchFromGitHub
|
||||||
|
, exiftool
|
||||||
|
, setuptools
|
||||||
|
, pytestCheckHook
|
||||||
|
}:
|
||||||
|
|
||||||
|
buildPythonPackage rec {
|
||||||
|
pname = "pyexiftool";
|
||||||
|
version = "0.5.6";
|
||||||
|
pyproject = true;
|
||||||
|
|
||||||
|
disabled = pythonOlder "3.6";
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "sylikc";
|
||||||
|
repo = "pyexiftool";
|
||||||
|
rev = "refs/tags/v${version}";
|
||||||
|
hash = "sha256-dgQkbpCbdq2JbupY0DyQbHPR9Bg+bwDo7yN03o3sX+A=";
|
||||||
|
};
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
substituteInPlace exiftool/constants.py \
|
||||||
|
--replace-fail 'DEFAULT_EXECUTABLE = "exiftool"' \
|
||||||
|
'DEFAULT_EXECUTABLE = "${lib.getExe exiftool}"'
|
||||||
|
'';
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
setuptools
|
||||||
|
];
|
||||||
|
|
||||||
|
pythonImportsCheck = [ "exiftool" ];
|
||||||
|
|
||||||
|
nativeCheckInputs = [
|
||||||
|
pytestCheckHook
|
||||||
|
];
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
changelog = "https://github.com/sylikc/pyexiftool/blob/${src.rev}/CHANGELOG.md";
|
||||||
|
description = "Python wrapper for exiftool";
|
||||||
|
homepage = "https://github.com/sylikc/pyexiftool";
|
||||||
|
license = with lib.licenses; [ bsd3 /* or */ gpl3Plus ];
|
||||||
|
maintainers = with lib.maintainers; [ dotlambda ];
|
||||||
|
};
|
||||||
|
}
|
@ -1,26 +1,34 @@
|
|||||||
{ lib
|
{ lib
|
||||||
, buildPythonPackage
|
, buildPythonPackage
|
||||||
, fetchPypi
|
, fetchFromGitHub
|
||||||
|
, setuptools
|
||||||
, urwid
|
, urwid
|
||||||
, glibcLocales
|
|
||||||
, pytestCheckHook
|
, pytestCheckHook
|
||||||
}:
|
}:
|
||||||
|
|
||||||
buildPythonPackage rec {
|
buildPythonPackage rec {
|
||||||
pname = "urwid_readline";
|
pname = "urwid-readline";
|
||||||
version = "0.13";
|
version = "0.14";
|
||||||
|
pyproject = true;
|
||||||
|
|
||||||
src = fetchPypi {
|
src = fetchFromGitHub {
|
||||||
inherit pname version;
|
owner = "rr-";
|
||||||
hash = "sha256-AYAgy8hku17Ye+F9wmsGnq4nVcsp86nFaarDve0e+vQ=";
|
repo = "urwid_readline";
|
||||||
|
rev = "refs/tags/${version}";
|
||||||
|
hash = "sha256-ZTg+GZnu7R6Jf2+SIwVo57yHnjwuY92DElTJs8oRErE=";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
setuptools
|
||||||
|
];
|
||||||
|
|
||||||
propagatedBuildInputs = [
|
propagatedBuildInputs = [
|
||||||
urwid
|
urwid
|
||||||
];
|
];
|
||||||
|
|
||||||
|
pythonImportsCheck = [ "urwid_readline" ];
|
||||||
|
|
||||||
nativeCheckInputs = [
|
nativeCheckInputs = [
|
||||||
glibcLocales
|
|
||||||
pytestCheckHook
|
pytestCheckHook
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
buildPythonApplication rec {
|
buildPythonApplication rec {
|
||||||
pname = "autotiling";
|
pname = "autotiling";
|
||||||
version = "1.9";
|
version = "1.9.1";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "nwg-piotr";
|
owner = "nwg-piotr";
|
||||||
repo = pname;
|
repo = pname;
|
||||||
rev = "refs/tags/v${version}";
|
rev = "refs/tags/v${version}";
|
||||||
sha256 = "sha256-0wZg4FvBo2AyVRexY3ZJhBTqUwElqyIHD5bLJ84WynE=";
|
hash = "sha256-PTMF9w4PMkKuhjLAP7856lOOiuyj5YZOoax0K9bgGgQ=";
|
||||||
};
|
};
|
||||||
|
|
||||||
propagatedBuildInputs = [ i3ipc importlib-metadata ];
|
propagatedBuildInputs = [ i3ipc importlib-metadata ];
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
, kernel ? null
|
, kernel ? null
|
||||||
, stdenv
|
, stdenv
|
||||||
, linuxKernel
|
, linuxKernel
|
||||||
, removeLinuxDRM ? false
|
|
||||||
, lib
|
, lib
|
||||||
, nixosTests
|
, nixosTests
|
||||||
, ...
|
, ...
|
||||||
@ -16,20 +15,15 @@ callPackage ./generic.nix args {
|
|||||||
# this attribute is the correct one for this package.
|
# this attribute is the correct one for this package.
|
||||||
kernelModuleAttribute = "zfs_2_1";
|
kernelModuleAttribute = "zfs_2_1";
|
||||||
# check the release notes for compatible kernels
|
# check the release notes for compatible kernels
|
||||||
kernelCompatible =
|
kernelCompatible = kernel.kernelOlder "6.8";
|
||||||
if stdenv'.isx86_64 || removeLinuxDRM
|
|
||||||
then kernel.kernelOlder "6.6"
|
|
||||||
else kernel.kernelOlder "6.2";
|
|
||||||
|
|
||||||
latestCompatibleLinuxPackages = if stdenv'.isx86_64 || removeLinuxDRM
|
latestCompatibleLinuxPackages = linuxKernel.packages.linux_6_7;
|
||||||
then linuxKernel.packages.linux_6_5
|
|
||||||
else linuxKernel.packages.linux_6_1;
|
|
||||||
|
|
||||||
# This is a fixed version to the 2.1.x series, move only
|
# This is a fixed version to the 2.1.x series, move only
|
||||||
# if the 2.1.x series moves.
|
# if the 2.1.x series moves.
|
||||||
version = "2.1.14";
|
version = "2.1.15";
|
||||||
|
|
||||||
hash = "sha256-RVAoZbV9yclGuN+D37SB6UCRFbbLEpBoyrQOQCVsQwE=";
|
hash = "sha256-zFO8fMbirEOrn5W57rAN7IWY6EIXG8jDXqhP7BWJyiY=";
|
||||||
|
|
||||||
tests = [
|
tests = [
|
||||||
nixosTests.zfs.series_2_1
|
nixosTests.zfs.series_2_1
|
||||||
|
@ -175,4 +175,6 @@ with pkgs;
|
|||||||
nixpkgs-check-by-name = callPackage ./nixpkgs-check-by-name { };
|
nixpkgs-check-by-name = callPackage ./nixpkgs-check-by-name { };
|
||||||
|
|
||||||
auto-patchelf-hook = callPackage ./auto-patchelf-hook { };
|
auto-patchelf-hook = callPackage ./auto-patchelf-hook { };
|
||||||
|
|
||||||
|
systemd = callPackage ./systemd { };
|
||||||
}
|
}
|
||||||
|
5
pkgs/test/systemd/default.nix
Normal file
5
pkgs/test/systemd/default.nix
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{ lib, callPackage }:
|
||||||
|
|
||||||
|
lib.recurseIntoAttrs {
|
||||||
|
nixos = callPackage ./nixos { };
|
||||||
|
}
|
37
pkgs/test/systemd/nixos/default.nix
Normal file
37
pkgs/test/systemd/nixos/default.nix
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
{ pkgs, lib, stdenv, ... }:
|
||||||
|
|
||||||
|
lib.runTests {
|
||||||
|
# Merging two non-list definitions must still result in an error
|
||||||
|
# about a conflicting definition.
|
||||||
|
test-unitOption-merging-non-lists-conflict =
|
||||||
|
let nixos = pkgs.nixos {
|
||||||
|
system.stateVersion = lib.trivial.release;
|
||||||
|
systemd.services.systemd-test-nixos = {
|
||||||
|
serviceConfig = lib.mkMerge [
|
||||||
|
{ StateDirectory = "foo"; }
|
||||||
|
{ StateDirectory = "bar"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
expr = (builtins.tryEval (nixos.config.systemd.services.systemd-test-nixos.serviceConfig.StateDirectory)).success;
|
||||||
|
expected = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Merging must lift non-list definitions to a list
|
||||||
|
# if at least one of them is a list.
|
||||||
|
test-unitOption-merging-list-non-list-append =
|
||||||
|
let nixos = pkgs.nixos {
|
||||||
|
system.stateVersion = lib.trivial.release;
|
||||||
|
systemd.services.systemd-test-nixos = {
|
||||||
|
serviceConfig = lib.mkMerge [
|
||||||
|
{ StateDirectory = "foo"; }
|
||||||
|
{ StateDirectory = ["bar"]; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
expr = nixos.config.systemd.services.systemd-test-nixos.serviceConfig.StateDirectory;
|
||||||
|
expected = [ "foo" "bar" ];
|
||||||
|
};
|
||||||
|
}
|
@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
pname = "abcMIDI";
|
pname = "abcMIDI";
|
||||||
version = "2024.02.19";
|
version = "2024.02.25";
|
||||||
|
|
||||||
src = fetchzip {
|
src = fetchzip {
|
||||||
url = "https://ifdo.ca/~seymour/runabc/${pname}-${version}.zip";
|
url = "https://ifdo.ca/~seymour/runabc/${pname}-${version}.zip";
|
||||||
hash = "sha256-mby2GAOcjSDgF21ZUOoPbyVV0RNMjIBvS5hg+15G75U=";
|
hash = "sha256-xaVmK7q10gxN69bGsFEIc01izSbu1m6IyMJWBN6kSzA=";
|
||||||
};
|
};
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
|
@ -1,69 +0,0 @@
|
|||||||
From e2c15e826fe9d4d2d12868ef5409e423e3191b58 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Daniel James Smith <2670567+djsmith85@users.noreply.github.com>
|
|
||||||
Date: Fri, 8 Dec 2023 13:07:46 +0100
|
|
||||||
Subject: [PATCH] Bump electron to v27.1.3 (#7134)
|
|
||||||
|
|
||||||
Co-authored-by: Daniel James Smith <djsmith85@users.noreply.github.com>
|
|
||||||
|
|
||||||
(cherry picked from commit d76602343f36d8e17a9b0204e0290488456c96d5)
|
|
||||||
---
|
|
||||||
apps/desktop/electron-builder.json | 2 +-
|
|
||||||
package-lock.json | 8 ++++----
|
|
||||||
package.json | 2 +-
|
|
||||||
3 files changed, 6 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/apps/desktop/electron-builder.json b/apps/desktop/electron-builder.json
|
|
||||||
index 69d1c0074f..a12870bd96 100644
|
|
||||||
--- a/apps/desktop/electron-builder.json
|
|
||||||
+++ b/apps/desktop/electron-builder.json
|
|
||||||
@@ -19,7 +19,7 @@
|
|
||||||
"**/node_modules/@bitwarden/desktop-native/index.js",
|
|
||||||
"**/node_modules/@bitwarden/desktop-native/desktop_native.${platform}-${arch}*.node"
|
|
||||||
],
|
|
||||||
- "electronVersion": "25.9.1",
|
|
||||||
+ "electronVersion": "27.1.3",
|
|
||||||
"generateUpdatesFilesForAllChannels": true,
|
|
||||||
"publish": {
|
|
||||||
"provider": "generic",
|
|
||||||
diff --git a/package-lock.json b/package-lock.json
|
|
||||||
index 3f0afde95b..9b7b2dbcd9 100644
|
|
||||||
--- a/package-lock.json
|
|
||||||
+++ b/package-lock.json
|
|
||||||
@@ -125,7 +125,7 @@
|
|
||||||
"cross-env": "7.0.3",
|
|
||||||
"css-loader": "6.8.1",
|
|
||||||
"del": "6.1.1",
|
|
||||||
- "electron": "25.9.1",
|
|
||||||
+ "electron": "27.1.3",
|
|
||||||
"electron-builder": "23.6.0",
|
|
||||||
"electron-log": "5.0.0",
|
|
||||||
"electron-reload": "2.0.0-alpha.1",
|
|
||||||
@@ -20173,9 +20173,9 @@
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/electron": {
|
|
||||||
- "version": "25.9.1",
|
|
||||||
- "resolved": "https://registry.npmjs.org/electron/-/electron-25.9.1.tgz",
|
|
||||||
- "integrity": "sha512-Uo/Fh7igjoUXA/f90iTATZJesQEArVL1uLA672JefNWTLymdKSZkJKiCciu/Xnd0TS6qvdIOUGuJFSTQnKskXQ==",
|
|
||||||
+ "version": "27.1.3",
|
|
||||||
+ "resolved": "https://registry.npmjs.org/electron/-/electron-27.1.3.tgz",
|
|
||||||
+ "integrity": "sha512-7eD8VMhhlL5J531OOawn00eMthUkX1e3qN5Nqd7eMK8bg5HxQBrn8bdPlvUEnCano9KhrVwaDnGeuzWoDOGpjQ==",
|
|
||||||
"dev": true,
|
|
||||||
"hasInstallScript": true,
|
|
||||||
"dependencies": {
|
|
||||||
diff --git a/package.json b/package.json
|
|
||||||
index 9ee884b31d..4a5c3513fd 100644
|
|
||||||
--- a/package.json
|
|
||||||
+++ b/package.json
|
|
||||||
@@ -88,7 +88,7 @@
|
|
||||||
"cross-env": "7.0.3",
|
|
||||||
"css-loader": "6.8.1",
|
|
||||||
"del": "6.1.1",
|
|
||||||
- "electron": "25.9.1",
|
|
||||||
+ "electron": "27.1.3",
|
|
||||||
"electron-builder": "23.6.0",
|
|
||||||
"electron-log": "5.0.0",
|
|
||||||
"electron-reload": "2.0.0-alpha.1",
|
|
||||||
--
|
|
||||||
2.42.0
|
|
||||||
|
|
@ -102,6 +102,7 @@ mapAliases ({
|
|||||||
beignet = throw "beignet was removed as it was never ported from old llvmPackages_6 upstream"; # added 2024-01-08
|
beignet = throw "beignet was removed as it was never ported from old llvmPackages_6 upstream"; # added 2024-01-08
|
||||||
binance = throw "binance has been removed, because it depends on a very outdated and insecure version of electron"; # Added 2023-11-09
|
binance = throw "binance has been removed, because it depends on a very outdated and insecure version of electron"; # Added 2023-11-09
|
||||||
bird2 = bird; # Added 2022-02-21
|
bird2 = bird; # Added 2022-02-21
|
||||||
|
bitwarden = bitwarden-desktop; # Added 2024-02-25
|
||||||
bitwig-studio1 = throw "bitwig-studio1 has been removed, you can upgrade to 'bitwig-studio'"; # Added 2023-01-03
|
bitwig-studio1 = throw "bitwig-studio1 has been removed, you can upgrade to 'bitwig-studio'"; # Added 2023-01-03
|
||||||
bitwig-studio2 = throw "bitwig-studio2 has been removed, you can upgrade to 'bitwig-studio'"; # Added 2023-01-03
|
bitwig-studio2 = throw "bitwig-studio2 has been removed, you can upgrade to 'bitwig-studio'"; # Added 2023-01-03
|
||||||
blender-with-packages = args:
|
blender-with-packages = args:
|
||||||
|
@ -3552,10 +3552,6 @@ with pkgs;
|
|||||||
|
|
||||||
biscuit-cli = callPackage ../tools/security/biscuit-cli { };
|
biscuit-cli = callPackage ../tools/security/biscuit-cli { };
|
||||||
|
|
||||||
bitwarden = callPackage ../tools/security/bitwarden { };
|
|
||||||
|
|
||||||
bitwarden-cli = callPackage ../tools/security/bitwarden/cli.nix { };
|
|
||||||
|
|
||||||
inherit (callPackages ../tools/security/bitwarden-directory-connector { }) bitwarden-directory-connector-cli bitwarden-directory-connector;
|
inherit (callPackages ../tools/security/bitwarden-directory-connector { }) bitwarden-directory-connector-cli bitwarden-directory-connector;
|
||||||
|
|
||||||
bitwarden-menu = python3Packages.callPackage ../applications/misc/bitwarden-menu { };
|
bitwarden-menu = python3Packages.callPackage ../applications/misc/bitwarden-menu { };
|
||||||
|
@ -13563,10 +13563,10 @@ with self; {
|
|||||||
|
|
||||||
LaTeXML = buildPerlPackage rec {
|
LaTeXML = buildPerlPackage rec {
|
||||||
pname = "LaTeXML";
|
pname = "LaTeXML";
|
||||||
version = "0.8.7";
|
version = "0.8.8";
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "mirror://cpan/authors/id/B/BR/BRMILLER/${pname}-${version}.tar.gz";
|
url = "mirror://cpan/authors/id/B/BR/BRMILLER/${pname}-${version}.tar.gz";
|
||||||
hash = "sha256-JdqdlEB3newNrdTMLUIn6Oq4dDfAcZh3J03PuQakzHk=";
|
hash = "sha256-fSu+LOJSuvhro/OIzQ3sOqSDj0nWErnsfMT/iBBbrcw=";
|
||||||
};
|
};
|
||||||
outputs = [ "out" "tex" ];
|
outputs = [ "out" "tex" ];
|
||||||
propagatedBuildInputs = [ ArchiveZip DBFile FileWhich IOString ImageMagick ImageSize JSONXS LWP ParseRecDescent PodParser TextUnidecode XMLLibXSLT ];
|
propagatedBuildInputs = [ ArchiveZip DBFile FileWhich IOString ImageMagick ImageSize JSONXS LWP ParseRecDescent PodParser TextUnidecode XMLLibXSLT ];
|
||||||
@ -13595,7 +13595,7 @@ with self; {
|
|||||||
homepage = "https://dlmf.nist.gov/LaTeXML/";
|
homepage = "https://dlmf.nist.gov/LaTeXML/";
|
||||||
license = with lib.licenses; [ publicDomain ];
|
license = with lib.licenses; [ publicDomain ];
|
||||||
maintainers = with maintainers; [ xworld21 ];
|
maintainers = with maintainers; [ xworld21 ];
|
||||||
mainProgram = "latexml";
|
mainProgram = "latexmlc";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4965,9 +4965,7 @@ self: super: with self; {
|
|||||||
|
|
||||||
graphtage = callPackage ../development/python-modules/graphtage { };
|
graphtage = callPackage ../development/python-modules/graphtage { };
|
||||||
|
|
||||||
graphviz = callPackage ../development/python-modules/graphviz {
|
graphviz = callPackage ../development/python-modules/graphviz { };
|
||||||
inherit (pkgs) graphviz;
|
|
||||||
};
|
|
||||||
|
|
||||||
grappelli-safe = callPackage ../development/python-modules/grappelli-safe { };
|
grappelli-safe = callPackage ../development/python-modules/grappelli-safe { };
|
||||||
|
|
||||||
@ -10567,6 +10565,8 @@ self: super: with self; {
|
|||||||
|
|
||||||
pyexcel-xls = callPackage ../development/python-modules/pyexcel-xls { };
|
pyexcel-xls = callPackage ../development/python-modules/pyexcel-xls { };
|
||||||
|
|
||||||
|
pyexiftool = callPackage ../development/python-modules/pyexiftool { };
|
||||||
|
|
||||||
pyexploitdb = callPackage ../development/python-modules/pyexploitdb { };
|
pyexploitdb = callPackage ../development/python-modules/pyexploitdb { };
|
||||||
|
|
||||||
pyezviz = callPackage ../development/python-modules/pyezviz { };
|
pyezviz = callPackage ../development/python-modules/pyezviz { };
|
||||||
|
Loading…
Reference in New Issue
Block a user