# HG changeset patch # User Eric S. Raymond # Date 1192115432 0 # Node ID 9b4cc51391e5f5bba9453f6ee94833ca06b3319c # Parent 497e90db3e18c361a7676b2a227af5a012fb9f2d Address an edge case in vc-diff. This is an experimental fix and may change. diff -r 497e90db3e18 -r 9b4cc51391e5 lisp/vc.el --- 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)