submodule: extract functions for config set and lookup
This is one step towards using the new configuration API. We just extract these functions to make replacing the actual code easier. Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net> Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Heiko Voigt committed
Aug 17, 2015 at 17:21 UTC
0d9f282c943a0799999176a2d8291ecbad060389
1 file changed
+97
-45
submodule.c
+97
-45
@@ -41,6 +41,76 @@ static int gitmodules_is_unmerged;
41
*/
42
static int gitmodules_is_modified;
43
44
+static const char *get_name_for_path(const char *path)
45
+{
46
+ struct string_list_item *path_option;
47
+ if (path == NULL) {
48
+ if (config_name_for_path.nr > 0)
49
+ return config_name_for_path.items[0].util;
50
+ else
51
+ return NULL;
52
+ }
53
+ path_option = unsorted_string_list_lookup(&config_name_for_path, path);
54
+ if (!path_option)
55
+ return NULL;
56
+ return path_option->util;
57
+}
58
+
59
+static void set_name_for_path(const char *path, const char *name, int namelen)
60
+{
61
+ struct string_list_item *config;
62
+ config = unsorted_string_list_lookup(&config_name_for_path, path);
63
+ if (config)
64
+ free(config->util);
65
+ else
66
+ config = string_list_append(&config_name_for_path, xstrdup(path));
67
+ config->util = xmemdupz(name, namelen);
68
+}
69
+
70
+static const char *get_ignore_for_name(const char *name)
71
+{
72
+ struct string_list_item *ignore_option;
73
+ ignore_option = unsorted_string_list_lookup(&config_ignore_for_name, name);
74
+ if (!ignore_option)
75
+ return NULL;
76
+
77
+ return ignore_option->util;
78
+}
79
+
80
+static void set_ignore_for_name(const char *name, int namelen, const char *ignore)
81
+{
82
+ struct string_list_item *config;
83
+ char *name_cstr = xmemdupz(name, namelen);
84
+ config = unsorted_string_list_lookup(&config_ignore_for_name, name_cstr);
85
+ if (config) {
86
+ free(config->util);
87
+ free(name_cstr);
88
+ } else
89
+ config = string_list_append(&config_ignore_for_name, name_cstr);
90
+ config->util = xstrdup(ignore);
91
+}
92
+
93
+static int get_fetch_recurse_for_name(const char *name)
94
+{
95
+ struct string_list_item *fetch_recurse;
96
+ fetch_recurse = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, name);
97
+ if (!fetch_recurse)
98
+ return RECURSE_SUBMODULES_NONE;
99
+
100
+ return (intptr_t) fetch_recurse->util;
101
+}
102
+
103
+static void set_fetch_recurse_for_name(const char *name, int namelen, int fetch_recurse)
104
+{
105
+ struct string_list_item *config;
106
+ char *name_cstr = xmemdupz(name, namelen);
107
+ config = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, name_cstr);
108
+ if (!config)
109
+ config = string_list_append(&config_fetch_recurse_submodules_for_name, name_cstr);
110
+ else
111
+ free(name_cstr);
112
+ config->util = (void *)(intptr_t) fetch_recurse;
113
+}
114
115
int is_staging_gitmodules_ok(void)
116
{
@@ -55,7 +125,7 @@ int is_staging_gitmodules_ok(void)
125
int update_path_in_gitmodules(const char *oldpath, const char *newpath)
126
{
127
struct strbuf entry = STRBUF_INIT;
58
- struct string_list_item *path_option;
128
+ const char *path;
129
130
if (!file_exists(".gitmodules")) /* Do nothing without .gitmodules */
131
return -1;
@@ -63,13 +133,13 @@ int update_path_in_gitmodules(const char *oldpath, const char *newpath)
133
if (gitmodules_is_unmerged)
134
die(_("Cannot change unmerged .gitmodules, resolve merge conflicts first"));
135
66
- path_option = unsorted_string_list_lookup(&config_name_for_path, oldpath);
67
- if (!path_option) {
136
+ path = get_name_for_path(oldpath);
137
+ if (!path) {
138
warning(_("Could not find section in .gitmodules where path=%s"), oldpath);
139
return -1;
140
}
141
strbuf_addstr(&entry, "submodule.");
72
- strbuf_addstr(&entry, path_option->util);
142
+ strbuf_addstr(&entry, path);
143
strbuf_addstr(&entry, ".path");
144
if (git_config_set_in_file(".gitmodules", entry.buf, newpath) < 0) {
145
/* Maybe the user already did that, don't error out here */
@@ -89,7 +159,7 @@ int update_path_in_gitmodules(const char *oldpath, const char *newpath)
159
int remove_path_from_gitmodules(const char *path)
160
{
161
struct strbuf sect = STRBUF_INIT;
92
- struct string_list_item *path_option;
162
+ const char *path_option;
163
164
if (!file_exists(".gitmodules")) /* Do nothing without .gitmodules */
165
return -1;
@@ -97,13 +167,13 @@ int remove_path_from_gitmodules(const char *path)
167
if (gitmodules_is_unmerged)
168
die(_("Cannot change unmerged .gitmodules, resolve merge conflicts first"));
169
100
- path_option = unsorted_string_list_lookup(&config_name_for_path, path);
170
+ path_option = get_name_for_path(path);
171
if (!path_option) {
172
warning(_("Could not find section in .gitmodules where path=%s"), path);
173
return -1;
174
}
175
strbuf_addstr(§, "submodule.");
106
- strbuf_addstr(§, path_option->util);
176
+ strbuf_addstr(§, path_option);
177
if (git_config_rename_section_in_file(".gitmodules", sect.buf, NULL) < 0) {
178
/* Maybe the user already did that, don't error out here */
179
warning(_("Could not remove .gitmodules entry for %s"), path);
@@ -165,12 +235,11 @@ done:
235
void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt,
236
const char *path)
237
{
168
- struct string_list_item *path_option, *ignore_option;
169
- path_option = unsorted_string_list_lookup(&config_name_for_path, path);
170
- if (path_option) {
171
- ignore_option = unsorted_string_list_lookup(&config_ignore_for_name, path_option->util);
172
- if (ignore_option)
173
- handle_ignore_submodules_arg(diffopt, ignore_option->util);
238
+ const char *name = get_name_for_path(path);
239
+ if (name) {
240
+ const char *ignore = get_ignore_for_name(name);
241
+ if (ignore)
242
+ handle_ignore_submodules_arg(diffopt, ignore);
243
else if (gitmodules_is_unmerged)
244
DIFF_OPT_SET(diffopt, IGNORE_SUBMODULES);
245
}
@@ -221,7 +290,6 @@ void gitmodules_config(void)
290
291
int parse_submodule_config_option(const char *var, const char *value)
292
{
224
- struct string_list_item *config;
293
const char *name, *key;
294
int namelen;
295
@@ -232,22 +300,14 @@ int parse_submodule_config_option(const char *var, const char *value)
300
if (!value)
301
return config_error_nonbool(var);
302
235
- config = unsorted_string_list_lookup(&config_name_for_path, value);
236
- if (config)
237
- free(config->util);
238
- else
239
- config = string_list_append(&config_name_for_path, xstrdup(value));
240
- config->util = xmemdupz(name, namelen);
303
+ set_name_for_path(value, name, namelen);
304
+
305
} else if (!strcmp(key, "fetchrecursesubmodules")) {
242
- char *name_cstr = xmemdupz(name, namelen);
243
- config = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, name_cstr);
244
- if (!config)
245
- config = string_list_append(&config_fetch_recurse_submodules_for_name, name_cstr);
246
- else
247
- free(name_cstr);
248
- config->util = (void *)(intptr_t)parse_fetch_recurse_submodules_arg(var, value);
306
+ int fetch_recurse = parse_fetch_recurse_submodules_arg(var, value);
307
+
308
+ set_fetch_recurse_for_name(name, namelen, fetch_recurse);
309
+
310
} else if (!strcmp(key, "ignore")) {
250
- char *name_cstr;
311
312
if (!value)
313
return config_error_nonbool(var);
@@ -258,14 +318,7 @@ int parse_submodule_config_option(const char *var, const char *value)
318
return 0;
319
}
320
261
- name_cstr = xmemdupz(name, namelen);
262
- config = unsorted_string_list_lookup(&config_ignore_for_name, name_cstr);
263
- if (config) {
264
- free(config->util);
265
- free(name_cstr);
266
- } else
267
- config = string_list_append(&config_ignore_for_name, name_cstr);
268
- config->util = xstrdup(value);
321
+ set_ignore_for_name(name, namelen, value);
322
return 0;
323
}
324
return 0;
@@ -646,7 +699,7 @@ static void calculate_changed_submodule_paths(void)
699
struct argv_array argv = ARGV_ARRAY_INIT;
700
701
/* No need to check if there are no submodules configured */
649
- if (!config_name_for_path.nr)
702
+ if (!get_name_for_path(NULL))
703
return;
704
705
init_revisions(&rev, NULL);
@@ -693,7 +746,7 @@ int fetch_populated_submodules(const struct argv_array *options,
746
int i, result = 0;
747
struct child_process cp = CHILD_PROCESS_INIT;
748
struct argv_array argv = ARGV_ARRAY_INIT;
696
- struct string_list_item *name_for_path;
749
+ const char *name_for_path;
750
const char *work_tree = get_git_work_tree();
751
if (!work_tree)
752
goto out;
@@ -724,18 +777,17 @@ int fetch_populated_submodules(const struct argv_array *options,
777
continue;
778
779
name = ce->name;
727
- name_for_path = unsorted_string_list_lookup(&config_name_for_path, ce->name);
780
+ name_for_path = get_name_for_path(ce->name);
781
if (name_for_path)
729
- name = name_for_path->util;
782
+ name = name_for_path;
783
784
default_argv = "yes";
785
if (command_line_option == RECURSE_SUBMODULES_DEFAULT) {
733
- struct string_list_item *fetch_recurse_submodules_option;
734
- fetch_recurse_submodules_option = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, name);
735
- if (fetch_recurse_submodules_option) {
736
- if ((intptr_t)fetch_recurse_submodules_option->util == RECURSE_SUBMODULES_OFF)
786
+ int fetch_recurse_option = get_fetch_recurse_for_name(name);
787
+ if (fetch_recurse_option != RECURSE_SUBMODULES_NONE) {
788
+ if (fetch_recurse_option == RECURSE_SUBMODULES_OFF)
789
continue;
738
- if ((intptr_t)fetch_recurse_submodules_option->util == RECURSE_SUBMODULES_ON_DEMAND) {
790
+ if (fetch_recurse_option == RECURSE_SUBMODULES_ON_DEMAND) {
791
if (!unsorted_string_list_lookup(&changed_submodule_paths, ce->name))
792
continue;
793
default_argv = "on-demand";