Thread (59 messages) 59 messages, 5 authors, 2021-06-19

Re: [PATCH 4/4] promisor-remote: teach lazy-fetch in any repo

flat view

From: Elijah Newren <hidden>
Date: 2021-06-05 00:23:25

Hi,

On Tue, Jun 1, 2021 at 2:38 PM Jonathan Tan [off-list ref] wrote:
This is one step towards supporting partial clone submodules.

Even after this patch, we will still lack partial clone submodules
support, primarily because a lot of Git code that accesses submodule
objects does so by adding their object stores as alternates, meaning
that any lazy fetches that would occur in the submodule would be done
based on the config of the superproject, not of the submodule. This also
prevents testing of the functionality in this patch by user-facing
commands. So for now, test this mechanism using a test helper.
...
quoted hunk ↗ jump to hunk
diff --git a/t/helper/test-partial-clone.c b/t/helper/test-partial-clone.c
new file mode 100644
index 0000000000..e7bc7eb21f
--- /dev/null
+++ b/t/helper/test-partial-clone.c
@@ -0,0 +1,34 @@
+#include "cache.h"
+#include "test-tool.h"
+#include "repository.h"
+#include "object-store.h"
+
+static void object_info(const char *gitdir, const char *oid_hex)
+{
+       struct repository r;
+       struct object_id oid;
+       unsigned long size;
+       struct object_info oi = {.sizep = &size};
+       const char *p;
+
+       if (repo_init(&r, gitdir, NULL))
+               die("could not init repo");
+       if (parse_oid_hex(oid_hex, &oid, &p))
+               die("could not parse oid");
+       if (oid_object_info_extended(&r, &oid, &oi, 0))
+               die("could not obtain object info");
+       printf("%d\n", (int) size);
+}
+
+int cmd__partial_clone(int argc, const char **argv)
+{
+       if (argc < 4)
+               die("too few arguments");
+
+       if (!strcmp(argv[1], "object-info"))
+               object_info(argv[2], argv[3]);
+       else
+               die("invalid argument '%s'", argv[1]);
+
+       return 0;
+}
diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c
index c5bd0c6d4c..b21e8f1519 100644
--- a/t/helper/test-tool.c
+++ b/t/helper/test-tool.c
@@ -46,6 +46,7 @@ static struct test_cmd cmds[] = {
        { "online-cpus", cmd__online_cpus },
        { "parse-options", cmd__parse_options },
        { "parse-pathspec-file", cmd__parse_pathspec_file },
+       { "partial-clone", cmd__partial_clone },
        { "path-utils", cmd__path_utils },
        { "pcre2-config", cmd__pcre2_config },
        { "pkt-line", cmd__pkt_line },
diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h
index e8069a3b22..f845ced4b3 100644
--- a/t/helper/test-tool.h
+++ b/t/helper/test-tool.h
@@ -35,6 +35,7 @@ int cmd__oidmap(int argc, const char **argv);
 int cmd__online_cpus(int argc, const char **argv);
 int cmd__parse_options(int argc, const char **argv);
 int cmd__parse_pathspec_file(int argc, const char** argv);
+int cmd__partial_clone(int argc, const char **argv);
 int cmd__path_utils(int argc, const char **argv);
 int cmd__pcre2_config(int argc, const char **argv);
 int cmd__pkt_line(int argc, const char **argv);
diff --git a/t/t0410-partial-clone.sh b/t/t0410-partial-clone.sh
index 584a039b85..e804d267e6 100755
--- a/t/t0410-partial-clone.sh
+++ b/t/t0410-partial-clone.sh
@@ -604,6 +604,30 @@ test_expect_success 'do not fetch when checking existence of tree we construct o
        git -C repo cherry-pick side1
 '

+test_expect_success 'lazy-fetch when accessing object not in the_repository' '
+       rm -rf full partial.git &&
+       test_create_repo full &&
+       printf 12345 >full/file.txt &&
+       git -C full add file.txt &&
+       git -C full commit -m "first commit" &&
+
+       test_config -C full uploadpack.allowfilter 1 &&
+       test_config -C full uploadpack.allowanysha1inwant 1 &&
+       git clone --filter=blob:none --bare "file://$(pwd)/full" partial.git &&
+       FILE_HASH=$(git hash-object --stdin <full/file.txt) &&
+
+       # Sanity check that the file is missing
+       git -C partial.git rev-list --objects --missing=print HEAD >out &&
+       grep "[?]$FILE_HASH" out &&
+
+       OUT=$(test-tool partial-clone object-info partial.git "$FILE_HASH") &&
+       test "$OUT" -eq 5 &&
+
+       # Sanity check that the file is now present
+       git -C partial.git rev-list --objects --missing=print HEAD >out &&
+       ! grep "[?]$FILE_HASH" out
+'
+
Turns out that this test fails under GIT_TEST_DEFAULT_HASH=sha256; output:

error: wrong index v2 file size in /home/newren/floss/git/t/trash
directory.t0410-partial-clone/partial.git/objects/pack/pack-66a15be115d740341216938fb7abb31902e960bd6d464829d85164d1a4a25bec.idx
error: wrong index v2 file size in /home/newren/floss/git/t/trash
directory.t0410-partial-clone/partial.git/objects/pack/pack-66a15be115d740341216938fb7abb31902e960bd6d464829d85164d1a4a25bec.idx
fatal: couldn't find remote ref 74242c6e4a0d89f454d89d3496a1f7cb3f1f39f0
error: wrong index v2 file size in /home/newren/floss/git/t/trash
directory.t0410-partial-clone/partial.git/objects/pack/pack-66a15be115d740341216938fb7abb31902e960bd6d464829d85164d1a4a25bec.idx
error: wrong index v2 file size in /home/newren/floss/git/t/trash
directory.t0410-partial-clone/partial.git/objects/pack/pack-66a15be115d740341216938fb7abb31902e960bd6d464829d85164d1a4a25bec.idx
fatal: could not obtain object info
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help