Commit f3a302ad by Vicent Marti

Merge pull request #2019 from linquize/recurse-on-demand

Accept 'submodule.*.fetchRecurseSubmodules' config 'on-demand' value
parents 71223e1c 41ceab25
...@@ -105,6 +105,19 @@ typedef enum { ...@@ -105,6 +105,19 @@ typedef enum {
GIT_SUBMODULE_STATUS_WD_UNTRACKED)) != 0) GIT_SUBMODULE_STATUS_WD_UNTRACKED)) != 0)
/** /**
* Options for submodule recurse.
*
* * GIT_SUBMODULE_RECURSE_NO - do no recurse into submodules
* * GIT_SUBMODULE_RECURSE_YES - recurse into submodules
* * GIT_SUBMODULE_RECURSE_ONDEMAND - recurse into submodules only when commit not already in local clone
*/
typedef enum {
GIT_SUBMODULE_RECURSE_NO = 0,
GIT_SUBMODULE_RECURSE_YES = 1,
GIT_SUBMODULE_RECURSE_ONDEMAND = 2,
} git_submodule_recurse_t;
/**
* Lookup submodule information by name or path. * Lookup submodule information by name or path.
* *
* Given either the submodule name or path (they are usually the same), this * Given either the submodule name or path (they are usually the same), this
...@@ -410,7 +423,7 @@ GIT_EXTERN(git_submodule_update_t) git_submodule_set_update( ...@@ -410,7 +423,7 @@ GIT_EXTERN(git_submodule_update_t) git_submodule_set_update(
* *
* @return 0 if fetchRecurseSubmodules is false, 1 if true * @return 0 if fetchRecurseSubmodules is false, 1 if true
*/ */
GIT_EXTERN(int) git_submodule_fetch_recurse_submodules( GIT_EXTERN(git_submodule_recurse_t) git_submodule_fetch_recurse_submodules(
git_submodule *submodule); git_submodule *submodule);
/** /**
...@@ -426,7 +439,7 @@ GIT_EXTERN(int) git_submodule_fetch_recurse_submodules( ...@@ -426,7 +439,7 @@ GIT_EXTERN(int) git_submodule_fetch_recurse_submodules(
*/ */
GIT_EXTERN(int) git_submodule_set_fetch_recurse_submodules( GIT_EXTERN(int) git_submodule_set_fetch_recurse_submodules(
git_submodule *submodule, git_submodule *submodule,
int fetch_recurse_submodules); git_submodule_recurse_t fetch_recurse_submodules);
/** /**
* Copy submodule info into ".git/config" file. * Copy submodule info into ".git/config" file.
......
...@@ -43,6 +43,12 @@ static git_cvar_map _sm_ignore_map[] = { ...@@ -43,6 +43,12 @@ static git_cvar_map _sm_ignore_map[] = {
{GIT_CVAR_TRUE, NULL, GIT_SUBMODULE_IGNORE_ALL}, {GIT_CVAR_TRUE, NULL, GIT_SUBMODULE_IGNORE_ALL},
}; };
static git_cvar_map _sm_recurse_map[] = {
{GIT_CVAR_STRING, "on-demand", GIT_SUBMODULE_RECURSE_ONDEMAND},
{GIT_CVAR_FALSE, NULL, GIT_SUBMODULE_RECURSE_NO},
{GIT_CVAR_TRUE, NULL, GIT_SUBMODULE_RECURSE_YES},
};
static kh_inline khint_t str_hash_no_trailing_slash(const char *s) static kh_inline khint_t str_hash_no_trailing_slash(const char *s)
{ {
khint_t h; khint_t h;
...@@ -428,6 +434,15 @@ const char *git_submodule_update_to_str(git_submodule_update_t update) ...@@ -428,6 +434,15 @@ const char *git_submodule_update_to_str(git_submodule_update_t update)
return NULL; return NULL;
} }
const char *git_submodule_recurse_to_str(git_submodule_recurse_t recurse)
{
int i;
for (i = 0; i < (int)ARRAY_SIZE(_sm_recurse_map); ++i)
if (_sm_recurse_map[i].map_value == recurse)
return _sm_recurse_map[i].str_match;
return NULL;
}
int git_submodule_save(git_submodule *submodule) int git_submodule_save(git_submodule *submodule)
{ {
int error = 0; int error = 0;
...@@ -469,10 +484,10 @@ int git_submodule_save(git_submodule *submodule) ...@@ -469,10 +484,10 @@ int git_submodule_save(git_submodule *submodule)
if (error < 0) if (error < 0)
goto cleanup; goto cleanup;
if ((error = submodule_config_key_trunc_puts( if (!(error = submodule_config_key_trunc_puts(&key, "fetchRecurseSubmodules")) &&
&key, "fetchRecurseSubmodules")) < 0 || (val = git_submodule_recurse_to_str(submodule->fetch_recurse)) != NULL)
(error = git_config_file_set_string( error = git_config_file_set_string(mods, key.ptr, val);
mods, key.ptr, submodule->fetch_recurse ? "true" : "false")) < 0) if (error < 0)
goto cleanup; goto cleanup;
/* update internal defaults */ /* update internal defaults */
...@@ -610,7 +625,7 @@ git_submodule_update_t git_submodule_set_update( ...@@ -610,7 +625,7 @@ git_submodule_update_t git_submodule_set_update(
return old; return old;
} }
int git_submodule_fetch_recurse_submodules( git_submodule_recurse_t git_submodule_fetch_recurse_submodules(
git_submodule *submodule) git_submodule *submodule)
{ {
assert(submodule); assert(submodule);
...@@ -619,14 +634,14 @@ int git_submodule_fetch_recurse_submodules( ...@@ -619,14 +634,14 @@ int git_submodule_fetch_recurse_submodules(
int git_submodule_set_fetch_recurse_submodules( int git_submodule_set_fetch_recurse_submodules(
git_submodule *submodule, git_submodule *submodule,
int fetch_recurse_submodules) git_submodule_recurse_t fetch_recurse_submodules)
{ {
int old; int old;
assert(submodule); assert(submodule);
old = submodule->fetch_recurse; old = submodule->fetch_recurse;
submodule->fetch_recurse = (fetch_recurse_submodules != 0); submodule->fetch_recurse = fetch_recurse_submodules;
return old; return old;
} }
...@@ -975,6 +990,7 @@ static git_submodule *submodule_alloc(git_repository *repo, const char *name) ...@@ -975,6 +990,7 @@ static git_submodule *submodule_alloc(git_repository *repo, const char *name)
GIT_REFCOUNT_INC(sm); GIT_REFCOUNT_INC(sm);
sm->ignore = sm->ignore_default = GIT_SUBMODULE_IGNORE_NONE; sm->ignore = sm->ignore_default = GIT_SUBMODULE_IGNORE_NONE;
sm->update = sm->update_default = GIT_SUBMODULE_UPDATE_CHECKOUT; sm->update = sm->update_default = GIT_SUBMODULE_UPDATE_CHECKOUT;
sm->fetch_recurse = sm->update_default = GIT_SUBMODULE_RECURSE_YES;
sm->repo = repo; sm->repo = repo;
return sm; return sm;
...@@ -1080,6 +1096,20 @@ int git_submodule_parse_update(git_submodule_update_t *out, const char *value) ...@@ -1080,6 +1096,20 @@ int git_submodule_parse_update(git_submodule_update_t *out, const char *value)
return 0; return 0;
} }
int git_submodule_parse_recurse(git_submodule_recurse_t *out, const char *value)
{
int val;
if (git_config_lookup_map_value(
&val, _sm_recurse_map, ARRAY_SIZE(_sm_recurse_map), value) < 0) {
*out = GIT_SUBMODULE_RECURSE_YES;
return submodule_config_error("recurse", value);
}
*out = (git_submodule_recurse_t)val;
return 0;
}
static int submodule_load_from_config( static int submodule_load_from_config(
const git_config_entry *entry, void *payload) const git_config_entry *entry, void *payload)
{ {
...@@ -1166,10 +1196,8 @@ static int submodule_load_from_config( ...@@ -1166,10 +1196,8 @@ static int submodule_load_from_config(
sm->update_default = sm->update; sm->update_default = sm->update;
} }
else if (strcasecmp(property, "fetchRecurseSubmodules") == 0) { else if (strcasecmp(property, "fetchRecurseSubmodules") == 0) {
if (git__parse_bool(&sm->fetch_recurse, value) < 0) { if (git_submodule_parse_recurse(&sm->fetch_recurse, value) < 0)
error = submodule_config_error("fetchRecurseSubmodules", value); return -1;
goto done;
}
} }
else if (strcasecmp(property, "ignore") == 0) { else if (strcasecmp(property, "ignore") == 0) {
if ((error = git_submodule_parse_ignore(&sm->ignore, value)) < 0) if ((error = git_submodule_parse_ignore(&sm->ignore, value)) < 0)
......
...@@ -85,7 +85,7 @@ struct git_submodule { ...@@ -85,7 +85,7 @@ struct git_submodule {
git_submodule_update_t update_default; git_submodule_update_t update_default;
git_submodule_ignore_t ignore; git_submodule_ignore_t ignore;
git_submodule_ignore_t ignore_default; git_submodule_ignore_t ignore_default;
int fetch_recurse; git_submodule_recurse_t fetch_recurse;
/* internal information */ /* internal information */
git_repository *repo; git_repository *repo;
......
...@@ -168,7 +168,7 @@ void test_submodule_modify__edit_and_save(void) ...@@ -168,7 +168,7 @@ void test_submodule_modify__edit_and_save(void)
git_submodule_ignore_t old_ignore; git_submodule_ignore_t old_ignore;
git_submodule_update_t old_update; git_submodule_update_t old_update;
git_repository *r2; git_repository *r2;
int old_fetchrecurse; git_submodule_recurse_t old_fetchrecurse;
cl_git_pass(git_submodule_lookup(&sm1, g_repo, "sm_changed_head")); cl_git_pass(git_submodule_lookup(&sm1, g_repo, "sm_changed_head"));
...@@ -178,14 +178,14 @@ void test_submodule_modify__edit_and_save(void) ...@@ -178,14 +178,14 @@ void test_submodule_modify__edit_and_save(void)
cl_git_pass(git_submodule_set_url(sm1, SM_LIBGIT2_URL)); cl_git_pass(git_submodule_set_url(sm1, SM_LIBGIT2_URL));
old_ignore = git_submodule_set_ignore(sm1, GIT_SUBMODULE_IGNORE_UNTRACKED); old_ignore = git_submodule_set_ignore(sm1, GIT_SUBMODULE_IGNORE_UNTRACKED);
old_update = git_submodule_set_update(sm1, GIT_SUBMODULE_UPDATE_REBASE); old_update = git_submodule_set_update(sm1, GIT_SUBMODULE_UPDATE_REBASE);
old_fetchrecurse = git_submodule_set_fetch_recurse_submodules(sm1, 1); old_fetchrecurse = git_submodule_set_fetch_recurse_submodules(sm1, GIT_SUBMODULE_RECURSE_YES);
cl_assert_equal_s(SM_LIBGIT2_URL, git_submodule_url(sm1)); cl_assert_equal_s(SM_LIBGIT2_URL, git_submodule_url(sm1));
cl_assert_equal_i( cl_assert_equal_i(
(int)GIT_SUBMODULE_IGNORE_UNTRACKED, (int)git_submodule_ignore(sm1)); (int)GIT_SUBMODULE_IGNORE_UNTRACKED, (int)git_submodule_ignore(sm1));
cl_assert_equal_i( cl_assert_equal_i(
(int)GIT_SUBMODULE_UPDATE_REBASE, (int)git_submodule_update(sm1)); (int)GIT_SUBMODULE_UPDATE_REBASE, (int)git_submodule_update(sm1));
cl_assert_equal_i(1, git_submodule_fetch_recurse_submodules(sm1)); cl_assert_equal_i(GIT_SUBMODULE_RECURSE_YES, git_submodule_fetch_recurse_submodules(sm1));
/* revert without saving (and confirm setters return old value) */ /* revert without saving (and confirm setters return old value) */
cl_git_pass(git_submodule_set_url(sm1, old_url)); cl_git_pass(git_submodule_set_url(sm1, old_url));
...@@ -196,7 +196,7 @@ void test_submodule_modify__edit_and_save(void) ...@@ -196,7 +196,7 @@ void test_submodule_modify__edit_and_save(void)
(int)GIT_SUBMODULE_UPDATE_REBASE, (int)GIT_SUBMODULE_UPDATE_REBASE,
(int)git_submodule_set_update(sm1, GIT_SUBMODULE_UPDATE_RESET)); (int)git_submodule_set_update(sm1, GIT_SUBMODULE_UPDATE_RESET));
cl_assert_equal_i( cl_assert_equal_i(
1, git_submodule_set_fetch_recurse_submodules(sm1, old_fetchrecurse)); GIT_SUBMODULE_RECURSE_YES, git_submodule_set_fetch_recurse_submodules(sm1, old_fetchrecurse));
/* check that revert was successful */ /* check that revert was successful */
cl_assert_equal_s(old_url, git_submodule_url(sm1)); cl_assert_equal_s(old_url, git_submodule_url(sm1));
...@@ -209,7 +209,7 @@ void test_submodule_modify__edit_and_save(void) ...@@ -209,7 +209,7 @@ void test_submodule_modify__edit_and_save(void)
cl_git_pass(git_submodule_set_url(sm1, SM_LIBGIT2_URL)); cl_git_pass(git_submodule_set_url(sm1, SM_LIBGIT2_URL));
git_submodule_set_ignore(sm1, GIT_SUBMODULE_IGNORE_UNTRACKED); git_submodule_set_ignore(sm1, GIT_SUBMODULE_IGNORE_UNTRACKED);
git_submodule_set_update(sm1, GIT_SUBMODULE_UPDATE_REBASE); git_submodule_set_update(sm1, GIT_SUBMODULE_UPDATE_REBASE);
git_submodule_set_fetch_recurse_submodules(sm1, 1); git_submodule_set_fetch_recurse_submodules(sm1, GIT_SUBMODULE_RECURSE_YES);
/* call save */ /* call save */
cl_git_pass(git_submodule_save(sm1)); cl_git_pass(git_submodule_save(sm1));
...@@ -225,7 +225,7 @@ void test_submodule_modify__edit_and_save(void) ...@@ -225,7 +225,7 @@ void test_submodule_modify__edit_and_save(void)
(int)GIT_SUBMODULE_IGNORE_UNTRACKED, (int)git_submodule_ignore(sm1)); (int)GIT_SUBMODULE_IGNORE_UNTRACKED, (int)git_submodule_ignore(sm1));
cl_assert_equal_i( cl_assert_equal_i(
(int)GIT_SUBMODULE_UPDATE_REBASE, (int)git_submodule_update(sm1)); (int)GIT_SUBMODULE_UPDATE_REBASE, (int)git_submodule_update(sm1));
cl_assert_equal_i(1, git_submodule_fetch_recurse_submodules(sm1)); cl_assert_equal_i(GIT_SUBMODULE_RECURSE_YES, git_submodule_fetch_recurse_submodules(sm1));
/* call reload and check that the new values are loaded */ /* call reload and check that the new values are loaded */
cl_git_pass(git_submodule_reload(sm1)); cl_git_pass(git_submodule_reload(sm1));
...@@ -235,7 +235,7 @@ void test_submodule_modify__edit_and_save(void) ...@@ -235,7 +235,7 @@ void test_submodule_modify__edit_and_save(void)
(int)GIT_SUBMODULE_IGNORE_UNTRACKED, (int)git_submodule_ignore(sm1)); (int)GIT_SUBMODULE_IGNORE_UNTRACKED, (int)git_submodule_ignore(sm1));
cl_assert_equal_i( cl_assert_equal_i(
(int)GIT_SUBMODULE_UPDATE_REBASE, (int)git_submodule_update(sm1)); (int)GIT_SUBMODULE_UPDATE_REBASE, (int)git_submodule_update(sm1));
cl_assert_equal_i(1, git_submodule_fetch_recurse_submodules(sm1)); cl_assert_equal_i(GIT_SUBMODULE_RECURSE_YES, git_submodule_fetch_recurse_submodules(sm1));
/* open a second copy of the repo and compare submodule */ /* open a second copy of the repo and compare submodule */
cl_git_pass(git_repository_open(&r2, "submod2")); cl_git_pass(git_repository_open(&r2, "submod2"));
...@@ -246,7 +246,16 @@ void test_submodule_modify__edit_and_save(void) ...@@ -246,7 +246,16 @@ void test_submodule_modify__edit_and_save(void)
(int)GIT_SUBMODULE_IGNORE_UNTRACKED, (int)git_submodule_ignore(sm2)); (int)GIT_SUBMODULE_IGNORE_UNTRACKED, (int)git_submodule_ignore(sm2));
cl_assert_equal_i( cl_assert_equal_i(
(int)GIT_SUBMODULE_UPDATE_REBASE, (int)git_submodule_update(sm2)); (int)GIT_SUBMODULE_UPDATE_REBASE, (int)git_submodule_update(sm2));
cl_assert_equal_i(1, git_submodule_fetch_recurse_submodules(sm2)); cl_assert_equal_i(GIT_SUBMODULE_RECURSE_YES, git_submodule_fetch_recurse_submodules(sm2));
/* set fetchRecurseSubmodules on-demand */
cl_git_pass(git_submodule_reload(sm1));
git_submodule_set_fetch_recurse_submodules(sm1, GIT_SUBMODULE_RECURSE_ONDEMAND);
cl_assert_equal_i(GIT_SUBMODULE_RECURSE_ONDEMAND, git_submodule_fetch_recurse_submodules(sm1));
/* call save */
cl_git_pass(git_submodule_save(sm1));
cl_git_pass(git_submodule_reload(sm1));
cl_assert_equal_i(GIT_SUBMODULE_RECURSE_ONDEMAND, git_submodule_fetch_recurse_submodules(sm1));
git_repository_free(r2); git_repository_free(r2);
git__free(old_url); git__free(old_url);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment