changeset 85165:9b4cc51391e5

Address an edge case in vc-diff. This is an experimental fix and may change.
author Eric S. Raymond <esr@snark.thyrsus.com>
date Thu, 11 Oct 2007 15:10:32 +0000
parents 497e90db3e18
children c08d5f729dcc
files lisp/vc.el
diffstat 1 files changed, 31 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/vc.el	Thu Oct 11 14:47:16 2007 +0000
+++ b/lisp/vc.el	Thu Oct 11 15:10:32 2007 +0000
@@ -1985,24 +1985,41 @@
       (error "Not a valid revision range."))
   (vc-diff-internal backend t files rev1 rev2 (interactive-p)))
 
+(defun vc-contains-version-controlled-file (dir)
+  "Return t if DIR contains a version-controlled file, nil otherwise."
+  (catch 'found
+    (mapc (lambda (f) (and (not (file-directory-p f)) (vc-backend f) (throw 'found 't))) (directory-files dir))
+    nil))
+
 ;;;###autoload
 (defun vc-diff (historic)
   "Display diffs between file revisions.
-Normally this compares the current file and buffer with the most
-recent checked in revision of that file.  This uses no arguments.  With
-a prefix argument HISTORIC, it reads the file name to use and two
-revision designators specifying which revisions to compare."
+Normally this compares the currently selected fileset with their
+working revisions. With a prefix argument HISTORIC, it reads two revision
+designators specifying which revisions to compare.
+
+If no current fileset is available (that is, we are not in
+VC-Dired mode and the visited file of the current buffer is not
+under version control) behave specially; if there are
+version-controlled files in the current directory, treat all
+version-controlled files recursively beneath the current
+directory as the selected fileset.
+"
+
   (interactive "P")
-  (if historic
-      (call-interactively 'vc-history-diff)
-    (let* ((files (vc-deduce-fileset t))
-	   (first (car files))
-	   (backend 
-	    (cond ((file-directory-p first)
-		   (vc-responsible-backend first))
-		  (t
-		   (vc-backend first)))))
-      (vc-diff-internal backend t files nil nil (interactive-p)))))
+  (cond ((not (vc-contains-version-controlled-file default-directory))
+	 (error "No version-controlled files directly beneath default directory"))
+	(historic
+	 (call-interactively 'vc-history-diff))
+	(t
+	 (let* ((files (vc-deduce-fileset t))
+		(first (car files))
+		(backend 
+		 (cond ((file-directory-p first)
+			(vc-responsible-backend first))
+		       (t
+			(vc-backend first)))))
+	   (vc-diff-internal backend t files nil nil (interactive-p))))))
 
 ;;;###autoload
 (defun vc-revision-other-window (rev)