diff options
| author | Chris Wells <chris@mathematicaster.org> | 2024-09-10 11:21:08 -0500 |
|---|---|---|
| committer | Chris Wells <chris@mathematicaster.org> | 2024-09-10 11:21:08 -0500 |
| commit | 8eae39e8e670f228e9675fb3bc432ce512560396 (patch) | |
| tree | d3736c2f236f0878c2d199b042deb6b4d25e9c6c /pkgs/misc/merge.nix | |
| parent | 373d5246eb53ef1a13166b066248526f33f935db (diff) | |
| download | kobo-manager-8eae39e8e670f228e9675fb3bc432ce512560396.tar kobo-manager-8eae39e8e670f228e9675fb3bc432ce512560396.tar.gz kobo-manager-8eae39e8e670f228e9675fb3bc432ce512560396.tar.bz2 kobo-manager-8eae39e8e670f228e9675fb3bc432ce512560396.tar.lz kobo-manager-8eae39e8e670f228e9675fb3bc432ce512560396.tar.xz kobo-manager-8eae39e8e670f228e9675fb3bc432ce512560396.tar.zst kobo-manager-8eae39e8e670f228e9675fb3bc432ce512560396.zip | |
Created a merge function which will probably be better than symlinkJoin. Also started writing the cli manager in haskell
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} +'' |
