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 <gitster@pobox.com>
This commit is contained in:
Junio C Hamano
2007-08-31 13:13:42 -07:00
parent 18e32b5b7a
commit aecbf914c4
4 changed files with 45 additions and 7 deletions

View File

@ -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;
}