The "Consier running git-status" warning message we experimented during the 1.5.3 cycle turns out to be a bad idea. It robbed cache-dirty information from people who valued it, while still asking users to run "update-index --refresh". It was hoped that the new behaviour would at least have some educational value, but not showing the cache-dirty paths like before means the user would not even know easily which paths are cache-dirty. This commit reinstates the traditional behaviour as the default, but with a twist. If you set diff.autorefreshindex configuration variable, it squelches the empty "diff --git" output, and at the end of the command, it automatically runs "update-index --refresh" without even bothering the user. In other words, with the configuration variable set, people who do not care about the cache-dirtyness do not even have to see the warning. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- Jeff King <peff@xxxxxxxx> writes: > FWIW, I find the new message terribly ugly compared to the old behavior. > There have been many output changes that I didn't like at first, but for > which I held my tongue and eventually grew to like when they became more > familiar (e.g., the 'subject' line after git-commit). > > But I just can't seem to find this one anything but ugly; everytime I > see it, I involuntarily cringe. Perhaps because it really looks like an > error message that accidentally got stuck in the diff output through > incompetent redirection of stdout/stderr. > > I say this not to start a flame war (which is perhaps inevitable), but I > just wonder if others feel the same, now that they have had a chance to > get used to it. Same here. This patch saw only very light testing, but I personally think is a sane thing to do before 1.5.3 final. builtin-diff.c | 31 ++++++++++++++++++++++++++----- cache.h | 3 +++ diff.c | 5 +++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/builtin-diff.c b/builtin-diff.c index 6ed7b68..4ffbbad 100644 --- a/builtin-diff.c +++ b/builtin-diff.c @@ -188,6 +188,30 @@ void add_head(struct rev_info *revs) add_pending_object(revs, obj, "HEAD"); } +static void refresh_index_quietly(void) +{ + struct lock_file *lock_file; + int fd; + + lock_file = xcalloc(1, sizeof(struct lock_file)); + fd = hold_locked_index(lock_file, 0); + if (fd < 0) + return; + discard_cache(); + read_cache(); + refresh_cache(REFRESH_QUIET|REFRESH_UNMERGED); + if (active_cache_changed) { + if (write_cache(fd, active_cache, active_nr) || + close(fd) || + commit_locked_index(lock_file)) + ; /* + * silently ignore it -- we haven't mucked + * with the real index. + */ + } + rollback_lock_file(lock_file); +} + int cmd_diff(int argc, const char **argv, const char *prefix) { int i; @@ -222,7 +246,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix) prefix = setup_git_directory_gently(&nongit); git_config(git_diff_ui_config); init_revisions(&rev, prefix); - rev.diffopt.skip_stat_unmatch = 1; + rev.diffopt.skip_stat_unmatch = !!diff_auto_refresh_index; if (!setup_diff_no_index(&rev, argc, argv, nongit, prefix)) argc = 0; @@ -348,9 +372,6 @@ int cmd_diff(int argc, const char **argv, const char *prefix) if ((rev.diffopt.output_format & DIFF_FORMAT_PATCH) && (1 < rev.diffopt.skip_stat_unmatch)) - printf("Warning: %d path%s touched but unmodified. " - "Consider running git-status.\n", - rev.diffopt.skip_stat_unmatch - 1, - rev.diffopt.skip_stat_unmatch == 2 ? "" : "s"); + refresh_index_quietly(); return result; } diff --git a/cache.h b/cache.h index c7e00e7..70abbd5 100644 --- a/cache.h +++ b/cache.h @@ -594,6 +594,9 @@ extern char *convert_to_git(const char *path, const char *src, unsigned long *si extern char *convert_to_working_tree(const char *path, const char *src, unsigned long *sizep); extern void *convert_sha1_file(const char *path, const unsigned char *sha1, unsigned int mode, enum object_type *type, unsigned long *size); +/* diff.c */ +extern int diff_auto_refresh_index; + /* match-trees.c */ void shift_tree(const unsigned char *, const unsigned char *, unsigned char *, int); diff --git a/diff.c b/diff.c index a7e7671..75d95da 100644 --- a/diff.c +++ b/diff.c @@ -19,6 +19,7 @@ static int diff_detect_rename_default; static int diff_rename_limit_default = -1; static int diff_use_color_default; +int diff_auto_refresh_index; static char diff_colors[][COLOR_MAXLEN] = { "\033[m", /* reset */ @@ -166,6 +167,10 @@ int git_diff_ui_config(const char *var, const char *value) diff_detect_rename_default = DIFF_DETECT_RENAME; return 0; } + if (!strcmp(var, "diff.autorefreshindex")) { + diff_auto_refresh_index = git_config_bool(var, value); + return 0; + } if (!prefixcmp(var, "diff.")) { const char *ep = strrchr(var, '.'); - 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