summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <junkio@cox.net>2007-04-13 03:23:20 -0700
committerLibravatar Junio C Hamano <junkio@cox.net>2007-04-13 19:34:35 -0700
commit1ad029b6a1e2fb0254667a2bea8d1ee180cc6ac7 (patch)
treefa691b3722da005643fbb65c61258a1adb770c33
parentUse rev-list --reverse in git-rebase.sh (diff)
downloadtgif-1ad029b6a1e2fb0254667a2bea8d1ee180cc6ac7.tar.xz
Do not default to --no-index when given two directories.
git-diff -- a/ b/ always defaulted to --no-index, primarily because the function is_in_index() was implemented quite incorrectly. Noticed by Patrick Maaß and Simon Schubert independently, initial patch was provided by Patrick but I fixed it differently. Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--diff-lib.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/diff-lib.c b/diff-lib.c
index 5c5b05bfe3..7531e20c78 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -142,18 +142,34 @@ static int queue_diff(struct diff_options *o,
}
}
+/*
+ * Does the path name a blob in the working tree, or a directory
+ * in the working tree?
+ */
static int is_in_index(const char *path)
{
- int len = strlen(path);
- int pos = cache_name_pos(path, len);
- char c;
-
- if (pos < 0)
- return 0;
- if (strncmp(active_cache[pos]->name, path, len))
- return 0;
- c = active_cache[pos]->name[len];
- return c == '\0' || c == '/';
+ int len, pos;
+ struct cache_entry *ce;
+
+ len = strlen(path);
+ while (path[len-1] == '/')
+ len--;
+ if (!len)
+ return 1; /* "." */
+ pos = cache_name_pos(path, len);
+ if (0 <= pos)
+ return 1;
+ pos = -1 - pos;
+ while (pos < active_nr) {
+ ce = active_cache[pos++];
+ if (ce_namelen(ce) <= len ||
+ strncmp(ce->name, path, len) ||
+ (ce->name[len] > '/'))
+ break; /* path cannot be a prefix */
+ if (ce->name[len] == '/')
+ return 1;
+ }
+ return 0;
}
static int handle_diff_files_args(struct rev_info *revs,