Small refactor to make thing tidier Also repurposed an unused function and deleted another one.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
diff --git a/src/diff_generate.c b/src/diff_generate.c
index bc7c266..f05ae37 100644
--- a/src/diff_generate.c
+++ b/src/diff_generate.c
@@ -709,18 +709,12 @@ static int maybe_modified_submodule(
} else {
if (!info->submodule_cache_initialized) {
info->submodule_cache_initialized = true;
- /* Cache the submodule information to avoid having to parse it for every submodule. */
- if (git_strmap_new(&info->submodule_cache) == 0) {
- if (git_submodule__map(diff->base.repo, info->submodule_cache) < 0) {
- /* If the caching failed for whatever reason, bail out and clean up. */
- git_submodule *sm = NULL;
- git_strmap_foreach_value(info->submodule_cache, sm, {
- git_submodule_free(sm);
- });
- git_strmap_free(info->submodule_cache);
- info->submodule_cache = NULL;
- }
- }
+ /*
+ * Try to cache the submodule information to avoid having to parse it for
+ * every submodule. It is okay if it fails, the cache will still be NULL
+ * and the submodules will be attempted to be looked up individually.
+ */
+ git_submodule_cache_init(&info->submodule_cache, diff->base.repo);
}
submodule_cache = info->submodule_cache;
}
@@ -1284,13 +1278,8 @@ cleanup:
*out = &diff->base;
else
git_diff_free(&diff->base);
- if (info.submodule_cache) {
- git_submodule *sm = NULL;
- git_strmap_foreach_value(info.submodule_cache, sm, {
- git_submodule_free(sm);
- });
- git_strmap_free(info.submodule_cache);
- }
+ if (info.submodule_cache)
+ git_submodule_cache_free(info.submodule_cache);
return error;
}
diff --git a/src/repository.c b/src/repository.c
index 3b6bcbe..3a54f8c 100644
--- a/src/repository.c
+++ b/src/repository.c
@@ -3055,30 +3055,16 @@ int git_repository_set_ident(git_repository *repo, const char *name, const char
int git_repository_submodule_cache_all(git_repository *repo)
{
- int error;
-
GIT_ASSERT_ARG(repo);
-
- if ((error = git_strmap_new(&repo->submodule_cache)))
- return error;
-
- error = git_submodule__map(repo, repo->submodule_cache);
- return error;
+ return git_submodule_cache_init(&repo->submodule_cache, repo);
}
int git_repository_submodule_cache_clear(git_repository *repo)
{
- git_submodule *sm;
-
+ int error = 0;
GIT_ASSERT_ARG(repo);
- if (repo->submodule_cache == NULL) {
- return 0;
- }
- git_strmap_foreach_value(repo->submodule_cache, sm, {
- git_submodule_free(sm);
- });
- git_strmap_free(repo->submodule_cache);
- repo->submodule_cache = 0;
+ error = git_submodule_cache_free(repo->submodule_cache);
+ repo->submodule_cache = NULL;
return 0;
}
diff --git a/src/submodule.c b/src/submodule.c
index 3bbdeed..50bde2c 100644
--- a/src/submodule.c
+++ b/src/submodule.c
@@ -249,6 +249,34 @@ out:
return error;
}
+int git_submodule_cache_init(git_strmap **out, git_repository *repo)
+{
+ int error = 0;
+ git_strmap *cache = NULL;
+ GIT_ASSERT_ARG(out);
+ GIT_ASSERT_ARG(repo);
+ if ((error = git_strmap_new(&cache)) < 0)
+ return error;
+ if ((error = git_submodule__map(repo, cache)) < 0) {
+ git_submodule_cache_free(cache);
+ return error;
+ }
+ *out = cache;
+ return error;
+}
+
+int git_submodule_cache_free(git_strmap *cache)
+{
+ git_submodule *sm = NULL;
+ if (cache == NULL)
+ return 0;
+ git_strmap_foreach_value(cache, sm, {
+ git_submodule_free(sm);
+ });
+ git_strmap_free(cache);
+ return 0;
+}
+
int git_submodule_lookup(
git_submodule **out, /* NULL if user only wants to test existence */
git_repository *repo,
diff --git a/src/submodule.h b/src/submodule.h
index f32f818..b01ff68 100644
--- a/src/submodule.h
+++ b/src/submodule.h
@@ -101,12 +101,6 @@ struct git_submodule {
git_oid wd_oid;
};
-/* Force revalidation of submodule data cache (alloc as needed) */
-extern int git_submodule_cache_refresh(git_repository *repo);
-
-/* Release all submodules */
-extern void git_submodule_cache_free(git_repository *repo);
-
/* Additional flags on top of public GIT_SUBMODULE_STATUS values */
enum {
GIT_SUBMODULE_STATUS__WD_SCANNED = (1u << 20),
@@ -122,6 +116,12 @@ enum {
#define GIT_SUBMODULE_STATUS__CLEAR_INTERNAL(S) \
((S) & ~(0xFFFFFFFFu << 20))
+/* Initialize an external submodule cache for the provided repo. */
+extern int git_submodule_cache_init(git_strmap **out, git_repository *repo);
+
+/* Release the resources of the submodule cache. */
+extern int git_submodule_cache_free(git_strmap *cache);
+
/* Submodule lookup with an explicit cache */
extern int git_submodule__lookup_with_cache(
git_submodule **out, git_repository *repo, const char *path, git_strmap *cache);