]> git.ipfire.org Git - thirdparty/git.git/commitdiff
repository: support unabsorbed in repo_submodule_init
authorJonathan Tan <jonathantanmy@google.com>
Thu, 9 Sep 2021 18:47:28 +0000 (11:47 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 9 Sep 2021 21:09:30 +0000 (14:09 -0700)
In preparation for a subsequent commit that migrates code using
add_submodule_odb() to repo_submodule_init(), teach
repo_submodule_init() to support submodules with unabsorbed gitdirs.
(See the documentation for "git submodule absorbgitdirs" for more
information about absorbed and unabsorbed gitdirs.)

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/grep.c
builtin/ls-files.c
builtin/submodule--helper.c
repository.c
repository.h
submodule.c
t/helper/test-submodule-nested-repo-config.c

index 51278b01fa273fbad1d01430dbb26c9c66fda41c..8af5249a7bb118333da4eede706d3fd2de8a287b 100644 (file)
@@ -433,17 +433,14 @@ static int grep_submodule(struct grep_opt *opt,
 {
        struct repository *subrepo;
        struct repository *superproject = opt->repo;
-       const struct submodule *sub;
        struct grep_opt subopt;
        int hit = 0;
 
-       sub = submodule_from_path(superproject, null_oid(), path);
-
        if (!is_submodule_active(superproject, path))
                return 0;
 
        subrepo = xmalloc(sizeof(*subrepo));
-       if (repo_submodule_init(subrepo, superproject, sub)) {
+       if (repo_submodule_init(subrepo, superproject, path, null_oid())) {
                free(subrepo);
                return 0;
        }
index 29a26ad8ae483b6055268ca2a238b8b7e9c09b74..ec19bf54b2377d2cde1cd6cc061fcb6329079354 100644 (file)
@@ -209,10 +209,8 @@ static void show_submodule(struct repository *superproject,
                           struct dir_struct *dir, const char *path)
 {
        struct repository subrepo;
-       const struct submodule *sub = submodule_from_path(superproject,
-                                                         null_oid(), path);
 
-       if (repo_submodule_init(&subrepo, superproject, sub))
+       if (repo_submodule_init(&subrepo, superproject, path, null_oid()))
                return;
 
        if (repo_read_index(&subrepo) < 0)
index ef2776a9e4523894c6ff044bffcd9a2c60d2b98f..6718f202dbfe6307d82e26a912fb234ef2727292 100644 (file)
@@ -2540,7 +2540,6 @@ static int push_check(int argc, const char **argv, const char *prefix)
 
 static int ensure_core_worktree(int argc, const char **argv, const char *prefix)
 {
-       const struct submodule *sub;
        const char *path;
        const char *cw;
        struct repository subrepo;
@@ -2550,11 +2549,7 @@ static int ensure_core_worktree(int argc, const char **argv, const char *prefix)
 
        path = argv[1];
 
-       sub = submodule_from_path(the_repository, null_oid(), path);
-       if (!sub)
-               BUG("We could get the submodule handle before?");
-
-       if (repo_submodule_init(&subrepo, the_repository, sub))
+       if (repo_submodule_init(&subrepo, the_repository, path, null_oid()))
                die(_("could not get a repository handle for submodule '%s'"), path);
 
        if (!repo_config_get_string_tmp(&subrepo, "core.worktree", &cw)) {
index b2bf44c6fafec83b6360354ae77081759096be6f..e4a1afb0acac4cee810ae2f6a5af4334f9cdc572 100644 (file)
@@ -190,19 +190,15 @@ error:
 
 int repo_submodule_init(struct repository *subrepo,
                        struct repository *superproject,
-                       const struct submodule *sub)
+                       const char *path,
+                       const struct object_id *treeish_name)
 {
        struct strbuf gitdir = STRBUF_INIT;
        struct strbuf worktree = STRBUF_INIT;
        int ret = 0;
 
-       if (!sub) {
-               ret = -1;
-               goto out;
-       }
-
-       strbuf_repo_worktree_path(&gitdir, superproject, "%s/.git", sub->path);
-       strbuf_repo_worktree_path(&worktree, superproject, "%s", sub->path);
+       strbuf_repo_worktree_path(&gitdir, superproject, "%s/.git", path);
+       strbuf_repo_worktree_path(&worktree, superproject, "%s", path);
 
        if (repo_init(subrepo, gitdir.buf, worktree.buf)) {
                /*
@@ -212,6 +208,13 @@ int repo_submodule_init(struct repository *subrepo,
                 * in the superproject's 'modules' directory.  In this case the
                 * submodule would not have a worktree.
                 */
+               const struct submodule *sub =
+                       submodule_from_path(superproject, treeish_name, path);
+               if (!sub) {
+                       ret = -1;
+                       goto out;
+               }
+
                strbuf_reset(&gitdir);
                strbuf_repo_git_path(&gitdir, superproject,
                                     "modules/%s", sub->name);
@@ -225,7 +228,7 @@ int repo_submodule_init(struct repository *subrepo,
        subrepo->submodule_prefix = xstrfmt("%s%s/",
                                            superproject->submodule_prefix ?
                                            superproject->submodule_prefix :
-                                           "", sub->path);
+                                           "", path);
 
 out:
        strbuf_release(&gitdir);
index 3740c93bc0fe273c975e76e5643507bff35ceb06..c24e177c7e65f8c6f104faa1aace3184bf08dd05 100644 (file)
@@ -172,15 +172,18 @@ void initialize_the_repository(void);
 int repo_init(struct repository *r, const char *gitdir, const char *worktree);
 
 /*
- * Initialize the repository 'subrepo' as the submodule given by the
- * struct submodule 'sub' in parent repository 'superproject'.
- * Return 0 upon success and a non-zero value upon failure, which may happen
- * if the submodule is not found, or 'sub' is NULL.
+ * Initialize the repository 'subrepo' as the submodule at the given path. If
+ * the submodule's gitdir cannot be found at <path>/.git, this function calls
+ * submodule_from_path() to try to find it. treeish_name is only used if
+ * submodule_from_path() needs to be called; see its documentation for more
+ * information.
+ * Return 0 upon success and a non-zero value upon failure.
  */
-struct submodule;
+struct object_id;
 int repo_submodule_init(struct repository *subrepo,
                        struct repository *superproject,
-                       const struct submodule *sub);
+                       const char *path,
+                       const struct object_id *treeish_name);
 void repo_clear(struct repository *repo);
 
 /*
index 3af3da5b5ed2c0fd4f55566ddb379b84d54337cf..ecda0229af70e5d3a494d276f9e333392d918e36 100644 (file)
@@ -520,9 +520,6 @@ static void prepare_submodule_repo_env_in_gitdir(struct strvec *out)
 /*
  * Initialize a repository struct for a submodule based on the provided 'path'.
  *
- * Unlike repo_submodule_init, this tolerates submodules not present
- * in .gitmodules. This function exists only to preserve historical behavior,
- *
  * Returns the repository struct on success,
  * NULL when the submodule is not present.
  */
@@ -1404,11 +1401,11 @@ static void fetch_task_release(struct fetch_task *p)
 }
 
 static struct repository *get_submodule_repo_for(struct repository *r,
-                                                const struct submodule *sub)
+                                                const char *path)
 {
        struct repository *ret = xmalloc(sizeof(*ret));
 
-       if (repo_submodule_init(ret, r, sub)) {
+       if (repo_submodule_init(ret, r, path, null_oid())) {
                free(ret);
                return NULL;
        }
@@ -1452,7 +1449,7 @@ static int get_next_submodule(struct child_process *cp,
                        continue;
                }
 
-               task->repo = get_submodule_repo_for(spf->r, task->sub);
+               task->repo = get_submodule_repo_for(spf->r, task->sub->path);
                if (task->repo) {
                        struct strbuf submodule_prefix = STRBUF_INIT;
                        child_process_init(cp);
index e3f11ff5a78fc15b36b22efe05c90ebdac8920f0..dc1c14bde3741715f9dee0768f061e31ba2d7330 100644 (file)
@@ -11,15 +11,13 @@ static void die_usage(const char **argv, const char *msg)
 int cmd__submodule_nested_repo_config(int argc, const char **argv)
 {
        struct repository subrepo;
-       const struct submodule *sub;
 
        if (argc < 3)
                die_usage(argv, "Wrong number of arguments.");
 
        setup_git_directory();
 
-       sub = submodule_from_path(the_repository, null_oid(), argv[1]);
-       if (repo_submodule_init(&subrepo, the_repository, sub)) {
+       if (repo_submodule_init(&subrepo, the_repository, argv[1], null_oid())) {
                die_usage(argv, "Submodule not found.");
        }