Skip to contentSkip to conversation

Make 'remote show' distinguish between merged and rebased remote branches

PATCH In review Marc Branchaud 5 participants 9 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Make 'remote show' distinguish between merged and rebased remote branches

Prints "rebased" instead of "merged" if branch.<name>.rebase is true.

---

I'd like to be able to tell if my "git pull" is going to merge or rebase...

 builtin-remote.c  |   13 ++++++++++---
 t/t5505-remote.sh |    5 +++++
 2 files changed, 15 insertions(+), 3 deletions(-)
builtin-remote.c +10 -3
index abc8dd8..ac3a88e 100644
@@ -145,6 +145,7 @@ static int add(int argc, const char **argv)
 struct branch_info {
 	char *remote;
 	struct string_list merge;
+	int rebase;
 };
 
 static struct string_list branch_list;
@@ -164,7 +165,7 @@ static int config_read_branches(const char *key, const char *value, void *cb)
 		char *name;
 		struct string_list_item *item;
 		struct branch_info *info;
-		enum { REMOTE, MERGE } type;
+		enum { REMOTE, MERGE, REBASE } type;
 
 		key += 7;
 		if (!postfixcmp(key, ".remote")) {
@@ -173,6 +174,9 @@ static int config_read_branches(const char *key, const char *value, void *cb)
 		} else if (!postfixcmp(key, ".merge")) {
 			name = xstrndup(key, strlen(key) - 6);
 			type = MERGE;
+		} else if (!postfixcmp(key, ".rebase")) {
+			name = xstrndup(key, strlen(key) - 7);
+			type = REBASE;
 		} else
 			return 0;
 
@@ -185,7 +189,7 @@ static int config_read_branches(const char *key, const char *value, void *cb)
 			if (info->remote)
 				warning("more than one branch.%s", key);
 			info->remote = xstrdup(value);
-		} else {
+		} else if (type == MERGE) {
 			char *space = strchr(value, ' ');
 			value = abbrev_branch(value);
 			while (space) {
@@ -196,6 +200,8 @@ static int config_read_branches(const char *key, const char *value, void *cb)
 				space = strchr(value, ' ');
 			}
 			string_list_append(xstrdup(value), &info->merge);
+		} else {
+			info->rebase = 1;
 		}
 	}
 	return 0;
@@ -678,9 +684,10 @@ static int show(int argc, const char **argv)
 
 			if (!info->merge.nr || strcmp(*argv, info->remote))
 				continue;
-			printf("  Remote branch%s merged with 'git pull' "
+			printf("  Remote branch%s %s with 'git pull' "
 				"while on branch %s\n   ",
 				info->merge.nr > 1 ? "es" : "",
+				info->rebase ? "rebased" : "merged",
 				branch->string);
 			for (j = 0; j < info->merge.nr; j++)
 				printf(" %s", info->merge.items[j].string);
t/t5505-remote.sh +5 -0
index 1f59960..be0316a 100755
@@ -112,6 +112,8 @@ cat > test/expect << EOF
   URL: $(pwd)/one
   Remote branch merged with 'git pull' while on branch master
     master
+  Remote branch rebased with 'git pull' while on branch rebaser
+    side
   New remote branch (next fetch will store in remotes/origin)
     master
   Tracked remote branches
@@ -136,7 +138,10 @@ test_expect_success 'show' '
 		refs/heads/master:refs/heads/upstream &&
 	 git config --add remote.origin.push \
 		+refs/tags/lastbackup &&
+	 git branch --track rebaser origin/side &&
+	 git config --add branch.rebaser.rebase true &&
 	 git remote show origin > output &&
+	 git branch -D rebaser &&
 	 test_cmp expect output)
 '
 
Signature · 1 line
1.6.1.2.390.gba743
#1 lore raw
Quoted 9 lines · Marc Branchaud

Prints "rebased" instead of "merged" if branch.<name>.rebase is true.

...

t/t5505-remote.sh +0 -0
index 1f59960..be0316a 100755

t/t5505-remote.sh cat > test/expect << EOF · line 119

Quoted 8 lines
t/t5505-remote.sh +2 -0
@@ -112,6 +112,8 @@ cat > test/expect << EOF
   URL: $(pwd)/one
   Remote branch merged with 'git pull' while on branch master
     master
+  Remote branch rebased with 'git pull' while on branch rebaser
+    side
   New remote branch (next fetch will store in remotes/origin)
     master
   Tracked remote branches

I sympathize with what you are trying to do but I do not think this is correct. You will *never* rebase remote on top of your changes; rather you will replay your changes on top of what the updated remote has.

It is more like "if you start git pull while on branch rebaser, it will rebased on top of this branch from the remote".

#2 lore raw
Quoted 8 lines · Junio C Hamano

I sympathize with what you are trying to do but I do not think this is correct. You will *never* rebase remote on top of your changes; rather you will replay your changes on top of what the updated remote has.

It is more like "if you start git pull while on branch rebaser, it will rebased on top of this branch from the remote".

I'm happy to use more accurate phrasing -- I was just going for a minimal change.

How about the following, consistent for both cases:

'git pull' merges branch master with remote branch
master
'git pull' rebases branch rebaser on top of remote branch
side

?

I like the above because the keywords & branch names are in consistent locations, making it easier to parse the output.

Marc

#3 lore raw
Quoted 4 lines · Marc Branchaud

I'm happy to use more accurate phrasing -- I was just going for a minimal change.

How about the following, consistent for both cases:

Quoted 8 lines

'git pull' merges branch master with remote branch
master
'git pull' rebases branch rebaser on top of remote branch
side

?

I like the above because the keywords & branch names are in consistent locations, making it easier to parse the output.

