Skip to content

Commit 4e63642

Browse files
committed
submodule: make _set_update_fetch_recurse_submodules() affect the config
Similarly to the other ones. In this test we copy over testing `RECURSE_YES` which shows an error in our handling of the `YES` variant which we may have to port to the rest.
1 parent e8a39f8 commit 4e63642

File tree

3 files changed

+49
-53
lines changed

3 files changed

+49
-53
lines changed

include/git2/submodule.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -519,18 +519,18 @@ GIT_EXTERN(git_submodule_recurse_t) git_submodule_fetch_recurse_submodules(
519519
git_submodule *submodule);
520520

521521
/**
522-
* Set the fetchRecurseSubmodules rule for a submodule.
522+
* Set the fetchRecurseSubmodules rule for a submodule in the configuration
523523
*
524-
* This sets the submodule.<name>.fetchRecurseSubmodules value for
525-
* the submodule. You should call `git_submodule_save()` if you want
526-
* to persist the new value.
524+
* This setting won't affect any existing instances.
527525
*
528-
* @param submodule The submodule to modify
526+
* @param repo the repository to affect
527+
* @param name the submodule to configure
529528
* @param fetch_recurse_submodules Boolean value
530529
* @return old value for fetchRecurseSubmodules
531530
*/
532-
GIT_EXTERN(git_submodule_recurse_t) git_submodule_set_fetch_recurse_submodules(
533-
git_submodule *submodule,
531+
GIT_EXTERN(int) git_submodule_set_fetch_recurse_submodules(
532+
git_repository *repo,
533+
const char *name,
534534
git_submodule_recurse_t fetch_recurse_submodules);
535535

536536
/**

src/submodule.c

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,6 @@ int git_submodule_save(git_submodule *submodule)
769769
int error = 0;
770770
git_config_backend *mods;
771771
git_buf key = GIT_BUF_INIT;
772-
const char *val;
773772

774773
assert(submodule);
775774

@@ -806,12 +805,6 @@ int git_submodule_save(git_submodule *submodule)
806805
if (error < 0)
807806
goto cleanup;
808807

809-
if (!(error = submodule_config_key_trunc_puts(&key, "fetchRecurseSubmodules")) &&
810-
(val = git_submodule_recurse_to_str(submodule->fetch_recurse)) != NULL)
811-
error = git_config_file_set_string(mods, key.ptr, val);
812-
if (error < 0)
813-
goto cleanup;
814-
815808
/* update internal defaults */
816809

817810
submodule->ignore_default = submodule->ignore;
@@ -965,7 +958,11 @@ static int write_var(git_repository *repo, const char *name, const char *var, co
965958
if ((error = git_buf_printf(&key, "submodule.%s.%s", name, var)) < 0)
966959
goto cleanup;
967960

968-
error = git_config_file_set_string(mods, key.ptr, val);
961+
if (val)
962+
error = git_config_file_set_string(mods, key.ptr, val);
963+
else
964+
error = git_config_file_delete(mods, key.ptr);
965+
969966
git_buf_free(&key);
970967

971968
cleanup:
@@ -1019,20 +1016,31 @@ git_submodule_recurse_t git_submodule_fetch_recurse_submodules(
10191016
return submodule->fetch_recurse;
10201017
}
10211018

1022-
git_submodule_recurse_t git_submodule_set_fetch_recurse_submodules(
1023-
git_submodule *submodule,
1024-
git_submodule_recurse_t fetch_recurse_submodules)
1019+
int git_submodule_set_fetch_recurse_submodules(git_repository *repo, const char *name, git_submodule_recurse_t recurse)
10251020
{
1026-
git_submodule_recurse_t old;
1021+
const char *val;
1022+
int error;
10271023

1028-
assert(submodule);
1024+
assert(repo && name);
1025+
1026+
val = git_submodule_recurse_to_str(recurse);
1027+
if (!val) {
1028+
switch (recurse) {
1029+
case GIT_SUBMODULE_RECURSE_YES:
1030+
val = "true";
1031+
break;
1032+
case GIT_SUBMODULE_RECURSE_NO:
1033+
val = NULL;
1034+
break;
1035+
default:
1036+
giterr_set(GITERR_SUBMODULE, "invalid recurse value");
1037+
return -1;
1038+
}
1039+
}
10291040

1030-
if (fetch_recurse_submodules == GIT_SUBMODULE_RECURSE_RESET)
1031-
fetch_recurse_submodules = submodule->fetch_recurse_default;
1041+
error = write_var(repo, name, "fetchRecurseSubmodules", val);
10321042

1033-
old = submodule->fetch_recurse;
1034-
submodule->fetch_recurse = fetch_recurse_submodules;
1035-
return old;
1043+
return error;
10361044
}
10371045

10381046
static int submodule_repo_create(

tests/submodule/modify.c

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,27 @@ void test_submodule_modify__set_update(void)
150150
git_submodule_free(sm);
151151
}
152152

153+
void test_submodule_modify__set_fetch_recurse_submodules(void)
154+
{
155+
git_submodule *sm;
156+
157+
cl_git_pass(git_submodule_set_fetch_recurse_submodules(g_repo, "sm_changed_head", GIT_SUBMODULE_RECURSE_YES));
158+
159+
cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head"));
160+
cl_assert_equal_i(GIT_SUBMODULE_RECURSE_YES, git_submodule_fetch_recurse_submodules(sm));
161+
git_submodule_free(sm);
162+
163+
git_submodule_set_fetch_recurse_submodules(g_repo, "sm_changed_head", GIT_SUBMODULE_RECURSE_ONDEMAND);
164+
cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head"));
165+
cl_assert_equal_i(GIT_SUBMODULE_RECURSE_ONDEMAND, git_submodule_fetch_recurse_submodules(sm));
166+
git_submodule_free(sm);
167+
}
168+
153169
void test_submodule_modify__edit_and_save(void)
154170
{
155171
git_submodule *sm1, *sm2;
156172
char *old_url, *old_branch;
157173
git_repository *r2;
158-
git_submodule_recurse_t old_fetchrecurse;
159174

160175
cl_git_pass(git_submodule_lookup(&sm1, g_repo, "sm_changed_head"));
161176

@@ -165,43 +180,29 @@ void test_submodule_modify__edit_and_save(void)
165180
/* modify properties of submodule */
166181
cl_git_pass(git_submodule_set_url(sm1, SM_LIBGIT2_URL));
167182
cl_git_pass(git_submodule_set_branch(sm1, SM_LIBGIT2_BRANCH));
168-
old_fetchrecurse = git_submodule_set_fetch_recurse_submodules(
169-
sm1, GIT_SUBMODULE_RECURSE_YES);
170-
171183
cl_assert_equal_s(SM_LIBGIT2_URL, git_submodule_url(sm1));
172184
cl_assert_equal_s(SM_LIBGIT2_BRANCH, git_submodule_branch(sm1));
173-
cl_assert_equal_i(
174-
GIT_SUBMODULE_RECURSE_YES, git_submodule_fetch_recurse_submodules(sm1));
175185

176186
/* revert without saving (and confirm setters return old value) */
177187
cl_git_pass(git_submodule_set_url(sm1, old_url));
178188
cl_git_pass(git_submodule_set_branch(sm1, old_branch));
179-
cl_assert_equal_i(
180-
GIT_SUBMODULE_RECURSE_YES, git_submodule_set_fetch_recurse_submodules(
181-
sm1, GIT_SUBMODULE_RECURSE_RESET));
182189

183190
/* check that revert was successful */
184191
cl_assert_equal_s(old_url, git_submodule_url(sm1));
185192
cl_assert_equal_s(old_branch, git_submodule_branch(sm1));
186-
cl_assert_equal_i(
187-
old_fetchrecurse, git_submodule_fetch_recurse_submodules(sm1));
188193

189194
/* modify properties of submodule (again) */
190195
cl_git_pass(git_submodule_set_url(sm1, SM_LIBGIT2_URL));
191196
cl_git_pass(git_submodule_set_branch(sm1, SM_LIBGIT2_BRANCH));
192-
git_submodule_set_fetch_recurse_submodules(sm1, GIT_SUBMODULE_RECURSE_YES);
193197

194198
/* call save */
195199
cl_git_pass(git_submodule_save(sm1));
196200

197-
cl_assert_equal_i(GIT_SUBMODULE_RECURSE_YES, git_submodule_fetch_recurse_submodules(sm1));
198-
199201
/* call reload and check that the new values are loaded */
200202
cl_git_pass(git_submodule_reload(sm1, 0));
201203

202204
cl_assert_equal_s(SM_LIBGIT2_URL, git_submodule_url(sm1));
203205
cl_assert_equal_s(SM_LIBGIT2_BRANCH, git_submodule_branch(sm1));
204-
cl_assert_equal_i(GIT_SUBMODULE_RECURSE_YES, git_submodule_fetch_recurse_submodules(sm1));
205206

206207
/* unset branch again and verify that the property is deleted in config */
207208
cl_git_pass(git_submodule_set_branch(sm1, NULL));
@@ -214,19 +215,6 @@ void test_submodule_modify__edit_and_save(void)
214215
cl_git_pass(git_submodule_lookup(&sm2, r2, "sm_changed_head"));
215216

216217
cl_assert_equal_s(SM_LIBGIT2_URL, git_submodule_url(sm2));
217-
cl_assert_equal_i(
218-
GIT_SUBMODULE_RECURSE_NO, git_submodule_fetch_recurse_submodules(sm2));
219-
220-
/* set fetchRecurseSubmodules on-demand */
221-
cl_git_pass(git_submodule_reload(sm1, 0));
222-
git_submodule_set_fetch_recurse_submodules(sm1, GIT_SUBMODULE_RECURSE_ONDEMAND);
223-
cl_assert_equal_i(
224-
GIT_SUBMODULE_RECURSE_ONDEMAND, git_submodule_fetch_recurse_submodules(sm1));
225-
/* call save */
226-
cl_git_pass(git_submodule_save(sm1));
227-
cl_git_pass(git_submodule_reload(sm1, 0));
228-
cl_assert_equal_i(
229-
GIT_SUBMODULE_RECURSE_ONDEMAND, git_submodule_fetch_recurse_submodules(sm1));
230218

231219
git_submodule_free(sm1);
232220
git_submodule_free(sm2);

0 commit comments

Comments
 (0)