]> git.ipfire.org Git - thirdparty/git.git/blobdiff - git-fetch.sh
git-fetch --tags: reject malformed tags.
[thirdparty/git.git] / git-fetch.sh
index 7c05880bcfca30426d03112c0967ada6f68305be..b46b3e558945a3afb783894c75ce20cede0b4eec 100755 (executable)
@@ -1,6 +1,8 @@
 #!/bin/sh
 #
-. git-sh-setup || die "Not a git archive"
+
+USAGE='<fetch-options> <repository> <refspec>...'
+. git-sh-setup
 . git-parse-remote
 _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
 _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
@@ -12,6 +14,7 @@ IFS="$LF"
 tags=
 append=
 force=
+verbose=
 update_head_ok=
 while case "$#" in 0) break ;; esac
 do
@@ -30,6 +33,12 @@ do
        --update-head-o|--update-head-ok)
                update_head_ok=t
                ;;
+       -v|--verbose)
+               verbose=Yes
+               ;;
+       -*)
+               usage
+               ;;
        *)
                break
                ;;
@@ -91,12 +100,12 @@ append_fetch_head () {
     then
        headc_=$(git-rev-parse --verify "$head_^0") || exit
        echo "$headc_   $not_for_merge_ $note_" >>"$GIT_DIR/FETCH_HEAD"
-       echo >&2 "* committish: $head_"
-       echo >&2 "  $note_"
+       [ "$verbose" ] && echo >&2 "* committish: $head_"
+       [ "$verbose" ] && echo >&2 "  $note_"
     else
        echo "$head_    not-for-merge   $note_" >>"$GIT_DIR/FETCH_HEAD"
-       echo >&2 "* non-commit: $head_"
-       echo >&2 "  $note_"
+       [ "$verbose" ] && echo >&2 "* non-commit: $head_"
+       [ "$verbose" ] && echo >&2 "  $note_"
     fi
     if test "$local_name_" != ""
     then
@@ -114,7 +123,12 @@ fast_forward_local () {
        # is no way to guarantee "fast-forward" anyway.
        if test -f "$GIT_DIR/$1"
        then
-               echo >&2 "* $1: updating with $3"
+               if now_=$(cat "$GIT_DIR/$1") && test "$now_" = "$2"
+               then
+                       [ "$verbose" ] && echo >&2 "* $1: same as $3"
+               else
+                       echo >&2 "* $1: updating with $3"
+               fi
        else
                echo >&2 "* $1: storing $3"
        fi
@@ -174,10 +188,20 @@ esac
 reflist=$(get_remote_refs_for_fetch "$@")
 if test "$tags"
 then
-       taglist=$(git-ls-remote --tags "$remote" |
-               sed -e '
-                       s/^[^   ]*      //
-                       s/.*/&:&/')
+       taglist=$(IFS=" " &&
+                 git-ls-remote --tags "$remote" |
+                 while read sha1 name
+                 do
+                       case "$name" in
+                       (*^*) continue ;;
+                       esac
+                       if git-check-ref-format "$name"
+                       then
+                           echo ".${name}:${name}"
+                       else
+                           echo >&2 "warning: tag ${name} ignored"
+                       fi
+                 done)
        if test "$#" -gt 1
        then
                # remote URL plus explicit refspecs; we need to merge them.
@@ -224,7 +248,7 @@ do
            $u =~ s{([^-a-zA-Z0-9/.])}{sprintf"%%%02x",ord($1)}eg;
            print "$u";
        ' "$remote_name")
-       head=$(curl -nsf $curl_extra_args "$remote/$remote_name_quoted") &&
+       head=$(curl -nsfL $curl_extra_args "$remote/$remote_name_quoted") &&
        expr "$head" : "$_x40\$" >/dev/null ||
                die "Failed to fetch $remote_name from $remote"
        echo >&2 Fetching "$remote_name from $remote" using http