summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2017-07-12 15:20:35 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2017-07-12 15:20:36 -0700
commit9d21a968b2018983fa28a3e41dcb1d7546e0c27c (patch)
tree150d346d126a89fb62b8aa60509139ae6d146905
parentPrepare for 2.13.3 (diff)
parentreflog-walk: include all fields when freeing complete_reflogs (diff)
downloadtgif-9d21a968b2018983fa28a3e41dcb1d7546e0c27c.tar.xz
Merge branch 'jk/reflog-walk-maint' into maint
After "git branch --move" of the currently checked out branch, the code to walk the reflog of HEAD via "log -g" and friends incorrectly stopped at the reflog entry that records the renaming of the branch. * jk/reflog-walk-maint: reflog-walk: include all fields when freeing complete_reflogs reflog-walk: don't free reflogs added to cache reflog-walk: duplicate strings in complete_reflogs list reflog-walk: skip over double-null oid due to HEAD rename
-rw-r--r--reflog-walk.c33
-rwxr-xr-xt/t1411-reflog-show.sh10
-rwxr-xr-xt/t3200-branch.sh11
3 files changed, 42 insertions, 12 deletions
diff --git a/reflog-walk.c b/reflog-walk.c
index c63eb1a3fd..ba72020fc3 100644
--- a/reflog-walk.c
+++ b/reflog-walk.c
@@ -38,6 +38,22 @@ static int read_one_reflog(struct object_id *ooid, struct object_id *noid,
return 0;
}
+static void free_complete_reflog(struct complete_reflogs *array)
+{
+ int i;
+
+ if (!array)
+ return;
+
+ for (i = 0; i < array->nr; i++) {
+ free(array->items[i].email);
+ free(array->items[i].message);
+ }
+ free(array->items);
+ free(array->ref);
+ free(array);
+}
+
static struct complete_reflogs *read_complete_reflog(const char *ref)
{
struct complete_reflogs *reflogs =
@@ -136,6 +152,7 @@ struct reflog_walk_info {
void init_reflog_walk(struct reflog_walk_info **info)
{
*info = xcalloc(1, sizeof(struct reflog_walk_info));
+ (*info)->complete_reflogs.strdup_strings = 1;
}
int add_reflog_for_walk(struct reflog_walk_info *info,
@@ -188,20 +205,14 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
if (ret > 1)
free(b);
else if (ret == 1) {
- if (reflogs) {
- free(reflogs->ref);
- free(reflogs);
- }
+ free_complete_reflog(reflogs);
free(branch);
branch = b;
reflogs = read_complete_reflog(branch);
}
}
if (!reflogs || reflogs->nr == 0) {
- if (reflogs) {
- free(reflogs->ref);
- free(reflogs);
- }
+ free_complete_reflog(reflogs);
free(branch);
return -1;
}
@@ -214,10 +225,6 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
if (recno < 0) {
commit_reflog->recno = get_reflog_recno_by_time(reflogs, timestamp);
if (commit_reflog->recno < 0) {
- if (reflogs) {
- free(reflogs->ref);
- free(reflogs);
- }
free(commit_reflog);
return -1;
}
@@ -259,6 +266,8 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit)
/* a root commit, but there are still more entries to show */
reflog = &commit_reflog->reflogs->items[commit_reflog->recno];
logobj = parse_object(reflog->noid.hash);
+ if (!logobj)
+ logobj = parse_object(reflog->ooid.hash);
}
if (!logobj || logobj->type != OBJ_COMMIT) {
diff --git a/t/t1411-reflog-show.sh b/t/t1411-reflog-show.sh
index 6ac7734d79..b9cb76654b 100755
--- a/t/t1411-reflog-show.sh
+++ b/t/t1411-reflog-show.sh
@@ -171,4 +171,14 @@ 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
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index 48d152b9a9..dd37ac47c5 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -162,6 +162,17 @@ test_expect_success 'git branch -M baz bam should add entries to .git/logs/HEAD'
grep "^0\{40\}.*$msg$" .git/logs/HEAD
'
+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 &&
+ test_cmp expect actual
+'
+
test_expect_success 'git branch -M baz bam should succeed when baz is checked out as linked working tree' '
git checkout master &&
git worktree add -b baz bazdir &&