From aecbf914c43ab76e055fa8a25b12456ae74d91bc Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 31 Aug 2007 13:13:42 -0700 Subject: git-diff: resurrect the traditional empty "diff --git" behaviour The warning message to suggest "Consider running git-status" from "git-diff" that we experimented with 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 meant that the user would not even know easily which paths were cache-dirty, and it made the need to refresh the index look like even more unnecessary chore. This commit reinstates the traditional behaviour, but with a twist. By default, the empty "diff --git" output is totally squelched out from "git diff" output. At the end of the command, it automatically runs "update-index --refresh" as needed, without even bothering the user. In other words, people who do not care about the cache-dirtyness do not even have to see the warning. The traditional behaviour to see the stat-dirty output and to bypassing the overhead of content comparison can be specified by setting the configuration variable diff.autorefreshindex to false. Signed-off-by: Junio C Hamano --- builtin-diff.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) (limited to 'builtin-diff.c') diff --git a/builtin-diff.c b/builtin-diff.c index 6ed7b6842e..f77352b40d 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; @@ -346,11 +370,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix) if (rev.diffopt.exit_with_status) result = rev.diffopt.has_changes; - 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"); + if (1 < rev.diffopt.skip_stat_unmatch) + refresh_index_quietly(); return result; } -- cgit v1.2.1