summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2013-12-05 13:02:41 (GMT)
committerJunio C Hamano <gitster@pobox.com>2013-12-11 00:14:17 (GMT)
commit79d3a236c551ad59719a6835bee03a1446296e65 (patch)
treea23554e47b3d83df429dda8e9fbe7c33a1b8cb58
parent4820a33baa963c4559736d7a1c4c35f8dcb37293 (diff)
downloadgit-79d3a236c551ad59719a6835bee03a1446296e65.zip
git-79d3a236c551ad59719a6835bee03a1446296e65.tar.gz
git-79d3a236c551ad59719a6835bee03a1446296e65.tar.bz2
upload-pack: make sure deepening preserves shallow roots
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>
-rw-r--r--Documentation/fetch-options.txt8
-rw-r--r--shallow.c6
-rwxr-xr-xt/t5537-fetch-shallow.sh16
-rw-r--r--upload-pack.c2
4 files changed, 28 insertions, 4 deletions
diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
index ba1fe49..a83d2b4 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.txt
@@ -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::
diff --git a/shallow.c b/shallow.c
index fb6069b..5226854 100644
--- a/shallow.c
+++ b/shallow.c
@@ -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;
@@ -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;
diff --git a/t/t5537-fetch-shallow.sh b/t/t5537-fetch-shallow.sh
index d211052..022cb2c 100755
--- a/t/t5537-fetch-shallow.sh
+++ b/t/t5537-fetch-shallow.sh
@@ -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
diff --git a/upload-pack.c b/upload-pack.c
index f082f06..28269c7 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -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;