[PATCH v2 3/3] fetch: reduce duplicate in ref update status lines
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