]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/submodule--helper.c
submodule--helper: don't use global --super-prefix in "absorbgitdirs"
[thirdparty/git.git] / builtin / submodule--helper.c
index c75e9e86b06e986d6d125209ec911009786aea67..b8b2bc776d1cf2d365a6f5d374d8244cfa0ad689 100644 (file)
@@ -1,4 +1,4 @@
-#define USE_THE_INDEX_COMPATIBILITY_MACROS
+#define USE_THE_INDEX_VARIABLE
 #include "builtin.h"
 #include "repository.h"
 #include "cache.h"
@@ -113,10 +113,9 @@ static char *resolve_relative_url(const char *rel_url, const char *up_path, int
 }
 
 /* the result should be freed by the caller. */
-static char *get_submodule_displaypath(const char *path, const char *prefix)
+static char *get_submodule_displaypath(const char *path, const char *prefix,
+                                      const char *super_prefix)
 {
-       const char *super_prefix = get_super_prefix();
-
        if (prefix && super_prefix) {
                BUG("cannot have prefix '%s' and superprefix '%s'",
                    prefix, super_prefix);
@@ -196,11 +195,11 @@ static int module_list_compute(const char **argv,
        if (pathspec->nr)
                ps_matched = xcalloc(pathspec->nr, 1);
 
-       if (read_cache() < 0)
+       if (repo_read_index(the_repository) < 0)
                die(_("index file corrupt"));
 
-       for (i = 0; i < active_nr; i++) {
-               const struct cache_entry *ce = active_cache[i];
+       for (i = 0; i < the_index.cache_nr; i++) {
+               const struct cache_entry *ce = the_index.cache[i];
 
                if (!match_pathspec(&the_index, pathspec, ce->name, ce_namelen(ce),
                                    0, ps_matched, 1) ||
@@ -209,8 +208,8 @@ static int module_list_compute(const char **argv,
 
                ALLOC_GROW(list->entries, list->nr + 1, list->alloc);
                list->entries[list->nr++] = ce;
-               while (i + 1 < active_nr &&
-                      !strcmp(ce->name, active_cache[i + 1]->name))
+               while (i + 1 < the_index.cache_nr &&
+                      !strcmp(ce->name, the_index.cache[i + 1]->name))
                        /*
                         * Skip entries with the same name in different stages
                         * to make sure an entry is returned only once.
@@ -294,7 +293,8 @@ static void runcommand_in_submodule_cb(const struct cache_entry *list_item,
        struct child_process cp = CHILD_PROCESS_INIT;
        char *displaypath;
 
-       displaypath = get_submodule_displaypath(path, info->prefix);
+       displaypath = get_submodule_displaypath(path, info->prefix,
+                                               get_super_prefix());
 
        sub = submodule_from_path(the_repository, null_oid(), path);
 
@@ -447,7 +447,8 @@ static void init_submodule(const char *path, const char *prefix,
        const char *upd;
        char *url = NULL, *displaypath;
 
-       displaypath = get_submodule_displaypath(path, prefix);
+       displaypath = get_submodule_displaypath(path, prefix,
+                                               get_super_prefix());
 
        sub = submodule_from_path(the_repository, null_oid(), path);
 
@@ -624,7 +625,8 @@ static void status_submodule(const char *path, const struct object_id *ce_oid,
                die(_("no submodule mapping found in .gitmodules for path '%s'"),
                      path);
 
-       displaypath = get_submodule_displaypath(path, prefix);
+       displaypath = get_submodule_displaypath(path, prefix,
+                                               get_super_prefix());
 
        if ((CE_STAGEMASK & ce_flags) >> CE_STAGESHIFT) {
                print_status(flags, 'U', path, null_oid(), displaypath);
@@ -948,7 +950,8 @@ static void generate_submodule_summary(struct summary_cb *info,
                dst_abbrev = xstrndup(oid_to_hex(&p->oid_dst), 7);
        }
 
-       displaypath = get_submodule_displaypath(p->sm_path, info->prefix);
+       displaypath = get_submodule_displaypath(p->sm_path, info->prefix,
+                                               get_super_prefix());
 
        if (!missing_src && !missing_dst) {
                struct child_process cp_rev_list = CHILD_PROCESS_INIT;
@@ -1110,13 +1113,13 @@ static int compute_summary_module_list(struct object_id *head_oid,
        if (!info->cached) {
                if (diff_cmd == DIFF_INDEX)
                        setup_work_tree();
-               if (read_cache_preload(&rev.diffopt.pathspec) < 0) {
-                       perror("read_cache_preload");
+               if (repo_read_index_preload(the_repository, &rev.diffopt.pathspec, 0) < 0) {
+                       perror("repo_read_index_preload");
                        ret = -1;
                        goto cleanup;
                }
-       } else if (read_cache() < 0) {
-               perror("read_cache");
+       } else if (repo_read_index(the_repository) < 0) {
+               perror("repo_read_cache");
                ret = -1;
                goto cleanup;
        }
@@ -1239,7 +1242,8 @@ static void sync_submodule(const char *path, const char *prefix,
                super_config_url = xstrdup("");
        }
 
-       displaypath = get_submodule_displaypath(path, prefix);
+       displaypath = get_submodule_displaypath(path, prefix,
+                                               get_super_prefix());
 
        if (!(flags & OPT_QUIET))
                printf(_("Synchronizing submodule url for '%s'\n"),
@@ -1365,7 +1369,7 @@ static void deinit_submodule(const char *path, const char *prefix,
        if (!sub || !sub->name)
                goto cleanup;
 
-       displaypath = get_submodule_displaypath(path, prefix);
+       displaypath = get_submodule_displaypath(path, prefix, NULL);
 
        /* remove the submodule work tree (unless the user already did it) */
        if (is_directory(path)) {
@@ -1379,7 +1383,7 @@ static void deinit_submodule(const char *path, const char *prefix,
                                          ".git file by using absorbgitdirs."),
                                        displaypath);
 
-                       absorb_git_dir_into_superproject(path);
+                       absorb_git_dir_into_superproject(path, NULL);
 
                }
 
@@ -1958,7 +1962,8 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
        enum submodule_update_type update_type;
        char *key;
        const struct update_data *ud = suc->update_data;
-       char *displaypath = get_submodule_displaypath(ce->name, ud->prefix);
+       char *displaypath = get_submodule_displaypath(ce->name, ud->prefix,
+                                                     get_super_prefix());
        struct strbuf sb = STRBUF_INIT;
        int needs_cloning = 0;
        int need_free_url = 0;
@@ -2608,7 +2613,8 @@ static int update_submodules(struct update_data *update_data)
                        goto fail;
 
                update_data->displaypath = get_submodule_displaypath(
-                       update_data->sm_path, update_data->prefix);
+                       update_data->sm_path, update_data->prefix,
+                       get_super_prefix());
                code = update_submodule(update_data);
                FREE_AND_NULL(update_data->displaypath);
 fail:
@@ -2828,7 +2834,9 @@ static int absorb_git_dirs(int argc, const char **argv, const char *prefix)
        int i;
        struct pathspec pathspec = { 0 };
        struct module_list list = MODULE_LIST_INIT;
+       const char *super_prefix = NULL;
        struct option embed_gitdir_options[] = {
+               OPT__SUPER_PREFIX(&super_prefix),
                OPT_END()
        };
        const char *const git_submodule_helper_usage[] = {
@@ -2844,7 +2852,8 @@ static int absorb_git_dirs(int argc, const char **argv, const char *prefix)
                goto cleanup;
 
        for (i = 0; i < list.nr; i++)
-               absorb_git_dir_into_superproject(list.entries[i]->name);
+               absorb_git_dir_into_superproject(list.entries[i]->name,
+                                                super_prefix);
 
        ret = 0;
 cleanup:
@@ -3187,7 +3196,7 @@ static void die_on_index_match(const char *path, int force)
        const char *args[] = { path, NULL };
        parse_pathspec(&ps, 0, PATHSPEC_PREFER_CWD, NULL, args);
 
-       if (read_cache_preload(NULL) < 0)
+       if (repo_read_index_preload(the_repository, NULL, 0) < 0)
                die(_("index file corrupt"));
 
        if (ps.nr) {
@@ -3202,15 +3211,15 @@ static void die_on_index_match(const char *path, int force)
                 * need to check ps_matched[0] to know if a cache
                 * entry matched.
                 */
-               for (i = 0; i < active_nr; i++) {
-                       ce_path_match(&the_index, active_cache[i], &ps,
+               for (i = 0; i < the_index.cache_nr; i++) {
+                       ce_path_match(&the_index, the_index.cache[i], &ps,
                                      ps_matched);
 
                        if (ps_matched[0]) {
                                if (!force)
                                        die(_("'%s' already exists in the index"),
                                            path);
-                               if (!S_ISGITLINK(active_cache[i]->ce_mode))
+                               if (!S_ISGITLINK(the_index.cache[i]->ce_mode))
                                        die(_("'%s' already exists in the index "
                                              "and is not a submodule"), path);
                                break;
@@ -3382,8 +3391,7 @@ int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
 
        if (strcmp(subcmd, "clone") && strcmp(subcmd, "update") &&
            strcmp(subcmd, "foreach") && strcmp(subcmd, "status") &&
-           strcmp(subcmd, "sync") && strcmp(subcmd, "absorbgitdirs") &&
-           get_super_prefix())
+           strcmp(subcmd, "sync") && get_super_prefix())
                /*
                 * xstrfmt() rather than "%s %s" to keep the translated
                 * string identical to git.c's.