From: Stefan Beller <sbeller@google.com>
To: gitster@pobox.com
Cc: git@vger.kernel.org, Jens.Lehmann@web.de, mst@redhat.com,
Stefan Beller <sbeller@google.com>
Subject: [PATCHv3 8/9] submodule: try alternates when superproject has an alternate
Date: Mon, 8 Aug 2016 21:08:10 -0700 [thread overview]
Message-ID: <20160809040811.21408-11-sbeller@google.com> (raw)
In-Reply-To: <20160809040811.21408-1-sbeller@google.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
---
Documentation/git-clone.txt | 4 ++++
builtin/submodule--helper.c | 47 ++++++++++++++++++++++++++++++++++++++++++
t/t7408-submodule-reference.sh | 29 +++++++++++++++++++++++++-
3 files changed, 79 insertions(+), 1 deletion(-)
diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt
index e316c4b..cadf138 100644
--- a/Documentation/git-clone.txt
+++ b/Documentation/git-clone.txt
@@ -103,6 +103,10 @@ objects from the source repository into a pack in the cloned repository.
+
*NOTE*: see the NOTE for the `--shared` option, and also the
`--dissociate` option.
++
+When using --reference any submodule that is cloned
+sets up a corresponding alternate at $GIT_DIR/modules if such a
+an alternate exists.
--dissociate::
Borrow the objects from reference repositories specified
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index f360473..fc14843 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -635,6 +635,45 @@ static void next_submodule_warn_missing(struct submodule_update_clone *suc,
}
}
+struct submodule_alternate_setup {
+ struct submodule_update_clone *suc;
+ const char *submodule_name;
+ struct child_process *child;
+ struct strbuf *out;
+};
+
+int add_possible_reference(struct alternate_object_database *alt, void *sas_cb)
+{
+ struct submodule_alternate_setup *sas = sas_cb;
+
+ /* directory name, minus trailing slash */
+ size_t namelen = alt->name - alt->base - 1;
+ struct strbuf name = STRBUF_INIT;
+ strbuf_add(&name, alt->base, namelen);
+
+ /*
+ * If the alternate object store is another repository, try the
+ * standard layout with .git/modules/<name>/objects
+ */
+ if (ends_with(name.buf, ".git/objects")) {
+ struct strbuf sb = STRBUF_INIT;
+ strbuf_add(&sb, name.buf, name.len - strlen("objects"));
+ /*
+ * We need to end the new path with '/' to mark it as a dir,
+ * otherwise a submodule name containing '/' will be broken
+ * as the last part of a missing submodule reference would
+ * be taken as a file name.
+ */
+ strbuf_addf(&sb, "modules/%s/", sas->submodule_name);
+ argv_array_pushf(&sas->child->args,
+ "--reference-if-able=%s", sb.buf);
+ strbuf_release(&sb);
+ }
+
+ strbuf_release(&name);
+ return 0;
+}
+
/**
* Determine whether 'ce' needs to be cloned. If so, prepare the 'child' to
* run the clone. Returns 1 if 'ce' needs to be cloned, 0 otherwise.
@@ -650,6 +689,7 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
const char *displaypath = NULL;
char *url = NULL;
int needs_cloning = 0;
+ struct submodule_alternate_setup sas;
if (ce_stage(ce)) {
if (suc->recursive_prefix)
@@ -728,6 +768,13 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
for_each_string_list_item(item, &suc->references)
argv_array_pushl(&child->args, "--reference", item->string, NULL);
}
+
+ sas.submodule_name = sub->name;
+ sas.suc = suc;
+ sas.child = child;
+ sas.out = out;
+ foreach_alt_odb(add_possible_reference, &sas);
+
if (suc->depth)
argv_array_push(&child->args, suc->depth);
diff --git a/t/t7408-submodule-reference.sh b/t/t7408-submodule-reference.sh
index 4a1b8f0..a9b89a3 100755
--- a/t/t7408-submodule-reference.sh
+++ b/t/t7408-submodule-reference.sh
@@ -7,7 +7,6 @@ test_description='test clone --reference'
. ./test-lib.sh
base_dir=$(pwd)
-
test_alternate_is_used () {
alternates_file="$1" &&
working_dir="$2" &&
@@ -73,4 +72,32 @@ test_expect_success 'updating superproject keeps alternates' '
test_alternate_is_used super-clone/.git/modules/sub/objects/info/alternates super-clone/sub
'
+test_expect_success 'submodules use alternates when cloning a superproject' '
+ test_when_finished "rm -rf super-clone" &&
+ git clone --reference super --recursive super super-clone &&
+ (
+ cd super-clone &&
+ # test superproject has alternates setup correctly
+ test_alternate_is_used .git/objects/info/alternates . &&
+ # test submodule has correct setup
+ test_alternate_is_used .git/modules/sub/objects/info/alternates sub
+ )
+'
+
+test_expect_success 'cloning superproject, missing submodule alternates' '
+ test_when_finished "rm -rf super-clone" &&
+ git clone super super2 &&
+ git clone --recursive --reference super2 super2 super-clone &&
+ (
+ cd super-clone &&
+ # test superproject has alternates setup correctly
+ test_alternate_is_used .git/objects/info/alternates . &&
+ # update of the submodule succeeds
+ git submodule update --init &&
+ # and we have no alternates:
+ test_must_fail test_alternate_is_used .git/modules/sub/objects/info/alternates sub &&
+ test_path_is_file sub/file1
+ )
+'
+
test_done
--
2.9.2.583.gd6329be.dirty
next prev parent reply other threads:[~2016-08-09 4:08 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-09 4:08 [PATCHv2 0/6] git clone: Marry --recursive and --reference Stefan Beller
2016-08-09 4:08 ` [PATCHv3 1/9] t7408: modernize style Stefan Beller
2016-08-09 6:59 ` Eric Sunshine
2016-08-09 15:50 ` Junio C Hamano
2016-08-09 15:51 ` Junio C Hamano
2016-08-09 17:30 ` Stefan Beller
2016-08-09 17:39 ` Junio C Hamano
2016-08-09 23:06 ` Eric Sunshine
2016-08-09 4:08 ` [PATCHv3 2/9] t7408: merge short tests, factor out testing method Stefan Beller
2016-08-09 16:41 ` Junio C Hamano
2016-08-09 17:26 ` Stefan Beller
2016-08-09 4:08 ` [PATCHv3 3/9] submodule--helper module-clone: allow multiple references Stefan Beller
2016-08-09 4:08 ` [PATCHv3 4/9] submodule--helper update-clone: " Stefan Beller
2016-08-09 4:08 ` [PATCHv3 5/9] clone: clarify option_reference as required Stefan Beller
2016-08-09 4:08 ` [PATCHv2 5/6] submodule update: add super-reference flag Stefan Beller
2016-08-09 4:08 ` [PATCHv3 6/9] clone: implement optional references Stefan Beller
2016-08-09 16:37 ` Junio C Hamano
2016-08-09 17:54 ` Junio C Hamano
2016-08-09 18:20 ` Stefan Beller
2016-08-09 18:35 ` Junio C Hamano
2016-08-09 4:08 ` [PATCHv2 6/6] clone: reference flag is used for submodules as well Stefan Beller
2016-08-09 4:08 ` [PATCHv3 7/9] submodule helper: pass through --reference-if-able Stefan Beller
2016-08-09 4:08 ` Stefan Beller [this message]
2016-08-09 4:08 ` [PATCHv3 9/9] submodule--helper: use parallel processor correctly Stefan Beller
2016-08-09 16:40 ` Junio C Hamano
2016-08-09 5:23 ` [PATCHv2 0/6] git clone: Marry --recursive and --reference Jacob Keller
2016-08-09 15:49 ` Junio C Hamano
2016-08-09 17:26 ` Stefan Beller
2016-08-09 17:47 ` Junio C Hamano
2016-08-09 17:58 ` Junio C Hamano
2016-08-09 18:09 ` Stefan Beller
2016-08-09 18:44 ` Junio C Hamano
2016-08-09 20:31 ` Stefan Beller
2016-08-09 21:45 ` Junio C Hamano
2016-08-09 22:05 ` Stefan Beller
2016-08-10 15:59 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160809040811.21408-11-sbeller@google.com \
--to=sbeller@google.com \
--cc=Jens.Lehmann@web.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=mst@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).