threads / patch / 43246

patch, 3 partsRe: [PATCH 3/3] git-fetch: allow glob pattern in refspec

Subject: Re: [PATCH 3/3] git-fetch: allow glob pattern in refspec

## tl;dr

3 messages between Nov 23, 2006 and Nov 27, 2006. Diffs are folded; open one to read it.

replies: 2people: 3as markdown or json

Junio C Hamano· Nov 23, 2006, 07:24 UTC · lore

[PATCH 3/3] git-fetch: allow glob pattern in refspec

This adds Andy's refspec glob.  You can have a single line:
	Pull: refs/heads/*:refs/remotes/origin/*

in your ".git/remotes/origin" and say "git fetch" to retrieve all refs under heads/ at the remote side to remotes/origin/ in the local repository.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 * Andy, I think this does the same thing as you wanted to do,
   but is cleaner implementation-wise and also at the concept
   level, to pretend as if the user listed the expanded form in
   the configuration.  I deliberately decided not to apply the
   wildcard expansion on refspecs that came from command line,
   but if we wanted to we can move the expand_refs_wildcard call
   a few lines down to make it also apply to them.
 git-parse-remote.sh |   35 +++++++++++++++++++++++++++++++++++
 1 files changed, 35 insertions(+), 0 deletions(-)
Show changes to git-parse-remote.sh +35 −0
diff --git a/git-parse-remote.sh b/git-parse-remote.sh
index c325ef7..e281b7c 100755
--- a/git-parse-remote.sh
+++ b/git-parse-remote.sh
@@ -90,6 +90,39 @@ get_remote_default_refs_for_push () {
 	esac
 }
 
+# Called from canon_refs_list_for_fetch -d "$remote", which
+# is called from get_remote_default_refs_for_fetch to grok
+# refspecs that are retrieved from the configuration, but not
+# from get_remote_refs_for_fetch when it deals with refspecs
+# supplied on the command line.  $ls_remote_result has the list
+# of refs available at remote.
+expand_refs_wildcard () {
+	for ref
+	do
+		# a non glob pattern is given back as-is.
+		expr "z$ref" : 'zrefs/.*/\*:refs/.*/\*$' >/dev/null || {
+			echo "$ref"
+			continue
+		}
+		from=`expr "z$ref" : 'z\(refs/.*/\)\*:refs/.*/\*$'`
+		to=`expr "z$ref" : 'zrefs/.*/\*:\(refs/.*/\)\*$'`
+		echo "$ls_remote_result" |
+		(
+			IFS='	'
+			while read sha1 name
+			do
+				mapped=${name#"$from"}
+				if test "z$name" != "z${name#'^{}'}" ||
+					test "z$name" = "z$mapped"
+				then
+					continue
+				fi
+				echo "${name}:${to}${mapped}"
+			done
+		)
+	done
+}
+
 # Subroutine to canonicalize remote:local notation.
 canon_refs_list_for_fetch () {
 	# If called from get_remote_default_refs_for_fetch
@@ -107,6 +140,8 @@ canon_refs_list_for_fetch () {
 			merge_branches=$(git-repo-config \
 			    --get-all "branch.${curr_branch}.merge")
 		fi
+		set x $(expand_refs_wildcard "$@")
+		shift
 	fi
 	for ref
 	do
-- 
1.4.4.1.g77614
Andy Parkins· Nov 23, 2006, 08:55 UTC · re: Junio C Hamano · lore
On Thursday 2006 November 23 07:24, Junio C Hamano wrote:
>  * Andy, I think this does the same thing as you wanted to do,
>    but is cleaner implementation-wise and also at the concept

It certainly is. Looking at your implementation I see that I was worrying unnecessarily about passing extra globals/parameters to git-parse-remote. Your version is much better than mine; and I see that noone else calls get_remote_refs_for_fetch anyway.

Show 5 quoted lines
>    level, to pretend as if the user listed the expanded form in
>    the configuration.  I deliberately decided not to apply the
>    wildcard expansion on refspecs that came from command line,
>    but if we wanted to we can move the expand_refs_wildcard call
>    a few lines down to make it also apply to them.

That's probably the most sensible method. Using globs on the command line could get people into trouble if they accidentally hit a shell expansion.

Andy
-- 
Dr Andy Parkins, M Eng (hons), MIEE
Michael Loeffler· Nov 27, 2006, 18:14 UTC · re: Junio C Hamano · lore
hi,
Am Mittwoch, den 22.11.2006, 23:24 -0800 schrieb Junio C Hamano: 
> This adds Andy's refspec glob.  You can have a single line:
> 
> 	Pull: refs/heads/*:refs/remotes/origin/*
How about using extended regex for this, something like this:
Pull: refs/heads/master:refs/remotes/origin/master
Pull: refs/tags/v(.*):refs/tags/origin/v\1
... 
> +expand_refs_wildcard () {
> +	for ref
> +	do

... How about using something like: echo "$ls_remote_result" | sed -n -r -e "s:$ref: p"

Using $ref as a part of the sed expression is not a good idea (.* should not match past the ':'), but something like this maybe. What do you think?

bye

← back to recent threads