mirror of
https://github.com/git/git.git
synced 2026-03-27 09:00:06 +01:00
Merge branch 'jk/reflog-walk'
Numerous bugs in walking of reflogs via "log -g" and friends have been fixed. * jk/reflog-walk: reflog-walk: apply --since/--until to reflog dates reflog-walk: stop using fake parents rev-list: check reflog_info before showing usage get_revision_1(): replace do-while with an early return log: do not free parents when walking reflog log: clarify comment about reflog cycles revision: disallow reflog walking with revs->limited t1414: document some reflog-walk oddities
This commit is contained in:
@@ -171,14 +171,4 @@ test_expect_success 'reflog exists works' '
|
||||
! git reflog exists refs/heads/nonexistent
|
||||
'
|
||||
|
||||
# The behavior with two reflogs is buggy and the output is in flux; for now
|
||||
# we're just checking that the program works at all without segfaulting.
|
||||
test_expect_success 'showing multiple reflogs works' '
|
||||
git log -g HEAD HEAD >actual
|
||||
'
|
||||
|
||||
test_expect_success 'showing multiple reflogs with an old date' '
|
||||
git log -g HEAD@{1979-01-01} HEAD >actual
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
135
t/t1414-reflog-walk.sh
Executable file
135
t/t1414-reflog-walk.sh
Executable file
@@ -0,0 +1,135 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='various tests of reflog walk (log -g) behavior'
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'set up some reflog entries' '
|
||||
test_commit one &&
|
||||
test_commit two &&
|
||||
git checkout -b side HEAD^ &&
|
||||
test_commit three &&
|
||||
git merge --no-commit master &&
|
||||
echo evil-merge-content >>one.t &&
|
||||
test_tick &&
|
||||
git commit --no-edit -a
|
||||
'
|
||||
|
||||
do_walk () {
|
||||
git log -g --format="%gd %gs" "$@"
|
||||
}
|
||||
|
||||
sq="'"
|
||||
test_expect_success 'set up expected reflog' '
|
||||
cat >expect.all <<-EOF
|
||||
HEAD@{0} commit (merge): Merge branch ${sq}master${sq} into side
|
||||
HEAD@{1} commit: three
|
||||
HEAD@{2} checkout: moving from master to side
|
||||
HEAD@{3} commit: two
|
||||
HEAD@{4} commit (initial): one
|
||||
EOF
|
||||
'
|
||||
|
||||
test_expect_success 'reflog walk shows expected logs' '
|
||||
do_walk >actual &&
|
||||
test_cmp expect.all actual
|
||||
'
|
||||
|
||||
test_expect_success 'reflog can limit with --no-merges' '
|
||||
grep -v merge expect.all >expect &&
|
||||
do_walk --no-merges >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'reflog can limit with pathspecs' '
|
||||
grep two expect.all >expect &&
|
||||
do_walk -- two.t >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'pathspec limiting handles merges' '
|
||||
# we pick up:
|
||||
# - the initial commit of one
|
||||
# - the checkout back to commit one
|
||||
# - the evil merge which touched one
|
||||
sed -n "1p;3p;5p" expect.all >expect &&
|
||||
do_walk -- one.t >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success '--parents shows true parents' '
|
||||
# convert newlines to spaces
|
||||
echo $(git rev-parse HEAD HEAD^1 HEAD^2) >expect &&
|
||||
git rev-list -g --parents -1 HEAD >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'walking multiple reflogs shows all' '
|
||||
# We expect to see all entries for all reflogs, but interleaved by
|
||||
# date, with order on the command line breaking ties. We
|
||||
# can use "sort" on the separate lists to generate this,
|
||||
# but note two tricks:
|
||||
#
|
||||
# 1. We use "{" as the delimiter, which lets us skip to the reflog
|
||||
# date specifier as our second field, and then our "-n" numeric
|
||||
# sort ignores the bits after the timestamp.
|
||||
#
|
||||
# 2. POSIX leaves undefined whether this is a stable sort or not. So
|
||||
# we use "-k 1" to ensure that we see HEAD before master before
|
||||
# side when breaking ties.
|
||||
{
|
||||
do_walk --date=unix HEAD &&
|
||||
do_walk --date=unix side &&
|
||||
do_walk --date=unix master
|
||||
} >expect.raw &&
|
||||
sort -t "{" -k 2nr -k 1 <expect.raw >expect &&
|
||||
do_walk --date=unix HEAD master side >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'date-limiting does not interfere with other logs' '
|
||||
do_walk HEAD@{1979-01-01} HEAD >actual &&
|
||||
test_cmp expect.all actual
|
||||
'
|
||||
|
||||
test_expect_success 'min/max age uses entry date to limit' '
|
||||
# Flip between commits one and two so each ref update actually
|
||||
# does something (and does not get optimized out). We know
|
||||
# that the timestamps of those commits will be before our "min".
|
||||
|
||||
git update-ref -m before refs/heads/minmax one &&
|
||||
|
||||
test_tick &&
|
||||
min=$test_tick &&
|
||||
git update-ref -m min refs/heads/minmax two &&
|
||||
|
||||
test_tick &&
|
||||
max=$test_tick &&
|
||||
git update-ref -m max refs/heads/minmax one &&
|
||||
|
||||
test_tick &&
|
||||
git update-ref -m after refs/heads/minmax two &&
|
||||
|
||||
cat >expect <<-\EOF &&
|
||||
max
|
||||
min
|
||||
EOF
|
||||
git log -g --since=$min --until=$max --format=%gs minmax >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'walk prefers reflog to ref tip' '
|
||||
head=$(git rev-parse HEAD) &&
|
||||
one=$(git rev-parse one) &&
|
||||
ident="$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE" &&
|
||||
echo "$head $one $ident broken reflog entry" >>.git/logs/HEAD &&
|
||||
|
||||
echo $one >expect &&
|
||||
git log -g --format=%H -1 >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'rev-list -g complains when there are no reflogs' '
|
||||
test_must_fail git rev-list -g
|
||||
'
|
||||
|
||||
test_done
|
||||
@@ -166,10 +166,9 @@ test_expect_success 'resulting reflog can be shown by log -g' '
|
||||
oid=$(git rev-parse HEAD) &&
|
||||
cat >expect <<-EOF &&
|
||||
HEAD@{0} $oid $msg
|
||||
HEAD@{1} $oid $msg
|
||||
HEAD@{2} $oid checkout: moving from foo to baz
|
||||
EOF
|
||||
git log -g --format="%gd %H %gs" -3 HEAD >actual &&
|
||||
git log -g --format="%gd %H %gs" -2 HEAD >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user