summary refs log tree commit diff
path: root/pkgs/tools/package-management/nix-prefetch-scripts
diff options
context:
space:
mode:
authorCharles Strahan <charles.c.strahan@gmail.com>2014-06-20 23:05:48 -0400
committerCharles Strahan <charles.c.strahan@gmail.com>2014-06-22 04:59:18 -0400
commita6a729b207f995674c931cea3c2d818cc7f0ffc4 (patch)
tree730e02815496b6ffbe3b4aaf97e4fe8157151192 /pkgs/tools/package-management/nix-prefetch-scripts
parent15166ca5c2447e9ea7971c2648ca6ba0128f13fc (diff)
downloadnixpkgs-a6a729b207f995674c931cea3c2d818cc7f0ffc4.tar
nixpkgs-a6a729b207f995674c931cea3c2d818cc7f0ffc4.tar.gz
nixpkgs-a6a729b207f995674c931cea3c2d818cc7f0ffc4.tar.bz2
nixpkgs-a6a729b207f995674c931cea3c2d818cc7f0ffc4.tar.lz
nixpkgs-a6a729b207f995674c931cea3c2d818cc7f0ffc4.tar.xz
nixpkgs-a6a729b207f995674c931cea3c2d818cc7f0ffc4.tar.zst
nixpkgs-a6a729b207f995674c931cea3c2d818cc7f0ffc4.zip
add nix-prefetch-zip
Diffstat (limited to 'pkgs/tools/package-management/nix-prefetch-scripts')
-rw-r--r--pkgs/tools/package-management/nix-prefetch-scripts/default.nix12
-rwxr-xr-xpkgs/tools/package-management/nix-prefetch-scripts/nix-prefetch-zip147
2 files changed, 155 insertions, 4 deletions
diff --git a/pkgs/tools/package-management/nix-prefetch-scripts/default.nix b/pkgs/tools/package-management/nix-prefetch-scripts/default.nix
index d7210b2f616..8f5e7c4a544 100644
--- a/pkgs/tools/package-management/nix-prefetch-scripts/default.nix
+++ b/pkgs/tools/package-management/nix-prefetch-scripts/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, makeWrapper, git, subversion, mercurial, bazaar, cvs }:
+{ stdenv, makeWrapper, git, subversion, mercurial, bazaar, cvs, unzip, curl }:
 
 stdenv.mkDerivation {
   name = "nix-prefetch-scripts";
@@ -11,9 +11,12 @@ stdenv.mkDerivation {
     function copyScript {
       local name=nix-prefetch-$1;
       local src=$2;
-      local exe=$3/bin;
       cp $src $out/bin/$name;
-      wrapProgram $out/bin/$name --suffix PATH : "$exe"
+      for dep in ''${@:3}; do
+        local exe=$dep/bin;
+        local wrapArgs="$wrapArgs --suffix PATH : $exe"
+      done
+      wrapProgram $out/bin/$name $wrapArgs
     }
 
     copyScript "hg" ${../../../build-support/fetchhg/nix-prefetch-hg} ${mercurial}
@@ -21,6 +24,7 @@ stdenv.mkDerivation {
     copyScript "svn" ${../../../build-support/fetchsvn/nix-prefetch-svn} ${subversion}
     copyScript "bzr" ${../../../build-support/fetchbzr/nix-prefetch-bzr} ${bazaar}
     copyScript "cvs" ${../../../build-support/fetchcvs/nix-prefetch-cvs} ${cvs}
+    copyScript "zip" ${./nix-prefetch-zip} ${unzip} ${curl}
   '';
 
   meta = with stdenv.lib; {
@@ -30,4 +34,4 @@ stdenv.mkDerivation {
     # Quicker to build than to download, I hope
     hydraPlatforms = [];
   };
-}
\ No newline at end of file
+}
diff --git a/pkgs/tools/package-management/nix-prefetch-scripts/nix-prefetch-zip b/pkgs/tools/package-management/nix-prefetch-scripts/nix-prefetch-zip
new file mode 100755
index 00000000000..b1c71bbff33
--- /dev/null
+++ b/pkgs/tools/package-management/nix-prefetch-scripts/nix-prefetch-zip
@@ -0,0 +1,147 @@
+#! /bin/sh -e
+
+usage(){
+    echo  >&2 "syntax: nix-prefetch-zip [options]
+
+Options:
+      --url         name   The url of the archive to fetch.
+      --name        name   The name to use for the store path (defaults to \`basename \$url\`).
+      --hash        name   The hash of unpacked archive.
+      --hash-type   hash   Use the specified cryptographic hash algorithm, which can be one of md5, sha1, and sha256.
+      --base32             Print/accept the hash in a base-32 representation rather than hexadecimal.
+      --leave-root         Keep the root directory of the archive.
+      --help               Show this help text.
+"
+    exit 1
+}
+
+
+argi=0
+argfun=""
+for arg; do
+  if test -z "$argfun"; then
+    case $arg in
+      --url) argfun=set_url;;
+      --name) argfun=set_name;;
+      --hash) argfun=set_expHash;;
+      --hash-type) argfun=set_hashType;;
+      --base32) hashFormat="--base32";;
+      --leave-root) leaveRoot=true;;
+      --help) usage;;
+      *)
+        echo "Unexpected argument: $arg" >&2
+        usage
+        ;;
+    esac
+  else
+    case $argfun in
+      set_*)
+        var=$(echo $argfun | sed 's,^set_,,')
+        eval "$var=\$arg"
+        ;;
+    esac
+    argfun=""
+  fi
+done
+
+if [ -z "$url" ]; then
+  echo "Error: No --url flag given" >&2
+  usage
+fi
+
+if [ -z "$name" ]; then
+  name=$(basename "$url")
+fi
+
+if test -z "$hashType"; then
+  hashType=sha256
+fi
+
+tmp=$(mktemp -d 2>/dev/null || mktemp -d -t "$$")
+trap "rm -rf \"\$tmp\"" EXIT
+
+TMPDIR=$tmp/unpacked/$name
+mkdir -p $TMPDIR
+downloadedFile=$tmp/$name
+
+unpackFile() {
+  local curSrc="$1"
+
+  case "$curSrc" in
+    *.tar.xz | *.tar.lzma)
+      # Don't rely on tar knowing about .xz.
+      xz -d < $curSrc | tar xf -
+      ;;
+    *.tar | *.tar.* | *.tgz | *.tbz2)
+      # GNU tar can automatically select the decompression method
+      # (info "(tar) gzip").
+      tar xf $curSrc
+      ;;
+    *.zip)
+      unzip -qq $curSrc
+      ;;
+    *)
+      echo "source archive $curSrc has unknown type" >&2
+      exit 1
+      ;;
+  esac
+}
+
+# If the hash was given, a file with that hash may already be in the
+# store.
+if test -n "$expHash"; then
+  finalPath=$(nix-store --print-fixed-path --recursive "$hashType" "$expHash" "$name")
+  if ! nix-store --check-validity "$finalPath" 2> /dev/null; then
+    finalPath=
+  fi
+  hash=$expHash
+fi
+
+# If we don't know the hash or a path with that hash doesn't exist,
+# download the file and add it to the store.
+if test -z "$finalPath"; then
+  curl="curl \
+   --location --max-redirs 20 \
+   --disable-epsv \
+   --insecure"
+
+  if ! $curl --fail "$url" --output "$downloadedFile"; then
+    echo "error: could not download $url" >&2
+    exit 1
+  fi
+
+  cd $TMPDIR
+  unpackFile "$downloadedFile"
+
+  # FIXME: handle zip files that contain a single regular file.
+  if [ -z "$leaveRoot" ]; then
+    shopt -s dotglob
+    if [ $(ls -d $TMPDIR/* | wc -l) != 1 ]; then
+      echo "error: zip file must contain a single directory."
+      exit 1
+    fi
+    fn=$(cd "$TMPDIR" && echo *)
+    mv $TMPDIR/$fn/* "$TMPDIR/"
+    rmdir "$TMPDIR/$fn"
+  fi
+
+  # Compute the hash.
+  hash=$(nix-hash --type $hashType $hashFormat $TMPDIR)
+  if ! test -n "$QUIET"; then echo "hash is $hash" >&2; fi
+
+  # Add the downloaded file to the Nix store.
+  finalPath=$(nix-store --add-fixed --recursive "$hashType" $TMPDIR)
+
+  if test -n "$expHash" -a "$expHash" != "$hash"; then
+    echo "hash mismatch for URL \`$url'"
+    exit 1
+  fi
+fi
+
+if ! test -n "$QUIET"; then echo "path is $finalPath" >&2; fi
+
+echo $hash
+
+if test -n "$PRINT_PATH"; then
+  echo $finalPath
+fi