Merge branch 'tb/fix-persistent-shallow' into master

When "fetch.writeCommitGraph" configuration is set in a shallow
repository and a fetch moves the shallow boundary, we wrote out
broken commit-graph files that do not match the reality, which has
been corrected.

* tb/fix-persistent-shallow:
  commit.c: don't persist substituted parents when unshallowing
This commit is contained in:
Junio C Hamano 2020-07-09 14:00:44 -07:00
commit 24ecfdf206
4 changed files with 19 additions and 1 deletions

View File

@ -203,7 +203,8 @@ static int commit_graph_compatible(struct repository *r)
}
prepare_commit_graft(r);
if (r->parsed_objects && r->parsed_objects->grafts_nr)
if (r->parsed_objects &&
(r->parsed_objects->grafts_nr || r->parsed_objects->substituted_parent))
return 0;
if (is_repository_shallow(r))
return 0;

View File

@ -423,6 +423,8 @@ int parse_commit_buffer(struct repository *r, struct commit *item, const void *b
pptr = &item->parents;
graft = lookup_commit_graft(r, &item->object.oid);
if (graft)
r->parsed_objects->substituted_parent = 1;
while (bufptr + parent_entry_len < tail && !memcmp(bufptr, "parent ", 7)) {
struct commit *new_parent;

View File

@ -25,6 +25,7 @@ struct parsed_object_pool {
char *alternate_shallow_file;
int commit_graft_prepared;
int substituted_parent;
struct buffer_slab *buffer_slab;
};

View File

@ -81,6 +81,20 @@ test_expect_success 'fetch --unshallow from shallow clone' '
)
'
test_expect_success 'fetch --unshallow from a full clone' '
git clone --no-local --depth=2 .git shallow3 &&
(
cd shallow3 &&
git log --format=%s >actual &&
test_write_lines 4 3 >expect &&
test_cmp expect actual &&
git -c fetch.writeCommitGraph fetch --unshallow &&
git log origin/master --format=%s >actual &&
test_write_lines 4 3 2 1 >expect &&
test_cmp expect actual
)
'
test_expect_success 'fetch something upstream has but hidden by clients shallow boundaries' '
# the blob "1" is available in .git but hidden by the
# shallow2/.git/shallow and it should be resent