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(&sect, "submodule.");
106 - strbuf_addstr(&sect, path_option->util);
176 + strbuf_addstr(&sect, 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";