Merge branch 'jn/shortlog' into maint
* jn/shortlog: pretty: Respect --abbrev option shortlog: Document and test --format option t4201 (shortlog): Test output format with multiple authors t4201 (shortlog): guard setup with test_expect_success Documentation/shortlog: scripted users should not rely on implicit HEAD
This commit is contained in:
commit
799c34449e
@ -9,7 +9,7 @@ SYNOPSIS
|
|||||||
--------
|
--------
|
||||||
[verse]
|
[verse]
|
||||||
git log --pretty=short | 'git shortlog' [-h] [-n] [-s] [-e] [-w]
|
git log --pretty=short | 'git shortlog' [-h] [-n] [-s] [-e] [-w]
|
||||||
'git shortlog' [-n|--numbered] [-s|--summary] [-e|--email] [-w[<width>[,<indent1>[,<indent2>]]]] [<committish>...]
|
'git shortlog' [-n|--numbered] [-s|--summary] [-e|--email] [-w[<width>[,<indent1>[,<indent2>]]]] <commit>...
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
@ -19,6 +19,11 @@ the first line of the commit message will be shown.
|
|||||||
|
|
||||||
Additionally, "[PATCH]" will be stripped from the commit description.
|
Additionally, "[PATCH]" will be stripped from the commit description.
|
||||||
|
|
||||||
|
If no revisions are passed on the command line and either standard input
|
||||||
|
is not a terminal or there is no current branch, 'git shortlog' will
|
||||||
|
output a summary of the log read from standard input, without
|
||||||
|
reference to the current repository.
|
||||||
|
|
||||||
OPTIONS
|
OPTIONS
|
||||||
-------
|
-------
|
||||||
|
|
||||||
@ -39,6 +44,14 @@ OPTIONS
|
|||||||
--email::
|
--email::
|
||||||
Show the email address of each author.
|
Show the email address of each author.
|
||||||
|
|
||||||
|
--format[='<format>']::
|
||||||
|
Instead of the commit subject, use some other information to
|
||||||
|
describe each commit. '<format>' can be any string accepted
|
||||||
|
by the `--format` option of 'git log', such as '{asterisk} [%h] %s'.
|
||||||
|
(See the "PRETTY FORMATS" section of linkgit:git-log[1].)
|
||||||
|
|
||||||
|
Each pretty-printed commit will be rewrapped before it is shown.
|
||||||
|
|
||||||
-w[<width>[,<indent1>[,<indent2>]]]::
|
-w[<width>[,<indent1>[,<indent2>]]]::
|
||||||
Linewrap the output by wrapping each line at `width`. The first
|
Linewrap the output by wrapping each line at `width`. The first
|
||||||
line of each entry is indented by `indent1` spaces, and the second
|
line of each entry is indented by `indent1` spaces, and the second
|
||||||
|
@ -162,7 +162,7 @@ void shortlog_add_commit(struct shortlog *log, struct commit *commit)
|
|||||||
sha1_to_hex(commit->object.sha1));
|
sha1_to_hex(commit->object.sha1));
|
||||||
if (log->user_format) {
|
if (log->user_format) {
|
||||||
struct pretty_print_context ctx = {0};
|
struct pretty_print_context ctx = {0};
|
||||||
ctx.abbrev = DEFAULT_ABBREV;
|
ctx.abbrev = log->abbrev;
|
||||||
ctx.subject = "";
|
ctx.subject = "";
|
||||||
ctx.after_subject = "";
|
ctx.after_subject = "";
|
||||||
ctx.date_mode = DATE_NORMAL;
|
ctx.date_mode = DATE_NORMAL;
|
||||||
@ -290,6 +290,7 @@ parse_done:
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.user_format = rev.commit_format == CMIT_FMT_USERFORMAT;
|
log.user_format = rev.commit_format == CMIT_FMT_USERFORMAT;
|
||||||
|
log.abbrev = rev.abbrev;
|
||||||
|
|
||||||
/* assume HEAD if from a tty */
|
/* assume HEAD if from a tty */
|
||||||
if (!nongit && !rev.pending.nr && isatty(0))
|
if (!nongit && !rev.pending.nr && isatty(0))
|
||||||
|
7
pretty.c
7
pretty.c
@ -716,7 +716,7 @@ static size_t format_commit_one(struct strbuf *sb, const char *placeholder,
|
|||||||
if (add_again(sb, &c->abbrev_commit_hash))
|
if (add_again(sb, &c->abbrev_commit_hash))
|
||||||
return 1;
|
return 1;
|
||||||
strbuf_addstr(sb, find_unique_abbrev(commit->object.sha1,
|
strbuf_addstr(sb, find_unique_abbrev(commit->object.sha1,
|
||||||
DEFAULT_ABBREV));
|
c->pretty_ctx->abbrev));
|
||||||
c->abbrev_commit_hash.len = sb->len - c->abbrev_commit_hash.off;
|
c->abbrev_commit_hash.len = sb->len - c->abbrev_commit_hash.off;
|
||||||
return 1;
|
return 1;
|
||||||
case 'T': /* tree hash */
|
case 'T': /* tree hash */
|
||||||
@ -726,7 +726,7 @@ static size_t format_commit_one(struct strbuf *sb, const char *placeholder,
|
|||||||
if (add_again(sb, &c->abbrev_tree_hash))
|
if (add_again(sb, &c->abbrev_tree_hash))
|
||||||
return 1;
|
return 1;
|
||||||
strbuf_addstr(sb, find_unique_abbrev(commit->tree->object.sha1,
|
strbuf_addstr(sb, find_unique_abbrev(commit->tree->object.sha1,
|
||||||
DEFAULT_ABBREV));
|
c->pretty_ctx->abbrev));
|
||||||
c->abbrev_tree_hash.len = sb->len - c->abbrev_tree_hash.off;
|
c->abbrev_tree_hash.len = sb->len - c->abbrev_tree_hash.off;
|
||||||
return 1;
|
return 1;
|
||||||
case 'P': /* parent hashes */
|
case 'P': /* parent hashes */
|
||||||
@ -743,7 +743,8 @@ static size_t format_commit_one(struct strbuf *sb, const char *placeholder,
|
|||||||
if (p != commit->parents)
|
if (p != commit->parents)
|
||||||
strbuf_addch(sb, ' ');
|
strbuf_addch(sb, ' ');
|
||||||
strbuf_addstr(sb, find_unique_abbrev(
|
strbuf_addstr(sb, find_unique_abbrev(
|
||||||
p->item->object.sha1, DEFAULT_ABBREV));
|
p->item->object.sha1,
|
||||||
|
c->pretty_ctx->abbrev));
|
||||||
}
|
}
|
||||||
c->abbrev_parent_hashes.len = sb->len -
|
c->abbrev_parent_hashes.len = sb->len -
|
||||||
c->abbrev_parent_hashes.off;
|
c->abbrev_parent_hashes.off;
|
||||||
|
@ -12,6 +12,7 @@ struct shortlog {
|
|||||||
int in1;
|
int in1;
|
||||||
int in2;
|
int in2;
|
||||||
int user_format;
|
int user_format;
|
||||||
|
int abbrev;
|
||||||
|
|
||||||
char *common_repo_prefix;
|
char *common_repo_prefix;
|
||||||
int email;
|
int email;
|
||||||
|
@ -8,30 +8,93 @@ test_description='git shortlog
|
|||||||
|
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
|
||||||
echo 1 > a1
|
test_expect_success 'setup' '
|
||||||
git add a1
|
echo 1 >a1 &&
|
||||||
tree=$(git write-tree)
|
git add a1 &&
|
||||||
commit=$( (echo "Test"; echo) | git commit-tree $tree )
|
tree=$(git write-tree) &&
|
||||||
git update-ref HEAD $commit
|
commit=$(printf "%s\n" "Test" "" | git commit-tree "$tree") &&
|
||||||
|
git update-ref HEAD "$commit" &&
|
||||||
|
|
||||||
echo 2 > a1
|
echo 2 >a1 &&
|
||||||
git commit --quiet -m "This is a very, very long first line for the commit message to see if it is wrapped correctly" a1
|
git commit --quiet -m "This is a very, very long first line for the commit message to see if it is wrapped correctly" a1 &&
|
||||||
|
|
||||||
# test if the wrapping is still valid when replacing all i's by treble clefs.
|
# test if the wrapping is still valid
|
||||||
echo 3 > a1
|
# when replacing all is by treble clefs.
|
||||||
git commit --quiet -m "$(echo "This is a very, very long first line for the commit message to see if it is wrapped correctly" | sed "s/i/1234/g" | tr 1234 '\360\235\204\236')" a1
|
echo 3 >a1 &&
|
||||||
|
git commit --quiet -m "$(
|
||||||
|
echo "This is a very, very long first line for the commit message to see if it is wrapped correctly" |
|
||||||
|
sed "s/i/1234/g" |
|
||||||
|
tr 1234 "\360\235\204\236")" a1 &&
|
||||||
|
|
||||||
# now fsck up the utf8
|
# now fsck up the utf8
|
||||||
git config i18n.commitencoding non-utf-8
|
git config i18n.commitencoding non-utf-8 &&
|
||||||
echo 4 > a1
|
echo 4 >a1 &&
|
||||||
git commit --quiet -m "$(echo "This is a very, very long first line for the commit message to see if it is wrapped correctly" | sed "s/i/1234/g" | tr 1234 '\370\235\204\236')" a1
|
git commit --quiet -m "$(
|
||||||
|
echo "This is a very, very long first line for the commit message to see if it is wrapped correctly" |
|
||||||
|
sed "s/i/1234/g" |
|
||||||
|
tr 1234 "\370\235\204\236")" a1 &&
|
||||||
|
|
||||||
echo 5 > a1
|
echo 5 >a1 &&
|
||||||
git commit --quiet -m "a 12 34 56 78" a1
|
git commit --quiet -m "a 12 34 56 78" a1
|
||||||
|
|
||||||
git shortlog -w HEAD > out
|
echo 6 >a1 &&
|
||||||
|
git commit --quiet -m "Commit by someone else" \
|
||||||
|
--author="Someone else <not!me>" a1 &&
|
||||||
|
|
||||||
cat > expect << EOF
|
cat >expect.template <<-\EOF
|
||||||
|
A U Thor (5):
|
||||||
|
SUBJECT
|
||||||
|
SUBJECT
|
||||||
|
SUBJECT
|
||||||
|
SUBJECT
|
||||||
|
SUBJECT
|
||||||
|
|
||||||
|
Someone else (1):
|
||||||
|
SUBJECT
|
||||||
|
|
||||||
|
EOF
|
||||||
|
'
|
||||||
|
|
||||||
|
fuzz() {
|
||||||
|
file=$1 &&
|
||||||
|
sed "
|
||||||
|
s/$_x40/OBJECT_NAME/g
|
||||||
|
s/$_x05/OBJID/g
|
||||||
|
s/^ \{6\}[CTa].*/ SUBJECT/g
|
||||||
|
s/^ \{8\}[^ ].*/ CONTINUATION/g
|
||||||
|
" <"$file" >"$file.fuzzy" &&
|
||||||
|
sed "/CONTINUATION/ d" <"$file.fuzzy"
|
||||||
|
}
|
||||||
|
|
||||||
|
test_expect_success 'default output format' '
|
||||||
|
git shortlog HEAD >log &&
|
||||||
|
fuzz log >log.predictable &&
|
||||||
|
test_cmp expect.template log.predictable
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pretty format' '
|
||||||
|
sed s/SUBJECT/OBJECT_NAME/ expect.template >expect &&
|
||||||
|
git shortlog --format="%H" HEAD >log &&
|
||||||
|
fuzz log >log.predictable &&
|
||||||
|
test_cmp expect log.predictable
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success '--abbrev' '
|
||||||
|
sed s/SUBJECT/OBJID/ expect.template >expect &&
|
||||||
|
git shortlog --format="%h" --abbrev=5 HEAD >log &&
|
||||||
|
fuzz log >log.predictable &&
|
||||||
|
test_cmp expect log.predictable
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'output from user-defined format is re-wrapped' '
|
||||||
|
sed "s/SUBJECT/two lines/" expect.template >expect &&
|
||||||
|
git shortlog --format="two%nlines" HEAD >log &&
|
||||||
|
fuzz log >log.predictable &&
|
||||||
|
test_cmp expect log.predictable
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'shortlog wrapping' '
|
||||||
|
cat >expect <<\EOF &&
|
||||||
A U Thor (5):
|
A U Thor (5):
|
||||||
Test
|
Test
|
||||||
This is a very, very long first line for the commit message to see if
|
This is a very, very long first line for the commit message to see if
|
||||||
@ -43,14 +106,19 @@ A U Thor (5):
|
|||||||
a 12 34
|
a 12 34
|
||||||
56 78
|
56 78
|
||||||
|
|
||||||
|
Someone else (1):
|
||||||
|
Commit by someone else
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
|
git shortlog -w HEAD >out &&
|
||||||
|
test_cmp expect out
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'shortlog wrapping' 'test_cmp expect out'
|
test_expect_success 'shortlog from non-git directory' '
|
||||||
|
git log HEAD >log &&
|
||||||
git log HEAD > log
|
GIT_DIR=non-existing git shortlog -w <log >out &&
|
||||||
GIT_DIR=non-existing git shortlog -w < log > out
|
test_cmp expect out
|
||||||
|
'
|
||||||
test_expect_success 'shortlog from non-git directory' 'test_cmp expect out'
|
|
||||||
|
|
||||||
iconvfromutf8toiso88591() {
|
iconvfromutf8toiso88591() {
|
||||||
printf "%s" "$*" | iconv -f UTF-8 -t ISO8859-1
|
printf "%s" "$*" | iconv -f UTF-8 -t ISO8859-1
|
||||||
|
@ -191,6 +191,31 @@ test_expect_success 'add LF before non-empty (2)' '
|
|||||||
grep "^$" actual
|
grep "^$" actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success '--abbrev' '
|
||||||
|
echo SHORT SHORT SHORT >expect2 &&
|
||||||
|
echo LONG LONG LONG >expect3 &&
|
||||||
|
git log -1 --format="%h %h %h" HEAD >actual1 &&
|
||||||
|
git log -1 --abbrev=5 --format="%h %h %h" HEAD >actual2 &&
|
||||||
|
git log -1 --abbrev=5 --format="%H %H %H" HEAD >actual3 &&
|
||||||
|
sed -e "s/$_x40/LONG/g" -e "s/$_x05/SHORT/g" <actual2 >fuzzy2 &&
|
||||||
|
sed -e "s/$_x40/LONG/g" -e "s/$_x05/SHORT/g" <actual3 >fuzzy3 &&
|
||||||
|
test_cmp expect2 fuzzy2 &&
|
||||||
|
test_cmp expect3 fuzzy3 &&
|
||||||
|
! test_cmp actual1 actual2
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success '%H is not affected by --abbrev-commit' '
|
||||||
|
git log -1 --format=%H --abbrev-commit --abbrev=20 HEAD >actual &&
|
||||||
|
len=$(wc -c <actual) &&
|
||||||
|
test $len = 41
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success '%h is not affected by --abbrev-commit' '
|
||||||
|
git log -1 --format=%h --abbrev-commit --abbrev=20 HEAD >actual &&
|
||||||
|
len=$(wc -c <actual) &&
|
||||||
|
test $len = 21
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success '"%h %gD: %gs" is same as git-reflog' '
|
test_expect_success '"%h %gD: %gs" is same as git-reflog' '
|
||||||
git reflog >expect &&
|
git reflog >expect &&
|
||||||
git log -g --format="%h %gD: %gs" >actual &&
|
git log -g --format="%h %gD: %gs" >actual &&
|
||||||
@ -203,6 +228,12 @@ test_expect_success '"%h %gD: %gs" is same as git-reflog (with date)' '
|
|||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success '"%h %gD: %gs" is same as git-reflog (with --abbrev)' '
|
||||||
|
git reflog --abbrev=13 --date=raw >expect &&
|
||||||
|
git log -g --abbrev=13 --format="%h %gD: %gs" --date=raw >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success '%gd shortens ref name' '
|
test_expect_success '%gd shortens ref name' '
|
||||||
echo "master@{0}" >expect.gd-short &&
|
echo "master@{0}" >expect.gd-short &&
|
||||||
git log -g -1 --format=%gd refs/heads/master >actual.gd-short &&
|
git log -g -1 --format=%gd refs/heads/master >actual.gd-short &&
|
||||||
|
Loading…
Reference in New Issue
Block a user