mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-10 16:00:04 +00:00
Merge pull request #3097 from libgit2/cmn/submodule-config-state
Remove run-time configuration settings from submodules
This commit is contained in:
commit
daacf96d10
@ -384,25 +384,19 @@ static void print_short(git_repository *repo, git_status_list *status)
|
||||
if (s->index_to_workdir &&
|
||||
s->index_to_workdir->new_file.mode == GIT_FILEMODE_COMMIT)
|
||||
{
|
||||
git_submodule *sm = NULL;
|
||||
unsigned int smstatus = 0;
|
||||
|
||||
if (!git_submodule_lookup(
|
||||
&sm, repo, s->index_to_workdir->new_file.path)) {
|
||||
|
||||
if (!git_submodule_status(&smstatus, sm)) {
|
||||
if (smstatus & GIT_SUBMODULE_STATUS_WD_MODIFIED)
|
||||
extra = " (new commits)";
|
||||
else if (smstatus & GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED)
|
||||
extra = " (modified content)";
|
||||
else if (smstatus & GIT_SUBMODULE_STATUS_WD_WD_MODIFIED)
|
||||
extra = " (modified content)";
|
||||
else if (smstatus & GIT_SUBMODULE_STATUS_WD_UNTRACKED)
|
||||
extra = " (untracked content)";
|
||||
}
|
||||
if (!git_submodule_status(&smstatus, repo, s->index_to_workdir->new_file.path,
|
||||
GIT_SUBMODULE_IGNORE_FALLBACK)) {
|
||||
if (smstatus & GIT_SUBMODULE_STATUS_WD_MODIFIED)
|
||||
extra = " (new commits)";
|
||||
else if (smstatus & GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED)
|
||||
extra = " (modified content)";
|
||||
else if (smstatus & GIT_SUBMODULE_STATUS_WD_WD_MODIFIED)
|
||||
extra = " (modified content)";
|
||||
else if (smstatus & GIT_SUBMODULE_STATUS_WD_UNTRACKED)
|
||||
extra = " (untracked content)";
|
||||
}
|
||||
|
||||
git_submodule_free(sm);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -399,7 +399,7 @@ typedef struct {
|
||||
* `git_diff_options_init` programmatic initialization.
|
||||
*/
|
||||
#define GIT_DIFF_OPTIONS_INIT \
|
||||
{GIT_DIFF_OPTIONS_VERSION, 0, GIT_SUBMODULE_IGNORE_DEFAULT, {NULL,0}, NULL, NULL, 3}
|
||||
{GIT_DIFF_OPTIONS_VERSION, 0, GIT_SUBMODULE_IGNORE_FALLBACK, {NULL,0}, NULL, NULL, 3}
|
||||
|
||||
/**
|
||||
* Initializes a `git_diff_options` with default values. Equivalent to
|
||||
|
@ -300,20 +300,6 @@ GIT_EXTERN(int) git_submodule_add_to_index(
|
||||
git_submodule *submodule,
|
||||
int write_index);
|
||||
|
||||
/**
|
||||
* Write submodule settings to .gitmodules file.
|
||||
*
|
||||
* This commits any in-memory changes to the submodule to the gitmodules
|
||||
* file on disk. You may also be interested in `git_submodule_init()` which
|
||||
* writes submodule info to ".git/config" (which is better for local changes
|
||||
* to submodule settings) and/or `git_submodule_sync()` which writes
|
||||
* settings about remotes to the actual submodule repository.
|
||||
*
|
||||
* @param submodule The submodule to write.
|
||||
* @return 0 on success, <0 on failure.
|
||||
*/
|
||||
GIT_EXTERN(int) git_submodule_save(git_submodule *submodule);
|
||||
|
||||
/**
|
||||
* Get the containing repository for a submodule.
|
||||
*
|
||||
@ -373,36 +359,31 @@ GIT_EXTERN(int) git_submodule_resolve_url(git_buf *out, git_repository *repo, co
|
||||
GIT_EXTERN(const char *) git_submodule_branch(git_submodule *submodule);
|
||||
|
||||
/**
|
||||
* Set the branch for the submodule.
|
||||
* Set the branch for the submodule in the configuration
|
||||
*
|
||||
* This sets the branch in memory for the submodule. This will be used for
|
||||
* any following submodule actions while this submodule data is in memory.
|
||||
*
|
||||
* After calling this, you may wish to call `git_submodule_save()` to write
|
||||
* the changes back to the ".gitmodules" file and `git_submodule_sync()` to
|
||||
* After calling this, you may wish to call `git_submodule_sync()` to
|
||||
* write the changes to the checked out submodule repository.
|
||||
*
|
||||
* @param submodule Pointer to the submodule object
|
||||
* @param repo the repository to affect
|
||||
* @param name the name of the submodule to configure
|
||||
* @param branch Branch that should be used for the submodule
|
||||
* @return 0 on success, <0 on failure
|
||||
*/
|
||||
GIT_EXTERN(int) git_submodule_set_branch(git_submodule *submodule, const char *branch);
|
||||
GIT_EXTERN(int) git_submodule_set_branch(git_repository *repo, const char *name, const char *branch);
|
||||
|
||||
/**
|
||||
* Set the URL for the submodule.
|
||||
* Set the URL for the submodule in the configuration
|
||||
*
|
||||
* This sets the URL in memory for the submodule. This will be used for
|
||||
* any following submodule actions while this submodule data is in memory.
|
||||
*
|
||||
* After calling this, you may wish to call `git_submodule_save()` to write
|
||||
* the changes back to the ".gitmodules" file and `git_submodule_sync()` to
|
||||
* After calling this, you may wish to call `git_submodule_sync()` to
|
||||
* write the changes to the checked out submodule repository.
|
||||
*
|
||||
* @param submodule Pointer to the submodule object
|
||||
* @param repo the repository to affect
|
||||
* @param name the name of the submodule to configure
|
||||
* @param url URL that should be used for the submodule
|
||||
* @return 0 on success, <0 on failure
|
||||
*/
|
||||
GIT_EXTERN(int) git_submodule_set_url(git_submodule *submodule, const char *url);
|
||||
GIT_EXTERN(int) git_submodule_set_url(git_repository *repo, const char *name, const char *url);
|
||||
|
||||
/**
|
||||
* Get the OID for the submodule in the index.
|
||||
@ -452,9 +433,6 @@ GIT_EXTERN(const git_oid *) git_submodule_wd_id(git_submodule *submodule);
|
||||
* The working directory will be consider clean so long as there is a
|
||||
* checked out version present.
|
||||
*
|
||||
* plus the special **GIT_SUBMODULE_IGNORE_RESET** which can be used with
|
||||
* `git_submodule_set_ignore()` to revert to the on-disk setting.
|
||||
*
|
||||
* @param submodule The submodule to check
|
||||
* @return The current git_submodule_ignore_t valyue what will be used for
|
||||
* this submodule.
|
||||
@ -463,32 +441,25 @@ GIT_EXTERN(git_submodule_ignore_t) git_submodule_ignore(
|
||||
git_submodule *submodule);
|
||||
|
||||
/**
|
||||
* Set the ignore rule for the submodule.
|
||||
* Set the ignore rule for the submodule in the configuration
|
||||
*
|
||||
* This sets the in-memory ignore rule for the submodule which will
|
||||
* control the behavior of `git_submodule_status()`.
|
||||
* This does not affect any currently-loaded instances.
|
||||
*
|
||||
* To make changes persistent, call `git_submodule_save()` to write the
|
||||
* value to disk (in the ".gitmodules" and ".git/config" files).
|
||||
*
|
||||
* Call with `GIT_SUBMODULE_IGNORE_RESET` or call `git_submodule_reload()`
|
||||
* to revert the in-memory rule to the value that is on disk.
|
||||
*
|
||||
* @param submodule The submodule to update
|
||||
* @param repo the repository to affect
|
||||
* @param name the name of the submdule
|
||||
* @param ignore The new value for the ignore rule
|
||||
* @return old value for ignore
|
||||
* @return 0 or an error code
|
||||
*/
|
||||
GIT_EXTERN(git_submodule_ignore_t) git_submodule_set_ignore(
|
||||
git_submodule *submodule,
|
||||
GIT_EXTERN(int) git_submodule_set_ignore(
|
||||
git_repository *repo,
|
||||
const char *name,
|
||||
git_submodule_ignore_t ignore);
|
||||
|
||||
/**
|
||||
* Get the update rule that will be used for the submodule.
|
||||
*
|
||||
* This value controls the behavior of the `git submodule update` command.
|
||||
* There are four useful values documented with `git_submodule_update_t`
|
||||
* plus the `GIT_SUBMODULE_UPDATE_RESET` which can be used to revert to
|
||||
* the on-disk setting.
|
||||
* There are four useful values documented with `git_submodule_update_t`.
|
||||
*
|
||||
* @param submodule The submodule to check
|
||||
* @return The current git_submodule_update_t value that will be used
|
||||
@ -498,23 +469,18 @@ GIT_EXTERN(git_submodule_update_t) git_submodule_update_strategy(
|
||||
git_submodule *submodule);
|
||||
|
||||
/**
|
||||
* Set the update rule for the submodule.
|
||||
* Set the update rule for the submodule in the configuration
|
||||
*
|
||||
* The initial value comes from the ".git/config" setting of
|
||||
* `submodule.$name.update` for this submodule (which is initialized from
|
||||
* the ".gitmodules" file). Using this function sets the update rule in
|
||||
* memory for the submodule. Call `git_submodule_save()` to write out the
|
||||
* new update rule.
|
||||
* This setting won't affect any existing instances.
|
||||
*
|
||||
* Calling this again with GIT_SUBMODULE_UPDATE_RESET or calling
|
||||
* `git_submodule_reload()` will revert the rule to the on disk value.
|
||||
*
|
||||
* @param submodule The submodule to update
|
||||
* @param repo the repository to affect
|
||||
* @param name the name of the submodule to configure
|
||||
* @param update The new value to use
|
||||
* @return old value for update
|
||||
* @return 0 or an error code
|
||||
*/
|
||||
GIT_EXTERN(git_submodule_update_t) git_submodule_set_update(
|
||||
git_submodule *submodule,
|
||||
GIT_EXTERN(int) git_submodule_set_update(
|
||||
git_repository *repo,
|
||||
const char *name,
|
||||
git_submodule_update_t update);
|
||||
|
||||
/**
|
||||
@ -532,18 +498,18 @@ GIT_EXTERN(git_submodule_recurse_t) git_submodule_fetch_recurse_submodules(
|
||||
git_submodule *submodule);
|
||||
|
||||
/**
|
||||
* Set the fetchRecurseSubmodules rule for a submodule.
|
||||
* Set the fetchRecurseSubmodules rule for a submodule in the configuration
|
||||
*
|
||||
* This sets the submodule.<name>.fetchRecurseSubmodules value for
|
||||
* the submodule. You should call `git_submodule_save()` if you want
|
||||
* to persist the new value.
|
||||
* This setting won't affect any existing instances.
|
||||
*
|
||||
* @param submodule The submodule to modify
|
||||
* @param repo the repository to affect
|
||||
* @param name the submodule to configure
|
||||
* @param fetch_recurse_submodules Boolean value
|
||||
* @return old value for fetchRecurseSubmodules
|
||||
*/
|
||||
GIT_EXTERN(git_submodule_recurse_t) git_submodule_set_fetch_recurse_submodules(
|
||||
git_submodule *submodule,
|
||||
GIT_EXTERN(int) git_submodule_set_fetch_recurse_submodules(
|
||||
git_repository *repo,
|
||||
const char *name,
|
||||
git_submodule_recurse_t fetch_recurse_submodules);
|
||||
|
||||
/**
|
||||
@ -634,16 +600,19 @@ GIT_EXTERN(int) git_submodule_reload_all(git_repository *repo, int force);
|
||||
* This looks at a submodule and tries to determine the status. It
|
||||
* will return a combination of the `GIT_SUBMODULE_STATUS` values above.
|
||||
* How deeply it examines the working directory to do this will depend
|
||||
* on the `git_submodule_ignore_t` value for the submodule - which can be
|
||||
* set either temporarily or permanently with `git_submodule_set_ignore()`.
|
||||
* on the `git_submodule_ignore_t` value for the submodule.
|
||||
*
|
||||
* @param status Combination of `GIT_SUBMODULE_STATUS` flags
|
||||
* @param submodule Submodule for which to get status
|
||||
* @param repo the repository in which to look
|
||||
* @param name name of the submodule
|
||||
* @param ignore the ignore rules to follow
|
||||
* @return 0 on success, <0 on error
|
||||
*/
|
||||
GIT_EXTERN(int) git_submodule_status(
|
||||
unsigned int *status,
|
||||
git_submodule *submodule);
|
||||
git_repository *repo,
|
||||
const char *name,
|
||||
git_submodule_ignore_t ignore);
|
||||
|
||||
/**
|
||||
* Get the locations of submodule information.
|
||||
|
@ -349,7 +349,6 @@ typedef struct git_submodule git_submodule;
|
||||
*
|
||||
* The values are:
|
||||
*
|
||||
* - GIT_SUBMODULE_UPDATE_RESET: reset to the on-disk value.
|
||||
* - GIT_SUBMODULE_UPDATE_CHECKOUT: the default; when a submodule is
|
||||
* updated, checkout the new detached HEAD to the submodule directory.
|
||||
* - GIT_SUBMODULE_UPDATE_REBASE: update by rebasing the current checked
|
||||
@ -362,8 +361,6 @@ typedef struct git_submodule git_submodule;
|
||||
* when we don't want any particular update rule to be specified.
|
||||
*/
|
||||
typedef enum {
|
||||
GIT_SUBMODULE_UPDATE_RESET = -1,
|
||||
|
||||
GIT_SUBMODULE_UPDATE_CHECKOUT = 1,
|
||||
GIT_SUBMODULE_UPDATE_REBASE = 2,
|
||||
GIT_SUBMODULE_UPDATE_MERGE = 3,
|
||||
@ -386,7 +383,7 @@ typedef enum {
|
||||
*
|
||||
* The values are:
|
||||
*
|
||||
* - GIT_SUBMODULE_IGNORE_RESET: reset to the on-disk value.
|
||||
* - GIT_SUBMODULE_IGNORE_FALLBACK: use the submodule's configuration
|
||||
* - GIT_SUBMODULE_IGNORE_NONE: don't ignore any change - i.e. even an
|
||||
* untracked file, will mark the submodule as dirty. Ignored files are
|
||||
* still ignored, of course.
|
||||
@ -400,14 +397,12 @@ typedef enum {
|
||||
* when we don't want any particular ignore rule to be specified.
|
||||
*/
|
||||
typedef enum {
|
||||
GIT_SUBMODULE_IGNORE_RESET = -1, /**< reset to on-disk value */
|
||||
GIT_SUBMODULE_IGNORE_FALLBACK = -1, /**< use the submodule's configuration */
|
||||
|
||||
GIT_SUBMODULE_IGNORE_NONE = 1, /**< any change or untracked == dirty */
|
||||
GIT_SUBMODULE_IGNORE_UNTRACKED = 2, /**< dirty if tracked files change */
|
||||
GIT_SUBMODULE_IGNORE_DIRTY = 3, /**< only dirty if HEAD moved */
|
||||
GIT_SUBMODULE_IGNORE_ALL = 4, /**< never dirty */
|
||||
|
||||
GIT_SUBMODULE_IGNORE_DEFAULT = 0
|
||||
} git_submodule_ignore_t;
|
||||
|
||||
/**
|
||||
@ -415,15 +410,12 @@ typedef enum {
|
||||
*
|
||||
* Represent the value of `submodule.$name.fetchRecurseSubmodules`
|
||||
*
|
||||
* * GIT_SUBMODULE_RECURSE_RESET - reset to the on-disk value
|
||||
* * 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_RESET = -1,
|
||||
|
||||
GIT_SUBMODULE_RECURSE_NO = 0,
|
||||
GIT_SUBMODULE_RECURSE_YES = 1,
|
||||
GIT_SUBMODULE_RECURSE_ONDEMAND = 2,
|
||||
|
@ -180,7 +180,7 @@ static bool checkout_is_workdir_modified(
|
||||
return true;
|
||||
}
|
||||
|
||||
if (git_submodule_status(&sm_status, sm) < 0 ||
|
||||
if (git_submodule_status(&sm_status, data->repo, wditem->path, GIT_SUBMODULE_IGNORE_FALLBACK) < 0 ||
|
||||
GIT_SUBMODULE_STATUS_IS_WD_DIRTY(sm_status))
|
||||
rval = true;
|
||||
else if ((sm_oid = git_submodule_wd_id(sm)) == NULL)
|
||||
@ -1860,11 +1860,6 @@ static int checkout_create_submodules(
|
||||
git_diff_delta *delta;
|
||||
size_t i;
|
||||
|
||||
/* initial reload of submodules if .gitmodules was changed */
|
||||
if (data->reload_submodules &&
|
||||
(error = git_submodule_reload_all(data->repo, 1)) < 0)
|
||||
return error;
|
||||
|
||||
git_vector_foreach(&data->diff->deltas, i, delta) {
|
||||
if (actions[i] & CHECKOUT_ACTION__DEFER_REMOVE) {
|
||||
/* this has a blocker directory that should only be removed iff
|
||||
@ -1885,8 +1880,7 @@ static int checkout_create_submodules(
|
||||
}
|
||||
}
|
||||
|
||||
/* final reload once submodules have been updated */
|
||||
return git_submodule_reload_all(data->repo, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int checkout_lookup_head_tree(git_tree **out, git_repository *repo)
|
||||
|
20
src/config.c
20
src/config.c
@ -1194,6 +1194,26 @@ fail_parse:
|
||||
return -1;
|
||||
}
|
||||
|
||||
int git_config_lookup_map_enum(git_cvar_t *type_out, const char **str_out,
|
||||
const git_cvar_map *maps, size_t map_n, int enum_val)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < map_n; i++) {
|
||||
const git_cvar_map *m = &maps[i];
|
||||
|
||||
if (m->map_value != enum_val)
|
||||
continue;
|
||||
|
||||
*type_out = m->cvar_type;
|
||||
*str_out = m->str_match;
|
||||
return 0;
|
||||
}
|
||||
|
||||
giterr_set(GITERR_CONFIG, "invalid enum value");
|
||||
return GIT_ENOTFOUND;
|
||||
}
|
||||
|
||||
int git_config_parse_bool(int *out, const char *value)
|
||||
{
|
||||
if (git__parse_bool(out, value) == 0)
|
||||
|
@ -82,4 +82,10 @@ extern int git_config__get_int_force(
|
||||
extern int git_config__cvar(
|
||||
int *out, git_config *config, git_cvar_cached cvar);
|
||||
|
||||
/**
|
||||
* The opposite of git_config_lookup_map_value, we take an enum value
|
||||
* and map it to the string or bool value on the config.
|
||||
*/
|
||||
int git_config_lookup_map_enum(git_cvar_t *type_out, const char **str_out,
|
||||
const git_cvar_map *maps, size_t map_n, int enum_val);
|
||||
#endif
|
||||
|
@ -186,7 +186,7 @@ static int diff_file_content_commit_to_str(
|
||||
return error;
|
||||
}
|
||||
|
||||
if ((error = git_submodule_status(&sm_status, sm)) < 0) {
|
||||
if ((error = git_submodule_status(&sm_status, fc->repo, fc->file->path, GIT_SUBMODULE_IGNORE_FALLBACK)) < 0) {
|
||||
git_submodule_free(sm);
|
||||
return error;
|
||||
}
|
||||
|
@ -111,7 +111,6 @@ void git_repository__cleanup(git_repository *repo)
|
||||
|
||||
git_cache_clear(&repo->objects);
|
||||
git_attr_cache_flush(repo);
|
||||
git_submodule_cache_free(repo);
|
||||
|
||||
set_config(repo, NULL);
|
||||
set_index(repo, NULL);
|
||||
|
@ -121,7 +121,6 @@ struct git_repository {
|
||||
git_refdb *_refdb;
|
||||
git_config *_config;
|
||||
git_index *_index;
|
||||
git_submodule_cache *_submodules;
|
||||
|
||||
git_cache objects;
|
||||
git_attr_cache *attrcache;
|
||||
|
1037
src/submodule.c
1037
src/submodule.c
File diff suppressed because it is too large
Load Diff
@ -99,23 +99,6 @@ struct git_submodule {
|
||||
git_oid wd_oid;
|
||||
};
|
||||
|
||||
/**
|
||||
* The git_submodule_cache stores known submodules along with timestamps,
|
||||
* etc. about when they were loaded
|
||||
*/
|
||||
typedef struct {
|
||||
git_repository *repo;
|
||||
git_strmap *submodules;
|
||||
git_mutex lock;
|
||||
|
||||
/* cache invalidation data */
|
||||
git_oid head_id;
|
||||
git_oid index_checksum;
|
||||
git_buf gitmodules_path;
|
||||
git_futils_filestamp gitmodules_stamp;
|
||||
git_futils_filestamp config_stamp;
|
||||
} git_submodule_cache;
|
||||
|
||||
/* Force revalidation of submodule data cache (alloc as needed) */
|
||||
extern int git_submodule_cache_refresh(git_repository *repo);
|
||||
|
||||
@ -137,9 +120,6 @@ enum {
|
||||
#define GIT_SUBMODULE_STATUS__CLEAR_INTERNAL(S) \
|
||||
((S) & ~(0xFFFFFFFFu << 20))
|
||||
|
||||
/* Internal submodule check does not attempt to refresh cached data */
|
||||
extern bool git_submodule__is_submodule(git_repository *repo, const char *name);
|
||||
|
||||
/* Internal lookup does not attempt to refresh cached data */
|
||||
extern int git_submodule__lookup(
|
||||
git_submodule **out, git_repository *repo, const char *path);
|
||||
@ -163,8 +143,4 @@ extern int git_submodule_parse_ignore(
|
||||
extern int git_submodule_parse_update(
|
||||
git_submodule_update_t *out, const char *value);
|
||||
|
||||
extern const char *git_submodule_ignore_to_str(git_submodule_ignore_t);
|
||||
extern const char *git_submodule_update_to_str(git_submodule_update_t);
|
||||
extern const char *git_submodule_recurse_to_str(git_submodule_recurse_t);
|
||||
|
||||
#endif
|
||||
|
@ -273,13 +273,13 @@ void test_diff_submodules__invalid_cache(void)
|
||||
|
||||
/* create untracked file in submodule working directory */
|
||||
cl_git_mkfile("submod2/sm_changed_head/new_around_here", "hello");
|
||||
git_submodule_set_ignore(sm, GIT_SUBMODULE_IGNORE_NONE);
|
||||
git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_NONE);
|
||||
|
||||
cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
|
||||
check_diff_patches(diff, expected_dirty);
|
||||
git_diff_free(diff);
|
||||
|
||||
git_submodule_set_ignore(sm, GIT_SUBMODULE_IGNORE_UNTRACKED);
|
||||
git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_UNTRACKED);
|
||||
|
||||
cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
|
||||
check_diff_patches(diff, expected_unchanged);
|
||||
@ -301,7 +301,7 @@ void test_diff_submodules__invalid_cache(void)
|
||||
check_diff_patches(diff, expected_dirty);
|
||||
git_diff_free(diff);
|
||||
|
||||
git_submodule_set_ignore(sm, GIT_SUBMODULE_IGNORE_DIRTY);
|
||||
git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_DIRTY);
|
||||
|
||||
cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
|
||||
check_diff_patches(diff, expected_unchanged);
|
||||
@ -312,13 +312,13 @@ void test_diff_submodules__invalid_cache(void)
|
||||
cl_git_pass(git_repository_index(&smindex, smrepo));
|
||||
cl_git_pass(git_index_add_bypath(smindex, "file_to_modify"));
|
||||
|
||||
git_submodule_set_ignore(sm, GIT_SUBMODULE_IGNORE_UNTRACKED);
|
||||
git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_UNTRACKED);
|
||||
|
||||
cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
|
||||
check_diff_patches(diff, expected_dirty);
|
||||
git_diff_free(diff);
|
||||
|
||||
git_submodule_set_ignore(sm, GIT_SUBMODULE_IGNORE_DIRTY);
|
||||
git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_DIRTY);
|
||||
|
||||
cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
|
||||
check_diff_patches(diff, expected_unchanged);
|
||||
@ -327,19 +327,19 @@ void test_diff_submodules__invalid_cache(void)
|
||||
/* commit changed index of submodule */
|
||||
cl_repo_commit_from_index(NULL, smrepo, NULL, 1372350000, "Move it");
|
||||
|
||||
git_submodule_set_ignore(sm, GIT_SUBMODULE_IGNORE_DIRTY);
|
||||
git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_DIRTY);
|
||||
|
||||
cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
|
||||
check_diff_patches(diff, expected_moved);
|
||||
git_diff_free(diff);
|
||||
|
||||
git_submodule_set_ignore(sm, GIT_SUBMODULE_IGNORE_ALL);
|
||||
git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_ALL);
|
||||
|
||||
cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
|
||||
check_diff_patches(diff, expected_unchanged);
|
||||
git_diff_free(diff);
|
||||
|
||||
git_submodule_set_ignore(sm, GIT_SUBMODULE_IGNORE_NONE);
|
||||
git_submodule_set_ignore(g_repo, git_submodule_name(sm), GIT_SUBMODULE_IGNORE_NONE);
|
||||
|
||||
cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
|
||||
check_diff_patches(diff, expected_moved_dirty);
|
||||
|
@ -89,7 +89,7 @@ void test_diff_tree__0(void)
|
||||
}
|
||||
|
||||
#define DIFF_OPTS(FLAGS, CTXT) \
|
||||
{GIT_DIFF_OPTIONS_VERSION, (FLAGS), GIT_SUBMODULE_IGNORE_DEFAULT, \
|
||||
{GIT_DIFF_OPTIONS_VERSION, (FLAGS), GIT_SUBMODULE_IGNORE_FALLBACK, \
|
||||
{NULL,0}, NULL, NULL, (CTXT), 1}
|
||||
|
||||
void test_diff_tree__options(void)
|
||||
|
@ -23,10 +23,10 @@ void test_submodule_init__absolute_url(void)
|
||||
cl_assert(git_path_dirname_r(&absolute_url, git_repository_workdir(g_repo)) > 0);
|
||||
cl_git_pass(git_buf_joinpath(&absolute_url, absolute_url.ptr, "testrepo.git"));
|
||||
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo"));
|
||||
|
||||
/* write the absolute url to the .gitmodules file*/
|
||||
cl_git_pass(git_submodule_set_url(sm, absolute_url.ptr));
|
||||
cl_git_pass(git_submodule_set_url(g_repo, "testrepo", absolute_url.ptr));
|
||||
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo"));
|
||||
|
||||
/* verify that the .gitmodules is set with an absolute path*/
|
||||
cl_assert_equal_s(absolute_url.ptr, git_submodule_url(sm));
|
||||
|
@ -41,17 +41,15 @@ void test_submodule_modify__init(void)
|
||||
git_config_free(cfg);
|
||||
|
||||
/* confirm no submodule data in config */
|
||||
cl_git_pass(git_repository_config(&cfg, g_repo));
|
||||
cl_git_fail(git_config_get_string(&str, cfg, "submodule.sm_unchanged.url"));
|
||||
cl_git_fail(git_config_get_string(&str, cfg, "submodule.sm_changed_head.url"));
|
||||
cl_git_fail(git_config_get_string(&str, cfg, "submodule.sm_added_and_uncommited.url"));
|
||||
cl_git_pass(git_repository_config_snapshot(&cfg, g_repo));
|
||||
cl_git_fail_with(GIT_ENOTFOUND, git_config_get_string(&str, cfg, "submodule.sm_unchanged.url"));
|
||||
cl_git_fail_with(GIT_ENOTFOUND, git_config_get_string(&str, cfg, "submodule.sm_changed_head.url"));
|
||||
cl_git_fail_with(GIT_ENOTFOUND, git_config_get_string(&str, cfg, "submodule.sm_added_and_uncommited.url"));
|
||||
git_config_free(cfg);
|
||||
|
||||
/* call init and see that settings are copied */
|
||||
cl_git_pass(git_submodule_foreach(g_repo, init_one_submodule, NULL));
|
||||
|
||||
git_submodule_reload_all(g_repo, 1);
|
||||
|
||||
/* confirm submodule data in config */
|
||||
cl_git_pass(git_repository_config_snapshot(&cfg, g_repo));
|
||||
cl_git_pass(git_config_get_string(&str, cfg, "submodule.sm_unchanged.url"));
|
||||
@ -130,132 +128,85 @@ void test_submodule_modify__sync(void)
|
||||
git_submodule_free(sm3);
|
||||
}
|
||||
|
||||
void test_submodule_modify__edit_and_save(void)
|
||||
{
|
||||
git_submodule *sm1, *sm2;
|
||||
char *old_url, *old_branch;
|
||||
git_submodule_ignore_t old_ignore;
|
||||
git_submodule_update_t old_update;
|
||||
git_repository *r2;
|
||||
git_submodule_recurse_t old_fetchrecurse;
|
||||
|
||||
cl_git_pass(git_submodule_lookup(&sm1, g_repo, "sm_changed_head"));
|
||||
|
||||
old_url = git__strdup(git_submodule_url(sm1));
|
||||
old_branch = NULL;
|
||||
|
||||
/* modify properties of submodule */
|
||||
cl_git_pass(git_submodule_set_url(sm1, SM_LIBGIT2_URL));
|
||||
cl_git_pass(git_submodule_set_branch(sm1, SM_LIBGIT2_BRANCH));
|
||||
old_ignore = git_submodule_set_ignore(sm1, GIT_SUBMODULE_IGNORE_UNTRACKED);
|
||||
old_update = git_submodule_set_update(sm1, GIT_SUBMODULE_UPDATE_REBASE);
|
||||
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_BRANCH, git_submodule_branch(sm1));
|
||||
cl_assert_equal_i(
|
||||
GIT_SUBMODULE_IGNORE_UNTRACKED, git_submodule_ignore(sm1));
|
||||
cl_assert_equal_i(
|
||||
GIT_SUBMODULE_UPDATE_REBASE, git_submodule_update_strategy(sm1));
|
||||
cl_assert_equal_i(
|
||||
GIT_SUBMODULE_RECURSE_YES, git_submodule_fetch_recurse_submodules(sm1));
|
||||
|
||||
/* 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_branch(sm1, old_branch));
|
||||
cl_assert_equal_i(
|
||||
GIT_SUBMODULE_IGNORE_UNTRACKED,
|
||||
git_submodule_set_ignore(sm1, GIT_SUBMODULE_IGNORE_RESET));
|
||||
cl_assert_equal_i(
|
||||
GIT_SUBMODULE_UPDATE_REBASE,
|
||||
git_submodule_set_update(sm1, GIT_SUBMODULE_UPDATE_RESET));
|
||||
cl_assert_equal_i(
|
||||
GIT_SUBMODULE_RECURSE_YES, git_submodule_set_fetch_recurse_submodules(
|
||||
sm1, GIT_SUBMODULE_RECURSE_RESET));
|
||||
|
||||
/* check that revert was successful */
|
||||
cl_assert_equal_s(old_url, git_submodule_url(sm1));
|
||||
cl_assert_equal_s(old_branch, git_submodule_branch(sm1));
|
||||
cl_assert_equal_i((int)old_ignore, (int)git_submodule_ignore(sm1));
|
||||
cl_assert_equal_i((int)old_update, (int)git_submodule_update_strategy(sm1));
|
||||
cl_assert_equal_i(
|
||||
old_fetchrecurse, git_submodule_fetch_recurse_submodules(sm1));
|
||||
|
||||
/* modify properties of submodule (again) */
|
||||
cl_git_pass(git_submodule_set_url(sm1, SM_LIBGIT2_URL));
|
||||
cl_git_pass(git_submodule_set_branch(sm1, SM_LIBGIT2_BRANCH));
|
||||
git_submodule_set_ignore(sm1, GIT_SUBMODULE_IGNORE_UNTRACKED);
|
||||
git_submodule_set_update(sm1, GIT_SUBMODULE_UPDATE_REBASE);
|
||||
git_submodule_set_fetch_recurse_submodules(sm1, GIT_SUBMODULE_RECURSE_YES);
|
||||
|
||||
/* call save */
|
||||
cl_git_pass(git_submodule_save(sm1));
|
||||
|
||||
/* attempt to "revert" values */
|
||||
git_submodule_set_ignore(sm1, GIT_SUBMODULE_IGNORE_RESET);
|
||||
git_submodule_set_update(sm1, GIT_SUBMODULE_UPDATE_RESET);
|
||||
|
||||
/* but ignore and update should NOT revert because the RESET
|
||||
* should now be the newly saved value...
|
||||
*/
|
||||
cl_assert_equal_i(
|
||||
(int)GIT_SUBMODULE_IGNORE_UNTRACKED, (int)git_submodule_ignore(sm1));
|
||||
cl_assert_equal_i(
|
||||
(int)GIT_SUBMODULE_UPDATE_REBASE, (int)git_submodule_update_strategy(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 */
|
||||
cl_git_pass(git_submodule_reload(sm1, 0));
|
||||
|
||||
cl_assert_equal_s(SM_LIBGIT2_URL, git_submodule_url(sm1));
|
||||
cl_assert_equal_s(SM_LIBGIT2_BRANCH, git_submodule_branch(sm1));
|
||||
cl_assert_equal_i(
|
||||
(int)GIT_SUBMODULE_IGNORE_UNTRACKED, (int)git_submodule_ignore(sm1));
|
||||
cl_assert_equal_i(
|
||||
(int)GIT_SUBMODULE_UPDATE_REBASE, (int)git_submodule_update_strategy(sm1));
|
||||
cl_assert_equal_i(GIT_SUBMODULE_RECURSE_YES, git_submodule_fetch_recurse_submodules(sm1));
|
||||
|
||||
/* unset branch again and verify that the property is deleted in config */
|
||||
cl_git_pass(git_submodule_set_branch(sm1, NULL));
|
||||
cl_git_pass(git_submodule_save(sm1));
|
||||
cl_git_pass(git_submodule_reload(sm1, 0));
|
||||
cl_assert_equal_s(NULL, git_submodule_branch(sm1));
|
||||
|
||||
/* open a second copy of the repo and compare submodule */
|
||||
cl_git_pass(git_repository_open(&r2, "submod2"));
|
||||
cl_git_pass(git_submodule_lookup(&sm2, r2, "sm_changed_head"));
|
||||
|
||||
cl_assert_equal_s(SM_LIBGIT2_URL, git_submodule_url(sm2));
|
||||
cl_assert_equal_i(
|
||||
GIT_SUBMODULE_IGNORE_UNTRACKED, git_submodule_ignore(sm2));
|
||||
cl_assert_equal_i(
|
||||
GIT_SUBMODULE_UPDATE_REBASE, git_submodule_update_strategy(sm2));
|
||||
cl_assert_equal_i(
|
||||
GIT_SUBMODULE_RECURSE_NO, git_submodule_fetch_recurse_submodules(sm2));
|
||||
|
||||
/* set fetchRecurseSubmodules on-demand */
|
||||
cl_git_pass(git_submodule_reload(sm1, 0));
|
||||
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, 0));
|
||||
cl_assert_equal_i(
|
||||
GIT_SUBMODULE_RECURSE_ONDEMAND, git_submodule_fetch_recurse_submodules(sm1));
|
||||
|
||||
git_submodule_free(sm1);
|
||||
git_submodule_free(sm2);
|
||||
git_repository_free(r2);
|
||||
git__free(old_url);
|
||||
}
|
||||
|
||||
void test_submodule_modify__save_last(void)
|
||||
void assert_ignore_change(git_submodule_ignore_t ignore)
|
||||
{
|
||||
git_submodule *sm;
|
||||
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_gitmodules_only"));
|
||||
cl_git_pass(git_submodule_save(sm));
|
||||
cl_git_pass(git_submodule_set_ignore(g_repo, "sm_changed_head", ignore));
|
||||
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head"));
|
||||
cl_assert_equal_i(ignore, git_submodule_ignore(sm));
|
||||
git_submodule_free(sm);
|
||||
}
|
||||
|
||||
void test_submodule_modify__set_ignore(void)
|
||||
{
|
||||
assert_ignore_change(GIT_SUBMODULE_IGNORE_UNTRACKED);
|
||||
assert_ignore_change(GIT_SUBMODULE_IGNORE_NONE);
|
||||
assert_ignore_change(GIT_SUBMODULE_IGNORE_ALL);
|
||||
}
|
||||
|
||||
void assert_update_change(git_submodule_update_t update)
|
||||
{
|
||||
git_submodule *sm;
|
||||
|
||||
cl_git_pass(git_submodule_set_update(g_repo, "sm_changed_head", update));
|
||||
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head"));
|
||||
cl_assert_equal_i(update, git_submodule_update_strategy(sm));
|
||||
git_submodule_free(sm);
|
||||
}
|
||||
|
||||
void test_submodule_modify__set_update(void)
|
||||
{
|
||||
assert_update_change(GIT_SUBMODULE_UPDATE_REBASE);
|
||||
assert_update_change(GIT_SUBMODULE_UPDATE_NONE);
|
||||
assert_update_change(GIT_SUBMODULE_UPDATE_CHECKOUT);
|
||||
}
|
||||
|
||||
void assert_recurse_change(git_submodule_recurse_t recurse)
|
||||
{
|
||||
git_submodule *sm;
|
||||
|
||||
cl_git_pass(git_submodule_set_fetch_recurse_submodules(g_repo, "sm_changed_head", recurse));
|
||||
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head"));
|
||||
cl_assert_equal_i(recurse, git_submodule_fetch_recurse_submodules(sm));
|
||||
git_submodule_free(sm);
|
||||
}
|
||||
|
||||
void test_submodule_modify__set_fetch_recurse_submodules(void)
|
||||
{
|
||||
assert_recurse_change(GIT_SUBMODULE_RECURSE_YES);
|
||||
assert_recurse_change(GIT_SUBMODULE_RECURSE_NO);
|
||||
assert_recurse_change(GIT_SUBMODULE_RECURSE_ONDEMAND);
|
||||
}
|
||||
|
||||
void test_submodule_modify__set_branch(void)
|
||||
{
|
||||
git_submodule *sm;
|
||||
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head"));
|
||||
cl_assert(git_submodule_branch(sm) == NULL);
|
||||
git_submodule_free(sm);
|
||||
|
||||
cl_git_pass(git_submodule_set_branch(g_repo, "sm_changed_head", SM_LIBGIT2_BRANCH));
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head"));
|
||||
cl_assert_equal_s(SM_LIBGIT2_BRANCH, git_submodule_branch(sm));
|
||||
git_submodule_free(sm);
|
||||
|
||||
cl_git_pass(git_submodule_set_branch(g_repo, "sm_changed_head", NULL));
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head"));
|
||||
cl_assert(git_submodule_branch(sm) == NULL);
|
||||
git_submodule_free(sm);
|
||||
}
|
||||
|
||||
void test_submodule_modify__set_url(void)
|
||||
{
|
||||
git_submodule *sm;
|
||||
|
||||
cl_git_pass(git_submodule_set_url(g_repo, "sm_changed_head", SM_LIBGIT2_URL));
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_changed_head"));
|
||||
cl_assert_equal_s(SM_LIBGIT2_URL, git_submodule_url(sm));
|
||||
git_submodule_free(sm);
|
||||
}
|
||||
|
@ -21,19 +21,11 @@ void test_submodule_nosubs__lookup(void)
|
||||
|
||||
cl_assert_equal_i(GIT_EEXISTS, git_submodule_lookup(&sm, repo, "subrepo"));
|
||||
|
||||
cl_git_pass(git_submodule_reload_all(repo, 0));
|
||||
|
||||
cl_assert_equal_i(GIT_ENOTFOUND, git_submodule_lookup(&sm, repo, "subdir"));
|
||||
|
||||
cl_assert_equal_i(GIT_EEXISTS, git_submodule_lookup(&sm, repo, "subrepo"));
|
||||
}
|
||||
|
||||
void test_submodule_nosubs__immediate_reload(void)
|
||||
{
|
||||
git_repository *repo = cl_git_sandbox_init("status");
|
||||
cl_git_pass(git_submodule_reload_all(repo, 0));
|
||||
}
|
||||
|
||||
static int fake_submod_cb(git_submodule *sm, const char *n, void *p)
|
||||
{
|
||||
GIT_UNUSED(sm); GIT_UNUSED(n); GIT_UNUSED(p);
|
||||
@ -57,53 +49,17 @@ void test_submodule_nosubs__add(void)
|
||||
git_submodule_free(sm2);
|
||||
|
||||
cl_git_pass(git_submodule_foreach(repo, fake_submod_cb, NULL));
|
||||
cl_git_pass(git_submodule_reload_all(repo, 0));
|
||||
|
||||
git_submodule_free(sm);
|
||||
}
|
||||
|
||||
void test_submodule_nosubs__reload_add_reload(void)
|
||||
{
|
||||
git_repository *repo = cl_git_sandbox_init("status");
|
||||
git_submodule *sm;
|
||||
|
||||
cl_git_pass(git_submodule_reload_all(repo, 0));
|
||||
|
||||
/* try one add with a reload (to make sure no errors happen) */
|
||||
|
||||
cl_git_pass(git_submodule_add_setup(&sm, repo,
|
||||
"https://github.com/libgit2/libgit2.git", "submodules/libgit2", 1));
|
||||
|
||||
cl_git_pass(git_submodule_reload_all(repo, 0));
|
||||
|
||||
cl_assert_equal_s("submodules/libgit2", git_submodule_name(sm));
|
||||
git_submodule_free(sm);
|
||||
|
||||
cl_git_pass(git_submodule_lookup(&sm, repo, "submodules/libgit2"));
|
||||
cl_assert_equal_s("submodules/libgit2", git_submodule_name(sm));
|
||||
git_submodule_free(sm);
|
||||
|
||||
/* try one add without a reload (to make sure cache inval works, too) */
|
||||
|
||||
cl_git_pass(git_submodule_add_setup(&sm, repo,
|
||||
"https://github.com/libgit2/libgit2.git", "libgit2-again", 1));
|
||||
cl_assert_equal_s("libgit2-again", git_submodule_name(sm));
|
||||
git_submodule_free(sm);
|
||||
|
||||
cl_git_pass(git_submodule_lookup(&sm, repo, "libgit2-again"));
|
||||
cl_assert_equal_s("libgit2-again", git_submodule_name(sm));
|
||||
git_submodule_free(sm);
|
||||
}
|
||||
|
||||
void test_submodule_nosubs__bad_gitmodules(void)
|
||||
{
|
||||
git_repository *repo = cl_git_sandbox_init("status");
|
||||
|
||||
cl_git_mkfile("status/.gitmodules", "[submodule \"foobar\"]\tpath=blargle\n\turl=\n\tbranch=\n\tupdate=flooble\n\n");
|
||||
cl_git_fail(git_submodule_reload_all(repo, 0));
|
||||
|
||||
cl_git_rewritefile("status/.gitmodules", "[submodule \"foobar\"]\tpath=blargle\n\turl=\n\tbranch=\n\tupdate=rebase\n\n");
|
||||
cl_git_pass(git_submodule_reload_all(repo, 0));
|
||||
|
||||
cl_git_pass(git_submodule_lookup(NULL, repo, "foobar"));
|
||||
cl_assert_equal_i(GIT_ENOTFOUND, git_submodule_lookup(NULL, repo, "subdir"));
|
||||
|
@ -107,56 +107,47 @@ void test_submodule_status__ignore_none(void)
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_INDEX_DELETED) != 0);
|
||||
}
|
||||
|
||||
static int set_sm_ignore(git_submodule *sm, const char *name, void *payload)
|
||||
{
|
||||
git_submodule_ignore_t ignore = *(git_submodule_ignore_t *)payload;
|
||||
GIT_UNUSED(name);
|
||||
git_submodule_set_ignore(sm, ignore);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void test_submodule_status__ignore_untracked(void)
|
||||
{
|
||||
unsigned int status;
|
||||
git_submodule_ignore_t ign = GIT_SUBMODULE_IGNORE_UNTRACKED;
|
||||
|
||||
rm_submodule("sm_unchanged");
|
||||
cl_git_pass(git_submodule_foreach(g_repo, set_sm_ignore, &ign));
|
||||
|
||||
refute_submodule_exists(g_repo, "just_a_dir", GIT_ENOTFOUND);
|
||||
refute_submodule_exists(g_repo, "not-submodule", GIT_EEXISTS);
|
||||
refute_submodule_exists(g_repo, "not", GIT_EEXISTS);
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_changed_index");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_index", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED) != 0);
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_changed_head");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_head", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_WD_MODIFIED) != 0);
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_changed_file");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_file", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_WD_WD_MODIFIED) != 0);
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_changed_untracked_file");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_untracked_file", ign));
|
||||
cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status));
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_missing_commits");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_missing_commits", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_WD_MODIFIED) != 0);
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_added_and_uncommited");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_added_and_uncommited", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_INDEX_ADDED) != 0);
|
||||
|
||||
/* removed sm_unchanged for deleted workdir */
|
||||
status = get_submodule_status(g_repo, "sm_unchanged");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_unchanged", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_WD_DELETED) != 0);
|
||||
|
||||
/* now mkdir sm_unchanged to test uninitialized */
|
||||
cl_git_pass(git_futils_mkdir("sm_unchanged", "submod2", 0755, 0));
|
||||
status = get_submodule_status(g_repo, "sm_unchanged");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_unchanged", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_WD_UNINITIALIZED) != 0);
|
||||
|
||||
/* update sm_changed_head in index */
|
||||
add_submodule_to_index("sm_changed_head");
|
||||
status = get_submodule_status(g_repo, "sm_changed_head");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_head", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_INDEX_MODIFIED) != 0);
|
||||
}
|
||||
|
||||
@ -166,42 +157,41 @@ void test_submodule_status__ignore_dirty(void)
|
||||
git_submodule_ignore_t ign = GIT_SUBMODULE_IGNORE_DIRTY;
|
||||
|
||||
rm_submodule("sm_unchanged");
|
||||
cl_git_pass(git_submodule_foreach(g_repo, set_sm_ignore, &ign));
|
||||
|
||||
refute_submodule_exists(g_repo, "just_a_dir", GIT_ENOTFOUND);
|
||||
refute_submodule_exists(g_repo, "not-submodule", GIT_EEXISTS);
|
||||
refute_submodule_exists(g_repo, "not", GIT_EEXISTS);
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_changed_index");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_index", ign));
|
||||
cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status));
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_changed_head");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_head", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_WD_MODIFIED) != 0);
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_changed_file");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_file", ign));
|
||||
cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status));
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_changed_untracked_file");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_untracked_file", ign));
|
||||
cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status));
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_missing_commits");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_missing_commits", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_WD_MODIFIED) != 0);
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_added_and_uncommited");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_added_and_uncommited", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_INDEX_ADDED) != 0);
|
||||
|
||||
/* removed sm_unchanged for deleted workdir */
|
||||
status = get_submodule_status(g_repo, "sm_unchanged");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_unchanged", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_WD_DELETED) != 0);
|
||||
|
||||
/* now mkdir sm_unchanged to test uninitialized */
|
||||
cl_git_pass(git_futils_mkdir("sm_unchanged", "submod2", 0755, 0));
|
||||
status = get_submodule_status(g_repo, "sm_unchanged");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_unchanged", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_WD_UNINITIALIZED) != 0);
|
||||
|
||||
/* update sm_changed_head in index */
|
||||
add_submodule_to_index("sm_changed_head");
|
||||
status = get_submodule_status(g_repo, "sm_changed_head");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_head", ign));
|
||||
cl_assert((status & GIT_SUBMODULE_STATUS_INDEX_MODIFIED) != 0);
|
||||
}
|
||||
|
||||
@ -211,42 +201,41 @@ void test_submodule_status__ignore_all(void)
|
||||
git_submodule_ignore_t ign = GIT_SUBMODULE_IGNORE_ALL;
|
||||
|
||||
rm_submodule("sm_unchanged");
|
||||
cl_git_pass(git_submodule_foreach(g_repo, set_sm_ignore, &ign));
|
||||
|
||||
refute_submodule_exists(g_repo, "just_a_dir", GIT_ENOTFOUND);
|
||||
refute_submodule_exists(g_repo, "not-submodule", GIT_EEXISTS);
|
||||
refute_submodule_exists(g_repo, "not", GIT_EEXISTS);
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_changed_index");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_index", ign));
|
||||
cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status));
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_changed_head");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_head", ign));
|
||||
cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status));
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_changed_file");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_file", ign));
|
||||
cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status));
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_changed_untracked_file");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_untracked_file", ign));
|
||||
cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status));
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_missing_commits");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_missing_commits", ign));
|
||||
cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status));
|
||||
|
||||
status = get_submodule_status(g_repo, "sm_added_and_uncommited");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_added_and_uncommited", ign));
|
||||
cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status));
|
||||
|
||||
/* removed sm_unchanged for deleted workdir */
|
||||
status = get_submodule_status(g_repo, "sm_unchanged");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_unchanged", ign));
|
||||
cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status));
|
||||
|
||||
/* now mkdir sm_unchanged to test uninitialized */
|
||||
cl_git_pass(git_futils_mkdir("sm_unchanged", "submod2", 0755, 0));
|
||||
status = get_submodule_status(g_repo, "sm_unchanged");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_unchanged", ign));
|
||||
cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status));
|
||||
|
||||
/* update sm_changed_head in index */
|
||||
add_submodule_to_index("sm_changed_head");
|
||||
status = get_submodule_status(g_repo, "sm_changed_head");
|
||||
cl_git_pass(git_submodule_status(&status, g_repo,"sm_changed_head", ign));
|
||||
cl_assert(GIT_SUBMODULE_STATUS_IS_UNMODIFIED(status));
|
||||
}
|
||||
|
||||
|
@ -156,21 +156,18 @@ void refute__submodule_exists(
|
||||
git_repository *repo, const char *name, int expected_error,
|
||||
const char *msg, const char *file, int line)
|
||||
{
|
||||
git_submodule *sm;
|
||||
clar__assert_equal(
|
||||
file, line, msg, 1, "%i",
|
||||
expected_error, (int)(git_submodule_lookup(&sm, repo, name)));
|
||||
expected_error, (int)(git_submodule_lookup(NULL, repo, name)));
|
||||
}
|
||||
|
||||
unsigned int get_submodule_status(git_repository *repo, const char *name)
|
||||
{
|
||||
git_submodule *sm = NULL;
|
||||
unsigned int status = 0;
|
||||
|
||||
cl_git_pass(git_submodule_lookup(&sm, repo, name));
|
||||
cl_assert(sm);
|
||||
cl_git_pass(git_submodule_status(&status, sm));
|
||||
git_submodule_free(sm);
|
||||
assert(repo && name);
|
||||
|
||||
cl_git_pass(git_submodule_status(&status, repo, name, GIT_SUBMODULE_IGNORE_FALLBACK));
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -103,7 +103,7 @@ void test_submodule_update__update_submodule(void)
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo"));
|
||||
|
||||
/* verify the initial state of the submodule */
|
||||
cl_git_pass(git_submodule_status(&submodule_status, sm));
|
||||
cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_FALLBACK));
|
||||
cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD |
|
||||
GIT_SUBMODULE_STATUS_IN_INDEX |
|
||||
GIT_SUBMODULE_STATUS_IN_CONFIG |
|
||||
@ -114,7 +114,7 @@ void test_submodule_update__update_submodule(void)
|
||||
cl_git_pass(git_submodule_update(sm, 0, &update_options));
|
||||
|
||||
/* verify state */
|
||||
cl_git_pass(git_submodule_status(&submodule_status, sm));
|
||||
cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_FALLBACK));
|
||||
cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD |
|
||||
GIT_SUBMODULE_STATUS_IN_INDEX |
|
||||
GIT_SUBMODULE_STATUS_IN_CONFIG |
|
||||
@ -142,7 +142,7 @@ void test_submodule_update__update_and_init_submodule(void)
|
||||
/* get the submodule */
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo"));
|
||||
|
||||
cl_git_pass(git_submodule_status(&submodule_status, sm));
|
||||
cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_FALLBACK));
|
||||
cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD |
|
||||
GIT_SUBMODULE_STATUS_IN_INDEX |
|
||||
GIT_SUBMODULE_STATUS_IN_CONFIG |
|
||||
@ -177,7 +177,7 @@ void test_submodule_update__update_already_checked_out_submodule(void)
|
||||
/* Initialize and update the sub repository */
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo"));
|
||||
|
||||
cl_git_pass(git_submodule_status(&submodule_status, sm));
|
||||
cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_FALLBACK));
|
||||
cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD |
|
||||
GIT_SUBMODULE_STATUS_IN_INDEX |
|
||||
GIT_SUBMODULE_STATUS_IN_CONFIG |
|
||||
@ -203,7 +203,11 @@ void test_submodule_update__update_already_checked_out_submodule(void)
|
||||
* HEAD commit and index should be updated, but not the workdir.
|
||||
*/
|
||||
|
||||
cl_git_pass(git_submodule_status(&submodule_status, sm));
|
||||
cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_FALLBACK));
|
||||
|
||||
git_submodule_free(sm);
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo"));
|
||||
|
||||
cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD |
|
||||
GIT_SUBMODULE_STATUS_IN_INDEX |
|
||||
GIT_SUBMODULE_STATUS_IN_CONFIG |
|
||||
@ -251,7 +255,7 @@ void test_submodule_update__update_blocks_on_dirty_wd(void)
|
||||
/* Initialize and update the sub repository */
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo"));
|
||||
|
||||
cl_git_pass(git_submodule_status(&submodule_status, sm));
|
||||
cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_FALLBACK));
|
||||
cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD |
|
||||
GIT_SUBMODULE_STATUS_IN_INDEX |
|
||||
GIT_SUBMODULE_STATUS_IN_CONFIG |
|
||||
@ -277,7 +281,11 @@ void test_submodule_update__update_blocks_on_dirty_wd(void)
|
||||
* HEAD commit and index should be updated, but not the workdir.
|
||||
*/
|
||||
|
||||
cl_git_pass(git_submodule_status(&submodule_status, sm));
|
||||
cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_FALLBACK));
|
||||
|
||||
git_submodule_free(sm);
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo"));
|
||||
|
||||
cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD |
|
||||
GIT_SUBMODULE_STATUS_IN_INDEX |
|
||||
GIT_SUBMODULE_STATUS_IN_CONFIG |
|
||||
@ -324,7 +332,7 @@ void test_submodule_update__can_force_update(void)
|
||||
/* Initialize and update the sub repository */
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo"));
|
||||
|
||||
cl_git_pass(git_submodule_status(&submodule_status, sm));
|
||||
cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_FALLBACK));
|
||||
cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD |
|
||||
GIT_SUBMODULE_STATUS_IN_INDEX |
|
||||
GIT_SUBMODULE_STATUS_IN_CONFIG |
|
||||
@ -349,7 +357,11 @@ void test_submodule_update__can_force_update(void)
|
||||
* Verify state after checkout of parent repository. The submodule ID in the
|
||||
* HEAD commit and index should be updated, but not the workdir.
|
||||
*/
|
||||
cl_git_pass(git_submodule_status(&submodule_status, sm));
|
||||
cl_git_pass(git_submodule_status(&submodule_status, g_repo, "testrepo", GIT_SUBMODULE_IGNORE_FALLBACK));
|
||||
|
||||
git_submodule_free(sm);
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo"));
|
||||
|
||||
cl_assert_equal_i(submodule_status, GIT_SUBMODULE_STATUS_IN_HEAD |
|
||||
GIT_SUBMODULE_STATUS_IN_INDEX |
|
||||
GIT_SUBMODULE_STATUS_IN_CONFIG |
|
||||
|
Loading…
Reference in New Issue
Block a user