@@ -41,6 +41,76 @@ static int gitmodules_is_unmerged;
41
41
*/
42
42
static int gitmodules_is_modified ;
43
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
+ }
44
114
45
115
int is_staging_gitmodules_ok (void )
46
116
{
@@ -55,21 +125,21 @@ int is_staging_gitmodules_ok(void)
55
125
int update_path_in_gitmodules (const char * oldpath , const char * newpath )
56
126
{
57
127
struct strbuf entry = STRBUF_INIT ;
58
- struct string_list_item * path_option ;
128
+ const char * path ;
59
129
60
130
if (!file_exists (".gitmodules" )) /* Do nothing without .gitmodules */
61
131
return -1 ;
62
132
63
133
if (gitmodules_is_unmerged )
64
134
die (_ ("Cannot change unmerged .gitmodules, resolve merge conflicts first" ));
65
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 ) {
68
138
warning (_ ("Could not find section in .gitmodules where path=%s" ), oldpath );
69
139
return -1 ;
70
140
}
71
141
strbuf_addstr (& entry , "submodule." );
72
- strbuf_addstr (& entry , path_option -> util );
142
+ strbuf_addstr (& entry , path );
73
143
strbuf_addstr (& entry , ".path" );
74
144
if (git_config_set_in_file (".gitmodules" , entry .buf , newpath ) < 0 ) {
75
145
/* Maybe the user already did that, don't error out here */
@@ -89,21 +159,21 @@ int update_path_in_gitmodules(const char *oldpath, const char *newpath)
89
159
int remove_path_from_gitmodules (const char * path )
90
160
{
91
161
struct strbuf sect = STRBUF_INIT ;
92
- struct string_list_item * path_option ;
162
+ const char * path_option ;
93
163
94
164
if (!file_exists (".gitmodules" )) /* Do nothing without .gitmodules */
95
165
return -1 ;
96
166
97
167
if (gitmodules_is_unmerged )
98
168
die (_ ("Cannot change unmerged .gitmodules, resolve merge conflicts first" ));
99
169
100
- path_option = unsorted_string_list_lookup ( & config_name_for_path , path );
170
+ path_option = get_name_for_path ( path );
101
171
if (!path_option ) {
102
172
warning (_ ("Could not find section in .gitmodules where path=%s" ), path );
103
173
return -1 ;
104
174
}
105
175
strbuf_addstr (& sect , "submodule." );
106
- strbuf_addstr (& sect , path_option -> util );
176
+ strbuf_addstr (& sect , path_option );
107
177
if (git_config_rename_section_in_file (".gitmodules" , sect .buf , NULL ) < 0 ) {
108
178
/* Maybe the user already did that, don't error out here */
109
179
warning (_ ("Could not remove .gitmodules entry for %s" ), path );
@@ -165,12 +235,11 @@ static int add_submodule_odb(const char *path)
165
235
void set_diffopt_flags_from_submodule_config (struct diff_options * diffopt ,
166
236
const char * path )
167
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 );
174
243
else if (gitmodules_is_unmerged )
175
244
DIFF_OPT_SET (diffopt , IGNORE_SUBMODULES );
176
245
}
@@ -221,7 +290,6 @@ void gitmodules_config(void)
221
290
222
291
int parse_submodule_config_option (const char * var , const char * value )
223
292
{
224
- struct string_list_item * config ;
225
293
const char * name , * key ;
226
294
int namelen ;
227
295
@@ -232,22 +300,14 @@ int parse_submodule_config_option(const char *var, const char *value)
232
300
if (!value )
233
301
return config_error_nonbool (var );
234
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
+
241
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
+
249
310
} else if (!strcmp (key , "ignore" )) {
250
- char * name_cstr ;
251
311
252
312
if (!value )
253
313
return config_error_nonbool (var );
@@ -258,14 +318,7 @@ int parse_submodule_config_option(const char *var, const char *value)
258
318
return 0 ;
259
319
}
260
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 );
269
322
return 0 ;
270
323
}
271
324
return 0 ;
@@ -646,7 +699,7 @@ static void calculate_changed_submodule_paths(void)
646
699
struct argv_array argv = ARGV_ARRAY_INIT ;
647
700
648
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 ) )
650
703
return ;
651
704
652
705
init_revisions (& rev , NULL );
@@ -693,7 +746,7 @@ int fetch_populated_submodules(const struct argv_array *options,
693
746
int i , result = 0 ;
694
747
struct child_process cp = CHILD_PROCESS_INIT ;
695
748
struct argv_array argv = ARGV_ARRAY_INIT ;
696
- struct string_list_item * name_for_path ;
749
+ const char * name_for_path ;
697
750
const char * work_tree = get_git_work_tree ();
698
751
if (!work_tree )
699
752
goto out ;
@@ -724,18 +777,17 @@ int fetch_populated_submodules(const struct argv_array *options,
724
777
continue ;
725
778
726
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 );
728
781
if (name_for_path )
729
- name = name_for_path -> util ;
782
+ name = name_for_path ;
730
783
731
784
default_argv = "yes" ;
732
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 )
737
789
continue ;
738
- if (( intptr_t ) fetch_recurse_submodules_option -> util == RECURSE_SUBMODULES_ON_DEMAND ) {
790
+ if (fetch_recurse_option == RECURSE_SUBMODULES_ON_DEMAND ) {
739
791
if (!unsorted_string_list_lookup (& changed_submodule_paths , ce -> name ))
740
792
continue ;
741
793
default_argv = "on-demand" ;
0 commit comments