Subject: [PATCH] Only use core 'git diff' if both paths are within the repo.

From: Anthony Foiani <[email-masked]>
Date: Sun, 22 May 2011 22:44:16 -0600

The core 'git diff' engine can only handle pathspecs that are within a
given repo.  Make sure that we don't invoke it unless both pathspec
values are in the repo.

Signed-off-by: Anthony Foiani <[email-masked]>
---
 diff-no-index.c |   39 ++++++++++++---------------------------
 1 files changed, 12 insertions(+), 27 deletions(-)

diff --git a/diff-no-index.c b/diff-no-index.c
index 3172788..b651f6d 100644
--- a/diff-no-index.c
+++ b/diff-no-index.c
@@ -227,43 +227,28 @@ void diff_no_index(struct rev_info *revs,
 	/* If --no-index wasn't specified explicitly, check to see if
 	 * we need to force it. */
 	if (!no_index) {
-
-		/* The first pathspec is the "left hand side" */
-		const char *lhs = (n_paths >= 1) ? argv[i] : NULL;
-		const int lhs_in_repo = lhs && path_in_repo(lhs);
-
-		/* And the second is the "right hand side" */
-		const char *rhs = (n_paths >= 2) ? argv[i+1] : NULL;
-		const int rhs_in_repo = rhs && path_in_repo(rhs);
-
-		int force_no_index = 0;
-
 		if (nongit) {
 			warning("'git diff' outside a repo, forcing --no-index");
-			force_no_index = 1;
 		}
 		else {
-			if (lhs_in_repo || rhs_in_repo)
-				return; /* Normal git diff, let core handle it. */
-
-			const int lhs_untracked = (lhs && !lhs_in_repo);
-			const int rhs_untracked = (rhs && !rhs_in_repo);
+			/* lhs = "left hand side", rhs = "right hand side" */
+			const char *lhs = (n_paths >= 1) ? argv[i] : NULL;
+			const char *rhs = (n_paths >= 2) ? argv[i+1] : NULL;
+			const int lhs_tracked = lhs && path_in_repo(lhs);
+			const int rhs_tracked = rhs && path_in_repo(rhs);
 
-			if (lhs_untracked && rhs_untracked)
-				warning("neither '%s' nor '%s' are tracked,"
-					" forcing --no-index", lhs, rhs );
-			else if (lhs_untracked)
+			if (lhs_tracked && rhs_tracked)
+				return; /* Normal git diff, let core handle it. */
+			else if (!lhs_tracked)
 				warning("'%s' is not tracked,"
 					" forcing --no-index", lhs );
-			else if (rhs_untracked)
+			else if (!rhs_tracked)
 				warning("'%s' is not tracked,"
 					" forcing --no-index", rhs );
-
-			force_no_index = lhs_untracked || rhs_untracked;
+			else
+				warning("neither '%s' nor '%s' are tracked,"
+					" forcing --no-index", lhs, rhs );
 		}
-
-		if (!force_no_index) /* Impossible? */
-			die("--no-index not set and not forced");
 	}
 
 	if (n_paths != 2) {
-- 
1.7.4.4