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 <redacted>
---
Jeff King [off-list ref] 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, '.');