Skip to content

Commit

Permalink
upload-pack: make sure deepening preserves shallow roots
Browse files Browse the repository at this point in the history
When "fetch --depth=N" where N exceeds the longest chain of history in
the source repo, usually we just send an "unshallow" line to the
client so full history is obtained.

When the source repo is shallow we need to make sure to "unshallow"
the current shallow point _and_ "shallow" again when the commit
reaches its shallow bottom in the source repo.

This should fix both cases: large <N> and --unshallow.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Nguyễn Thái Ngọc Duy authored and Junio C Hamano committed Dec 11, 2013
1 parent 4820a33 commit 79d3a23
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 4 deletions.
8 changes: 6 additions & 2 deletions Documentation/fetch-options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,12 @@
branch history. Tags for the deepened commits are not fetched.

--unshallow::
Convert a shallow repository to a complete one, removing all
the limitations imposed by shallow repositories.
If the source repository is complete, convert a shallow
repository to a complete one, removing all the limitations
imposed by shallow repositories.
+
If the source repository is shallow, fetch as much as possible so that
the current repository has the same history as the source repository.

ifndef::git-pull[]
--dry-run::
Expand Down
6 changes: 5 additions & 1 deletion shallow.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ struct commit_list *get_shallow_commits(struct object_array *heads, int depth,
struct commit_list *result = NULL;
struct object_array stack = OBJECT_ARRAY_INIT;
struct commit *commit = NULL;
struct commit_graft *graft;

while (commit || i < heads->nr || stack.nr) {
struct commit_list *p;
Expand All @@ -99,7 +100,10 @@ struct commit_list *get_shallow_commits(struct object_array *heads, int depth,
if (parse_commit(commit))
die("invalid commit");
cur_depth++;
if (cur_depth >= depth) {
if ((depth != INFINITE_DEPTH && cur_depth >= depth) ||
(is_repository_shallow() && !commit->parents &&
(graft = lookup_commit_graft(commit->object.sha1)) != NULL &&
graft->nr_parent < 0)) {
commit_list_insert(commit, &result);
commit->object.flags |= shallow_flag;
commit = NULL;
Expand Down
16 changes: 16 additions & 0 deletions t/t5537-fetch-shallow.sh
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,22 @@ EOF
)
'

test_expect_success 'fetch --unshallow from shallow clone' '
(
cd shallow2 &&
git fetch --unshallow &&
git fsck &&
git log --format=%s origin/master >actual &&
cat <<EOF >expect &&
6
5
4
3
EOF
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
Expand Down
2 changes: 1 addition & 1 deletion upload-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,7 @@ static void receive_needs(void)
if (depth > 0) {
struct commit_list *result = NULL, *backup = NULL;
int i;
if (depth == INFINITE_DEPTH)
if (depth == INFINITE_DEPTH && !is_repository_shallow())
for (i = 0; i < shallows.nr; i++) {
struct object *object = shallows.objects[i].item;
object->flags |= NOT_SHALLOW;
Expand Down

0 comments on commit 79d3a23

Please sign in to comment.