2007-12-25 11:06:47 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='git log'
|
|
|
|
|
|
|
|
. ./test-lib.sh
|
2014-07-09 02:10:21 +00:00
|
|
|
. "$TEST_DIRECTORY/lib-gpg.sh"
|
2017-03-24 05:46:31 +00:00
|
|
|
. "$TEST_DIRECTORY/lib-terminal.sh"
|
2020-02-24 13:38:13 +00:00
|
|
|
. "$TEST_DIRECTORY/lib-log-graph.sh"
|
|
|
|
|
|
|
|
test_cmp_graph () {
|
|
|
|
lib_test_cmp_graph --format=%s "$@"
|
|
|
|
}
|
2007-12-25 11:06:47 +00:00
|
|
|
|
|
|
|
test_expect_success setup '
|
|
|
|
|
|
|
|
echo one >one &&
|
|
|
|
git add one &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m initial &&
|
|
|
|
|
|
|
|
echo ichi >one &&
|
|
|
|
git add one &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m second &&
|
|
|
|
|
2009-01-22 16:37:24 +00:00
|
|
|
git mv one ichi &&
|
2007-12-25 11:06:47 +00:00
|
|
|
test_tick &&
|
|
|
|
git commit -m third &&
|
|
|
|
|
2009-01-22 16:37:24 +00:00
|
|
|
cp ichi ein &&
|
|
|
|
git add ein &&
|
2007-12-25 11:06:47 +00:00
|
|
|
test_tick &&
|
|
|
|
git commit -m fourth &&
|
|
|
|
|
2009-01-22 16:37:24 +00:00
|
|
|
mkdir a &&
|
|
|
|
echo ni >a/two &&
|
|
|
|
git add a/two &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m fifth &&
|
|
|
|
|
|
|
|
git rm a/two &&
|
2007-12-25 11:06:47 +00:00
|
|
|
test_tick &&
|
2009-01-22 16:37:24 +00:00
|
|
|
git commit -m sixth
|
2007-12-25 11:06:47 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
2009-02-24 21:06:37 +00:00
|
|
|
printf "sixth\nfifth\nfourth\nthird\nsecond\ninitial" > expect
|
|
|
|
test_expect_success 'pretty' '
|
|
|
|
|
|
|
|
git log --pretty="format:%s" > actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
printf "sixth\nfifth\nfourth\nthird\nsecond\ninitial\n" > expect
|
|
|
|
test_expect_success 'pretty (tformat)' '
|
|
|
|
|
|
|
|
git log --pretty="tformat:%s" > actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'pretty (shortcut)' '
|
|
|
|
|
|
|
|
git log --pretty="%s" > actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'format' '
|
|
|
|
|
|
|
|
git log --format="%s" > actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2009-11-22 16:15:29 +00:00
|
|
|
cat > expect << EOF
|
|
|
|
This is
|
|
|
|
the sixth
|
|
|
|
commit.
|
|
|
|
This is
|
|
|
|
the fifth
|
|
|
|
commit.
|
|
|
|
EOF
|
|
|
|
|
utf8: fix off-by-one wrapping of text
The wrapping logic in strbuf_add_wrapped_text() does currently not allow
lines that entirely fill the allowed width, instead it wraps the line one
character too early.
For example, the text "This is the sixth commit." formatted via
"%w(11,1,2)" (wrap at 11 characters, 1 char indent of first line, 2 char
indent of following lines) results in four lines: " This is", " the",
" sixth", " commit." This is wrong, because " the sixth" is exactly
11 characters long, and thus allowed.
Fix this by allowing the (width+1) character of a line to be a valid
wrapping point if it is a whitespace character.
Signed-off-by: Jan H. Schönherr <schnhrr@cs.tu-berlin.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-10-18 14:43:28 +00:00
|
|
|
test_expect_success 'format %w(11,1,2)' '
|
2009-11-22 16:15:29 +00:00
|
|
|
|
utf8: fix off-by-one wrapping of text
The wrapping logic in strbuf_add_wrapped_text() does currently not allow
lines that entirely fill the allowed width, instead it wraps the line one
character too early.
For example, the text "This is the sixth commit." formatted via
"%w(11,1,2)" (wrap at 11 characters, 1 char indent of first line, 2 char
indent of following lines) results in four lines: " This is", " the",
" sixth", " commit." This is wrong, because " the sixth" is exactly
11 characters long, and thus allowed.
Fix this by allowing the (width+1) character of a line to be a valid
wrapping point if it is a whitespace character.
Signed-off-by: Jan H. Schönherr <schnhrr@cs.tu-berlin.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-10-18 14:43:28 +00:00
|
|
|
git log -2 --format="%w(11,1,2)This is the %s commit." > actual &&
|
2009-11-22 16:15:29 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'format %w(,1,2)' '
|
|
|
|
|
|
|
|
git log -2 --format="%w(,1,2)This is%nthe %s%ncommit." > actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2009-02-24 21:06:37 +00:00
|
|
|
cat > expect << EOF
|
2019-12-21 19:49:21 +00:00
|
|
|
$(git rev-parse --short :/sixth ) sixth
|
|
|
|
$(git rev-parse --short :/fifth ) fifth
|
|
|
|
$(git rev-parse --short :/fourth ) fourth
|
|
|
|
$(git rev-parse --short :/third ) third
|
|
|
|
$(git rev-parse --short :/second ) second
|
|
|
|
$(git rev-parse --short :/initial) initial
|
2009-02-24 21:06:37 +00:00
|
|
|
EOF
|
|
|
|
test_expect_success 'oneline' '
|
|
|
|
|
|
|
|
git log --oneline > actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2007-12-25 11:06:47 +00:00
|
|
|
test_expect_success 'diff-filter=A' '
|
|
|
|
|
2016-02-25 08:59:21 +00:00
|
|
|
git log --no-renames --pretty="format:%s" --diff-filter=A HEAD > actual &&
|
|
|
|
git log --no-renames --pretty="format:%s" --diff-filter A HEAD > actual-separate &&
|
2010-08-05 08:22:52 +00:00
|
|
|
printf "fifth\nfourth\nthird\ninitial" > expect &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
test_cmp expect actual-separate
|
2007-12-25 11:06:47 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'diff-filter=M' '
|
|
|
|
|
|
|
|
actual=$(git log --pretty="format:%s" --diff-filter=M HEAD) &&
|
|
|
|
expect=$(echo second) &&
|
2015-03-20 10:09:00 +00:00
|
|
|
verbose test "$actual" = "$expect"
|
2007-12-25 11:06:47 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'diff-filter=D' '
|
|
|
|
|
2016-02-25 08:59:21 +00:00
|
|
|
actual=$(git log --no-renames --pretty="format:%s" --diff-filter=D HEAD) &&
|
2009-01-22 16:37:24 +00:00
|
|
|
expect=$(echo sixth ; echo third) &&
|
2015-03-20 10:09:00 +00:00
|
|
|
verbose test "$actual" = "$expect"
|
2009-01-22 16:37:24 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'diff-filter=R' '
|
|
|
|
|
|
|
|
actual=$(git log -M --pretty="format:%s" --diff-filter=R HEAD) &&
|
|
|
|
expect=$(echo third) &&
|
2015-03-20 10:09:00 +00:00
|
|
|
verbose test "$actual" = "$expect"
|
2009-01-22 16:37:24 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'diff-filter=C' '
|
|
|
|
|
|
|
|
actual=$(git log -C -C --pretty="format:%s" --diff-filter=C HEAD) &&
|
|
|
|
expect=$(echo fourth) &&
|
2015-03-20 10:09:00 +00:00
|
|
|
verbose test "$actual" = "$expect"
|
2009-01-22 16:37:24 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'git log --follow' '
|
|
|
|
|
|
|
|
actual=$(git log --follow --pretty="format:%s" ichi) &&
|
|
|
|
expect=$(echo third ; echo second ; echo initial) &&
|
2015-03-20 10:09:00 +00:00
|
|
|
verbose test "$actual" = "$expect"
|
2015-07-08 01:29:34 +00:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'git config log.follow works like --follow' '
|
|
|
|
test_config log.follow true &&
|
|
|
|
actual=$(git log --pretty="format:%s" ichi) &&
|
|
|
|
expect=$(echo third ; echo second ; echo initial) &&
|
|
|
|
verbose test "$actual" = "$expect"
|
|
|
|
'
|
2007-12-25 11:06:47 +00:00
|
|
|
|
2015-07-08 01:29:34 +00:00
|
|
|
test_expect_success 'git config log.follow does not die with multiple paths' '
|
|
|
|
test_config log.follow true &&
|
|
|
|
git log --pretty="format:%s" ichi ein
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'git config log.follow does not die with no paths' '
|
|
|
|
test_config log.follow true &&
|
|
|
|
git log --
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'git config log.follow is overridden by --no-follow' '
|
|
|
|
test_config log.follow true &&
|
|
|
|
actual=$(git log --no-follow --pretty="format:%s" ichi) &&
|
|
|
|
expect="third" &&
|
|
|
|
verbose test "$actual" = "$expect"
|
2007-12-25 11:06:47 +00:00
|
|
|
'
|
|
|
|
|
2019-12-21 19:49:21 +00:00
|
|
|
# Note that these commits are intentionally listed out of order.
|
|
|
|
last_three="$(git rev-parse :/fourth :/sixth :/fifth)"
|
2009-07-17 14:28:06 +00:00
|
|
|
cat > expect << EOF
|
2019-12-21 19:49:21 +00:00
|
|
|
$(git rev-parse --short :/sixth ) sixth
|
|
|
|
$(git rev-parse --short :/fifth ) fifth
|
|
|
|
$(git rev-parse --short :/fourth) fourth
|
2009-07-17 14:28:06 +00:00
|
|
|
EOF
|
|
|
|
test_expect_success 'git log --no-walk <commits> sorts by commit time' '
|
2019-12-21 19:49:21 +00:00
|
|
|
git log --no-walk --oneline $last_three > actual &&
|
2009-07-17 14:28:06 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
teach log --no-walk=unsorted, which avoids sorting
When 'git log' is passed the --no-walk option, no revision walk takes
place, naturally. Perhaps somewhat surprisingly, however, the provided
revisions still get sorted by commit date. So e.g 'git log --no-walk
HEAD HEAD~1' and 'git log --no-walk HEAD~1 HEAD' give the same result
(unless the two revisions share the commit date, in which case they
will retain the order given on the command line). As the commit that
introduced --no-walk (8e64006 (Teach revision machinery about
--no-walk, 2007-07-24)) points out, the sorting is intentional, to
allow things like
git log --abbrev-commit --pretty=oneline --decorate --all --no-walk
to show all refs in order by commit date.
But there are also other cases where the sorting is not wanted, such
as
<command producing revisions in order> |
git log --oneline --no-walk --stdin
To accomodate both cases, leave the decision of whether or not to sort
up to the caller, by allowing --no-walk={sorted,unsorted}, defaulting
to 'sorted' for backward-compatibility reasons.
Signed-off-by: Martin von Zweigbergk <martinvonz@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-08-29 06:15:54 +00:00
|
|
|
test_expect_success 'git log --no-walk=sorted <commits> sorts by commit time' '
|
2019-12-21 19:49:21 +00:00
|
|
|
git log --no-walk=sorted --oneline $last_three > actual &&
|
teach log --no-walk=unsorted, which avoids sorting
When 'git log' is passed the --no-walk option, no revision walk takes
place, naturally. Perhaps somewhat surprisingly, however, the provided
revisions still get sorted by commit date. So e.g 'git log --no-walk
HEAD HEAD~1' and 'git log --no-walk HEAD~1 HEAD' give the same result
(unless the two revisions share the commit date, in which case they
will retain the order given on the command line). As the commit that
introduced --no-walk (8e64006 (Teach revision machinery about
--no-walk, 2007-07-24)) points out, the sorting is intentional, to
allow things like
git log --abbrev-commit --pretty=oneline --decorate --all --no-walk
to show all refs in order by commit date.
But there are also other cases where the sorting is not wanted, such
as
<command producing revisions in order> |
git log --oneline --no-walk --stdin
To accomodate both cases, leave the decision of whether or not to sort
up to the caller, by allowing --no-walk={sorted,unsorted}, defaulting
to 'sorted' for backward-compatibility reasons.
Signed-off-by: Martin von Zweigbergk <martinvonz@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-08-29 06:15:54 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2016-08-31 23:27:20 +00:00
|
|
|
cat > expect << EOF
|
2019-12-21 19:49:21 +00:00
|
|
|
=== $(git rev-parse --short :/sixth ) sixth
|
|
|
|
=== $(git rev-parse --short :/fifth ) fifth
|
|
|
|
=== $(git rev-parse --short :/fourth) fourth
|
2016-08-31 23:27:20 +00:00
|
|
|
EOF
|
|
|
|
test_expect_success 'git log --line-prefix="=== " --no-walk <commits> sorts by commit time' '
|
2019-12-21 19:49:21 +00:00
|
|
|
git log --line-prefix="=== " --no-walk --oneline $last_three > actual &&
|
2016-08-31 23:27:20 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2009-07-17 14:28:06 +00:00
|
|
|
cat > expect << EOF
|
2019-12-21 19:49:21 +00:00
|
|
|
$(git rev-parse --short :/fourth) fourth
|
|
|
|
$(git rev-parse --short :/sixth ) sixth
|
|
|
|
$(git rev-parse --short :/fifth ) fifth
|
2009-07-17 14:28:06 +00:00
|
|
|
EOF
|
teach log --no-walk=unsorted, which avoids sorting
When 'git log' is passed the --no-walk option, no revision walk takes
place, naturally. Perhaps somewhat surprisingly, however, the provided
revisions still get sorted by commit date. So e.g 'git log --no-walk
HEAD HEAD~1' and 'git log --no-walk HEAD~1 HEAD' give the same result
(unless the two revisions share the commit date, in which case they
will retain the order given on the command line). As the commit that
introduced --no-walk (8e64006 (Teach revision machinery about
--no-walk, 2007-07-24)) points out, the sorting is intentional, to
allow things like
git log --abbrev-commit --pretty=oneline --decorate --all --no-walk
to show all refs in order by commit date.
But there are also other cases where the sorting is not wanted, such
as
<command producing revisions in order> |
git log --oneline --no-walk --stdin
To accomodate both cases, leave the decision of whether or not to sort
up to the caller, by allowing --no-walk={sorted,unsorted}, defaulting
to 'sorted' for backward-compatibility reasons.
Signed-off-by: Martin von Zweigbergk <martinvonz@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-08-29 06:15:54 +00:00
|
|
|
test_expect_success 'git log --no-walk=unsorted <commits> leaves list of commits as given' '
|
2019-12-21 19:49:21 +00:00
|
|
|
git log --no-walk=unsorted --oneline $last_three > actual &&
|
teach log --no-walk=unsorted, which avoids sorting
When 'git log' is passed the --no-walk option, no revision walk takes
place, naturally. Perhaps somewhat surprisingly, however, the provided
revisions still get sorted by commit date. So e.g 'git log --no-walk
HEAD HEAD~1' and 'git log --no-walk HEAD~1 HEAD' give the same result
(unless the two revisions share the commit date, in which case they
will retain the order given on the command line). As the commit that
introduced --no-walk (8e64006 (Teach revision machinery about
--no-walk, 2007-07-24)) points out, the sorting is intentional, to
allow things like
git log --abbrev-commit --pretty=oneline --decorate --all --no-walk
to show all refs in order by commit date.
But there are also other cases where the sorting is not wanted, such
as
<command producing revisions in order> |
git log --oneline --no-walk --stdin
To accomodate both cases, leave the decision of whether or not to sort
up to the caller, by allowing --no-walk={sorted,unsorted}, defaulting
to 'sorted' for backward-compatibility reasons.
Signed-off-by: Martin von Zweigbergk <martinvonz@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-08-29 06:15:54 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2009-07-17 14:28:06 +00:00
|
|
|
test_expect_success 'git show <commits> leaves list of commits as given' '
|
2019-12-21 19:49:21 +00:00
|
|
|
git show --oneline -s $last_three > actual &&
|
2009-07-17 14:28:06 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2008-08-25 06:15:05 +00:00
|
|
|
test_expect_success 'setup case sensitivity tests' '
|
|
|
|
echo case >one &&
|
|
|
|
test_tick &&
|
2010-10-31 01:46:54 +00:00
|
|
|
git add one &&
|
2008-08-25 06:15:05 +00:00
|
|
|
git commit -a -m Second
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'log --grep' '
|
|
|
|
echo second >expect &&
|
|
|
|
git log -1 --pretty="tformat:%s" --grep=sec >actual &&
|
log: teach --invert-grep option
"git log --grep=<string>" shows only commits with messages that
match the given string, but sometimes it is useful to be able to
show only commits that do *not* have certain messages (e.g. "show
me ones that are not FIXUP commits").
Originally, we had the invert-grep flag in grep_opt, but because
"git grep --invert-grep" does not make sense except in conjunction
with "--files-with-matches", which is already covered by
"--files-without-matches", it was moved it to revisions structure.
To have the flag there expresses the function to the feature better.
When the newly inserted two tests run, the history would have commits
with messages "initial", "second", "third", "fourth", "fifth", "sixth"
and "Second", committed in this order. The commits that does not match
either "th" or "Sec" is "second" and "initial". For the case insensitive
case only "initial" matches.
Signed-off-by: Christoph Junghans <ottxor@gentoo.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2015-01-13 01:33:32 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
cat > expect << EOF
|
|
|
|
second
|
|
|
|
initial
|
|
|
|
EOF
|
|
|
|
test_expect_success 'log --invert-grep --grep' '
|
2017-05-20 21:42:08 +00:00
|
|
|
# Fixed
|
|
|
|
git -c grep.patternType=fixed log --pretty="tformat:%s" --invert-grep --grep=th --grep=Sec >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
# POSIX basic
|
|
|
|
git -c grep.patternType=basic log --pretty="tformat:%s" --invert-grep --grep=t[h] --grep=S[e]c >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
# POSIX extended
|
|
|
|
git -c grep.patternType=basic log --pretty="tformat:%s" --invert-grep --grep=t[h] --grep=S[e]c >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
# PCRE
|
|
|
|
if test_have_prereq PCRE
|
|
|
|
then
|
|
|
|
git -c grep.patternType=perl log --pretty="tformat:%s" --invert-grep --grep=t[h] --grep=S[e]c >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
fi
|
log: teach --invert-grep option
"git log --grep=<string>" shows only commits with messages that
match the given string, but sometimes it is useful to be able to
show only commits that do *not* have certain messages (e.g. "show
me ones that are not FIXUP commits").
Originally, we had the invert-grep flag in grep_opt, but because
"git grep --invert-grep" does not make sense except in conjunction
with "--files-with-matches", which is already covered by
"--files-without-matches", it was moved it to revisions structure.
To have the flag there expresses the function to the feature better.
When the newly inserted two tests run, the history would have commits
with messages "initial", "second", "third", "fourth", "fifth", "sixth"
and "Second", committed in this order. The commits that does not match
either "th" or "Sec" is "second" and "initial". For the case insensitive
case only "initial" matches.
Signed-off-by: Christoph Junghans <ottxor@gentoo.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2015-01-13 01:33:32 +00:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'log --invert-grep --grep -i' '
|
|
|
|
echo initial >expect &&
|
2017-05-20 21:42:08 +00:00
|
|
|
|
|
|
|
# Fixed
|
|
|
|
git -c grep.patternType=fixed log --pretty="tformat:%s" --invert-grep -i --grep=th --grep=Sec >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
# POSIX basic
|
|
|
|
git -c grep.patternType=basic log --pretty="tformat:%s" --invert-grep -i --grep=t[h] --grep=S[e]c >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
# POSIX extended
|
|
|
|
git -c grep.patternType=extended log --pretty="tformat:%s" --invert-grep -i --grep=t[h] --grep=S[e]c >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
# PCRE
|
|
|
|
if test_have_prereq PCRE
|
|
|
|
then
|
|
|
|
git -c grep.patternType=perl log --pretty="tformat:%s" --invert-grep -i --grep=t[h] --grep=S[e]c >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
fi
|
2008-08-25 06:15:05 +00:00
|
|
|
'
|
2007-12-25 11:06:47 +00:00
|
|
|
|
2010-08-05 08:22:55 +00:00
|
|
|
test_expect_success 'log --grep option parsing' '
|
|
|
|
echo second >expect &&
|
|
|
|
git log -1 --pretty="tformat:%s" --grep sec >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
test_must_fail git log -1 --pretty="tformat:%s" --grep
|
|
|
|
'
|
|
|
|
|
2008-08-25 06:15:05 +00:00
|
|
|
test_expect_success 'log -i --grep' '
|
|
|
|
echo Second >expect &&
|
|
|
|
git log -1 --pretty="tformat:%s" -i --grep=sec >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'log --grep -i' '
|
|
|
|
echo Second >expect &&
|
2017-05-20 21:42:08 +00:00
|
|
|
|
|
|
|
# Fixed
|
2008-08-25 06:15:05 +00:00
|
|
|
git log -1 --pretty="tformat:%s" --grep=sec -i >actual &&
|
2017-05-20 21:42:08 +00:00
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
# POSIX basic
|
|
|
|
git -c grep.patternType=basic log -1 --pretty="tformat:%s" --grep=s[e]c -i >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
# POSIX extended
|
|
|
|
git -c grep.patternType=extended log -1 --pretty="tformat:%s" --grep=s[e]c -i >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
# PCRE
|
|
|
|
if test_have_prereq PCRE
|
|
|
|
then
|
|
|
|
git -c grep.patternType=perl log -1 --pretty="tformat:%s" --grep=s[e]c -i >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
fi
|
2008-08-25 06:15:05 +00:00
|
|
|
'
|
2007-12-25 11:06:47 +00:00
|
|
|
|
2012-10-03 21:50:51 +00:00
|
|
|
test_expect_success 'log -F -E --grep=<ere> uses ere' '
|
|
|
|
echo second >expect &&
|
2017-05-20 21:42:07 +00:00
|
|
|
# basic would need \(s\) to do the same
|
|
|
|
git log -1 --pretty="tformat:%s" -F -E --grep="(s).c.nd" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success PCRE 'log -F -E --perl-regexp --grep=<pcre> uses PCRE' '
|
|
|
|
test_when_finished "rm -rf num_commits" &&
|
|
|
|
git init num_commits &&
|
|
|
|
(
|
|
|
|
cd num_commits &&
|
|
|
|
test_commit 1d &&
|
|
|
|
test_commit 2e
|
|
|
|
) &&
|
|
|
|
|
|
|
|
# In PCRE \d in [\d] is like saying "0-9", and matches the 2
|
|
|
|
# in 2e...
|
|
|
|
echo 2e >expect &&
|
|
|
|
git -C num_commits log -1 --pretty="tformat:%s" -F -E --perl-regexp --grep="[\d]" >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
|
|
|
|
# ...in POSIX basic and extended it is the same as [d],
|
|
|
|
# i.e. "d", which matches 1d, but does not match 2e.
|
|
|
|
echo 1d >expect &&
|
|
|
|
git -C num_commits log -1 --pretty="tformat:%s" -F -E --grep="[\d]" >actual &&
|
2012-10-03 21:50:51 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
grep: further simplify setting the pattern type
When c5c31d33 (grep: move pattern-type bits support to top-level
grep.[ch], 2012-10-03) introduced grep_commit_pattern_type() helper
function, the intention was to allow the users of grep API to having
to fiddle only with .pattern_type_option (which can be set to "fixed",
"basic", "extended", and "pcre"), and then immediately before compiling
the pattern strings for use, call grep_commit_pattern_type() to have
it prepare various bits in the grep_opt structure (like .fixed,
.regflags, etc.).
However, grep_set_pattern_type_option() helper function the grep API
internally uses were left as an external function by mistake. This
function shouldn't have been made callable by the users of the API.
Later when the grep API was used in revision traversal machinery,
the caller then mistakenly started calling the function around
34a4ae55 (log --grep: use the same helper to set -E/-F options as
"git grep", 2012-10-03), instead of setting the .pattern_type_option
field and letting the grep_commit_pattern_type() to take care of the
details.
This caused an unnecessary bug that made a configured
grep.patternType take precedence over the command line options
(e.g. --basic-regexp, --fixed-strings) in "git log" family of
commands.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-07-22 18:43:14 +00:00
|
|
|
test_expect_success 'log with grep.patternType configuration' '
|
|
|
|
git -c grep.patterntype=fixed \
|
|
|
|
log -1 --pretty=tformat:%s --grep=s.c.nd >actual &&
|
2018-07-27 17:48:11 +00:00
|
|
|
test_must_be_empty actual
|
grep: further simplify setting the pattern type
When c5c31d33 (grep: move pattern-type bits support to top-level
grep.[ch], 2012-10-03) introduced grep_commit_pattern_type() helper
function, the intention was to allow the users of grep API to having
to fiddle only with .pattern_type_option (which can be set to "fixed",
"basic", "extended", and "pcre"), and then immediately before compiling
the pattern strings for use, call grep_commit_pattern_type() to have
it prepare various bits in the grep_opt structure (like .fixed,
.regflags, etc.).
However, grep_set_pattern_type_option() helper function the grep API
internally uses were left as an external function by mistake. This
function shouldn't have been made callable by the users of the API.
Later when the grep API was used in revision traversal machinery,
the caller then mistakenly started calling the function around
34a4ae55 (log --grep: use the same helper to set -E/-F options as
"git grep", 2012-10-03), instead of setting the .pattern_type_option
field and letting the grep_commit_pattern_type() to take care of the
details.
This caused an unnecessary bug that made a configured
grep.patternType take precedence over the command line options
(e.g. --basic-regexp, --fixed-strings) in "git log" family of
commands.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-07-22 18:43:14 +00:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'log with grep.patternType configuration and command line' '
|
|
|
|
echo second >expect &&
|
|
|
|
git -c grep.patterntype=fixed \
|
|
|
|
log -1 --pretty=tformat:%s --basic-regexp --grep=s.c.nd >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2019-05-13 18:32:42 +00:00
|
|
|
test_expect_success !FAIL_PREREQS 'log with various grep.patternType configurations & command-lines' '
|
2017-05-20 21:42:07 +00:00
|
|
|
git init pattern-type &&
|
|
|
|
(
|
|
|
|
cd pattern-type &&
|
|
|
|
test_commit 1 file A &&
|
|
|
|
|
|
|
|
# The tagname is overridden here because creating a
|
|
|
|
# tag called "(1|2)" as test_commit would otherwise
|
|
|
|
# implicitly do would fail on e.g. MINGW.
|
|
|
|
test_commit "(1|2)" file B 2 &&
|
|
|
|
|
|
|
|
echo "(1|2)" >expect.fixed &&
|
|
|
|
cp expect.fixed expect.basic &&
|
|
|
|
cp expect.fixed expect.extended &&
|
|
|
|
cp expect.fixed expect.perl &&
|
|
|
|
|
|
|
|
# A strcmp-like match with fixed.
|
|
|
|
git -c grep.patternType=fixed log --pretty=tformat:%s \
|
|
|
|
--grep="(1|2)" >actual.fixed &&
|
|
|
|
|
|
|
|
# POSIX basic matches (, | and ) literally.
|
|
|
|
git -c grep.patternType=basic log --pretty=tformat:%s \
|
|
|
|
--grep="(.|.)" >actual.basic &&
|
|
|
|
|
|
|
|
# POSIX extended needs to have | escaped to match it
|
|
|
|
# literally, whereas under basic this is the same as
|
|
|
|
# (|2), i.e. it would also match "1". This test checks
|
|
|
|
# for extended by asserting that it is not matching
|
|
|
|
# what basic would match.
|
|
|
|
git -c grep.patternType=extended log --pretty=tformat:%s \
|
|
|
|
--grep="\|2" >actual.extended &&
|
|
|
|
if test_have_prereq PCRE
|
|
|
|
then
|
|
|
|
# Only PCRE would match [\d]\| with only
|
|
|
|
# "(1|2)" due to [\d]. POSIX basic would match
|
|
|
|
# both it and "1" since similarly to the
|
|
|
|
# extended match above it is the same as
|
|
|
|
# \([\d]\|\). POSIX extended would
|
|
|
|
# match neither.
|
|
|
|
git -c grep.patternType=perl log --pretty=tformat:%s \
|
|
|
|
--grep="[\d]\|" >actual.perl &&
|
|
|
|
test_cmp expect.perl actual.perl
|
|
|
|
fi &&
|
|
|
|
test_cmp expect.fixed actual.fixed &&
|
|
|
|
test_cmp expect.basic actual.basic &&
|
|
|
|
test_cmp expect.extended actual.extended &&
|
|
|
|
|
|
|
|
git log --pretty=tformat:%s -F \
|
|
|
|
--grep="(1|2)" >actual.fixed.short-arg &&
|
|
|
|
git log --pretty=tformat:%s -E \
|
|
|
|
--grep="\|2" >actual.extended.short-arg &&
|
2017-05-25 20:05:24 +00:00
|
|
|
if test_have_prereq PCRE
|
|
|
|
then
|
|
|
|
git log --pretty=tformat:%s -P \
|
|
|
|
--grep="[\d]\|" >actual.perl.short-arg
|
|
|
|
else
|
|
|
|
test_must_fail git log -P \
|
|
|
|
--grep="[\d]\|"
|
|
|
|
fi &&
|
2017-05-20 21:42:07 +00:00
|
|
|
test_cmp expect.fixed actual.fixed.short-arg &&
|
|
|
|
test_cmp expect.extended actual.extended.short-arg &&
|
2017-05-25 20:05:24 +00:00
|
|
|
if test_have_prereq PCRE
|
|
|
|
then
|
|
|
|
test_cmp expect.perl actual.perl.short-arg
|
|
|
|
fi &&
|
2017-05-20 21:42:07 +00:00
|
|
|
|
|
|
|
git log --pretty=tformat:%s --fixed-strings \
|
|
|
|
--grep="(1|2)" >actual.fixed.long-arg &&
|
|
|
|
git log --pretty=tformat:%s --basic-regexp \
|
|
|
|
--grep="(.|.)" >actual.basic.long-arg &&
|
|
|
|
git log --pretty=tformat:%s --extended-regexp \
|
|
|
|
--grep="\|2" >actual.extended.long-arg &&
|
|
|
|
if test_have_prereq PCRE
|
|
|
|
then
|
|
|
|
git log --pretty=tformat:%s --perl-regexp \
|
|
|
|
--grep="[\d]\|" >actual.perl.long-arg &&
|
|
|
|
test_cmp expect.perl actual.perl.long-arg
|
2017-05-20 21:42:09 +00:00
|
|
|
else
|
|
|
|
test_must_fail git log --perl-regexp \
|
|
|
|
--grep="[\d]\|"
|
2017-05-20 21:42:07 +00:00
|
|
|
fi &&
|
|
|
|
test_cmp expect.fixed actual.fixed.long-arg &&
|
|
|
|
test_cmp expect.basic actual.basic.long-arg &&
|
|
|
|
test_cmp expect.extended actual.extended.long-arg
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2009-02-19 11:13:38 +00:00
|
|
|
cat > expect <<EOF
|
|
|
|
* Second
|
|
|
|
* sixth
|
|
|
|
* fifth
|
|
|
|
* fourth
|
|
|
|
* third
|
|
|
|
* second
|
|
|
|
* initial
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'simple log --graph' '
|
2020-02-24 13:38:13 +00:00
|
|
|
test_cmp_graph
|
2009-02-19 11:13:38 +00:00
|
|
|
'
|
|
|
|
|
2016-08-31 23:27:20 +00:00
|
|
|
cat > expect <<EOF
|
|
|
|
123 * Second
|
|
|
|
123 * sixth
|
|
|
|
123 * fifth
|
|
|
|
123 * fourth
|
|
|
|
123 * third
|
|
|
|
123 * second
|
|
|
|
123 * initial
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'simple log --graph --line-prefix="123 "' '
|
2020-02-24 13:38:13 +00:00
|
|
|
test_cmp_graph --line-prefix="123 "
|
2016-08-31 23:27:20 +00:00
|
|
|
'
|
|
|
|
|
2009-02-19 11:13:38 +00:00
|
|
|
test_expect_success 'set up merge history' '
|
|
|
|
git checkout -b side HEAD~4 &&
|
|
|
|
test_commit side-1 1 1 &&
|
|
|
|
test_commit side-2 2 2 &&
|
|
|
|
git checkout master &&
|
|
|
|
git merge side
|
|
|
|
'
|
|
|
|
|
|
|
|
cat > expect <<\EOF
|
|
|
|
* Merge branch 'side'
|
|
|
|
|\
|
|
|
|
| * side-2
|
|
|
|
| * side-1
|
|
|
|
* | Second
|
|
|
|
* | sixth
|
|
|
|
* | fifth
|
|
|
|
* | fourth
|
|
|
|
|/
|
|
|
|
* third
|
|
|
|
* second
|
|
|
|
* initial
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'log --graph with merge' '
|
2020-02-24 13:38:13 +00:00
|
|
|
test_cmp_graph --date-order
|
2009-02-19 11:13:38 +00:00
|
|
|
'
|
|
|
|
|
2016-08-31 23:27:20 +00:00
|
|
|
cat > expect <<\EOF
|
|
|
|
| | | * Merge branch 'side'
|
|
|
|
| | | |\
|
|
|
|
| | | | * side-2
|
|
|
|
| | | | * side-1
|
|
|
|
| | | * | Second
|
|
|
|
| | | * | sixth
|
|
|
|
| | | * | fifth
|
|
|
|
| | | * | fourth
|
|
|
|
| | | |/
|
|
|
|
| | | * third
|
|
|
|
| | | * second
|
|
|
|
| | | * initial
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'log --graph --line-prefix="| | | " with merge' '
|
2020-02-24 13:38:13 +00:00
|
|
|
test_cmp_graph --line-prefix="| | | " --date-order
|
2016-08-31 23:27:20 +00:00
|
|
|
'
|
|
|
|
|
2017-01-19 11:41:23 +00:00
|
|
|
cat > expect.colors <<\EOF
|
|
|
|
* Merge branch 'side'
|
|
|
|
<BLUE>|<RESET><CYAN>\<RESET>
|
|
|
|
<BLUE>|<RESET> * side-2
|
|
|
|
<BLUE>|<RESET> * side-1
|
|
|
|
* <CYAN>|<RESET> Second
|
|
|
|
* <CYAN>|<RESET> sixth
|
|
|
|
* <CYAN>|<RESET> fifth
|
|
|
|
* <CYAN>|<RESET> fourth
|
|
|
|
<CYAN>|<RESET><CYAN>/<RESET>
|
|
|
|
* third
|
|
|
|
* second
|
|
|
|
* initial
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'log --graph with merge with log.graphColors' '
|
color_parse_mem: allow empty color spec
Prior to c2f41bf52 (color.c: fix color_parse_mem() with
value_len == 0, 2017-01-19), the empty string was
interpreted as a color "reset". This was an accidental
outcome, and that commit turned it into an error.
However, scripts may pass the empty string as a default
value to "git config --get-color" to disable color when the
value is not defined. The git-add--interactive script does
this. As a result, the script is unusable since c2f41bf52
unless you have color.diff.plain defined (if it is defined,
then we don't parse the empty default at all).
Our test scripts didn't notice the recent breakage because
they run without a terminal, and thus without color. They
never hit this code path at all. And nobody noticed the
original buggy "reset" behavior, because it was effectively
a noop.
Let's fix the code to have an empty color name produce an
empty sequence of color codes. The tests need a few fixups:
- we'll add a new test in t4026 to cover this case. But
note that we need to tweak the color() helper. While
we're there, let's factor out the literal ANSI ESC
character. Otherwise it makes the diff quite hard to
read.
- we'll add a basic sanity-check in t4026 that "git add
-p" works at all when color is enabled. That would have
caught this bug, as well as any others that are specific
to the color code paths.
- 73c727d69 (log --graph: customize the graph lines with
config log.graphColors, 2017-01-19) added a test to
t4202 that checks some "invalid" graph color config.
Since ",, blue" before yielded only "blue" as valid, and
now yields "empty, empty, blue", we don't match the
expected output.
One way to fix this would be to change the expectation
to the empty color strings. But that makes the test much
less interesting, since we show only two graph lines,
both of which would be colorless.
Since the empty-string case is now covered by t4026,
let's remove them entirely here. They're just in the way
of the primary thing the test is supposed to be
checking.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-01 00:21:29 +00:00
|
|
|
test_config log.graphColors " blue,invalid-color, cyan, red , " &&
|
2020-02-24 13:38:14 +00:00
|
|
|
lib_test_cmp_colored_graph --date-order --format=%s
|
2017-01-19 11:41:23 +00:00
|
|
|
'
|
|
|
|
|
2009-07-24 23:45:00 +00:00
|
|
|
test_expect_success 'log --raw --graph -m with merge' '
|
|
|
|
git log --raw --graph --oneline -m master | head -n 500 >actual &&
|
|
|
|
grep "initial" actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'diff-tree --graph' '
|
|
|
|
git diff-tree --graph master^ | head -n 500 >actual &&
|
|
|
|
grep "one" actual
|
|
|
|
'
|
|
|
|
|
2009-02-19 11:13:38 +00:00
|
|
|
cat > expect <<\EOF
|
|
|
|
* commit master
|
|
|
|
|\ Merge: A B
|
|
|
|
| | Author: A U Thor <author@example.com>
|
|
|
|
| |
|
|
|
|
| | Merge branch 'side'
|
|
|
|
| |
|
name-rev: favor describing with tags and use committer date to tiebreak
"git name-rev" assigned a phony "far in the future" date to tips of
refs that are not pointing at tag objects, and favored names based
on a ref with the oldest date. This made it almost impossible for
an unannotated tags and branches to be counted as a viable base,
which was especially problematic when the command is run with the
"--tags" option. If an unannotated tag that points at an ancient
commit and an annotated tag that points at a much newer commit
reaches the commit that is being named, the old unannotated tag was
ignored.
Update the "taggerdate" field of the rev-name structure, which is
initialized from the tip of ref, to have the committer date if the
object at the tip of ref is a commit, not a tag, so that we can
optionally take it into account when doing "is this name better?"
comparison logic.
When "name-rev" is run without the "--tags" option, the general
expectation is still to name the commit based on a tag if possible,
but use non-tag refs as fallback, and tiebreak among these non-tag
refs by favoring names with shorter hops from the tip. The use of a
phony "far in the future" date in the original code was an effective
way to ensure this expectation is held: a non-tag tip gets the same
"far in the future" timestamp, giving precedence to tags, and among
non-tag tips, names with shorter hops are preferred over longer
hops, without taking the "taggerdate" into account. As we are
taking over the "taggerdate" field to store the committer date for
tips with commits:
(1) keep the original logic when comparing names based on two refs
both of which are from refs/tags/;
(2) favoring a name based on a ref in refs/tags/ hierarchy over
a ref outside the hierarchy;
(3) between two names based on a ref both outside refs/tags/, give
precedence to a name with shorter hops and use "taggerdate"
only to tie-break.
A change to t4202 is a natural consequence. The test creates a
commit on a branch "side" and points at it with an unannotated tag
"refs/tags/side-2". The original code couldn't decide which one to
favor at all, and gave a name based on a branch (simply because
refs/heads/side sorts earlier than refs/tags/side-2). Because the
updated logic is taught to favor refs in refs/tags/ hierarchy, the
the test is updated to expect to see tags/side-2 instead.
[mjg: open-coded the comparisons in is_better_name(), dropping a
helper macro used in the original]
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Michael J Gruber <git@grubix.eu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-03-29 14:39:16 +00:00
|
|
|
| * commit tags/side-2
|
2009-02-19 11:13:38 +00:00
|
|
|
| | Author: A U Thor <author@example.com>
|
|
|
|
| |
|
|
|
|
| | side-2
|
|
|
|
| |
|
|
|
|
| * commit tags/side-1
|
|
|
|
| | Author: A U Thor <author@example.com>
|
|
|
|
| |
|
|
|
|
| | side-1
|
|
|
|
| |
|
|
|
|
* | commit master~1
|
|
|
|
| | Author: A U Thor <author@example.com>
|
|
|
|
| |
|
|
|
|
| | Second
|
|
|
|
| |
|
|
|
|
* | commit master~2
|
|
|
|
| | Author: A U Thor <author@example.com>
|
|
|
|
| |
|
|
|
|
| | sixth
|
|
|
|
| |
|
|
|
|
* | commit master~3
|
|
|
|
| | Author: A U Thor <author@example.com>
|
|
|
|
| |
|
|
|
|
| | fifth
|
|
|
|
| |
|
|
|
|
* | commit master~4
|
|
|
|
|/ Author: A U Thor <author@example.com>
|
|
|
|
|
|
|
|
|
| fourth
|
|
|
|
|
|
|
|
|
* commit tags/side-1~1
|
|
|
|
| Author: A U Thor <author@example.com>
|
|
|
|
|
|
|
|
|
| third
|
|
|
|
|
|
|
|
|
* commit tags/side-1~2
|
|
|
|
| Author: A U Thor <author@example.com>
|
|
|
|
|
|
|
|
|
| second
|
|
|
|
|
|
|
|
|
* commit tags/side-1~3
|
|
|
|
Author: A U Thor <author@example.com>
|
|
|
|
|
|
|
|
initial
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'log --graph with full output' '
|
|
|
|
git log --graph --date-order --pretty=short |
|
|
|
|
git name-rev --name-only --stdin |
|
2010-01-26 23:08:31 +00:00
|
|
|
sed "s/Merge:.*/Merge: A B/;s/ *\$//" >actual &&
|
2009-02-19 11:13:38 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'set up more tangled history' '
|
|
|
|
git checkout -b tangle HEAD~6 &&
|
|
|
|
test_commit tangle-a tangle-a a &&
|
|
|
|
git merge master~3 &&
|
|
|
|
git merge side~1 &&
|
|
|
|
git checkout master &&
|
2009-04-22 21:27:15 +00:00
|
|
|
git merge tangle &&
|
|
|
|
git checkout -b reach &&
|
|
|
|
test_commit reach &&
|
|
|
|
git checkout master &&
|
|
|
|
git checkout -b octopus-a &&
|
|
|
|
test_commit octopus-a &&
|
|
|
|
git checkout master &&
|
|
|
|
git checkout -b octopus-b &&
|
|
|
|
test_commit octopus-b &&
|
|
|
|
git checkout master &&
|
|
|
|
test_commit seventh &&
|
2010-10-31 01:46:54 +00:00
|
|
|
git merge octopus-a octopus-b &&
|
2009-04-22 21:27:15 +00:00
|
|
|
git merge reach
|
2009-02-19 11:13:38 +00:00
|
|
|
'
|
|
|
|
|
|
|
|
cat > expect <<\EOF
|
2011-11-05 04:31:28 +00:00
|
|
|
* Merge tag 'reach'
|
2009-04-22 21:27:15 +00:00
|
|
|
|\
|
|
|
|
| \
|
|
|
|
| \
|
2011-11-05 04:31:28 +00:00
|
|
|
*-. \ Merge tags 'octopus-a' and 'octopus-b'
|
2009-04-22 21:27:15 +00:00
|
|
|
|\ \ \
|
|
|
|
* | | | seventh
|
|
|
|
| | * | octopus-b
|
|
|
|
| |/ /
|
|
|
|
|/| |
|
|
|
|
| * | octopus-a
|
|
|
|
|/ /
|
|
|
|
| * reach
|
|
|
|
|/
|
2009-02-19 11:13:38 +00:00
|
|
|
* Merge branch 'tangle'
|
|
|
|
|\
|
|
|
|
| * Merge branch 'side' (early part) into tangle
|
|
|
|
| |\
|
|
|
|
| * \ Merge branch 'master' (early part) into tangle
|
|
|
|
| |\ \
|
|
|
|
| * | | tangle-a
|
|
|
|
* | | | Merge branch 'side'
|
|
|
|
|\ \ \ \
|
|
|
|
| * | | | side-2
|
2009-04-21 12:47:01 +00:00
|
|
|
| | |_|/
|
2009-02-19 11:13:38 +00:00
|
|
|
| |/| |
|
|
|
|
| * | | side-1
|
|
|
|
* | | | Second
|
|
|
|
* | | | sixth
|
2009-04-21 12:47:01 +00:00
|
|
|
| |_|/
|
2009-02-19 11:13:38 +00:00
|
|
|
|/| |
|
|
|
|
* | | fifth
|
|
|
|
* | | fourth
|
|
|
|
|/ /
|
2019-10-15 23:47:57 +00:00
|
|
|
* / third
|
2009-02-19 11:13:38 +00:00
|
|
|
|/
|
|
|
|
* second
|
|
|
|
* initial
|
|
|
|
EOF
|
|
|
|
|
2009-04-26 19:29:13 +00:00
|
|
|
test_expect_success 'log --graph with merge' '
|
2020-02-24 13:38:13 +00:00
|
|
|
test_cmp_graph --date-order
|
2009-02-19 11:13:38 +00:00
|
|
|
'
|
|
|
|
|
2010-02-17 18:20:49 +00:00
|
|
|
test_expect_success 'log.decorate configuration' '
|
2017-03-24 05:46:31 +00:00
|
|
|
git log --oneline --no-decorate >expect.none &&
|
2010-04-08 17:17:17 +00:00
|
|
|
git log --oneline --decorate >expect.short &&
|
|
|
|
git log --oneline --decorate=full >expect.full &&
|
2010-02-17 18:20:49 +00:00
|
|
|
|
|
|
|
echo "[log] decorate" >>.git/config &&
|
2010-04-06 21:48:55 +00:00
|
|
|
git log --oneline >actual &&
|
2010-04-08 17:17:17 +00:00
|
|
|
test_cmp expect.short actual &&
|
2010-02-17 18:20:49 +00:00
|
|
|
|
2013-03-24 21:06:06 +00:00
|
|
|
test_config log.decorate true &&
|
2010-04-08 17:17:17 +00:00
|
|
|
git log --oneline >actual &&
|
2010-02-17 18:20:49 +00:00
|
|
|
test_cmp expect.short actual &&
|
2010-04-08 17:17:17 +00:00
|
|
|
git log --oneline --decorate=full >actual &&
|
2010-02-17 18:20:49 +00:00
|
|
|
test_cmp expect.full actual &&
|
2010-04-08 17:17:17 +00:00
|
|
|
git log --oneline --decorate=no >actual &&
|
2010-02-17 18:20:49 +00:00
|
|
|
test_cmp expect.none actual &&
|
|
|
|
|
2013-03-24 21:06:06 +00:00
|
|
|
test_config log.decorate no &&
|
2010-04-08 17:17:17 +00:00
|
|
|
git log --oneline >actual &&
|
2010-02-17 18:20:49 +00:00
|
|
|
test_cmp expect.none actual &&
|
2010-04-08 17:17:17 +00:00
|
|
|
git log --oneline --decorate >actual &&
|
2010-02-17 18:20:49 +00:00
|
|
|
test_cmp expect.short actual &&
|
2010-04-08 17:17:17 +00:00
|
|
|
git log --oneline --decorate=full >actual &&
|
2010-02-17 18:20:49 +00:00
|
|
|
test_cmp expect.full actual &&
|
|
|
|
|
2013-03-24 21:06:06 +00:00
|
|
|
test_config log.decorate 1 &&
|
2010-11-17 17:00:45 +00:00
|
|
|
git log --oneline >actual &&
|
|
|
|
test_cmp expect.short actual &&
|
|
|
|
git log --oneline --decorate=full >actual &&
|
|
|
|
test_cmp expect.full actual &&
|
|
|
|
git log --oneline --decorate=no >actual &&
|
|
|
|
test_cmp expect.none actual &&
|
|
|
|
|
2013-03-24 21:06:06 +00:00
|
|
|
test_config log.decorate short &&
|
2010-04-08 17:17:17 +00:00
|
|
|
git log --oneline >actual &&
|
2010-02-17 18:20:49 +00:00
|
|
|
test_cmp expect.short actual &&
|
2010-04-08 17:17:17 +00:00
|
|
|
git log --oneline --no-decorate >actual &&
|
2010-02-17 18:20:49 +00:00
|
|
|
test_cmp expect.none actual &&
|
2010-04-08 17:17:17 +00:00
|
|
|
git log --oneline --decorate=full >actual &&
|
2010-02-17 18:20:49 +00:00
|
|
|
test_cmp expect.full actual &&
|
|
|
|
|
2013-03-24 21:06:06 +00:00
|
|
|
test_config log.decorate full &&
|
2010-04-08 17:17:17 +00:00
|
|
|
git log --oneline >actual &&
|
2010-02-17 18:20:49 +00:00
|
|
|
test_cmp expect.full actual &&
|
2010-04-08 17:17:17 +00:00
|
|
|
git log --oneline --no-decorate >actual &&
|
2010-02-17 18:20:49 +00:00
|
|
|
test_cmp expect.none actual &&
|
2010-04-08 17:17:17 +00:00
|
|
|
git log --oneline --decorate >actual &&
|
2015-03-20 10:06:15 +00:00
|
|
|
test_cmp expect.short actual &&
|
2010-02-17 18:20:49 +00:00
|
|
|
|
2013-03-24 21:06:06 +00:00
|
|
|
test_unconfig log.decorate &&
|
2011-05-18 17:56:04 +00:00
|
|
|
git log --pretty=raw >expect.raw &&
|
2013-03-24 21:06:06 +00:00
|
|
|
test_config log.decorate full &&
|
2011-05-18 17:56:04 +00:00
|
|
|
git log --pretty=raw >actual &&
|
|
|
|
test_cmp expect.raw actual
|
|
|
|
|
|
|
|
'
|
|
|
|
|
log: add option to choose which refs to decorate
When `log --decorate` is used, git will decorate commits with all
available refs. While in most cases this may give the desired effect,
under some conditions it can lead to excessively verbose output.
Introduce two command line options, `--decorate-refs=<pattern>` and
`--decorate-refs-exclude=<pattern>` to allow the user to select which
refs are used in decoration.
When "--decorate-refs=<pattern>" is given, only the refs that match the
pattern are used in decoration. The refs that match the pattern when
"--decorate-refs-exclude=<pattern>" is given, are never used in
decoration.
These options follow the same convention for mixing negative and
positive patterns across the system, assuming that the inclusive default
is to match all refs available.
(1) if there is no positive pattern given, pretend as if an
inclusive default positive pattern was given;
(2) for each candidate, reject it if it matches no positive
pattern, or if it matches any one of the negative patterns.
The rules for what is considered a match are slightly different from the
rules used elsewhere.
Commands like `log --glob` assume a trailing '/*' when glob chars are
not present in the pattern. This makes it difficult to specify a single
ref. On the other hand, commands like `describe --match --all` allow
specifying exact refs, but do not have the convenience of allowing
"shorthand refs" like 'refs/heads' or 'heads' to refer to
'refs/heads/*'.
The commands introduced in this patch consider a match if:
(a) the pattern contains globs chars,
and regular pattern matching returns a match.
(b) the pattern does not contain glob chars,
and ref '<pattern>' exists, or if ref exists under '<pattern>/'
This allows both behaviours (allowing single refs and shorthand refs)
yet remaining compatible with existent commands.
Helped-by: Kevin Daudt <me@ikke.info>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Rafael Ascensão <rafa.almas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-11-21 21:33:41 +00:00
|
|
|
test_expect_success 'decorate-refs with glob' '
|
|
|
|
cat >expect.decorate <<-\EOF &&
|
|
|
|
Merge-tag-reach
|
|
|
|
Merge-tags-octopus-a-and-octopus-b
|
|
|
|
seventh
|
|
|
|
octopus-b (octopus-b)
|
|
|
|
octopus-a (octopus-a)
|
|
|
|
reach
|
|
|
|
EOF
|
|
|
|
git log -n6 --decorate=short --pretty="tformat:%f%d" \
|
|
|
|
--decorate-refs="heads/octopus*" >actual &&
|
|
|
|
test_cmp expect.decorate actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'decorate-refs without globs' '
|
|
|
|
cat >expect.decorate <<-\EOF &&
|
|
|
|
Merge-tag-reach
|
|
|
|
Merge-tags-octopus-a-and-octopus-b
|
|
|
|
seventh
|
|
|
|
octopus-b
|
|
|
|
octopus-a
|
|
|
|
reach (tag: reach)
|
|
|
|
EOF
|
|
|
|
git log -n6 --decorate=short --pretty="tformat:%f%d" \
|
|
|
|
--decorate-refs="tags/reach" >actual &&
|
|
|
|
test_cmp expect.decorate actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'multiple decorate-refs' '
|
|
|
|
cat >expect.decorate <<-\EOF &&
|
|
|
|
Merge-tag-reach
|
|
|
|
Merge-tags-octopus-a-and-octopus-b
|
|
|
|
seventh
|
|
|
|
octopus-b (octopus-b)
|
|
|
|
octopus-a (octopus-a)
|
|
|
|
reach (tag: reach)
|
|
|
|
EOF
|
|
|
|
git log -n6 --decorate=short --pretty="tformat:%f%d" \
|
|
|
|
--decorate-refs="heads/octopus*" \
|
|
|
|
--decorate-refs="tags/reach" >actual &&
|
|
|
|
test_cmp expect.decorate actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'decorate-refs-exclude with glob' '
|
|
|
|
cat >expect.decorate <<-\EOF &&
|
|
|
|
Merge-tag-reach (HEAD -> master)
|
|
|
|
Merge-tags-octopus-a-and-octopus-b
|
|
|
|
seventh (tag: seventh)
|
|
|
|
octopus-b (tag: octopus-b)
|
|
|
|
octopus-a (tag: octopus-a)
|
|
|
|
reach (tag: reach, reach)
|
|
|
|
EOF
|
|
|
|
git log -n6 --decorate=short --pretty="tformat:%f%d" \
|
|
|
|
--decorate-refs-exclude="heads/octopus*" >actual &&
|
|
|
|
test_cmp expect.decorate actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'decorate-refs-exclude without globs' '
|
|
|
|
cat >expect.decorate <<-\EOF &&
|
|
|
|
Merge-tag-reach (HEAD -> master)
|
|
|
|
Merge-tags-octopus-a-and-octopus-b
|
|
|
|
seventh (tag: seventh)
|
|
|
|
octopus-b (tag: octopus-b, octopus-b)
|
|
|
|
octopus-a (tag: octopus-a, octopus-a)
|
|
|
|
reach (reach)
|
|
|
|
EOF
|
|
|
|
git log -n6 --decorate=short --pretty="tformat:%f%d" \
|
|
|
|
--decorate-refs-exclude="tags/reach" >actual &&
|
|
|
|
test_cmp expect.decorate actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'multiple decorate-refs-exclude' '
|
|
|
|
cat >expect.decorate <<-\EOF &&
|
|
|
|
Merge-tag-reach (HEAD -> master)
|
|
|
|
Merge-tags-octopus-a-and-octopus-b
|
|
|
|
seventh (tag: seventh)
|
|
|
|
octopus-b (tag: octopus-b)
|
|
|
|
octopus-a (tag: octopus-a)
|
|
|
|
reach (reach)
|
|
|
|
EOF
|
|
|
|
git log -n6 --decorate=short --pretty="tformat:%f%d" \
|
|
|
|
--decorate-refs-exclude="heads/octopus*" \
|
|
|
|
--decorate-refs-exclude="tags/reach" >actual &&
|
|
|
|
test_cmp expect.decorate actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'decorate-refs and decorate-refs-exclude' '
|
|
|
|
cat >expect.decorate <<-\EOF &&
|
|
|
|
Merge-tag-reach (master)
|
|
|
|
Merge-tags-octopus-a-and-octopus-b
|
|
|
|
seventh
|
|
|
|
octopus-b
|
|
|
|
octopus-a
|
|
|
|
reach (reach)
|
|
|
|
EOF
|
|
|
|
git log -n6 --decorate=short --pretty="tformat:%f%d" \
|
|
|
|
--decorate-refs="heads/*" \
|
|
|
|
--decorate-refs-exclude="heads/oc*" >actual &&
|
|
|
|
test_cmp expect.decorate actual
|
|
|
|
'
|
|
|
|
|
2019-09-08 17:58:51 +00:00
|
|
|
test_expect_success 'decorate-refs-exclude and simplify-by-decoration' '
|
2019-09-08 17:58:41 +00:00
|
|
|
cat >expect.decorate <<-\EOF &&
|
|
|
|
Merge-tag-reach (HEAD -> master)
|
|
|
|
reach (tag: reach, reach)
|
|
|
|
seventh (tag: seventh)
|
|
|
|
Merge-branch-tangle
|
|
|
|
Merge-branch-side-early-part-into-tangle (tangle)
|
|
|
|
tangle-a (tag: tangle-a)
|
|
|
|
EOF
|
|
|
|
git log -n6 --decorate=short --pretty="tformat:%f%d" \
|
|
|
|
--decorate-refs-exclude="*octopus*" \
|
|
|
|
--simplify-by-decoration >actual &&
|
|
|
|
test_cmp expect.decorate actual
|
|
|
|
'
|
|
|
|
|
2017-05-14 18:00:58 +00:00
|
|
|
test_expect_success 'log.decorate config parsing' '
|
|
|
|
git log --oneline --decorate=full >expect.full &&
|
|
|
|
git log --oneline --decorate=short >expect.short &&
|
|
|
|
|
|
|
|
test_config log.decorate full &&
|
|
|
|
test_config log.mailmap true &&
|
|
|
|
git log --oneline >actual &&
|
|
|
|
test_cmp expect.full actual &&
|
|
|
|
git log --oneline --decorate=short >actual &&
|
|
|
|
test_cmp expect.short actual
|
|
|
|
'
|
|
|
|
|
2017-03-24 05:46:31 +00:00
|
|
|
test_expect_success TTY 'log output on a TTY' '
|
2017-10-03 13:39:34 +00:00
|
|
|
git log --color --oneline --decorate >expect.short &&
|
2017-03-24 05:46:31 +00:00
|
|
|
|
|
|
|
test_terminal git log --oneline >actual &&
|
|
|
|
test_cmp expect.short actual
|
|
|
|
'
|
|
|
|
|
2011-05-18 17:56:04 +00:00
|
|
|
test_expect_success 'reflog is expected format' '
|
|
|
|
git log -g --abbrev-commit --pretty=oneline >expect &&
|
|
|
|
git reflog >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'whatchanged is expected format' '
|
|
|
|
git log --no-merges --raw >expect &&
|
|
|
|
git whatchanged >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'log.abbrevCommit configuration' '
|
|
|
|
git log --abbrev-commit >expect.log.abbrev &&
|
|
|
|
git log --no-abbrev-commit >expect.log.full &&
|
|
|
|
git log --pretty=raw >expect.log.raw &&
|
|
|
|
git reflog --abbrev-commit >expect.reflog.abbrev &&
|
|
|
|
git reflog --no-abbrev-commit >expect.reflog.full &&
|
|
|
|
git whatchanged --abbrev-commit >expect.whatchanged.abbrev &&
|
|
|
|
git whatchanged --no-abbrev-commit >expect.whatchanged.full &&
|
|
|
|
|
2013-03-24 21:06:06 +00:00
|
|
|
test_config log.abbrevCommit true &&
|
2011-05-18 17:56:04 +00:00
|
|
|
|
|
|
|
git log >actual &&
|
|
|
|
test_cmp expect.log.abbrev actual &&
|
|
|
|
git log --no-abbrev-commit >actual &&
|
|
|
|
test_cmp expect.log.full actual &&
|
|
|
|
|
|
|
|
git log --pretty=raw >actual &&
|
|
|
|
test_cmp expect.log.raw actual &&
|
|
|
|
|
|
|
|
git reflog >actual &&
|
|
|
|
test_cmp expect.reflog.abbrev actual &&
|
|
|
|
git reflog --no-abbrev-commit >actual &&
|
|
|
|
test_cmp expect.reflog.full actual &&
|
|
|
|
|
|
|
|
git whatchanged >actual &&
|
|
|
|
test_cmp expect.whatchanged.abbrev actual &&
|
|
|
|
git whatchanged --no-abbrev-commit >actual &&
|
|
|
|
test_cmp expect.whatchanged.full actual
|
2010-02-17 18:20:49 +00:00
|
|
|
'
|
|
|
|
|
2010-08-15 10:16:25 +00:00
|
|
|
test_expect_success 'show added path under "--follow -M"' '
|
|
|
|
# This tests for a regression introduced in v1.7.2-rc0~103^2~2
|
|
|
|
test_create_repo regression &&
|
|
|
|
(
|
|
|
|
cd regression &&
|
|
|
|
test_commit needs-another-commit &&
|
|
|
|
test_commit foo.bar &&
|
|
|
|
git log -M --follow -p foo.bar.t &&
|
|
|
|
git log -M --follow --stat foo.bar.t &&
|
|
|
|
git log -M --follow --name-only foo.bar.t
|
|
|
|
)
|
|
|
|
'
|
2008-07-22 21:23:31 +00:00
|
|
|
|
2013-05-27 22:49:57 +00:00
|
|
|
test_expect_success 'git log -c --follow' '
|
|
|
|
test_create_repo follow-c &&
|
|
|
|
(
|
|
|
|
cd follow-c &&
|
|
|
|
test_commit initial file original &&
|
|
|
|
git rm file &&
|
|
|
|
test_commit rename file2 original &&
|
|
|
|
git reset --hard initial &&
|
|
|
|
test_commit modify file foo &&
|
|
|
|
git merge -m merge rename &&
|
|
|
|
git log -c --follow file2
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2012-03-20 08:05:34 +00:00
|
|
|
cat >expect <<\EOF
|
|
|
|
* commit COMMIT_OBJECT_NAME
|
|
|
|
|\ Merge: MERGE_PARENTS
|
|
|
|
| | Author: A U Thor <author@example.com>
|
|
|
|
| |
|
|
|
|
| | Merge HEADS DESCRIPTION
|
|
|
|
| |
|
|
|
|
| * commit COMMIT_OBJECT_NAME
|
|
|
|
| | Author: A U Thor <author@example.com>
|
|
|
|
| |
|
|
|
|
| | reach
|
|
|
|
| | ---
|
2012-04-30 20:38:58 +00:00
|
|
|
| | reach.t | 1 +
|
2012-03-20 08:05:34 +00:00
|
|
|
| | 1 file changed, 1 insertion(+)
|
|
|
|
| |
|
|
|
|
| | diff --git a/reach.t b/reach.t
|
|
|
|
| | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
| | index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
| | --- /dev/null
|
|
|
|
| | +++ b/reach.t
|
|
|
|
| | @@ -0,0 +1 @@
|
|
|
|
| | +reach
|
|
|
|
| |
|
|
|
|
| \
|
|
|
|
*-. \ commit COMMIT_OBJECT_NAME
|
|
|
|
|\ \ \ Merge: MERGE_PARENTS
|
|
|
|
| | | | Author: A U Thor <author@example.com>
|
|
|
|
| | | |
|
|
|
|
| | | | Merge HEADS DESCRIPTION
|
|
|
|
| | | |
|
|
|
|
| | * | commit COMMIT_OBJECT_NAME
|
|
|
|
| | |/ Author: A U Thor <author@example.com>
|
|
|
|
| | |
|
|
|
|
| | | octopus-b
|
|
|
|
| | | ---
|
2012-04-30 20:38:58 +00:00
|
|
|
| | | octopus-b.t | 1 +
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | 1 file changed, 1 insertion(+)
|
|
|
|
| | |
|
|
|
|
| | | diff --git a/octopus-b.t b/octopus-b.t
|
|
|
|
| | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
| | | index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | --- /dev/null
|
|
|
|
| | | +++ b/octopus-b.t
|
|
|
|
| | | @@ -0,0 +1 @@
|
|
|
|
| | | +octopus-b
|
|
|
|
| | |
|
|
|
|
| * | commit COMMIT_OBJECT_NAME
|
|
|
|
| |/ Author: A U Thor <author@example.com>
|
|
|
|
| |
|
|
|
|
| | octopus-a
|
|
|
|
| | ---
|
2012-04-30 20:38:58 +00:00
|
|
|
| | octopus-a.t | 1 +
|
2012-03-20 08:05:34 +00:00
|
|
|
| | 1 file changed, 1 insertion(+)
|
|
|
|
| |
|
|
|
|
| | diff --git a/octopus-a.t b/octopus-a.t
|
|
|
|
| | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
| | index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
| | --- /dev/null
|
|
|
|
| | +++ b/octopus-a.t
|
|
|
|
| | @@ -0,0 +1 @@
|
|
|
|
| | +octopus-a
|
|
|
|
| |
|
|
|
|
* | commit COMMIT_OBJECT_NAME
|
|
|
|
|/ Author: A U Thor <author@example.com>
|
|
|
|
|
|
|
|
|
| seventh
|
|
|
|
| ---
|
2012-04-30 20:38:58 +00:00
|
|
|
| seventh.t | 1 +
|
2012-03-20 08:05:34 +00:00
|
|
|
| 1 file changed, 1 insertion(+)
|
|
|
|
|
|
|
|
|
| diff --git a/seventh.t b/seventh.t
|
|
|
|
| new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
| index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
| --- /dev/null
|
|
|
|
| +++ b/seventh.t
|
|
|
|
| @@ -0,0 +1 @@
|
|
|
|
| +seventh
|
|
|
|
|
|
|
|
|
* commit COMMIT_OBJECT_NAME
|
|
|
|
|\ Merge: MERGE_PARENTS
|
|
|
|
| | Author: A U Thor <author@example.com>
|
|
|
|
| |
|
|
|
|
| | Merge branch 'tangle'
|
|
|
|
| |
|
|
|
|
| * commit COMMIT_OBJECT_NAME
|
|
|
|
| |\ Merge: MERGE_PARENTS
|
|
|
|
| | | Author: A U Thor <author@example.com>
|
|
|
|
| | |
|
|
|
|
| | | Merge branch 'side' (early part) into tangle
|
|
|
|
| | |
|
|
|
|
| * | commit COMMIT_OBJECT_NAME
|
|
|
|
| |\ \ Merge: MERGE_PARENTS
|
|
|
|
| | | | Author: A U Thor <author@example.com>
|
|
|
|
| | | |
|
|
|
|
| | | | Merge branch 'master' (early part) into tangle
|
|
|
|
| | | |
|
|
|
|
| * | | commit COMMIT_OBJECT_NAME
|
|
|
|
| | | | Author: A U Thor <author@example.com>
|
|
|
|
| | | |
|
|
|
|
| | | | tangle-a
|
|
|
|
| | | | ---
|
2012-04-30 20:38:58 +00:00
|
|
|
| | | | tangle-a | 1 +
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | | 1 file changed, 1 insertion(+)
|
|
|
|
| | | |
|
|
|
|
| | | | diff --git a/tangle-a b/tangle-a
|
|
|
|
| | | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
| | | | index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | | --- /dev/null
|
|
|
|
| | | | +++ b/tangle-a
|
|
|
|
| | | | @@ -0,0 +1 @@
|
|
|
|
| | | | +a
|
|
|
|
| | | |
|
|
|
|
* | | | commit COMMIT_OBJECT_NAME
|
|
|
|
|\ \ \ \ Merge: MERGE_PARENTS
|
|
|
|
| | | | | Author: A U Thor <author@example.com>
|
|
|
|
| | | | |
|
|
|
|
| | | | | Merge branch 'side'
|
|
|
|
| | | | |
|
|
|
|
| * | | | commit COMMIT_OBJECT_NAME
|
|
|
|
| | |_|/ Author: A U Thor <author@example.com>
|
|
|
|
| |/| |
|
|
|
|
| | | | side-2
|
|
|
|
| | | | ---
|
2012-04-30 20:38:58 +00:00
|
|
|
| | | | 2 | 1 +
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | | 1 file changed, 1 insertion(+)
|
|
|
|
| | | |
|
|
|
|
| | | | diff --git a/2 b/2
|
|
|
|
| | | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
| | | | index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | | --- /dev/null
|
|
|
|
| | | | +++ b/2
|
|
|
|
| | | | @@ -0,0 +1 @@
|
|
|
|
| | | | +2
|
|
|
|
| | | |
|
|
|
|
| * | | commit COMMIT_OBJECT_NAME
|
|
|
|
| | | | Author: A U Thor <author@example.com>
|
|
|
|
| | | |
|
|
|
|
| | | | side-1
|
|
|
|
| | | | ---
|
2012-04-30 20:38:58 +00:00
|
|
|
| | | | 1 | 1 +
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | | 1 file changed, 1 insertion(+)
|
|
|
|
| | | |
|
|
|
|
| | | | diff --git a/1 b/1
|
|
|
|
| | | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
| | | | index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | | --- /dev/null
|
|
|
|
| | | | +++ b/1
|
|
|
|
| | | | @@ -0,0 +1 @@
|
|
|
|
| | | | +1
|
|
|
|
| | | |
|
|
|
|
* | | | commit COMMIT_OBJECT_NAME
|
|
|
|
| | | | Author: A U Thor <author@example.com>
|
|
|
|
| | | |
|
|
|
|
| | | | Second
|
|
|
|
| | | | ---
|
2012-04-30 20:38:58 +00:00
|
|
|
| | | | one | 1 +
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | | 1 file changed, 1 insertion(+)
|
|
|
|
| | | |
|
|
|
|
| | | | diff --git a/one b/one
|
|
|
|
| | | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
| | | | index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | | --- /dev/null
|
|
|
|
| | | | +++ b/one
|
|
|
|
| | | | @@ -0,0 +1 @@
|
|
|
|
| | | | +case
|
|
|
|
| | | |
|
|
|
|
* | | | commit COMMIT_OBJECT_NAME
|
|
|
|
| |_|/ Author: A U Thor <author@example.com>
|
|
|
|
|/| |
|
|
|
|
| | | sixth
|
|
|
|
| | | ---
|
2012-04-30 20:38:58 +00:00
|
|
|
| | | a/two | 1 -
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | 1 file changed, 1 deletion(-)
|
|
|
|
| | |
|
|
|
|
| | | diff --git a/a/two b/a/two
|
|
|
|
| | | deleted file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
| | | index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | --- a/a/two
|
|
|
|
| | | +++ /dev/null
|
|
|
|
| | | @@ -1 +0,0 @@
|
|
|
|
| | | -ni
|
|
|
|
| | |
|
|
|
|
* | | commit COMMIT_OBJECT_NAME
|
|
|
|
| | | Author: A U Thor <author@example.com>
|
|
|
|
| | |
|
|
|
|
| | | fifth
|
|
|
|
| | | ---
|
2012-04-30 20:38:58 +00:00
|
|
|
| | | a/two | 1 +
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | 1 file changed, 1 insertion(+)
|
|
|
|
| | |
|
|
|
|
| | | diff --git a/a/two b/a/two
|
|
|
|
| | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
| | | index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
| | | --- /dev/null
|
|
|
|
| | | +++ b/a/two
|
|
|
|
| | | @@ -0,0 +1 @@
|
|
|
|
| | | +ni
|
|
|
|
| | |
|
|
|
|
* | | commit COMMIT_OBJECT_NAME
|
|
|
|
|/ / Author: A U Thor <author@example.com>
|
|
|
|
| |
|
|
|
|
| | fourth
|
|
|
|
| | ---
|
2012-04-30 20:38:58 +00:00
|
|
|
| | ein | 1 +
|
2012-03-20 08:05:34 +00:00
|
|
|
| | 1 file changed, 1 insertion(+)
|
|
|
|
| |
|
|
|
|
| | diff --git a/ein b/ein
|
|
|
|
| | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
| | index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
| | --- /dev/null
|
|
|
|
| | +++ b/ein
|
|
|
|
| | @@ -0,0 +1 @@
|
|
|
|
| | +ichi
|
|
|
|
| |
|
|
|
|
* | commit COMMIT_OBJECT_NAME
|
|
|
|
|/ Author: A U Thor <author@example.com>
|
|
|
|
|
|
|
|
|
| third
|
|
|
|
| ---
|
2012-04-30 20:38:58 +00:00
|
|
|
| ichi | 1 +
|
|
|
|
| one | 1 -
|
2012-03-20 08:05:34 +00:00
|
|
|
| 2 files changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
|
|
|
|
|
| diff --git a/ichi b/ichi
|
|
|
|
| new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
| index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
| --- /dev/null
|
|
|
|
| +++ b/ichi
|
|
|
|
| @@ -0,0 +1 @@
|
|
|
|
| +ichi
|
|
|
|
| diff --git a/one b/one
|
|
|
|
| deleted file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
| index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
| --- a/one
|
|
|
|
| +++ /dev/null
|
|
|
|
| @@ -1 +0,0 @@
|
|
|
|
| -ichi
|
|
|
|
|
|
|
|
|
* commit COMMIT_OBJECT_NAME
|
|
|
|
| Author: A U Thor <author@example.com>
|
|
|
|
|
|
|
|
|
| second
|
|
|
|
| ---
|
2012-04-30 20:38:58 +00:00
|
|
|
| one | 2 +-
|
2012-03-20 08:05:34 +00:00
|
|
|
| 1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
|
|
|
|
|
| diff --git a/one b/one
|
2019-12-21 19:49:21 +00:00
|
|
|
| index BEFORE..AFTER 100644
|
2012-03-20 08:05:34 +00:00
|
|
|
| --- a/one
|
|
|
|
| +++ b/one
|
|
|
|
| @@ -1 +1 @@
|
|
|
|
| -one
|
|
|
|
| +ichi
|
|
|
|
|
|
|
|
|
* commit COMMIT_OBJECT_NAME
|
|
|
|
Author: A U Thor <author@example.com>
|
|
|
|
|
|
|
|
initial
|
|
|
|
---
|
2012-04-30 20:38:58 +00:00
|
|
|
one | 1 +
|
2012-03-20 08:05:34 +00:00
|
|
|
1 file changed, 1 insertion(+)
|
|
|
|
|
|
|
|
diff --git a/one b/one
|
|
|
|
new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
index BEFORE..AFTER
|
2012-03-20 08:05:34 +00:00
|
|
|
--- /dev/null
|
|
|
|
+++ b/one
|
|
|
|
@@ -0,0 +1 @@
|
|
|
|
+one
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'log --graph with diff and stats' '
|
2020-02-24 13:38:13 +00:00
|
|
|
lib_test_cmp_short_graph --no-renames --stat -p
|
2012-03-20 08:05:34 +00:00
|
|
|
'
|
|
|
|
|
2016-08-31 23:27:20 +00:00
|
|
|
cat >expect <<\EOF
|
|
|
|
*** * commit COMMIT_OBJECT_NAME
|
|
|
|
*** |\ Merge: MERGE_PARENTS
|
|
|
|
*** | | Author: A U Thor <author@example.com>
|
|
|
|
*** | |
|
|
|
|
*** | | Merge HEADS DESCRIPTION
|
|
|
|
*** | |
|
|
|
|
*** | * commit COMMIT_OBJECT_NAME
|
|
|
|
*** | | Author: A U Thor <author@example.com>
|
|
|
|
*** | |
|
|
|
|
*** | | reach
|
|
|
|
*** | | ---
|
|
|
|
*** | | reach.t | 1 +
|
|
|
|
*** | | 1 file changed, 1 insertion(+)
|
|
|
|
*** | |
|
|
|
|
*** | | diff --git a/reach.t b/reach.t
|
|
|
|
*** | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | | index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | | --- /dev/null
|
|
|
|
*** | | +++ b/reach.t
|
|
|
|
*** | | @@ -0,0 +1 @@
|
|
|
|
*** | | +reach
|
|
|
|
*** | |
|
|
|
|
*** | \
|
|
|
|
*** *-. \ commit COMMIT_OBJECT_NAME
|
|
|
|
*** |\ \ \ Merge: MERGE_PARENTS
|
|
|
|
*** | | | | Author: A U Thor <author@example.com>
|
|
|
|
*** | | | |
|
|
|
|
*** | | | | Merge HEADS DESCRIPTION
|
|
|
|
*** | | | |
|
|
|
|
*** | | * | commit COMMIT_OBJECT_NAME
|
|
|
|
*** | | |/ Author: A U Thor <author@example.com>
|
|
|
|
*** | | |
|
|
|
|
*** | | | octopus-b
|
|
|
|
*** | | | ---
|
|
|
|
*** | | | octopus-b.t | 1 +
|
|
|
|
*** | | | 1 file changed, 1 insertion(+)
|
|
|
|
*** | | |
|
|
|
|
*** | | | diff --git a/octopus-b.t b/octopus-b.t
|
|
|
|
*** | | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | | | index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | | | --- /dev/null
|
|
|
|
*** | | | +++ b/octopus-b.t
|
|
|
|
*** | | | @@ -0,0 +1 @@
|
|
|
|
*** | | | +octopus-b
|
|
|
|
*** | | |
|
|
|
|
*** | * | commit COMMIT_OBJECT_NAME
|
|
|
|
*** | |/ Author: A U Thor <author@example.com>
|
|
|
|
*** | |
|
|
|
|
*** | | octopus-a
|
|
|
|
*** | | ---
|
|
|
|
*** | | octopus-a.t | 1 +
|
|
|
|
*** | | 1 file changed, 1 insertion(+)
|
|
|
|
*** | |
|
|
|
|
*** | | diff --git a/octopus-a.t b/octopus-a.t
|
|
|
|
*** | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | | index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | | --- /dev/null
|
|
|
|
*** | | +++ b/octopus-a.t
|
|
|
|
*** | | @@ -0,0 +1 @@
|
|
|
|
*** | | +octopus-a
|
|
|
|
*** | |
|
|
|
|
*** * | commit COMMIT_OBJECT_NAME
|
|
|
|
*** |/ Author: A U Thor <author@example.com>
|
|
|
|
*** |
|
|
|
|
*** | seventh
|
|
|
|
*** | ---
|
|
|
|
*** | seventh.t | 1 +
|
|
|
|
*** | 1 file changed, 1 insertion(+)
|
|
|
|
*** |
|
|
|
|
*** | diff --git a/seventh.t b/seventh.t
|
|
|
|
*** | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | --- /dev/null
|
|
|
|
*** | +++ b/seventh.t
|
|
|
|
*** | @@ -0,0 +1 @@
|
|
|
|
*** | +seventh
|
|
|
|
*** |
|
|
|
|
*** * commit COMMIT_OBJECT_NAME
|
|
|
|
*** |\ Merge: MERGE_PARENTS
|
|
|
|
*** | | Author: A U Thor <author@example.com>
|
|
|
|
*** | |
|
|
|
|
*** | | Merge branch 'tangle'
|
|
|
|
*** | |
|
|
|
|
*** | * commit COMMIT_OBJECT_NAME
|
|
|
|
*** | |\ Merge: MERGE_PARENTS
|
|
|
|
*** | | | Author: A U Thor <author@example.com>
|
|
|
|
*** | | |
|
|
|
|
*** | | | Merge branch 'side' (early part) into tangle
|
|
|
|
*** | | |
|
|
|
|
*** | * | commit COMMIT_OBJECT_NAME
|
|
|
|
*** | |\ \ Merge: MERGE_PARENTS
|
|
|
|
*** | | | | Author: A U Thor <author@example.com>
|
|
|
|
*** | | | |
|
|
|
|
*** | | | | Merge branch 'master' (early part) into tangle
|
|
|
|
*** | | | |
|
|
|
|
*** | * | | commit COMMIT_OBJECT_NAME
|
|
|
|
*** | | | | Author: A U Thor <author@example.com>
|
|
|
|
*** | | | |
|
|
|
|
*** | | | | tangle-a
|
|
|
|
*** | | | | ---
|
|
|
|
*** | | | | tangle-a | 1 +
|
|
|
|
*** | | | | 1 file changed, 1 insertion(+)
|
|
|
|
*** | | | |
|
|
|
|
*** | | | | diff --git a/tangle-a b/tangle-a
|
|
|
|
*** | | | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | | | | index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | | | | --- /dev/null
|
|
|
|
*** | | | | +++ b/tangle-a
|
|
|
|
*** | | | | @@ -0,0 +1 @@
|
|
|
|
*** | | | | +a
|
|
|
|
*** | | | |
|
|
|
|
*** * | | | commit COMMIT_OBJECT_NAME
|
|
|
|
*** |\ \ \ \ Merge: MERGE_PARENTS
|
|
|
|
*** | | | | | Author: A U Thor <author@example.com>
|
|
|
|
*** | | | | |
|
|
|
|
*** | | | | | Merge branch 'side'
|
|
|
|
*** | | | | |
|
|
|
|
*** | * | | | commit COMMIT_OBJECT_NAME
|
|
|
|
*** | | |_|/ Author: A U Thor <author@example.com>
|
|
|
|
*** | |/| |
|
|
|
|
*** | | | | side-2
|
|
|
|
*** | | | | ---
|
|
|
|
*** | | | | 2 | 1 +
|
|
|
|
*** | | | | 1 file changed, 1 insertion(+)
|
|
|
|
*** | | | |
|
|
|
|
*** | | | | diff --git a/2 b/2
|
|
|
|
*** | | | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | | | | index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | | | | --- /dev/null
|
|
|
|
*** | | | | +++ b/2
|
|
|
|
*** | | | | @@ -0,0 +1 @@
|
|
|
|
*** | | | | +2
|
|
|
|
*** | | | |
|
|
|
|
*** | * | | commit COMMIT_OBJECT_NAME
|
|
|
|
*** | | | | Author: A U Thor <author@example.com>
|
|
|
|
*** | | | |
|
|
|
|
*** | | | | side-1
|
|
|
|
*** | | | | ---
|
|
|
|
*** | | | | 1 | 1 +
|
|
|
|
*** | | | | 1 file changed, 1 insertion(+)
|
|
|
|
*** | | | |
|
|
|
|
*** | | | | diff --git a/1 b/1
|
|
|
|
*** | | | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | | | | index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | | | | --- /dev/null
|
|
|
|
*** | | | | +++ b/1
|
|
|
|
*** | | | | @@ -0,0 +1 @@
|
|
|
|
*** | | | | +1
|
|
|
|
*** | | | |
|
|
|
|
*** * | | | commit COMMIT_OBJECT_NAME
|
|
|
|
*** | | | | Author: A U Thor <author@example.com>
|
|
|
|
*** | | | |
|
|
|
|
*** | | | | Second
|
|
|
|
*** | | | | ---
|
|
|
|
*** | | | | one | 1 +
|
|
|
|
*** | | | | 1 file changed, 1 insertion(+)
|
|
|
|
*** | | | |
|
|
|
|
*** | | | | diff --git a/one b/one
|
|
|
|
*** | | | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | | | | index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | | | | --- /dev/null
|
|
|
|
*** | | | | +++ b/one
|
|
|
|
*** | | | | @@ -0,0 +1 @@
|
|
|
|
*** | | | | +case
|
|
|
|
*** | | | |
|
|
|
|
*** * | | | commit COMMIT_OBJECT_NAME
|
|
|
|
*** | |_|/ Author: A U Thor <author@example.com>
|
|
|
|
*** |/| |
|
|
|
|
*** | | | sixth
|
|
|
|
*** | | | ---
|
|
|
|
*** | | | a/two | 1 -
|
|
|
|
*** | | | 1 file changed, 1 deletion(-)
|
|
|
|
*** | | |
|
|
|
|
*** | | | diff --git a/a/two b/a/two
|
|
|
|
*** | | | deleted file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | | | index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | | | --- a/a/two
|
|
|
|
*** | | | +++ /dev/null
|
|
|
|
*** | | | @@ -1 +0,0 @@
|
|
|
|
*** | | | -ni
|
|
|
|
*** | | |
|
|
|
|
*** * | | commit COMMIT_OBJECT_NAME
|
|
|
|
*** | | | Author: A U Thor <author@example.com>
|
|
|
|
*** | | |
|
|
|
|
*** | | | fifth
|
|
|
|
*** | | | ---
|
|
|
|
*** | | | a/two | 1 +
|
|
|
|
*** | | | 1 file changed, 1 insertion(+)
|
|
|
|
*** | | |
|
|
|
|
*** | | | diff --git a/a/two b/a/two
|
|
|
|
*** | | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | | | index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | | | --- /dev/null
|
|
|
|
*** | | | +++ b/a/two
|
|
|
|
*** | | | @@ -0,0 +1 @@
|
|
|
|
*** | | | +ni
|
|
|
|
*** | | |
|
|
|
|
*** * | | commit COMMIT_OBJECT_NAME
|
|
|
|
*** |/ / Author: A U Thor <author@example.com>
|
|
|
|
*** | |
|
|
|
|
*** | | fourth
|
|
|
|
*** | | ---
|
|
|
|
*** | | ein | 1 +
|
|
|
|
*** | | 1 file changed, 1 insertion(+)
|
|
|
|
*** | |
|
|
|
|
*** | | diff --git a/ein b/ein
|
|
|
|
*** | | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | | index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | | --- /dev/null
|
|
|
|
*** | | +++ b/ein
|
|
|
|
*** | | @@ -0,0 +1 @@
|
|
|
|
*** | | +ichi
|
|
|
|
*** | |
|
|
|
|
*** * | commit COMMIT_OBJECT_NAME
|
|
|
|
*** |/ Author: A U Thor <author@example.com>
|
|
|
|
*** |
|
|
|
|
*** | third
|
|
|
|
*** | ---
|
|
|
|
*** | ichi | 1 +
|
|
|
|
*** | one | 1 -
|
|
|
|
*** | 2 files changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
*** |
|
|
|
|
*** | diff --git a/ichi b/ichi
|
|
|
|
*** | new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | --- /dev/null
|
|
|
|
*** | +++ b/ichi
|
|
|
|
*** | @@ -0,0 +1 @@
|
|
|
|
*** | +ichi
|
|
|
|
*** | diff --git a/one b/one
|
|
|
|
*** | deleted file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | --- a/one
|
|
|
|
*** | +++ /dev/null
|
|
|
|
*** | @@ -1 +0,0 @@
|
|
|
|
*** | -ichi
|
|
|
|
*** |
|
|
|
|
*** * commit COMMIT_OBJECT_NAME
|
|
|
|
*** | Author: A U Thor <author@example.com>
|
|
|
|
*** |
|
|
|
|
*** | second
|
|
|
|
*** | ---
|
|
|
|
*** | one | 2 +-
|
|
|
|
*** | 1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
*** |
|
|
|
|
*** | diff --git a/one b/one
|
2019-12-21 19:49:21 +00:00
|
|
|
*** | index BEFORE..AFTER 100644
|
2016-08-31 23:27:20 +00:00
|
|
|
*** | --- a/one
|
|
|
|
*** | +++ b/one
|
|
|
|
*** | @@ -1 +1 @@
|
|
|
|
*** | -one
|
|
|
|
*** | +ichi
|
|
|
|
*** |
|
|
|
|
*** * commit COMMIT_OBJECT_NAME
|
|
|
|
*** Author: A U Thor <author@example.com>
|
|
|
|
***
|
|
|
|
*** initial
|
|
|
|
*** ---
|
|
|
|
*** one | 1 +
|
|
|
|
*** 1 file changed, 1 insertion(+)
|
|
|
|
***
|
|
|
|
*** diff --git a/one b/one
|
|
|
|
*** new file mode 100644
|
2019-12-21 19:49:21 +00:00
|
|
|
*** index BEFORE..AFTER
|
2016-08-31 23:27:20 +00:00
|
|
|
*** --- /dev/null
|
|
|
|
*** +++ b/one
|
|
|
|
*** @@ -0,0 +1 @@
|
|
|
|
*** +one
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'log --line-prefix="*** " --graph with diff and stats' '
|
2020-02-24 13:38:13 +00:00
|
|
|
lib_test_cmp_short_graph --line-prefix="*** " --no-renames --stat -p
|
2016-08-31 23:27:20 +00:00
|
|
|
'
|
|
|
|
|
2017-02-08 20:31:15 +00:00
|
|
|
cat >expect <<-\EOF
|
|
|
|
* reach
|
|
|
|
|
|
|
|
|
| A reach.t
|
|
|
|
* Merge branch 'tangle'
|
|
|
|
* Merge branch 'side'
|
|
|
|
|\
|
|
|
|
| * side-2
|
|
|
|
|
|
|
|
|
| A 2
|
|
|
|
* Second
|
|
|
|
|
|
|
|
|
| A one
|
|
|
|
* sixth
|
|
|
|
|
|
|
|
D a/two
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'log --graph with --name-status' '
|
2020-02-24 13:38:13 +00:00
|
|
|
test_cmp_graph --name-status tangle..reach
|
2017-02-08 20:31:15 +00:00
|
|
|
'
|
|
|
|
|
|
|
|
cat >expect <<-\EOF
|
|
|
|
* reach
|
|
|
|
|
|
|
|
|
| reach.t
|
|
|
|
* Merge branch 'tangle'
|
|
|
|
* Merge branch 'side'
|
|
|
|
|\
|
|
|
|
| * side-2
|
|
|
|
|
|
|
|
|
| 2
|
|
|
|
* Second
|
|
|
|
|
|
|
|
|
| one
|
|
|
|
* sixth
|
|
|
|
|
|
|
|
a/two
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'log --graph with --name-only' '
|
2020-02-24 13:38:13 +00:00
|
|
|
test_cmp_graph --name-only tangle..reach
|
2017-02-08 20:31:15 +00:00
|
|
|
'
|
|
|
|
|
2011-05-02 20:39:16 +00:00
|
|
|
test_expect_success 'dotdot is a parent directory' '
|
|
|
|
mkdir -p a/b &&
|
|
|
|
( echo sixth && echo fifth ) >expect &&
|
|
|
|
( cd a/b && git log --format=%s .. ) >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2016-06-24 14:12:34 +00:00
|
|
|
test_expect_success GPG 'setup signed branch' '
|
2014-07-09 02:10:21 +00:00
|
|
|
test_when_finished "git reset --hard && git checkout master" &&
|
|
|
|
git checkout -b signed master &&
|
|
|
|
echo foo >foo &&
|
|
|
|
git add foo &&
|
2016-06-24 14:12:34 +00:00
|
|
|
git commit -S -m signed_commit
|
|
|
|
'
|
|
|
|
|
2019-11-22 20:23:12 +00:00
|
|
|
test_expect_success GPG 'setup signed branch with subkey' '
|
|
|
|
test_when_finished "git reset --hard && git checkout master" &&
|
|
|
|
git checkout -b signed-subkey master &&
|
|
|
|
echo foo >foo &&
|
|
|
|
git add foo &&
|
|
|
|
git commit -SB7227189 -m signed_commit
|
|
|
|
'
|
|
|
|
|
2018-07-20 08:28:07 +00:00
|
|
|
test_expect_success GPGSM 'setup signed branch x509' '
|
|
|
|
test_when_finished "git reset --hard && git checkout master" &&
|
|
|
|
git checkout -b signed-x509 master &&
|
|
|
|
echo foo >foo &&
|
|
|
|
git add foo &&
|
|
|
|
test_config gpg.format x509 &&
|
|
|
|
test_config user.signingkey $GIT_COMMITTER_EMAIL &&
|
|
|
|
git commit -S -m signed_commit
|
|
|
|
'
|
|
|
|
|
2019-11-22 20:23:12 +00:00
|
|
|
test_expect_success GPGSM 'log x509 fingerprint' '
|
|
|
|
echo "F8BF62E0693D0694816377099909C779FA23FD65 | " >expect &&
|
|
|
|
git log -n1 --format="%GF | %GP" signed-x509 >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success GPGSM 'log OpenPGP fingerprint' '
|
|
|
|
echo "D4BE22311AD3131E5EDA29A461092E85B7227189" > expect &&
|
|
|
|
git log -n1 --format="%GP" signed-subkey >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2016-06-24 14:12:34 +00:00
|
|
|
test_expect_success GPG 'log --graph --show-signature' '
|
2014-07-09 02:10:21 +00:00
|
|
|
git log --graph --show-signature -n1 signed >actual &&
|
|
|
|
grep "^| gpg: Signature made" actual &&
|
|
|
|
grep "^| gpg: Good signature" actual
|
|
|
|
'
|
|
|
|
|
2018-07-20 08:28:07 +00:00
|
|
|
test_expect_success GPGSM 'log --graph --show-signature x509' '
|
|
|
|
git log --graph --show-signature -n1 signed-x509 >actual &&
|
|
|
|
grep "^| gpgsm: Signature made" actual &&
|
|
|
|
grep "^| gpgsm: Good signature" actual
|
|
|
|
'
|
|
|
|
|
2014-07-09 02:10:21 +00:00
|
|
|
test_expect_success GPG 'log --graph --show-signature for merged tag' '
|
|
|
|
test_when_finished "git reset --hard && git checkout master" &&
|
|
|
|
git checkout -b plain master &&
|
|
|
|
echo aaa >bar &&
|
|
|
|
git add bar &&
|
|
|
|
git commit -m bar_commit &&
|
|
|
|
git checkout -b tagged master &&
|
|
|
|
echo bbb >baz &&
|
|
|
|
git add baz &&
|
|
|
|
git commit -m baz_commit &&
|
|
|
|
git tag -s -m signed_tag_msg signed_tag &&
|
|
|
|
git checkout plain &&
|
|
|
|
git merge --no-ff -m msg signed_tag &&
|
|
|
|
git log --graph --show-signature -n1 plain >actual &&
|
|
|
|
grep "^|\\\ merged tag" actual &&
|
|
|
|
grep "^| | gpg: Signature made" actual &&
|
|
|
|
grep "^| | gpg: Good signature" actual
|
|
|
|
'
|
|
|
|
|
2020-02-29 13:07:57 +00:00
|
|
|
test_expect_success GPG 'log --graph --show-signature for merged tag in shallow clone' '
|
|
|
|
test_when_finished "git reset --hard && git checkout master" &&
|
|
|
|
git checkout -b plain-shallow master &&
|
|
|
|
echo aaa >bar &&
|
|
|
|
git add bar &&
|
|
|
|
git commit -m bar_commit &&
|
|
|
|
git checkout --detach master &&
|
|
|
|
echo bbb >baz &&
|
|
|
|
git add baz &&
|
|
|
|
git commit -m baz_commit &&
|
|
|
|
git tag -s -m signed_tag_msg signed_tag_shallow &&
|
|
|
|
hash=$(git rev-parse HEAD) &&
|
|
|
|
git checkout plain-shallow &&
|
|
|
|
git merge --no-ff -m msg signed_tag_shallow &&
|
|
|
|
git clone --depth 1 --no-local . shallow &&
|
|
|
|
test_when_finished "rm -rf shallow" &&
|
|
|
|
git -C shallow log --graph --show-signature -n1 plain-shallow >actual &&
|
|
|
|
grep "tag signed_tag_shallow names a non-parent $hash" actual
|
|
|
|
'
|
|
|
|
|
2020-03-04 11:48:03 +00:00
|
|
|
test_expect_success GPG 'log --graph --show-signature for merged tag with missing key' '
|
|
|
|
test_when_finished "git reset --hard && git checkout master" &&
|
|
|
|
git checkout -b plain-nokey master &&
|
|
|
|
echo aaa >bar &&
|
|
|
|
git add bar &&
|
|
|
|
git commit -m bar_commit &&
|
|
|
|
git checkout -b tagged-nokey master &&
|
|
|
|
echo bbb >baz &&
|
|
|
|
git add baz &&
|
|
|
|
git commit -m baz_commit &&
|
|
|
|
git tag -s -m signed_tag_msg signed_tag_nokey &&
|
|
|
|
git checkout plain-nokey &&
|
|
|
|
git merge --no-ff -m msg signed_tag_nokey &&
|
|
|
|
GNUPGHOME=. git log --graph --show-signature -n1 plain-nokey >actual &&
|
|
|
|
grep "^|\\\ merged tag" actual &&
|
|
|
|
grep "^| | gpg: Signature made" actual &&
|
|
|
|
grep "^| | gpg: Can'"'"'t check signature: \(public key not found\|No public key\)" actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success GPG 'log --graph --show-signature for merged tag with bad signature' '
|
|
|
|
test_when_finished "git reset --hard && git checkout master" &&
|
|
|
|
git checkout -b plain-bad master &&
|
|
|
|
echo aaa >bar &&
|
|
|
|
git add bar &&
|
|
|
|
git commit -m bar_commit &&
|
|
|
|
git checkout -b tagged-bad master &&
|
|
|
|
echo bbb >baz &&
|
|
|
|
git add baz &&
|
|
|
|
git commit -m baz_commit &&
|
|
|
|
git tag -s -m signed_tag_msg signed_tag_bad &&
|
|
|
|
git cat-file tag signed_tag_bad >raw &&
|
|
|
|
sed -e "s/signed_tag_msg/forged/" raw >forged &&
|
|
|
|
git hash-object -w -t tag forged >forged.tag &&
|
|
|
|
git checkout plain-bad &&
|
|
|
|
git merge --no-ff -m msg "$(cat forged.tag)" &&
|
|
|
|
git log --graph --show-signature -n1 plain-bad >actual &&
|
|
|
|
grep "^|\\\ merged tag" actual &&
|
|
|
|
grep "^| | gpg: Signature made" actual &&
|
|
|
|
grep "^| | gpg: BAD signature from" actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success GPG 'log --show-signature for merged tag with GPG failure' '
|
|
|
|
test_when_finished "git reset --hard && git checkout master" &&
|
|
|
|
git checkout -b plain-fail master &&
|
|
|
|
echo aaa >bar &&
|
|
|
|
git add bar &&
|
|
|
|
git commit -m bar_commit &&
|
|
|
|
git checkout -b tagged-fail master &&
|
|
|
|
echo bbb >baz &&
|
|
|
|
git add baz &&
|
|
|
|
git commit -m baz_commit &&
|
|
|
|
git tag -s -m signed_tag_msg signed_tag_fail &&
|
|
|
|
git checkout plain-fail &&
|
|
|
|
git merge --no-ff -m msg signed_tag_fail &&
|
|
|
|
TMPDIR="$(pwd)/bogus" git log --show-signature -n1 plain-fail >actual &&
|
|
|
|
grep "^merged tag" actual &&
|
|
|
|
grep "^No signature" actual &&
|
|
|
|
! grep "^gpg: Signature made" actual
|
|
|
|
'
|
|
|
|
|
2018-07-20 08:28:07 +00:00
|
|
|
test_expect_success GPGSM 'log --graph --show-signature for merged tag x509' '
|
|
|
|
test_when_finished "git reset --hard && git checkout master" &&
|
|
|
|
test_config gpg.format x509 &&
|
|
|
|
test_config user.signingkey $GIT_COMMITTER_EMAIL &&
|
|
|
|
git checkout -b plain-x509 master &&
|
|
|
|
echo aaa >bar &&
|
|
|
|
git add bar &&
|
|
|
|
git commit -m bar_commit &&
|
|
|
|
git checkout -b tagged-x509 master &&
|
|
|
|
echo bbb >baz &&
|
|
|
|
git add baz &&
|
|
|
|
git commit -m baz_commit &&
|
|
|
|
git tag -s -m signed_tag_msg signed_tag_x509 &&
|
|
|
|
git checkout plain-x509 &&
|
|
|
|
git merge --no-ff -m msg signed_tag_x509 &&
|
|
|
|
git log --graph --show-signature -n1 plain-x509 >actual &&
|
|
|
|
grep "^|\\\ merged tag" actual &&
|
|
|
|
grep "^| | gpgsm: Signature made" actual &&
|
|
|
|
grep "^| | gpgsm: Good signature" actual
|
|
|
|
'
|
|
|
|
|
2020-03-04 11:48:03 +00:00
|
|
|
test_expect_success GPGSM 'log --graph --show-signature for merged tag x509 missing key' '
|
|
|
|
test_when_finished "git reset --hard && git checkout master" &&
|
|
|
|
test_config gpg.format x509 &&
|
|
|
|
test_config user.signingkey $GIT_COMMITTER_EMAIL &&
|
|
|
|
git checkout -b plain-x509-nokey master &&
|
|
|
|
echo aaa >bar &&
|
|
|
|
git add bar &&
|
|
|
|
git commit -m bar_commit &&
|
|
|
|
git checkout -b tagged-x509-nokey master &&
|
|
|
|
echo bbb >baz &&
|
|
|
|
git add baz &&
|
|
|
|
git commit -m baz_commit &&
|
|
|
|
git tag -s -m signed_tag_msg signed_tag_x509_nokey &&
|
|
|
|
git checkout plain-x509-nokey &&
|
|
|
|
git merge --no-ff -m msg signed_tag_x509_nokey &&
|
|
|
|
GNUPGHOME=. git log --graph --show-signature -n1 plain-x509-nokey >actual &&
|
|
|
|
grep "^|\\\ merged tag" actual &&
|
|
|
|
grep "^| | gpgsm: certificate not found" actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success GPGSM 'log --graph --show-signature for merged tag x509 bad signature' '
|
|
|
|
test_when_finished "git reset --hard && git checkout master" &&
|
|
|
|
test_config gpg.format x509 &&
|
|
|
|
test_config user.signingkey $GIT_COMMITTER_EMAIL &&
|
|
|
|
git checkout -b plain-x509-bad master &&
|
|
|
|
echo aaa >bar &&
|
|
|
|
git add bar &&
|
|
|
|
git commit -m bar_commit &&
|
|
|
|
git checkout -b tagged-x509-bad master &&
|
|
|
|
echo bbb >baz &&
|
|
|
|
git add baz &&
|
|
|
|
git commit -m baz_commit &&
|
|
|
|
git tag -s -m signed_tag_msg signed_tag_x509_bad &&
|
|
|
|
git cat-file tag signed_tag_x509_bad >raw &&
|
|
|
|
sed -e "s/signed_tag_msg/forged/" raw >forged &&
|
|
|
|
git hash-object -w -t tag forged >forged.tag &&
|
|
|
|
git checkout plain-x509-bad &&
|
|
|
|
git merge --no-ff -m msg "$(cat forged.tag)" &&
|
|
|
|
git log --graph --show-signature -n1 plain-x509-bad >actual &&
|
|
|
|
grep "^|\\\ merged tag" actual &&
|
|
|
|
grep "^| | gpgsm: Signature made" actual &&
|
|
|
|
grep "^| | gpgsm: invalid signature" actual
|
|
|
|
'
|
|
|
|
|
|
|
|
|
2016-06-22 16:51:25 +00:00
|
|
|
test_expect_success GPG '--no-show-signature overrides --show-signature' '
|
|
|
|
git log -1 --show-signature --no-show-signature signed >actual &&
|
|
|
|
! grep "^gpg:" actual
|
|
|
|
'
|
|
|
|
|
2016-06-22 16:51:26 +00:00
|
|
|
test_expect_success GPG 'log.showsignature=true behaves like --show-signature' '
|
|
|
|
test_config log.showsignature true &&
|
|
|
|
git log -1 signed >actual &&
|
|
|
|
grep "gpg: Signature made" actual &&
|
|
|
|
grep "gpg: Good signature" actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success GPG '--no-show-signature overrides log.showsignature=true' '
|
|
|
|
test_config log.showsignature true &&
|
|
|
|
git log -1 --no-show-signature signed >actual &&
|
|
|
|
! grep "^gpg:" actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success GPG '--show-signature overrides log.showsignature=false' '
|
|
|
|
test_config log.showsignature false &&
|
|
|
|
git log -1 --show-signature signed >actual &&
|
|
|
|
grep "gpg: Signature made" actual &&
|
|
|
|
grep "gpg: Good signature" actual
|
|
|
|
'
|
|
|
|
|
2015-03-11 02:13:02 +00:00
|
|
|
test_expect_success 'log --graph --no-walk is forbidden' '
|
|
|
|
test_must_fail git log --graph --no-walk
|
|
|
|
'
|
|
|
|
|
2015-08-29 05:04:18 +00:00
|
|
|
test_expect_success 'log diagnoses bogus HEAD' '
|
|
|
|
git init empty &&
|
|
|
|
test_must_fail git -C empty log 2>stderr &&
|
|
|
|
test_i18ngrep does.not.have.any.commits stderr &&
|
|
|
|
echo 1234abcd >empty/.git/refs/heads/master &&
|
|
|
|
test_must_fail git -C empty log 2>stderr &&
|
|
|
|
test_i18ngrep broken stderr &&
|
|
|
|
echo "ref: refs/heads/invalid.lock" >empty/.git/HEAD &&
|
|
|
|
test_must_fail git -C empty log 2>stderr &&
|
|
|
|
test_i18ngrep broken stderr &&
|
|
|
|
test_must_fail git -C empty log --default totally-bogus 2>stderr &&
|
|
|
|
test_i18ngrep broken stderr
|
|
|
|
'
|
|
|
|
|
2017-08-02 22:30:19 +00:00
|
|
|
test_expect_success 'log does not default to HEAD when rev input is given' '
|
|
|
|
git log --branches=does-not-exist >actual &&
|
2018-07-27 17:48:11 +00:00
|
|
|
test_must_be_empty actual
|
2017-08-02 22:30:19 +00:00
|
|
|
'
|
|
|
|
|
revision.c: propagate tag names from pending array
When we unwrap a tag to find its commit for a traversal, we
do not propagate the "name" field of the tag in the pending
array (i.e., the ref name the user gave us in the first
place) to the commit (instead, we use an empty string). This
means that "git log --source" will never show the tag-name
for commits we reach through it.
This was broken in 2073949 (traverse_commit_list: support
pending blobs/trees with paths, 2014-10-15). That commit
tried to be careful and avoid propagating the path
information for a tag (which would be nonsensical) to trees
and blobs. But it should not have cut off the "name" field,
which should carry forward to children.
Note that this does mean that the "name" field will carry
forward to blobs and trees, too. Whereas prior to 2073949,
we always gave them an empty string. This is the right thing
to do, but in practice no callers probably use it (since now
we have an explicit separate "path" field, which was the
point of 2073949).
We add tests here not only for the broken case, but also a
basic sanity test of "log --source" in general, which did
not have any coverage in the test suite.
Reported-by: Raymundo <gypark@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2015-12-17 06:47:07 +00:00
|
|
|
test_expect_success 'set up --source tests' '
|
|
|
|
git checkout --orphan source-a &&
|
|
|
|
test_commit one &&
|
|
|
|
test_commit two &&
|
|
|
|
git checkout -b source-b HEAD^ &&
|
|
|
|
test_commit three
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'log --source paints branch names' '
|
2019-12-21 19:49:21 +00:00
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$(git rev-parse --short :/three) source-b three
|
|
|
|
$(git rev-parse --short :/two ) source-a two
|
|
|
|
$(git rev-parse --short :/one ) source-b one
|
revision.c: propagate tag names from pending array
When we unwrap a tag to find its commit for a traversal, we
do not propagate the "name" field of the tag in the pending
array (i.e., the ref name the user gave us in the first
place) to the commit (instead, we use an empty string). This
means that "git log --source" will never show the tag-name
for commits we reach through it.
This was broken in 2073949 (traverse_commit_list: support
pending blobs/trees with paths, 2014-10-15). That commit
tried to be careful and avoid propagating the path
information for a tag (which would be nonsensical) to trees
and blobs. But it should not have cut off the "name" field,
which should carry forward to children.
Note that this does mean that the "name" field will carry
forward to blobs and trees, too. Whereas prior to 2073949,
we always gave them an empty string. This is the right thing
to do, but in practice no callers probably use it (since now
we have an explicit separate "path" field, which was the
point of 2073949).
We add tests here not only for the broken case, but also a
basic sanity test of "log --source" in general, which did
not have any coverage in the test suite.
Reported-by: Raymundo <gypark@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2015-12-17 06:47:07 +00:00
|
|
|
EOF
|
|
|
|
git log --oneline --source source-a source-b >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'log --source paints tag names' '
|
|
|
|
git tag -m tagged source-tag &&
|
2019-12-21 19:49:21 +00:00
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$(git rev-parse --short :/three) source-tag three
|
|
|
|
$(git rev-parse --short :/two ) source-a two
|
|
|
|
$(git rev-parse --short :/one ) source-tag one
|
revision.c: propagate tag names from pending array
When we unwrap a tag to find its commit for a traversal, we
do not propagate the "name" field of the tag in the pending
array (i.e., the ref name the user gave us in the first
place) to the commit (instead, we use an empty string). This
means that "git log --source" will never show the tag-name
for commits we reach through it.
This was broken in 2073949 (traverse_commit_list: support
pending blobs/trees with paths, 2014-10-15). That commit
tried to be careful and avoid propagating the path
information for a tag (which would be nonsensical) to trees
and blobs. But it should not have cut off the "name" field,
which should carry forward to children.
Note that this does mean that the "name" field will carry
forward to blobs and trees, too. Whereas prior to 2073949,
we always gave them an empty string. This is the right thing
to do, but in practice no callers probably use it (since now
we have an explicit separate "path" field, which was the
point of 2073949).
We add tests here not only for the broken case, but also a
basic sanity test of "log --source" in general, which did
not have any coverage in the test suite.
Reported-by: Raymundo <gypark@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2015-12-17 06:47:07 +00:00
|
|
|
EOF
|
|
|
|
git log --oneline --source source-tag source-a >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
handle_revision_arg: reset "dotdot" consistently
When we are parsing a range like "a..b", we write a
temporary NUL over the first ".", so that we can access the
names "a" and "b" as C strings. But our restoration of the
original "." is done at inconsistent times, which can lead
to confusing results.
For most calls, we restore the "." after we resolve the
names, but before we call verify_non_filename(). This means
that when we later call add_pending_object(), the name for
the left-hand "a" has been re-expanded to "a..b". You can
see this with:
git log --source a...b
where "b" will be correctly marked with "b", but "a" will be
marked with "a...b". Likewise with "a..b" (though you need
to use --boundary to even see "a" at all in that case).
To top off the confusion, when the REVARG_CANNOT_BE_FILENAME
flag is set, we skip the non-filename check, and leave the
NUL in place.
That means we do report the correct name for "a" in the
pending array. But some code paths try to show the whole
"a...b" name in error messages, and these erroneously show
only "a" instead of "a...b". E.g.:
$ git cherry-pick HEAD:foo...HEAD:foo
error: object d95f3ad14dee633a758d2e331151e950dd13e4ed is a blob, not a commit
error: object d95f3ad14dee633a758d2e331151e950dd13e4ed is a blob, not a commit
fatal: Invalid symmetric difference expression HEAD:foo
(That last message should be "HEAD:foo...HEAD:foo"; I used
cherry-pick because it passes the CANNOT_BE_FILENAME flag).
As an interesting side note, cherry-pick actually looks at
and re-resolves the arguments from the pending->name fields.
So it would have been visibly broken by the first bug, but
the effect was canceled out by the second one.
This patch makes the whole function consistent by re-writing
the NUL immediately after calling verify_non_filename(), and
then restoring the "." as appropriate in some error-printing
and early-return code paths.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-05-23 19:51:32 +00:00
|
|
|
test_expect_success 'log --source paints symmetric ranges' '
|
2019-12-21 19:49:21 +00:00
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$(git rev-parse --short :/three) source-b three
|
|
|
|
$(git rev-parse --short :/two ) source-a two
|
handle_revision_arg: reset "dotdot" consistently
When we are parsing a range like "a..b", we write a
temporary NUL over the first ".", so that we can access the
names "a" and "b" as C strings. But our restoration of the
original "." is done at inconsistent times, which can lead
to confusing results.
For most calls, we restore the "." after we resolve the
names, but before we call verify_non_filename(). This means
that when we later call add_pending_object(), the name for
the left-hand "a" has been re-expanded to "a..b". You can
see this with:
git log --source a...b
where "b" will be correctly marked with "b", but "a" will be
marked with "a...b". Likewise with "a..b" (though you need
to use --boundary to even see "a" at all in that case).
To top off the confusion, when the REVARG_CANNOT_BE_FILENAME
flag is set, we skip the non-filename check, and leave the
NUL in place.
That means we do report the correct name for "a" in the
pending array. But some code paths try to show the whole
"a...b" name in error messages, and these erroneously show
only "a" instead of "a...b". E.g.:
$ git cherry-pick HEAD:foo...HEAD:foo
error: object d95f3ad14dee633a758d2e331151e950dd13e4ed is a blob, not a commit
error: object d95f3ad14dee633a758d2e331151e950dd13e4ed is a blob, not a commit
fatal: Invalid symmetric difference expression HEAD:foo
(That last message should be "HEAD:foo...HEAD:foo"; I used
cherry-pick because it passes the CANNOT_BE_FILENAME flag).
As an interesting side note, cherry-pick actually looks at
and re-resolves the arguments from the pending->name fields.
So it would have been visibly broken by the first bug, but
the effect was canceled out by the second one.
This patch makes the whole function consistent by re-writing
the NUL immediately after calling verify_non_filename(), and
then restoring the "." as appropriate in some error-printing
and early-return code paths.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-05-23 19:51:32 +00:00
|
|
|
EOF
|
|
|
|
git log --oneline --source source-a...source-b >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2018-10-23 01:13:42 +00:00
|
|
|
test_expect_success '--exclude-promisor-objects does not BUG-crash' '
|
|
|
|
test_must_fail git log --exclude-promisor-objects source-a
|
|
|
|
'
|
|
|
|
|
2019-08-06 14:40:16 +00:00
|
|
|
test_expect_success 'log --end-of-options' '
|
|
|
|
git update-ref refs/heads/--source HEAD &&
|
|
|
|
git log --end-of-options --source >actual &&
|
|
|
|
git log >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2010-08-15 10:16:25 +00:00
|
|
|
test_done
|