diff options
-rw-r--r-- | commit.c | 16 | ||||
-rw-r--r-- | shallow.c | 7 | ||||
-rwxr-xr-x | t/t5537-fetch-shallow.sh | 12 |
3 files changed, 34 insertions, 1 deletions
@@ -120,6 +120,17 @@ int commit_graft_pos(struct repository *r, const struct object_id *oid) commit_graft_oid_access); } +static void unparse_commit(struct repository *r, const struct object_id *oid) +{ + struct commit *c = lookup_commit(r, oid); + + if (!c->object.parsed) + return; + free_commit_list(c->parents); + c->parents = NULL; + c->object.parsed = 0; +} + int register_commit_graft(struct repository *r, struct commit_graft *graft, int ignore_dups) { @@ -145,6 +156,7 @@ int register_commit_graft(struct repository *r, struct commit_graft *graft, (r->parsed_objects->grafts_nr - pos - 1) * sizeof(*r->parsed_objects->grafts)); r->parsed_objects->grafts[pos] = graft; + unparse_commit(r, &graft->oid); return 0; } @@ -253,8 +265,10 @@ void reset_commit_grafts(struct repository *r) { int i; - for (i = 0; i < r->parsed_objects->grafts_nr; i++) + for (i = 0; i < r->parsed_objects->grafts_nr; i++) { + unparse_commit(r, &r->parsed_objects->grafts[i]->oid); free(r->parsed_objects->grafts[i]); + } r->parsed_objects->grafts_nr = 0; r->parsed_objects->commit_graft_prepared = 0; } @@ -97,6 +97,13 @@ int commit_shallow_file(struct repository *r, struct shallow_lock *lk) { int res = commit_lock_file(&lk->lock); reset_repository_shallow(r); + + /* + * Update in-memory data structures with the new shallow information, + * including unparsing all commits that now have grafts. + */ + is_repository_shallow(r); + return res; } diff --git a/t/t5537-fetch-shallow.sh b/t/t5537-fetch-shallow.sh index 92948de7a0..10e9a7ff26 100755 --- a/t/t5537-fetch-shallow.sh +++ b/t/t5537-fetch-shallow.sh @@ -164,12 +164,24 @@ test_expect_success 'fetch --update-shallow' ' test_expect_success 'fetch --update-shallow into a repo with submodules' ' git init a-submodule && test_commit -C a-submodule foo && + + test_when_finished "rm -rf repo-with-sub" && git init repo-with-sub && git -C repo-with-sub submodule add ../a-submodule a-submodule && git -C repo-with-sub commit -m "added submodule" && git -C repo-with-sub fetch --update-shallow ../shallow/.git refs/heads/*:refs/remotes/shallow/* ' +test_expect_success 'fetch --update-shallow a commit that is also a shallow point into a repo with submodules' ' + test_when_finished "rm -rf repo-with-sub" && + git init repo-with-sub && + git -C repo-with-sub submodule add ../a-submodule a-submodule && + git -C repo-with-sub commit -m "added submodule" && + + SHALLOW=$(cat shallow/.git/shallow) && + git -C repo-with-sub fetch --update-shallow ../shallow/.git "$SHALLOW":refs/heads/a-shallow +' + test_expect_success 'fetch --update-shallow (with fetch.writeCommitGraph)' ' ( cd shallow && |