about summary refs log tree commit diff
path: root/pkgs/build-support/fetchpatch/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/build-support/fetchpatch/default.nix')
-rw-r--r--pkgs/build-support/fetchpatch/default.nix22
1 files changed, 22 insertions, 0 deletions
diff --git a/pkgs/build-support/fetchpatch/default.nix b/pkgs/build-support/fetchpatch/default.nix
new file mode 100644
index 000000000000..768d173934d5
--- /dev/null
+++ b/pkgs/build-support/fetchpatch/default.nix
@@ -0,0 +1,22 @@
+# This function downloads and normalizes a patch/diff file.
+# This is primarily useful for dynamically generated patches,
+# such as GitHub's or cgit's, where the non-significant content parts
+# often change with updating of git or cgit.
+# stripLen acts as the -p parameter when applying a patch.
+
+{ fetchurl, patchutils }:
+{ stripLen ? 0, ... }@args:
+
+fetchurl ({
+  postFetch = ''
+    tmpfile="$TMPDIR/${args.sha256}"
+    "${patchutils}/bin/lsdiff" "$out" \
+      | sort -u | sed -e 's/[*?]/\\&/g' \
+      | xargs -I{} \
+        "${patchutils}/bin/filterdiff" \
+        --include={} \
+        --strip=${toString stripLen} \
+        --clean "$out" > "$tmpfile"
+    mv "$tmpfile" "$out"
+  '';
+} // args)