diff options
Diffstat (limited to 'pkgs/misc/merge.nix')
| -rw-r--r-- | pkgs/misc/merge.nix | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/pkgs/misc/merge.nix b/pkgs/misc/merge.nix new file mode 100644 index 0000000..9d6eabb --- /dev/null +++ b/pkgs/misc/merge.nix @@ -0,0 +1,48 @@ +{ runCommand, writeShellApplication, rsync, lib, ... }: +args@{ name, paths, preferLocalBuild ? true, allowSubstitutes ? false, postBuild ? "" }: +let + env = builtins.removeAttrs args [ "name" "postBuild" ]] // { + inherit preferLocalBuild allowSubstitutes; + nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ + rsync + replaceBadSymlink + ]; + passAsFile = [ "paths" ]; + }; + + # copyDirs = p: '' + # ${lib.getExe rsync} -rv --copy-dirlinks --links --executability "${p}/" "$out" + # ''; + + replaceBadSymlink = writeShellApplication { + name = "replaceBadSymlink"; + # runtimeInputs = [ coreutils ]; + text = '' + FILE="''${1-}" + + if [[ -z "$FILE" ]]; then + >&2 echo "Need a file input" + fi + + REALPATH="$(readlink -f "$FILE")" + + case "$REALPATH" in + "/nix/store/"* ) + echo "Replacing $FILE by $REALPATH" + cp -v --remove-destination "$REALPATH" "$FILE" + ;; + esac + ''; + }; + +in runCommand name env '' + mkdir -p $out + + for i in $(cat $pathsPath); do + rsync -rv --copy-dirlinks --links --executability "$i/" "$out" + done + + find $out -type l -exec "replaceBadSymlink {}" \; + + ${postBuild} +'' |
