flakelike
This commit is contained in:
parent
9cd9d8fe3c
commit
ba94153c3b
8 changed files with 221 additions and 0 deletions
51
default.nix
Normal file
51
default.nix
Normal file
|
@ -0,0 +1,51 @@
|
|||
# if evaluating outside of the store, copy the current directory to the store and import it
|
||||
# filtering out .gitignore files and .git directories
|
||||
# if evaluating inside the store, import the outputs.nix file
|
||||
|
||||
let
|
||||
contains = str: substr: let
|
||||
str_length = builtins.stringLength str;
|
||||
substr_length = builtins.stringLength substr;
|
||||
listOfPossibleSubstrings = builtins.genList (i: builtins.substring i substr_length str) (str_length - substr_length + 1);
|
||||
in if substr_length > str_length then false else builtins.any (x: x == substr) listOfPossibleSubstrings;
|
||||
|
||||
endsWith = str: substr: let
|
||||
str_length = builtins.stringLength str;
|
||||
substr_length = builtins.stringLength substr;
|
||||
in if substr_length > str_length then false else builtins.substring (str_length - substr_length) str_length str == substr;
|
||||
|
||||
gitignore = builtins.filter (v:
|
||||
# ignore comments and empty lines
|
||||
if !(builtins.isString v) then false
|
||||
else if !builtins.isNull(builtins.match "^#.*" v) then false
|
||||
else if !builtins.isNull(builtins.match "^$" v) then false
|
||||
else true
|
||||
) (builtins.split "\n" (builtins.readFile ./.gitignore));
|
||||
|
||||
# checks if a given path matches a gitignore pattern
|
||||
# string -> bool
|
||||
matchesGitIgnore = path: builtins.any (pattern:
|
||||
let
|
||||
patternLength = builtins.stringLength pattern;
|
||||
unsupportedPatternMessage = "matchesGitIgnore: Unsupported pattern: ${pattern}";
|
||||
in
|
||||
if pattern == "*" then true
|
||||
else if pattern == ".*" then true
|
||||
else if pattern == "*.*" then true
|
||||
else if builtins.substring 0 2 pattern == "*." then endsWith path (builtins.substring 0 2 pattern)
|
||||
else if contains pattern "*" then abort unsupportedPatternMessage
|
||||
else if patternLength > 2 && builtins.substring 0 2 pattern == "./" then abort unsupportedPatternMessage
|
||||
else if patternLength > 1 && builtins.substring 0 1 pattern == "/" then abort unsupportedPatternMessage
|
||||
else contains path pattern
|
||||
) gitignore;
|
||||
|
||||
currentFilePath = (builtins.unsafeGetAttrPos "any" { any = "any"; }).file;
|
||||
storePathLength = builtins.stringLength (builtins.toString builtins.storeDir);
|
||||
evaluatingInStore = (builtins.substring 0 storePathLength currentFilePath) == builtins.storeDir;
|
||||
|
||||
selfInStore = builtins.filterSource (path: type:
|
||||
type != "unknown" && builtins.baseNameOf path != ".git" && !matchesGitIgnore path
|
||||
) ./.;
|
||||
in
|
||||
if !(evaluatingInStore) then import selfInStore
|
||||
else import ./outputs.nix
|
Loading…
Add table
Add a link
Reference in a new issue