If a non-standard prefix is used by --no-prefix, --src-prefix,
or --dst-prefix options, the resulting diff becomes something
git-apply would not grok. In such a case, we should not trigger
the more strict check git-apply does for "diff --git" format.
This checks the prefix specified when generating diff and if src
and dst prefix are not one-level of directory name followed by a
slash (i.e. the standard "diff --git a/foo b/foo" is fine, a
custom "diff --git l/foo k/foo" is Ok, but "diff --git foo foo"
is NOT Ok).
---
diff.c | 52 ++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 40 insertions(+), 12 deletions(-)
diff --git a/diff.c b/diff.c
index b18c140..8126a74 100644
--- a/diff.c
+++ b/diff.c
@@ -1233,6 +1233,18 @@ static const char *diff_funcname_pattern(struct diff_filespec *one)
return NULL;
}
+static int with_standard_prefix(struct diff_options *o)
+{
+ const char *slash;
+ slash = strchr(o->a_prefix, '/');
+ if (!slash || slash[1])
+ return 0;
+ slash = strchr(o->b_prefix, '/');
+ if (!slash || slash[1])
+ return 0;
+ return 1;
+}
+
static void builtin_diff(const char *name_a,
const char *name_b,
struct diff_filespec *one,
@@ -1246,30 +1258,46 @@ static void builtin_diff(const char *name_a,
char *a_one, *b_two;
const char *set = diff_get_color_opt(o, DIFF_METAINFO);
const char *reset = diff_get_color_opt(o, DIFF_RESET);
+ int is_git_diff = with_standard_prefix(o);
a_one = quote_two(o->a_prefix, name_a + (*name_a == '/'));
b_two = quote_two(o->b_prefix, name_b + (*name_b == '/'));
lbl[0] = DIFF_FILE_VALID(one) ? a_one : "/dev/null";
lbl[1] = DIFF_FILE_VALID(two) ? b_two : "/dev/null";
- printf("%sdiff --git %s %s%s\n", set, a_one, b_two, reset);
+
+ if (!is_git_diff)
+ printf("%sIndex: %s%s\n", set, b_two, reset);
+ else
+ printf("%sdiff --git %s %s%s\n", set, a_one, b_two, reset);
+
if (lbl[0][0] == '/') {
/* /dev/null */
- printf("%snew file mode %06o%s\n", set, two->mode, reset);
- if (xfrm_msg && xfrm_msg[0])
- printf("%s%s%s\n", set, xfrm_msg, reset);
+ if (is_git_diff) {
+ printf("%snew file mode %06o%s\n",
+ set, two->mode, reset);
+ if (xfrm_msg && xfrm_msg[0])
+ printf("%s%s%s\n", set, xfrm_msg, reset);
+ }
}
else if (lbl[1][0] == '/') {
- printf("%sdeleted file mode %06o%s\n", set, one->mode, reset);
- if (xfrm_msg && xfrm_msg[0])
- printf("%s%s%s\n", set, xfrm_msg, reset);
+ if (is_git_diff) {
+ printf("%sdeleted file mode %06o%s\n",
+ set, one->mode, reset);
+ if (xfrm_msg && xfrm_msg[0])
+ printf("%s%s%s\n", set, xfrm_msg, reset);
+ }
}
else {
- if (one->mode != two->mode) {
- printf("%sold mode %06o%s\n", set, one->mode, reset);
- printf("%snew mode %06o%s\n", set, two->mode, reset);
+ if (is_git_diff) {
+ if (one->mode != two->mode) {
+ printf("%sold mode %06o%s\n",
+ set, one->mode, reset);
+ printf("%snew mode %06o%s\n",
+ set, two->mode, reset);
+ }
+ if (xfrm_msg && xfrm_msg[0])
+ printf("%s%s%s\n", set, xfrm_msg, reset);
}
- if (xfrm_msg && xfrm_msg[0])
- printf("%s%s%s\n", set, xfrm_msg, reset);
/*
* we do not run diff between different kind
* of objects.
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html| Zach Brown | [PATCH 3 of 4] Teach paths to wake a specific void * target instead of a whole tas... |
| Linus Torvalds | Re: LSM conversion to static interface |
| Greg Kroah-Hartman | [PATCH 001/196] Chinese: Add the known_regression URI to the HOWTO |
| Andrew Morton | -mm merge plans for 2.6.23 |
git: | |
| Gregory Haskins | [RFC PATCH 00/17] virtual-bus |
| David Miller | [GIT]: Networking |
| Jarek Poplawski | Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
