The user can do fetch --depth=2147483647 for infinite depth now. But
it's hard to remember. Any other large numbers would also do if it's
longer than the longest commit chain in repository (some guessing may
be involved). Make --depth=0 or --depth=inf an alias for
--depth=2147483647. JGit and older C Git store depth as "int" so both
are OK with this number. Dulwich does not support shallow clone.

fetch-pack is not changed because it's a plumbing and the plumber is
expected to write this number explicitly.

Make upload-pack recognize this special number as infinite depth. The
effect is essentially the same as before, except that upload-pack is
more efficient in this case as it does not have to traverse the commit
DAG to the bottom any more. The chance of a user actually wanting
exactly 2147483647 commits depth, not infinite, is probably too small
to consider.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 This is a patch from the graveyard, the third patch of a series [1].
 The series, nd/clone-depth-zero, has been merged. Although I don't know
 only the first patch in the original series got in.

 http://thread.gmane.org/gmane.comp.version-control.git/154267/focus=154268

 Documentation/fetch-options.txt     |  2 ++
 Documentation/technical/shallow.txt |  3 +++
 commit.h                            |  3 +++
 t/t5500-fetch-pack.sh               |  8 ++++++++
 transport.c                         |  5 +++++
 upload-pack.c                       | 13 ++++++++++---
 6 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
index 6e98bdf..140d0cd 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.txt
@@ -12,6 +12,8 @@
        `git clone` with `--depth=<depth>` option (see linkgit:git-clone[1])
        to the specified number of commits from the tip of each remote
        branch history. Tags for the deepened commits are not fetched.
+       Depth 0 or "inf" is infinite, which may turn repository to a
+       non-shallow one again.
 
 ifndef::git-pull[]
 --dry-run::
diff --git a/Documentation/technical/shallow.txt 
b/Documentation/technical/shallow.txt
index 0502a54..ea2f69f 100644
--- a/Documentation/technical/shallow.txt
+++ b/Documentation/technical/shallow.txt
@@ -53,3 +53,6 @@ It also writes an appropriate $GIT_DIR/shallow.
 You can deepen a shallow repository with "git-fetch --depth 20
 repo branch", which will fetch branch from repo, but stop at depth
 20, updating $GIT_DIR/shallow.
+
+The special depth 2147483647 (or 0x7fffffff, the largest positive
+number a signed 32-bit integer can contain) means infinite depth.
diff --git a/commit.h b/commit.h
index 0f469e5..fbde106 100644
--- a/commit.h
+++ b/commit.h
@@ -162,6 +162,9 @@ extern struct commit_list *get_merge_bases(struct commit 
*rev1, struct commit *r
 extern struct commit_list *get_merge_bases_many(struct commit *one, int n, 
struct commit **twos, int cleanup);
 extern struct commit_list *get_octopus_merge_bases(struct commit_list *in);
 
+/* largest postive number a signed 32-bit integer can contain */
+#define INFINITE_DEPTH 0x7fffffff
+
 extern int register_shallow(const unsigned char *sha1);
 extern int unregister_shallow(const unsigned char *sha1);
 extern int for_each_commit_graft(each_commit_graft_fn, void *);
diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh
index 6322e8a..2d40073 100755
--- a/t/t5500-fetch-pack.sh
+++ b/t/t5500-fetch-pack.sh
@@ -264,6 +264,14 @@ test_expect_success 'clone shallow object count' '
        grep "^count: 52" count.shallow
 '
 
+test_expect_success 'infinite deepening (full repo)' '
+       (
+               cd shallow &&
+               git fetch --depth=inf &&
+               ! test -f .git/shallow
+       )
+'
+
 test_expect_success 'clone shallow without --no-single-branch' '
        git clone --depth 1 "file://$(pwd)/." shallow2
 '
diff --git a/transport.c b/transport.c
index 2673d27..a938ba0 100644
--- a/transport.c
+++ b/transport.c
@@ -12,6 +12,7 @@
 #include "url.h"
 #include "submodule.h"
 #include "string-list.h"
+#include "commit.h"
 
 /* rsync support */
 
@@ -475,11 +476,15 @@ static int set_git_option(struct git_transport_options 
*opts,
        } else if (!strcmp(name, TRANS_OPT_DEPTH)) {
                if (!value)
                        opts->depth = 0;
+               else if (!strcmp(value, "inf"))
+                       opts->depth = INFINITE_DEPTH;
                else {
                        char *end;
                        opts->depth = strtol(value, &end, 0);
                        if (*end)
                                die("transport: invalid depth option '%s'", 
value);
+                       if (opts->depth == 0)
+                               opts->depth = INFINITE_DEPTH;
                }
                return 0;
        }
diff --git a/upload-pack.c b/upload-pack.c
index 6142421..88f0029 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -670,10 +670,17 @@ static void receive_needs(void)
        if (depth == 0 && shallows.nr == 0)
                return;
        if (depth > 0) {
-               struct commit_list *result, *backup;
+               struct commit_list *result = NULL, *backup = NULL;
                int i;
-               backup = result = get_shallow_commits(&want_obj, depth,
-                       SHALLOW, NOT_SHALLOW);
+               if (depth == INFINITE_DEPTH)
+                       for (i = 0; i < shallows.nr; i++) {
+                               struct object *object = 
shallows.objects[i].item;
+                               object->flags |= NOT_SHALLOW;
+                       }
+               else
+                       backup = result =
+                               get_shallow_commits(&want_obj, depth,
+                                                   SHALLOW, NOT_SHALLOW);
                while (result) {
                        struct object *object = &result->item->object;
                        if (!(object->flags & (CLIENT_SHALLOW|NOT_SHALLOW))) {
-- 
1.8.0.rc2.23.g1fb49df

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to