gitweb: Replace some presentational HTML by CSS
[gitweb.git] / git-fetch.sh
index 68356343a63b8c07def2edcbed4d3b8c06776921..c2eebee798d10f7ed5977fc4e56cf02731031971 100755 (executable)
@@ -11,6 +11,7 @@ LF='
 '
 IFS="$LF"
 
+rloga=fetch
 no_tags=
 tags=
 append=
@@ -19,6 +20,7 @@ verbose=
 update_head_ok=
 exec=
 upload_pack=
+keep=--thin
 while case "$#" in 0) break ;; esac
 do
        case "$1" in
@@ -51,6 +53,9 @@ do
        -k|--k|--ke|--kee|--keep)
                keep=--keep
                ;;
+       --reflog-action=*)
+               rloga=`expr "z$1" : 'z-[^=]*=\(.*\)'`
+               ;;
        -*)
                usage
                ;;
@@ -65,7 +70,8 @@ case "$#" in
 0)
        test -f "$GIT_DIR/branches/origin" ||
                test -f "$GIT_DIR/remotes/origin" ||
-                       die "Where do you want to fetch from today?"
+                       git-repo-config --get remote.origin.url >/dev/null ||
+                               die "Where do you want to fetch from today?"
        set origin ;;
 esac
 
@@ -75,6 +81,9 @@ refs=
 rref=
 rsync_slurped_objects=
 
+rloga="$rloga $remote_nick"
+test "$remote_nick" = "$remote" || rloga="$rloga $remote"
+
 if test "" = "$append"
 then
        : >"$GIT_DIR/FETCH_HEAD"
@@ -94,6 +103,9 @@ append_fetch_head () {
     # remote-nick is the URL given on the command line (or a shorthand)
     # remote-name is the $GIT_DIR relative refs/ path we computed
     # for this refspec.
+
+    # the $note_ variable will be fed to git-fmt-merge-msg for further
+    # processing.
     case "$remote_name_" in
     HEAD)
        note_= ;;
