Re: [PATCH v3] Enable minimal stat checking
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jan 22, 2013, 17:21 UTC
- Message-ID
- <7va9s19lrb.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <1358840962-12316-1-git-send-email-robin.rosenberg@dewire.com>
Robin Rosenberg <robin.rosenberg@dewire.com> writes:
Show 15 quoted lines
> Specifically the fields uid, gid, ctime, ino and dev are set to zero > by JGit. Other implementations, eg. Git in cygwin are allegedly also > somewhat incompatible with Git For Windows and on *nix platforms > the resolution of the timestamps may differ. > > Any stat checking by git will then need to check content, which may > be very slow, particularly on Windows. Since mtime and size > is typically enough we should allow the user to tell git to avoid > checking these fields if they are set to zero in the index. > > This change introduces a core.checkstat config option where the > the user can select to check all fields (default), or just size > and the whole second part of mtime (minimal). > > Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
The "trust_ctime ? check_stat : trust_ctime/*false*/" gave me the same "Huh?" as it did to J6t, so I locally fixed them while applying.
Also, even though we settled on "default/minimal", we may regret in the future if old implementations died on an unrecognized value, as that will forbid users from using an old Git and a new Git on the same repository at the same time, so I'd suggest removing the "if not default or minimal, die" and replacing it with "treat unknown token as a do-no-harm no-op".
Interdiff would look like this.
Thanks.
config.c | 2 -- read-cache.c | 12 ++++++------ 2 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/config.c b/config.c index 2b58c75..3f638e3 100644 --- a/config.c +++ b/config.c @@ -571,8 +571,6 @@ static int git_default_core_config(const char *var, const char *value) check_stat = 1; else if (!strcasecmp(value, "minimal")) check_stat = 0; - else - die_bad_config(var); } if (!strcmp(var, "core.quotepath")) { diff --git a/read-cache.c b/read-cache.c index 23db681..827ae55 100644 --- a/read-cache.c +++ b/read-cache.c @@ -197,16 +197,16 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st) } if (ce->ce_mtime.sec != (unsigned int)st->st_mtime) changed |= MTIME_CHANGED; - if (trust_ctime ? check_stat : trust_ctime/*false*/) - if (ce->ce_ctime.sec != (unsigned int)st->st_ctime) - changed |= CTIME_CHANGED; + if (trust_ctime && check_stat && + ce->ce_ctime.sec != (unsigned int)st->st_ctime) + changed |= CTIME_CHANGED; #ifdef USE_NSEC if (check_stat && ce->ce_mtime.nsec != ST_MTIME_NSEC(*st)) changed |= MTIME_CHANGED; - if (trust_ctime ? check_stat : trust_ctime/*false*/) - if (ce->ce_ctime.nsec != ST_CTIME_NSEC(*st)) - changed |= CTIME_CHANGED; + if (trust_ctime && check_stat && + ce->ce_ctime.nsec != ST_CTIME_NSEC(*st)) + changed |= CTIME_CHANGED; #endif if (check_stat) {