get_shallow_commits: Avoid memory leak if a commit has been reached already.
[gitweb.git] / git-fetch.sh
index 7442dd2ca54ffc3744b260ee10309d2495afd5fd..f0645d97c91e1151354b737bb3259313dd07fed8 100755 (executable)
@@ -21,6 +21,7 @@ update_head_ok=
 exec=
 upload_pack=
 keep=
+shallow_depth=
 while case "$#" in 0) break ;; esac
 do
        case "$1" in
@@ -56,6 +57,13 @@ do
        --reflog-action=*)
                rloga=`expr "z$1" : 'z-[^=]*=\(.*\)'`
                ;;
+       --depth=*)
+               shallow_depth="--depth=`expr "z$1" : 'z-[^=]*=\(.*\)'`"
+               ;;
+       --depth)
+               shift
+               shallow_depth="--depth=$1"
+               ;;
        -*)
                usage
                ;;
@@ -296,6 +304,8 @@ fetch_main () {
       # There are transports that can fetch only one head at a time...
       case "$remote" in
       http://* | https://* | ftp://*)
+         test -n "$shallow_depth" &&
+               die "shallow clone with http not supported"
          proto=`expr "$remote" : '\([^:]*\):'`
          if [ -n "$GIT_SSL_NO_VERIFY" ]; then
              curl_extra_args="-k"
@@ -324,6 +334,8 @@ fetch_main () {
          git-http-fetch -v -a "$head" "$remote/" || exit
          ;;
       rsync://*)
+         test -n "$shallow_depth" &&
+               die "shallow clone with rsync not supported"
          TMP_HEAD="$GIT_DIR/TMP_HEAD"
          rsync -L -q "$remote/$remote_name" "$TMP_HEAD" || exit 1
          head=$(git-rev-parse --verify TMP_HEAD)
@@ -371,7 +383,7 @@ fetch_main () {
       pack_lockfile=
       IFS="    $LF"
       (
-         git-fetch-pack --thin $exec $keep "$remote" $rref || echo failed "$remote"
+         git-fetch-pack --thin $exec $keep $shallow_depth "$remote" $rref || echo failed "$remote"
       ) |
       while read sha1 remote_name
       do
@@ -432,10 +444,11 @@ case "$no_tags$tags" in
                # using local tracking branch.
                taglist=$(IFS=" " &&
                git-ls-remote $upload_pack --tags "$remote" |
-               sed -ne 's|^\([0-9a-f]*\)[      ]\(refs/tags/.*\)^{}$|\1 \2|p' |
+               sed -n  -e 's|^\('"$_x40"'\)    \(refs/tags/.*\)^{}$|\1 \2|p' \
+                       -e 's|^\('"$_x40"'\)    \(refs/tags/.*\)$|\1 \2|p' |
                while read sha1 name
                do
-                       git-show-ref --verify --quiet -- $name && continue
+                       git-show-ref --verify --quiet -- "$name" && continue
                        git-check-ref-format "$name" || {
                                echo >&2 "warning: tag ${name} ignored"
                                continue
@@ -448,6 +461,8 @@ case "$no_tags$tags" in
        case "$taglist" in
        '') ;;
        ?*)
+               # do not deepen a shallow tree when following tags
+               shallow_depth=
                fetch_main "$taglist" ;;
        esac
 esac