Branch: refs/heads/master
  Home:   https://github.com/NixOS/hydra
  Commit: 4a1a2203ac473b86d65704cab7469d299446b654
      
https://github.com/NixOS/hydra/commit/4a1a2203ac473b86d65704cab7469d299446b654
  Author: Rob Vermaas <[email protected]>
  Date:   2012-04-26 (Thu, 26 Apr 2012)

  Changed paths:
    M src/script/nix-prefetch-git

  Log Message:
  -----------
  I should sleep... grmbl


diff --git a/src/script/nix-prefetch-git b/src/script/nix-prefetch-git
index d89750a..979aa53 100755
--- a/src/script/nix-prefetch-git
+++ b/src/script/nix-prefetch-git
@@ -1 +1,269 @@
-<html><body>You are being <a 
href="https://raw.github.com/NixOS/hydra/966cc2213117c15a6b09d2c4e179b0929cff3023/src/script/nix-prefetch-git";>redirected</a>.</body></html>
\ No newline at end of file
+#! /bin/sh -e
+
+url=$1
+rev=$2
+expHash=$3
+hashType=$NIX_HASH_ALGO
+deepClone=$NIX_PREFETCH_GIT_DEEP_CLONE
+leaveDotGit=$NIX_PREFETCH_GIT_LEAVE_DOT_GIT
+builder=
+
+if test -n "$deepClone"; then
+  deepClone=true
+else
+  deepClone=false
+fi
+
+if test "$leaveDotGit" != 1; then
+  leaveDotGit=
+else
+  leaveDotGit=true
+fi
+
+
+argi=0
+argfun=""
+for arg; do
+  if test -z "$argfun"; then
+    case $arg in
+      --out) argfun=set_out;;
+      --url) argfun=set_url;;
+      --rev) argfun=set_rev;;
+      --hash) argfun=set_hashType;;
+      --deepClone) deepClone=true;;
+      --no-deepClone) deepClone=false;;
+      --leave-dotGit) leaveDotGit=true;;
+      --builder) builder=true;;
+      *)
+          argi=$(($argi + 1))
+          case $argi in
+              1) url=$arg;;
+              2) rev=$arg;;
+              3) expHash=$arg;;
+              *) exit 1;;
+          esac
+          ;;
+    esac
+  else
+    case $argfun in
+      set_*)
+        var=$(echo $argfun | sed 's,^set_,,')
+        eval $var=$arg
+        ;;
+    esac
+    argfun=""
+  fi
+done
+
+usage(){
+    echo  >&2 "syntax: nix-prefetch-git [options] [URL [REVISION 
[EXPECTED-HASH]]]
+
+Options:
+      --out path      Path where the output would be stored.
+      --url url       Any url understand by 'git clone'.
+      --rev ref       Any sha1 or references (such as refs/heads/master)
+      --hash h        Expected hash.
+      --deepClone     Clone submodules recursively.
+      --no-deepClone  Do not clone submodules.
+      --leave-dotGit  Keep the .git directories.
+      --builder       Clone as fetchgit does, but url, rev, and out option are 
mandatory.
+"
+    exit 1
+}
+
+if test -z "$url"; then
+  usage
+fi
+
+
+init_remote(){
+    local url=$1;
+    git init;
+    git remote add origin $url;
+}
+
+# Return the reference of an hash if it exists on the remote repository.
+ref_from_hash(){
+    local hash=$1;
+    git ls-remote origin | sed -n "\,$hash\t, { s,\(.*\)\t\(.*\),\2,; p; q}"
+}
+
+# Return the hash of a reference if it exists on the remote repository.
+hash_from_ref(){
+    local ref=$1
+    git ls-remote origin | sed -n "\,\t$ref, { s,\(.*\)\t\(.*\),\1,; p; q}"
+}
+
+# Fetch everything and checkout the right sha1
+checkout_hash(){
+    local hash="$1";
+    local ref="$2";
+
+    if test -z "$hash"; then
+        hash=$(hash_from_ref $ref);
+    fi;
+
+    git fetch ${builder:+--progress} origin || return 1
+    git checkout -b fetchgit $hash || return 1
+}
+
+# Fetch only a branch/tag and checkout it.
+checkout_ref(){
+    local hash="$1";
+    local ref="$2";
+
+    if "$deepClone"; then
+       # The caller explicitly asked for a deep clone.  Deep clones
+       # allow "git describe" and similar tools to work.  See
+       # http://thread.gmane.org/gmane.linux.distributions.nixos/3569
+       # for a discussion.
+       return 1
+    fi
+
+    if test -z "$ref"; then
+        ref=$(ref_from_hash $hash);
+    fi;
+
+    if test -n "$ref"; then
+        # --depth option is ignored on http repository.
+        git fetch ${builder:+--progress} --depth 1 origin +"$ref" || return 1
+        git checkout -b fetchgit FETCH_HEAD || return 1
+    else
+        return 1;
+    fi;
+}
+
+# Update submodules
+init_submodules(){
+    # Add urls into .git/config file
+    git submodule init
+
+    # list submodule directories and their hashes
+    git submodule status |
+    while read l; do
+        # checkout each submodule
+        local hash=$(echo $l | sed 's,^-\([0-9a-f]*\) \(.*\)$,\1,');
+        local dir=$(echo $l | sed 's,^-\([0-9a-f]*\) \(.*\)$,\2,');
+        local url=$(sed -n "\,$dir, { :loop; n; s,^.*url = ,,; T loop; p; q }" 
.git/config);
+
+        clone "$dir" "$url" "$hash" "";
+    done;
+}
+
+clone(){
+    local top=$(pwd)
+    local dir="$1"
+    local url="$2"
+    local hash="$3"
+    local ref="$4"
+
+    cd $dir;
+
+    # Initialize the repository.
+    init_remote "$url";
+
+    # Download data from the repository.
+    checkout_ref "$hash" "$ref" ||
+    checkout_hash "$hash" "$ref" || (
+        echo 1>&2 "Unable to checkout $hash$ref from $url.";
+        exit 1;
+    )
+
+    # Checkout linked sources.
+    init_submodules;
+
+    if [ -z "$builder" -a -f .topdeps ]; then
+       if tg help 2>&1 > /dev/null
+       then
+           echo "populating TopGit branches..."
+           tg remote --populate origin
+       else
+           echo "WARNING: would populate TopGit branches but TopGit is not 
available" >&2
+           echo "WARNING: install TopGit to fix the problem" >&2
+       fi
+    fi
+
+    cd $top;
+}
+
+clone_user_rev() {
+    local dir="$1"
+    local url="$2"
+    local rev="$3"
+
+    # Perform the checkout.
+    case "$rev" in
+        HEAD|refs/*)
+            clone "$dir" "$url" "" "$rev" 1>&2;;
+        [0-9a-f]*)
+            if test -z "$(echo $rev | tr -d 0123456789abcdef)"; then
+                clone "$dir" "$url" "$rev" "" 1>&2;
+            else
+                echo 1>&2 "Bad commit hash or bad reference.";
+                exit 1;
+            fi;;
+        "")
+            clone "$dir" "$url" "" "HEAD" 1>&2;;
+    esac
+
+    # Allow doing additional processing before .git removal
+    eval "$NIX_PREFETCH_GIT_CHECKOUT_HOOK"
+    if test -z "$leaveDotGit"; then
+       echo "removing \`.git'..." >&2
+        find $dir -name .git\* | xargs rm -rf
+    fi
+}
+
+if test -n "$builder"; then
+  test -n "$out" -a -n "$url" -a -n "$rev" || usage
+  mkdir $out
+  clone_user_rev "$out" "$url" "$rev"
+else
+  if test -z "$hashType"; then
+      hashType=sha256
+  fi
+
+  # 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" git-export)
+      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
+
+      tmpPath=/tmp/git-checkout-tmp-$$
+      tmpFile=$tmpPath/git-export
+      mkdir $tmpPath $tmpFile
+
+      trap "rm -rf $tmpPath" EXIT
+
+      # Perform the checkout.
+      clone_user_rev "$tmpFile" "$url" "$rev"
+
+      # Compute the hash.
+      hash=$(nix-hash --type $hashType $hashFormat $tmpFile)
+      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" $tmpFile)
+
+      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
+fi


================================================================

_______________________________________________
nix-commits mailing list
[email protected]
http://lists.science.uu.nl/mailman/listinfo/nix-commits

Reply via email to