Merge branch 'jk/reflog-walk-maint' into jk/reflog-walk
* 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
This commit is contained in:
commit
be5982a794
@ -38,6 +38,22 @@ static int read_one_reflog(struct object_id *ooid, struct object_id *noid,
|
|||||||
return 0;
|
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)
|
static struct complete_reflogs *read_complete_reflog(const char *ref)
|
||||||
{
|
{
|
||||||
struct complete_reflogs *reflogs =
|
struct complete_reflogs *reflogs =
|
||||||
@ -136,6 +152,7 @@ struct reflog_walk_info {
|
|||||||
void init_reflog_walk(struct reflog_walk_info **info)
|
void init_reflog_walk(struct reflog_walk_info **info)
|
||||||
{
|
{
|
||||||
*info = xcalloc(1, sizeof(struct reflog_walk_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,
|
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)
|
if (ret > 1)
|
||||||
free(b);
|
free(b);
|
||||||
else if (ret == 1) {
|
else if (ret == 1) {
|
||||||
if (reflogs) {
|
free_complete_reflog(reflogs);
|
||||||
free(reflogs->ref);
|
|
||||||
free(reflogs);
|
|
||||||
}
|
|
||||||
free(branch);
|
free(branch);
|
||||||
branch = b;
|
branch = b;
|
||||||
reflogs = read_complete_reflog(branch);
|
reflogs = read_complete_reflog(branch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!reflogs || reflogs->nr == 0) {
|
if (!reflogs || reflogs->nr == 0) {
|
||||||
if (reflogs) {
|
free_complete_reflog(reflogs);
|
||||||
free(reflogs->ref);
|
|
||||||
free(reflogs);
|
|
||||||
}
|
|
||||||
free(branch);
|
free(branch);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -214,10 +225,6 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
|
|||||||
if (recno < 0) {
|
if (recno < 0) {
|
||||||
commit_reflog->recno = get_reflog_recno_by_time(reflogs, timestamp);
|
commit_reflog->recno = get_reflog_recno_by_time(reflogs, timestamp);
|
||||||
if (commit_reflog->recno < 0) {
|
if (commit_reflog->recno < 0) {
|
||||||
if (reflogs) {
|
|
||||||
free(reflogs->ref);
|
|
||||||
free(reflogs);
|
|
||||||
}
|
|
||||||
free(commit_reflog);
|
free(commit_reflog);
|
||||||
return -1;
|
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 */
|
/* a root commit, but there are still more entries to show */
|
||||||
reflog = &commit_reflog->reflogs->items[commit_reflog->recno];
|
reflog = &commit_reflog->reflogs->items[commit_reflog->recno];
|
||||||
logobj = parse_object(&reflog->noid);
|
logobj = parse_object(&reflog->noid);
|
||||||
|
if (!logobj)
|
||||||
|
logobj = parse_object(&reflog->ooid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!logobj || logobj->type != OBJ_COMMIT) {
|
if (!logobj || logobj->type != OBJ_COMMIT) {
|
||||||
|
@ -171,4 +171,14 @@ test_expect_success 'reflog exists works' '
|
|||||||
! git reflog exists refs/heads/nonexistent
|
! 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
|
test_done
|
||||||
|
@ -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
|
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' '
|
test_expect_success 'git branch -M baz bam should succeed when baz is checked out as linked working tree' '
|
||||||
git checkout master &&
|
git checkout master &&
|
||||||
git worktree add -b baz bazdir &&
|
git worktree add -b baz bazdir &&
|
||||||
|
Loading…
Reference in New Issue
Block a user