The output of git remote show seems much too verbose for the information it provides. Something like this, I think, provides the same information in much less space:

* remote origin
URL: git://git.kernel.org/pub/scm/git/git.git
Remote branches:

    html      Not tracked
    maint     Tracked
    man       Tracked
    master    Tracked
    next      Tracked
    pu        Tracked
    todo      Not tracked
    old-next  Stale (would prune)

Local branches configured to pull from this remote:
master upstream is master (merges)
wip/remote-HEAD upstream is next (rebases)

When run with "-n" the status column would be blank or say "Status not available with -n".

$0.02. :-)

j.

#4 lore raw
Quoted 3 lines · Jay Soffian

The output of git remote show seems much too verbose for the information it provides.

I agree.

I'm happy to hammer out and implement new output for 'remote show', but is there any chance that such a change would be accepted?

Junio, Dscho, (others) -- any opposition to this?

Quoted 14 lines

Something like this, I think, provides the
same information in much less space:

* remote origin
URL: git://git.kernel.org/pub/scm/git/git.git
Remote branches:

    html      Not tracked
    maint     Tracked
    man       Tracked
    master    Tracked
    next      Tracked
    pu        Tracked
    todo      Not tracked
    old-next  Stale (would prune)
Quoted 3 lines

Local branches configured to pull from this remote:
master upstream is master (merges)
wip/remote-HEAD upstream is next (rebases)

How about something a bit tighter, merging the local branch list with the remote branch list:

* remote origin
URL: git://git.kernel.org/pub/scm/git/git.git
Remote branches:
html Not tracked
master Tracked by local branches:
master (merges)
mywork (rebases)
next Tracked by local branch:
wip/remote-HEAD (rebases)
pu Tracked by local branch:
pu (merges)
todo Not tracked
old-next Stale (would prune)

?

		M.
#5 lore raw
Quoted 15 lines · Marc Branchaud
Quoted 11 lines · Jay Soffian

* remote origin
URL: git://git.kernel.org/pub/scm/git/git.git
Remote branches:

    html      Not tracked
    maint     Tracked
    man       Tracked
    master    Tracked
    next      Tracked
    pu        Tracked
    todo      Not tracked
    old-next  Stale (would prune)
Quoted 3 lines

Local branches configured to pull from this remote:
master upstream is master (merges)
wip/remote-HEAD upstream is next (rebases)

I find this form more useful than the one below because of the clear separation into remote an local branchs.

Quoted 15 lines

How about something a bit tighter, merging the local branch list with the remote branch list:

* remote origin
URL: git://git.kernel.org/pub/scm/git/git.git
Remote branches:
html Not tracked
master Tracked by local branches:
master (merges)
mywork (rebases)
next Tracked by local branch:
wip/remote-HEAD (rebases)
pu Tracked by local branch:
pu (merges)
todo Not tracked
old-next Stale (would prune)

-- Hannes

#6 lore raw
Quoted 17 lines · Johannes Sixt
Quoted 15 lines · Marc Branchaud
Quoted 11 lines · Jay Soffian

* remote origin
URL: git://git.kernel.org/pub/scm/git/git.git
Remote branches:

    html      Not tracked
    maint     Tracked
    man       Tracked
    master    Tracked
    next      Tracked
    pu        Tracked
    todo      Not tracked
    old-next  Stale (would prune)
Quoted 3 lines

Local branches configured to pull from this remote:
master upstream is master (merges)
wip/remote-HEAD upstream is next (rebases)

Quoted 2 lines

I find this form more useful than the one below because of the clear separation into remote an local branchs.

Good point.

#7 lore raw
In reply to Jay Soffian
Quoted 16 lines · Jay Soffian

The output of git remote show seems much too verbose for the information it provides. Something like this, I think, provides the same information in much less space:

* remote origin
URL: git://git.kernel.org/pub/scm/git/git.git
Remote branches:

    html      Not tracked
    maint     Tracked
    man       Tracked
    master    Tracked
    next      Tracked
    pu        Tracked
    todo      Not tracked
    old-next  Stale (would prune)
Quoted 3 lines

Local branches configured to pull from this remote:
master upstream is master (merges)
wip/remote-HEAD upstream is next (rebases)

The current test case for 'remote show' (without my rebase patch) is:

* remote origin
URL: $(pwd)/one
Remote branch merged with 'git pull' while on branch master
master
New remote branch (next fetch will store in remotes/origin)
master
Tracked remote branches
side
master
Local branches pushed with 'git push'
master:upstream
+refs/tags/lastbackup

Should that last bit about 'git push' change as well (I admit I don't really understand what that part is saying)? Or should we just be consistent? Maybe something like:

* remote origin
URL: $(pwd)/one
Remote branches:

    master  Tracked
    side    Not tracked
    flip    Tracked
  New remote branch (next fetch will store in remotes/origin)
    master
  Local branches tracking this remote:
    master   upstream is master (merges)
    rebaser  upstream is flip   (rebases)
  Local branches pushed with 'git push'
    master:upstream
    +refs/tags/lastbackup

		M.
#8 lore raw
In reply to Marc Branchaud

Hi,

t/t5505-remote.sh cat > test/expect << EOF · line 116

Quoted 10 lines · Marc Branchaud
t/t5505-remote.sh +2 -0
index 1f59960..be0316a 100755
@@ -112,6 +112,8 @@ cat > test/expect << EOF
   URL: $(pwd)/one
   Remote branch merged with 'git pull' while on branch master
     master
+  Remote branch rebased with 'git pull' while on branch rebaser
+    side

I'm not a native speaker... but "rebased with" sounds wrong, but so does "Remote branch rebased onto with 'git pull' while on branch rebaser"...

Otherwise, the patch looks good to me.

Thanks,
Dscho