From 221e743c037fc1f9a729adc760546d23df9544a7 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 10 Oct 2005 23:22:02 -0700 Subject: git-fetch --tags: deal with tags with spaces in them. "git-fetch --tags" can get confused with tags with spaces in their names, it used to use shell IFS to split the list of tags and also used curl which insists the URL to be escaped. Fix it so it can work with Martin's moodle repository http://locke.catalyst.net.nz/git/moodle.git/. We still reserve characters like leading plus-sign '+' and colon ':' anywhere to represent refspec src-dst pair, and obviously we cannot use LF (that terminates Pull: line in .git/remotes files), but now you can have spaces with this patch. Signed-off-by: Junio C Hamano --- git-fetch.sh | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'git-fetch.sh') diff --git a/git-fetch.sh b/git-fetch.sh index d3988660ff..7c05880bcf 100755 --- a/git-fetch.sh +++ b/git-fetch.sh @@ -5,6 +5,10 @@ _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" +LF=' +' +IFS="$LF" + tags= append= force= @@ -170,11 +174,14 @@ esac reflist=$(get_remote_refs_for_fetch "$@") if test "$tags" then - taglist=$(git-ls-remote --tags "$remote" | awk '{ print "."$2":"$2 }') + taglist=$(git-ls-remote --tags "$remote" | + sed -e ' + s/^[^ ]* // + s/.*/&:&/') if test "$#" -gt 1 then # remote URL plus explicit refspecs; we need to merge them. - reflist="$reflist $taglist" + reflist="$reflist$LF$taglist" else # No explicit refspecs; fetch tags only. reflist=$taglist @@ -183,7 +190,7 @@ fi for ref in $reflist do - refs="$refs $ref" + refs="$refs$LF$ref" # These are relative path from $GIT_DIR, typically starting at refs/ # but may be HEAD @@ -204,7 +211,7 @@ do remote_name=$(expr "$ref" : '\([^:]*\):') local_name=$(expr "$ref" : '[^:]*:\(.*\)') - rref="$rref $remote_name" + rref="$rref$LF$remote_name" # There are transports that can fetch only one head at a time... case "$remote" in @@ -212,7 +219,12 @@ do if [ -n "$GIT_SSL_NO_VERIFY" ]; then curl_extra_args="-k" fi - head=$(curl -nsf $curl_extra_args "$remote/$remote_name") && + remote_name_quoted=$(perl -e ' + my $u = $ARGV[0]; + $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") && expr "$head" : "$_x40\$" >/dev/null || die "Failed to fetch $remote_name from $remote" echo >&2 Fetching "$remote_name from $remote" using http @@ -262,6 +274,7 @@ case "$remote" in http://* | https://* | rsync://* ) ;; # we are already done. *) + IFS=" $LF" ( git-fetch-pack "$remote" $rref || echo failed "$remote" ) | -- cgit v1.3-5-g9baa From f6b42a81fd97a55dec0766685aac722a838a11a6 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Thu, 13 Oct 2005 18:57:40 -0700 Subject: Show peeled onion from upload-pack and server-info. This updates git-ls-remote to show SHA1 names of objects that are referred by tags, in the "ref^{}" notation. This would make git-findtags (without -t flag) almost trivial. git-peek-remote . | sed -ne "s:^$target "'refs/tags/\(.*\)^{}$:\1:p' Also Pasky could do: git-ls-remote --tags $remote | sed -ne 's:\( refs/tags/.*\)^{}$:\1:p' to find out what object each of the remote tags refers to, and if he has one locally, run "git-fetch $remote tag $tagname" to automatically catch up with the upstream tags. Signed-off-by: Junio C Hamano --- git-fetch.sh | 1 + server-info.c | 7 +++++++ upload-pack.c | 8 ++++++++ 3 files changed, 16 insertions(+) (limited to 'git-fetch.sh') diff --git a/git-fetch.sh b/git-fetch.sh index 7c05880bcf..0cb1596f50 100755 --- a/git-fetch.sh +++ b/git-fetch.sh @@ -176,6 +176,7 @@ if test "$tags" then taglist=$(git-ls-remote --tags "$remote" | sed -e ' + /\^{}$/d s/^[^ ]* // s/.*/&:&/') if test "$#" -gt 1 diff --git a/server-info.c b/server-info.c index 3c08a288db..ba5359108d 100644 --- a/server-info.c +++ b/server-info.c @@ -9,7 +9,14 @@ static FILE *info_ref_fp; static int add_info_ref(const char *path, const unsigned char *sha1) { + struct object *o = parse_object(sha1); + fprintf(info_ref_fp, "%s %s\n", sha1_to_hex(sha1), path); + if (o->type == tag_type) { + o = deref_tag(o); + fprintf(info_ref_fp, "%s %s^{}\n", + sha1_to_hex(o->sha1), path); + } return 0; } diff --git a/upload-pack.c b/upload-pack.c index 83f5a35d26..21b4b8b757 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -1,6 +1,8 @@ #include "cache.h" #include "refs.h" #include "pkt-line.h" +#include "tag.h" +#include "object.h" static const char upload_pack_usage[] = "git-upload-pack "; @@ -165,7 +167,13 @@ static int receive_needs(void) static int send_ref(const char *refname, const unsigned char *sha1) { + struct object *o = parse_object(sha1); + packet_write(1, "%s %s\n", sha1_to_hex(sha1), refname); + if (o->type == tag_type) { + o = deref_tag(o); + packet_write(1, "%s %s^{}\n", sha1_to_hex(o->sha1), refname); + } return 0; } -- cgit v1.3-5-g9baa From cdb3950801fec8e9efa1607093a6e51737bacba0 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 17 Oct 2005 21:47:06 -0700 Subject: Forward port the "funny ref avoidance" in clone and fetch from maint branch. Somehow I forgot to forward port these fixes. "git clone" from a repository prepared with the latest update-server-info would fail without this patch. Signed-off-by: Junio C Hamano --- git-clone.sh | 6 +++++- git-fetch.sh | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'git-fetch.sh') diff --git a/git-clone.sh b/git-clone.sh index 71431319c0..18e692a67b 100755 --- a/git-clone.sh +++ b/git-clone.sh @@ -53,7 +53,11 @@ Perhaps git-update-server-info needs to be run there?" while read sha1 refname do name=`expr "$refname" : 'refs/\(.*\)'` && - git-http-fetch -v -a -w "$name" "$name" "$1/" || exit 1 + case "$name" in + *^*) ;; + *) + git-http-fetch -v -a -w "$name" "$name" "$1/" || exit 1 + esac done <"$clone_tmp/refs" rm -fr "$clone_tmp" } diff --git a/git-fetch.sh b/git-fetch.sh index 0cb1596f50..31b1cf0306 100755 --- a/git-fetch.sh +++ b/git-fetch.sh @@ -176,7 +176,7 @@ if test "$tags" then taglist=$(git-ls-remote --tags "$remote" | sed -e ' - /\^{}$/d + /\^/d s/^[^ ]* // s/.*/&:&/') if test "$#" -gt 1 -- cgit v1.3-5-g9baa From f8765797a41a39f4dfc7030098c38283e6461a83 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 18 Oct 2005 18:42:14 -0700 Subject: Even when overwriting tags, report if they are changed or not. Signed-off-by: Junio C Hamano --- git-fetch.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'git-fetch.sh') diff --git a/git-fetch.sh b/git-fetch.sh index 31b1cf0306..31e5f4c722 100755 --- a/git-fetch.sh +++ b/git-fetch.sh @@ -114,7 +114,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 + echo >&2 "* $1: same as $3" + else + echo >&2 "* $1: updating with $3" + fi else echo >&2 "* $1: storing $3" fi -- cgit v1.3-5-g9baa