When we know that mtime is fully supported by the environment, we don't want any slow down because we used --untracked-cache rather than --force-untracked-cache, and we don't want untracked cache to stop working because we updated a kernel. Also when we know that mtime is not supported by the environment, for example because the repo is shared over a network file system, then we might want 'git update-index --untracked-cache' to fail immediately instead of it testing if it works (because it might work on some systems using the repo over the network file system but not others). Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> --- At Booking.com we know that mtime works everywhere and we don't want the untracked cache to stop working when a kernel is upgraded or when the repo is copied to a machine with a different kernel. I will add tests later if people are ok with this. Documentation/config.txt | 8 ++++++++ Documentation/git-update-index.txt | 6 +++++- builtin/update-index.c | 6 +++++- cache.h | 1 + config.c | 7 +++++++ contrib/completion/git-completion.bash | 1 + dir.c | 2 +- environment.c | 1 + 8 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index b4b0194..186ad17 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -308,6 +308,14 @@ core.trustctime:: crawlers and some backup systems). See linkgit:git-update-index[1]. True by default. +core.trustmtime:: + If unset or set to 'default' or 'check', Git will test if + mtime is working properly before using features that need a + working mtime. If false, Git will refuse to use such + features. If set to true, Git will blindly use such features + without testing if they work. + See linkgit:git-update-index[1]. + core.checkStat:: Determines which stat fields to match between the index and work tree. The user can set this to 'default' or diff --git a/Documentation/git-update-index.txt b/Documentation/git-update-index.txt index 1a296bc..8b4c5af 100644 --- a/Documentation/git-update-index.txt +++ b/Documentation/git-update-index.txt @@ -182,7 +182,9 @@ may not support it yet. For safety, `--untracked-cache` performs tests on the working directory to make sure untracked cache can be used. These tests can take a few seconds. `--force-untracked-cache` can be - used to skip the tests. + used to skip the tests. If you always want to skip those + tests, you can set the `core.trustmtime` configuration + variable to 'true', (see linkgit:git-config[1]). \--:: Do not interpret any more arguments as options. @@ -398,6 +400,8 @@ It can be useful when the inode change time is regularly modified by something outside Git (file system crawlers and backup systems use ctime for marking files processed) (see linkgit:git-config[1]). +Untracked cache needs a fully working mtime, so it will look at +`core.trustmtime` configuration variable (see linkgit:git-config[1]). SEE ALSO -------- diff --git a/builtin/update-index.c b/builtin/update-index.c index 7431938..c64439f 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -1107,9 +1107,13 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) if (untracked_cache > 0) { struct untracked_cache *uc; + if (trust_mtime == 0) { + fprintf_ln(stderr,_("core.trustmtime is set to false")); + return 1; + } if (untracked_cache < 2) { setup_work_tree(); - if (!test_if_untracked_cache_is_supported()) + if (trust_mtime != 1 && !test_if_untracked_cache_is_supported()) return 1; } if (!the_index.untracked) { diff --git a/cache.h b/cache.h index 736abc0..69a6197 100644 --- a/cache.h +++ b/cache.h @@ -601,6 +601,7 @@ extern void set_alternate_index_output(const char *); /* Environment bits from configuration mechanism */ extern int trust_executable_bit; extern int trust_ctime; +extern int trust_mtime; extern int check_stat; extern int quote_path_fully; extern int has_symlinks; diff --git a/config.c b/config.c index 248a21a..d720b1f 100644 --- a/config.c +++ b/config.c @@ -691,6 +691,13 @@ static int git_default_core_config(const char *var, const char *value) trust_ctime = git_config_bool(var, value); return 0; } + if (!strcmp(var, "core.trustmtime")) { + if (!strcasecmp(value, "default") || !strcasecmp(value, "check")) + trust_mtime = -1; + else + trust_mtime = git_config_maybe_bool(var, value); + return 0; + } if (!strcmp(var, "core.checkstat")) { if (!strcasecmp(value, "default")) check_stat = 1; diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 482ca84..39d1c9b 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -2038,6 +2038,7 @@ _git_config () core.sparseCheckout core.symlinks core.trustctime + core.trustmtime core.warnAmbiguousRefs core.whitespace core.worktree diff --git a/dir.c b/dir.c index d2a8f06..b06df1b 100644 --- a/dir.c +++ b/dir.c @@ -1994,7 +1994,7 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d if (dir->exclude_list_group[EXC_CMDL].nr) return NULL; - if (!ident_in_untracked(dir->untracked)) { + if (trust_mtime != 1 && !ident_in_untracked(dir->untracked)) { warning(_("Untracked cache is disabled on this system.")); return NULL; } diff --git a/environment.c b/environment.c index 2da7fe2..c899947 100644 --- a/environment.c +++ b/environment.c @@ -14,6 +14,7 @@ int trust_executable_bit = 1; int trust_ctime = 1; +int trust_mtime = -1; int check_stat = 1; int has_symlinks = 1; int minimum_abbrev = 4, default_abbrev = 7; -- 2.6.3.380.g494b52d -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html