threads / patch / 3609

patchfetch/parse-remote: refs/remotes/* support

Subject: [PATCH] fetch/parse-remote: refs/remotes/* support

## tl;dr

5 messages between Mar 9, 2006 and Mar 10, 2006. Diffs are folded; open one to read it.

replies: 4people: 2as markdown or json

Eric Wong· Mar 9, 2006, 11:54 UTC · lore
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
 git-fetch.sh        |    5 ++++-
 git-parse-remote.sh |    8 ++++----
 2 files changed, 8 insertions(+), 5 deletions(-)
34f9d6c64bd686f29db4cd410882aab607e1b628
Show changes to 2 files +8 −5

git-fetch.sh, git-parse-remote.sh

diff --git a/git-fetch.sh b/git-fetch.sh
index 0346d4a..2748573 100755
--- a/git-fetch.sh
+++ b/git-fetch.sh
@@ -103,6 +103,9 @@ 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
@@ -150,7 +153,7 @@ fast_forward_local () {
 	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)
diff --git a/git-parse-remote.sh b/git-parse-remote.sh
index 5f158c6..63f2281 100755
--- a/git-parse-remote.sh
+++ b/git-parse-remote.sh
@@ -86,14 +86,14 @@ canon_refs_list_for_fetch () {
 		local=$(expr "$ref" : '[^:]*:\(.*\)')
 		case "$remote" in
 		'') remote=HEAD ;;
-		refs/heads/* | refs/tags/*) ;;
-		heads/* | tags/* ) remote="refs/$remote" ;;
+		refs/heads/* | refs/tags/* | refs/remotes/*) ;;
+		heads/* | tags/* | remotes/* ) remote="refs/$remote" ;;
 		*) remote="refs/heads/$remote" ;;
 		esac
 		case "$local" in
 		'') local= ;;
-		refs/heads/* | refs/tags/*) ;;
-		heads/* | tags/* ) local="refs/$local" ;;
+		refs/heads/* | refs/tags/* | refs/remotes/*) ;;
+		heads/* | tags/* | remotes/* ) local="refs/$local" ;;
 		*) local="refs/heads/$local" ;;
 		esac
 
-- 
1.2.4.ga2910
Eric Wong· Mar 9, 2006, 11:55 UTC · re: Eric Wong · lore

[PATCH] clone: add refs/remotes/* to Pull: targets when cloning

Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
 git-clone.sh |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)
be2db2344099b3713c1136e84bab7390b6198895
Show changes to git-clone.sh +6 −0
diff --git a/git-clone.sh b/git-clone.sh
index 4ed861d..a8ab7fd 100755
--- a/git-clone.sh
+++ b/git-clone.sh
@@ -249,6 +249,12 @@ Pull: $head_points_at:$origin" &&
 			test "$origin" = "$head" ||
 			echo "Pull: ${head}:${head}"
 		done >>"$GIT_DIR/remotes/origin"
+		(test -d "$GIT_DIR"/refs/remotes && cd "$GIT_DIR" &&
+		 find "refs/remotes" -type f -print | sed -e 's|^refs/||') |
+		while read ref
+		do
+			echo "Pull: $ref:$ref"
+		done >>"$GIT_DIR/remotes/origin"
 	esac
 
 	case "$no_checkout" in
-- 
1.2.4.ga2910
Junio C Hamano· Mar 9, 2006, 18:23 UTC · re: Eric Wong · lore

Re: [PATCH] clone: add refs/remotes/* to Pull: targets when cloning

Eric Wong <normalperson@yhbt.net> writes:
Show 15 quoted lines
> diff --git a/git-clone.sh b/git-clone.sh
> index 4ed861d..a8ab7fd 100755
> --- a/git-clone.sh
> +++ b/git-clone.sh
> @@ -249,6 +249,12 @@ Pull: $head_points_at:$origin" &&
>  			test "$origin" = "$head" ||
>  			echo "Pull: ${head}:${head}"
>  		done >>"$GIT_DIR/remotes/origin"
> +		(test -d "$GIT_DIR"/refs/remotes && cd "$GIT_DIR" &&
> +		 find "refs/remotes" -type f -print | sed -e 's|^refs/||') |
> +		while read ref
> +		do
> +			echo "Pull: $ref:$ref"
> +		done >>"$GIT_DIR/remotes/origin"
>  	esac

I am not sure I agree with what you are doing here. I thought the idea behind refs/remotes is to migrate away from copying all the remote heads into refs/heads (so that Linus does not need to see my "next" and "pu" under his refs/heads), and putting foreign SCM tracking branches used by SVN and CVS importers in there instead of in refs/heads naturally falls out from that pattern.

Now I do not propose to change the current clone that contaminates the local branch namespace by copying remote refs/heads into local refs/heads in the middle of v1.3.0 development without laying out a transition plan, but I think that is a sensible future direction. Instead of copying everything from refs/heads to refs/heads, we only copy what remote HEAD points at to refs/heads/master to initialize the local clone, and copy everything from refs/heads to refs/remotes, _and_ set up Pull: lines to do the same tracking. The part of the code you are touching corresponds to the last part.

We would probably be better off not doing this right now. When we are sure everybody thinks it is a better approach to use refs/remotes for remote branch tracking, we would need to change the part you did not change (I think the clone-pack part is the hardest to change since it has a built-in "copy refs to matching locations" logic) alongside with the part you touched with this patch to make things consistent. At that time also you would need to remove several lines above the part you touched so that we do not use local refs/heads/* for tracking.

How does that sound?
Junio C Hamano· Mar 9, 2006, 17:23 UTC · re: Eric Wong · lore

Re: [PATCH] fetch/parse-remote: refs/remotes/* support

Show 10 quoted lines
> @@ -103,6 +103,9 @@ 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

I vaguely recall that if you touch this part of the code you would also need to check if fmt-merge-msg does sensible thing for it.

Eric Wong· Mar 10, 2006, 12:19 UTC · re: Junio C Hamano · lore

[PATCH] fetch,parse-remote,fmt-merge-msg: refs/remotes/* support

Note: This replaces the previous patch to fetch and parse-remote.

We can now easily fetch and merge things from heads in the refs/remotes/ hierarchy in remote repositories.

The refs/remotes/ hierarchy is likely to become the standard for tracking foreign SCMs, as well as the location of Pull: targets for non-master heads of newly cloned repositories.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
 git-fetch.sh           |    8 +++++++-
 git-fmt-merge-msg.perl |    8 ++++++++
 git-parse-remote.sh    |    8 ++++----
 3 files changed, 19 insertions(+), 5 deletions(-)
6697c83da96b26739c3fe33c8526da6124cea909
Show changes to 3 files +19 −5

git-fetch.sh, git-fmt-merge-msg.perl, git-parse-remote.sh

diff --git a/git-fetch.sh b/git-fetch.sh
index 0346d4a..11e9a9d 100755
--- a/git-fetch.sh
+++ b/git-fetch.sh
@@ -94,6 +94,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,6 +106,9 @@ 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
@@ -150,7 +156,7 @@ fast_forward_local () {
 	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)
diff --git a/git-fmt-merge-msg.perl b/git-fmt-merge-msg.perl
index afe80e6..5986e54 100755
--- a/git-fmt-merge-msg.perl
+++ b/git-fmt-merge-msg.perl
@@ -75,6 +75,7 @@ while (<>) {
 		$src{$src} = {
 			BRANCH => [],
 			TAG => [],
+			R_BRANCH => [],
 			GENERIC => [],
 			# &1 == has HEAD.
 			# &2 == has others.
@@ -91,6 +92,11 @@ while (<>) {
 		push @{$src{$src}{TAG}}, $1;
 		$src{$src}{HEAD_STATUS} |= 2;
 	}
+	elsif (/^remote branch (.*)$/) {
+		$origin = $1;
+		push @{$src{$src}{R_BRANCH}}, $1;
+		$src{$src}{HEAD_STATUS} |= 2;
+	}
 	elsif (/^HEAD$/) {
 		$origin = $src;
 		$src{$src}{HEAD_STATUS} |= 1;
@@ -123,6 +129,8 @@ for my $src (@src) {
 	}
 	push @this, andjoin("branch ", "branches ",
 			   $src{$src}{BRANCH});
+	push @this, andjoin("remote branch ", "remote branches ",
+			   $src{$src}{R_BRANCH});
 	push @this, andjoin("tag ", "tags ",
 			   $src{$src}{TAG});
 	push @this, andjoin("commit ", "commits ",
diff --git a/git-parse-remote.sh b/git-parse-remote.sh
index 5f158c6..63f2281 100755
--- a/git-parse-remote.sh
+++ b/git-parse-remote.sh
@@ -86,14 +86,14 @@ canon_refs_list_for_fetch () {
 		local=$(expr "$ref" : '[^:]*:\(.*\)')
 		case "$remote" in
 		'') remote=HEAD ;;
-		refs/heads/* | refs/tags/*) ;;
-		heads/* | tags/* ) remote="refs/$remote" ;;
+		refs/heads/* | refs/tags/* | refs/remotes/*) ;;
+		heads/* | tags/* | remotes/* ) remote="refs/$remote" ;;
 		*) remote="refs/heads/$remote" ;;
 		esac
 		case "$local" in
 		'') local= ;;
-		refs/heads/* | refs/tags/*) ;;
-		heads/* | tags/* ) local="refs/$local" ;;
+		refs/heads/* | refs/tags/* | refs/remotes/*) ;;
+		heads/* | tags/* | remotes/* ) local="refs/$local" ;;
 		*) local="refs/heads/$local" ;;
 		esac
 
-- 
1.2.4.gbe2d

← back to recent threads