aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrĂ© Spiegel <[email protected]>2006-06-23 17:29:19 +0000
committerAndrĂ© Spiegel <[email protected]>2006-06-23 17:29:19 +0000
commit48033a08abf857780d8ec2cad67e1147db5b5458 (patch)
treec92f9c4c838e18755c19d528161c940e08cf47ae
parent11eced2faf50f6089b48101191295e7b5a2b01da (diff)
(vc-diff-knows-L): New variable.
(vc-diff-internal): Use it to handle "diff" programs that don't understand -L. This works automatically, no user action is necessary.
-rw-r--r--lisp/vc.el45
1 files changed, 35 insertions, 10 deletions
diff --git a/lisp/vc.el b/lisp/vc.el
index 54237800e3..c395a25798 100644
--- a/lisp/vc.el
+++ b/lisp/vc.el
@@ -567,6 +567,13 @@ specific to any particular backend."
:group 'vc
:version "21.1")
+(defcustom vc-diff-knows-L nil
+ "*Indicates whether diff understands the -L option.
+The value is either `yes', `no', or nil. If it is nil, VC tries
+to use -L and sets this variable to remember whether it worked."
+ :type '(choice (const :tag "Work out" nil) (const yes) (const no))
+ :group 'vc)
+
(defcustom vc-allow-async-revert nil
"Specifies whether the diff during \\[vc-revert-buffer] may be asynchronous.
Enabling this option means that you can confirm a revert operation even
@@ -1837,18 +1844,36 @@ actually call the backend, but performs a local diff."
(vc-version-backup-file file rev2)))
(coding-system-for-read (vc-coding-system-for-diff file)))
(if (and file-rev1 file-rev2)
- (apply 'vc-do-command "*vc-diff*" 1 "diff" nil
- (append (vc-switches nil 'diff)
- ;; Provide explicit labels like RCS or CVS would do
- ;; so diff-mode refers to `file' rather than to
- ;; `file-rev1' when trying to find/apply/undo hunks.
- (list "-L" (vc-diff-label file file-rev1 rev1)
- "-L" (vc-diff-label file file-rev2 rev2)
- (file-relative-name file-rev1)
- (file-relative-name file-rev2))))
+ (let ((status
+ (if (eq vc-diff-knows-L 'no)
+ (apply 'vc-do-command "*vc-diff*" 1 "diff"
+ (append (vc-switches nil 'diff)
+ (list (file-relative-name file-rev1)
+ (file-relative-name file-rev2))))
+ (apply 'vc-do-command "*vc-diff*" 2 "diff" nil
+ (append (vc-switches nil 'diff)
+ ;; Provide explicit labels like RCS or
+ ;; CVS would do so diff-mode refers to
+ ;; `file' rather than to `file-rev1'
+ ;; when trying to find/apply/undo
+ ;; hunks.
+ (list "-L" (vc-diff-label file file-rev1 rev1)
+ "-L" (vc-diff-label file file-rev2 rev2)
+ (file-relative-name file-rev1)
+ (file-relative-name file-rev2)))))))
+ (if (eq status 2)
+ (if (not vc-diff-knows-L)
+ (setq vc-diff-knows-L 'no
+ status (apply 'vc-do-command "*vc-diff*" 1 "diff"
+ (append
+ (vc-switches nil 'diff)
+ (list (file-relative-name file-rev1)
+ (file-relative-name file-rev2)))))
+ (error "diff failed"))
+ (if (not vc-diff-knows-L) (setq vc-diff-knows-L 'yes)))
+ status)
(vc-call diff file rev1 rev2))))
-
(defun vc-switches (backend op)
(let ((switches
(or (if backend