@@ -103,10 +115,13 @@ append_fetch_head () {
     refs/tags/*)
        note_="$(expr "$remote_name_" : 'refs/tags/\(.*\)')"
        note_="tag '$note_' of " ;;
+    refs/remotes/*)
+       note_="$(expr "$remote_name_" : 'refs/remotes/\(.*\)')"
+       note_="remote branch '$note_' of " ;;
     *)
        note_="$remote_name of " ;;
     esac
-    remote_1_=$(expr "$remote_" : '\(.*\)\.git/*$') &&
+    remote_1_=$(expr "z$remote_" : 'z\(.*\)\.git/*$') &&
        remote_="$remote_1_"
     note_="$note_$remote_"
 
@@ -140,17 +155,18 @@ fast_forward_local () {
        then
                if now_=$(cat "$GIT_DIR/$1") && test "$now_" = "$2"
                then
-                       [ "$verbose" ] && echo >&2 "* $1: same as $3"
+                       [ "$verbose" ] && echo >&2 "* $1: same as $3" ||:
                else
                        echo >&2 "* $1: updating with $3"
+                       git-update-ref -m "$rloga: updating tag" "$1" "$2"
                fi
        else
                echo >&2 "* $1: storing $3"
+               git-update-ref -m "$rloga: storing tag" "$1" "$2"
        fi
-       git-update-ref "$1" "$2" 
        ;;
 
-    refs/heads/*)
+    refs/heads/* | refs/remotes/*)
        # $1 is the ref being updated.
        # $2 is the new value for the ref.
        local=$(git-rev-parse --verify "$1^0" 2>/dev/null)
@@ -160,12 +176,15 @@ fast_forward_local () {
            mb=$(git-merge-base "$local" "$2") &&
            case "$2,$mb" in
            $local,*)
-               echo >&2 "* $1: same as $3"
+               if test -n "$verbose"
+               then
+                       echo >&2 "* $1: same as $3"
+               fi
                ;;
            *,$local)
                echo >&2 "* $1: fast forward to $3"
                echo >&2 "  from $local to $2"
-               git-update-ref "$1" "$2" "$local"
+               git-update-ref -m "$rloga: fast-forward" "$1" "$2" "$local"
                ;;
            *)
                false
@@ -175,7 +194,7 @@ fast_forward_local () {
                case ",$force,$single_force," in
                *,t,*)
                        echo >&2 "  forcing update."
-                       git-update-ref "$1" "$2" "$local"
+                       git-update-ref -m "$rloga: forced-update" "$1" "$2" "$local"
                        ;;
                *)
                        echo >&2 "  not updating."
@@ -185,7 +204,7 @@ fast_forward_local () {
            }
        else
            echo >&2 "* $1: storing $3"
-           git-update-ref "$1" "$2"
+           git-update-ref -m "$rloga: storing head" "$1" "$2"
        fi
        ;;
     esac
@@ -205,12 +224,19 @@ esac
 reflist=$(get_remote_refs_for_fetch "$@")
 if test "$tags"
 then
-       taglist=$(IFS=" " &&
-                 git-ls-remote $upload_pack --tags "$remote" |
+       taglist=`IFS="  " &&
+                 (
+                       git-ls-remote $upload_pack --tags "$remote" ||
+                       echo fail ouch
+                 ) |
                  while read sha1 name
                  do
+                       case "$sha1" in
+                       fail)
+                               exit 1
+                       esac
                        case "$name" in
-                       (*^*) continue ;;
+                       *^*) continue ;;
                        esac
                        if git-check-ref-format "$name"
                        then
@@ -218,7 +244,7 @@ then
                        else
                            echo >&2 "warning: tag ${name} ignored"
                        fi
-                 done)
+                 done` || exit
        if test "$#" -gt 1
        then
                # remote URL plus explicit refspecs; we need to merge them.
@@ -239,22 +265,22 @@ fetch_main () {
 
       # These are relative path from $GIT_DIR, typically starting at refs/
       # but may be HEAD
-      if expr "$ref" : '\.' >/dev/null
+      if expr "z$ref" : 'z\.' >/dev/null
       then
          not_for_merge=t
-         ref=$(expr "$ref" : '\.\(.*\)')
+         ref=$(expr "z$ref" : 'z\.\(.*\)')
       else
          not_for_merge=
       fi
-      if expr "$ref" : '\+' >/dev/null
+      if expr "z$ref" : 'z+' >/dev/null
       then
          single_force=t
-         ref=$(expr "$ref" : '\+\(.*\)')
+         ref=$(expr "z$ref" : 'z+\(.*\)')
       else
          single_force=
       fi
-      remote_name=$(expr "$ref" : '\([^:]*\):')
-      local_name=$(expr "$ref" : '[^:]*:\(.*\)')
+      remote_name=$(expr "z$ref" : 'z\([^:]*\):')
+      local_name=$(expr "z$ref" : 'z[^:]*:\(.*\)')
 
       rref="$rref$LF$remote_name"
 
@@ -264,14 +290,22 @@ fetch_main () {
          if [ -n "$GIT_SSL_NO_VERIFY" ]; then
              curl_extra_args="-k"
          fi
-         remote_name_quoted=$(perl -e '
+         max_depth=5
+         depth=0
+         head="ref: $remote_name"
+         while (expr "z$head" : "zref:" && expr $depth \< $max_depth) >/dev/null
+         do
+           remote_name_quoted=$(@@PERL@@ -e '
              my $u = $ARGV[0];
+              $u =~ s/^ref:\s*//;
              $u =~ s{([^-a-zA-Z0-9/.])}{sprintf"%%%02x",ord($1)}eg;
              print "$u";
-         ' "$remote_name")
-         head=$(curl -nsfL $curl_extra_args "$remote/$remote_name_quoted") &&
-         expr "$head" : "$_x40\$" >/dev/null ||
-                 die "Failed to fetch $remote_name from $remote"
+         ' "$head")
+           head=$(curl -nsfL $curl_extra_args "$remote/$remote_name_quoted")
+           depth=$( expr \( $depth + 1 \) )
+         done
+         expr "z$head" : "z$_x40\$" >/dev/null ||
+             die "Failed to fetch $remote_name from $remote"
          echo >&2 Fetching "$remote_name from $remote" using http
          git-http-fetch -v -a "$head" "$remote/" || exit
          ;;
@@ -322,7 +356,7 @@ fetch_main () {
     ( : subshell because we muck with IFS
       IFS="    $LF"
       (
-         git-fetch-pack $exec $keep --thin "$remote" $rref || echo failed "$remote"
+         git-fetch-pack $exec $keep "$remote" $rref || echo failed "$remote"
       ) |
       while read sha1 remote_name
       do
@@ -356,7 +390,7 @@ fetch_main () {
                  break ;;
              esac
          done
-         local_name=$(expr "$found" : '[^:]*:\(.*\)')
+         local_name=$(expr "z$found" : 'z[^:]*:\(.*\)')
          append_fetch_head "$sha1" "$remote" \
                  "$remote_name" "$remote_nick" "$local_name" "$not_for_merge"
       done
@@ -405,7 +439,9 @@ case ",$update_head_ok,$orig_head," in
        curr_head=$(git-rev-parse --verify HEAD 2>/dev/null)
        if test "$curr_head" != "$orig_head"
        then
-               git-update-ref HEAD "$orig_head"
+           git-update-ref \
+                       -m "$rloga: Undoing incorrectly fetched HEAD." \
+                       HEAD "$orig_head"
                die "Cannot fetch into the current branch."
        fi
        ;;