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

Subsystems: the rest

DORMANTno replies

3 messages, 3 authors, 2016-08-11 · open the first message on its own page

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

From: Junio C Hamano <hidden>
Date: 2016-08-11 19:29:38

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 <redacted>
---

 * 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(-)
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

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

From: Michael Loeffler <hidden>
Date: 2016-08-11 19:23:00

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

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

From: Andy Parkins <hidden>
Date: 2016-08-11 19:27:30

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.
   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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help