When there are lots of ref updates, each has different name length, this will make it easier to look because the variable part is at the end. --- Documentation/git-fetch.txt | 7 +++++++ builtin/fetch.c | 37 ++++++++++++++++++++++++++++++++++++- t/t5510-fetch.sh | 4 ++-- t/t5526-fetch-submodules.sh | 26 +++++++++++++------------- 4 files changed, 58 insertions(+), 16 deletions(-) diff --git a/Documentation/git-fetch.txt b/Documentation/git-fetch.txt index 18e733c..61c3bd1 100644 --- a/Documentation/git-fetch.txt +++ b/Documentation/git-fetch.txt @@ -113,6 +113,13 @@ representing the status of a single ref. Each line is of the form: <flag> <summary> <from> -> <to> (<reason>) ------------------------------- +When `from` and `to` share a common suffix, the line could be +displayed in the form: + +------------------------------- + <flag> <summary> {<from> -> <to>}<suffix> (<reason>) +------------------------------- + The status of up-to-date refs is shown only if --verbose option is used. diff --git a/builtin/fetch.c b/builtin/fetch.c index a7f152a..15782d6 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -451,12 +451,47 @@ fail: #define REFCOL_WIDTH 10 +static int common_suffix_length(const char *a, const char *b) +{ + const char *pa = a + strlen(a); + const char *pb = b + strlen(b); + int count = 0; + + while (pa > a && pb > b && pa[-1] == pb[-1]) { + pa--; + pb--; + count++; + } + + /* stick to '/' boundary, do not break in the middle of a word */ + while (count) { + if (*pa == '/' || + (pa == a && pb > b && pb[-1] == '/') || + (pb == b && pa > a && pa[-1] == '/')) + break; + pa++; + pb++; + count--; + } + + return count; +} + static void format_display(struct strbuf *display, char code, const char *summary, const char *error, const char *remote, const char *local) { + int len; + strbuf_addf(display, "%c %-*s ", code, TRANSPORT_SUMMARY(summary)); - strbuf_addf(display, "%-*s -> %s", REFCOL_WIDTH, remote, local); + len = common_suffix_length(remote, local); + if (len) + strbuf_addf(display, "{%.*s -> %.*s}%s", + (int)strlen(remote) - len, remote, + (int)strlen(local) - len, local, + remote + strlen(remote) - len); + else + strbuf_addf(display, "%-*s -> %s", REFCOL_WIDTH, remote, local); if (error) strbuf_addf(display, " (%s)", error); } diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh index 454d896..9a7649c 100755 --- a/t/t5510-fetch.sh +++ b/t/t5510-fetch.sh @@ -222,11 +222,11 @@ test_expect_success 'fetch uses remote ref names to describe new refs' ' ( cd descriptive && git fetch o 2>actual && - grep " -> refs/crazyheads/descriptive-branch$" actual | + grep " -> refs/crazyheads/.descriptive-branch$" actual | test_i18ngrep "new branch" && grep " -> descriptive-tag$" actual | test_i18ngrep "new tag" && - grep " -> crazy$" actual | + grep " -> .crazy$" actual | test_i18ngrep "new ref" ) && git checkout master diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh index 954d0e4..2285c47 100755 --- a/t/t5526-fetch-submodules.sh +++ b/t/t5526-fetch-submodules.sh @@ -18,7 +18,7 @@ add_upstream_commit() { head2=$(git rev-parse --short HEAD) && echo "Fetching submodule submodule" > ../expect.err && echo "From $pwd/submodule" >> ../expect.err && - echo " $head1..$head2 master -> origin/master" >> ../expect.err + echo " $head1..$head2 { -> origin/}master" >> ../expect.err ) && ( cd deepsubmodule && @@ -30,7 +30,7 @@ add_upstream_commit() { head2=$(git rev-parse --short HEAD) && echo "Fetching submodule submodule/subdir/deepsubmodule" >> ../expect.err echo "From $pwd/deepsubmodule" >> ../expect.err && - echo " $head1..$head2 master -> origin/master" >> ../expect.err + echo " $head1..$head2 { -> origin/}master" >> ../expect.err ) } @@ -235,7 +235,7 @@ test_expect_success "Recursion stops when no new submodule commits are fetched" git commit -m "new submodule" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.sub && - echo " $head1..$head2 master -> origin/master" >>expect.err.sub && + echo " $head1..$head2 { -> origin/}master" >>expect.err.sub && head -3 expect.err >> expect.err.sub && ( cd downstream && @@ -253,7 +253,7 @@ test_expect_success "Recursion doesn't happen when new superproject commits don' git commit -m "new file" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.file && - echo " $head1..$head2 master -> origin/master" >> expect.err.file && + echo " $head1..$head2 { -> origin/}master" >> expect.err.file && ( cd downstream && git fetch >../actual.out 2>../actual.err @@ -277,7 +277,7 @@ test_expect_success "Recursion picks up config in submodule" ' git commit -m "new submodule" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.sub && - echo " $head1..$head2 master -> origin/master" >> expect.err.sub && + echo " $head1..$head2 { -> origin/}master" >> expect.err.sub && cat expect.err >> expect.err.sub && ( cd downstream && @@ -306,14 +306,14 @@ test_expect_success "Recursion picks up all submodules when necessary" ' head2=$(git rev-parse --short HEAD) && echo "Fetching submodule submodule" > ../expect.err.sub && echo "From $pwd/submodule" >> ../expect.err.sub && - echo " $head1..$head2 master -> origin/master" >> ../expect.err.sub + echo " $head1..$head2 { -> origin/}master" >> ../expect.err.sub ) && head1=$(git rev-parse --short HEAD) && git add submodule && git commit -m "new submodule" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.2 && - echo " $head1..$head2 master -> origin/master" >> expect.err.2 && + echo " $head1..$head2 { -> origin/}master" >> expect.err.2 && cat expect.err.sub >> expect.err.2 && tail -3 expect.err >> expect.err.2 && ( @@ -339,7 +339,7 @@ test_expect_success "'--recurse-submodules=on-demand' doesn't recurse when no ne head2=$(git rev-parse --short HEAD) && echo Fetching submodule submodule > ../expect.err.sub && echo "From $pwd/submodule" >> ../expect.err.sub && - echo " $head1..$head2 master -> origin/master" >> ../expect.err.sub + echo " $head1..$head2 { -> origin/}master" >> ../expect.err.sub ) && ( cd downstream && @@ -358,7 +358,7 @@ test_expect_success "'--recurse-submodules=on-demand' recurses as deep as necess head2=$(git rev-parse --short HEAD) && tail -3 expect.err > expect.err.deepsub && echo "From $pwd/." > expect.err && - echo " $head1..$head2 master -> origin/master" >>expect.err && + echo " $head1..$head2 { -> origin/}master" >>expect.err && cat expect.err.sub >> expect.err && cat expect.err.deepsub >> expect.err && ( @@ -387,7 +387,7 @@ test_expect_success "'--recurse-submodules=on-demand' stops when no new submodul git commit -m "new file" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.file && - echo " $head1..$head2 master -> origin/master" >> expect.err.file && + echo " $head1..$head2 { -> origin/}master" >> expect.err.file && ( cd downstream && git fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err @@ -408,7 +408,7 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' overrides global config git commit -m "new submodule" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.2 && - echo " $head1..$head2 master -> origin/master" >>expect.err.2 && + echo " $head1..$head2 { -> origin/}master" >>expect.err.2 && head -3 expect.err >> expect.err.2 && ( cd downstream && @@ -436,7 +436,7 @@ test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' override git commit -m "new submodule" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.2 && - echo " $head1..$head2 master -> origin/master" >>expect.err.2 && + echo " $head1..$head2 { -> origin/}master" >>expect.err.2 && head -3 expect.err >> expect.err.2 && ( cd downstream && @@ -462,7 +462,7 @@ test_expect_success "don't fetch submodule when newly recorded commits are alrea git commit -m "submodule rewound" && head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err && - echo " $head1..$head2 master -> origin/master" >> expect.err && + echo " $head1..$head2 { -> origin/}master" >> expect.err && ( cd downstream && git fetch >../actual.out 2>../actual.err -- 2.8.2.524.g6ff3d78 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html