diff lisp/efs/dired-diff.el @ 22:8fc7fe29b841 r19-15b94

Import from CVS: tag r19-15b94
author cvs
date Mon, 13 Aug 2007 08:50:29 +0200
parents
children 7e54bd776075 9f59509498e1
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/efs/dired-diff.el	Mon Aug 13 08:50:29 2007 +0200
@@ -0,0 +1,164 @@
+;; -*-Emacs-Lisp-*-
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; File:           dired-diff.el
+;; RCS:
+;; Dired Version:  $Revision: 1.1 $
+;; Description:    Support for diff and related commands.
+;; Author:         Sandy Rutherford <sandy@ibm550.sissa.it>
+;; Created:        Fri Jun 24 08:50:20 1994 by sandy on ibm550
+;; 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; This program is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 1, or (at your option)
+;;; any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; A copy of the GNU General Public License can be obtained from this
+;;; program's author (send electronic mail to sandy@ibm550.sissa.it) or
+;;; from the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+;;; MA 02139, USA.
+
+(provide 'dired-diff)
+(require 'dired)
+
+(defvar emerge-last-dir-input)
+(defvar emerge-last-dir-output)
+(defvar emerge-last-dir-ancestor)
+(defvar diff-switches)
+
+(defun dired-diff-read-file-name (prompt)
+  ;; Read and return a file name for diff.
+  (let* ((mark-active t)
+	 (default (and (mark)
+		       (save-excursion
+			 (goto-char (mark))
+			 (dired-get-filename nil t)))))
+    (read-file-name (format "%s %s with: %s"
+			    prompt (dired-get-filename 'no-dir)
+			    (if default
+				(concat "["
+					(dired-make-relative
+					 default
+					 (dired-current-directory) t)
+					"] ")
+			      ""))
+		    (default-directory) default t)))
+
+(defun dired-diff-read-switches (switchprompt)
+  ;; Read and return a list of switches
+  (or (boundp 'diff-switches)
+      (require 'diff)) ; Make sure that `diff-switches' is defined.
+  (let* ((default (if (listp diff-switches)
+		      (mapconcat 'identity diff-switches " ")
+		    diff-switches))
+	 (switches
+	  (read-string (format switchprompt default) default)))
+    (let (result (start 0))
+      (while (string-match "\\(\\S-+\\)" switches start)
+	(setq result (cons (substring switches (match-beginning 1)
+				      (match-end 1))
+			   result)
+	      start (match-end 0)))
+      (nreverse result))))
+
+(defun dired-diff (file &optional switches)
+  "Compare file at point with file FILE using `diff'.
+FILE defaults to the file at the mark.
+The prompted-for file is the first file given to `diff'.
+With a prefix allows the switches for the diff program to be edited."
+  (interactive
+   (list
+    (dired-diff-read-file-name "Diff") 
+    (and current-prefix-arg (dired-diff-read-switches "Options for diff: "))))
+  (if switches
+      (diff file (dired-get-filename) switches)
+    (diff file (dired-get-filename))))
+
+(defun dired-backup-diff (&optional switches)
+  "Diff this file with its backup file or vice versa.
+Uses the latest backup, if there are several numerical backups.
+If this file is a backup, diff it with its original.
+The backup file is the first file given to `diff'."
+  (interactive (list (and current-prefix-arg
+			  (dired-diff-read-switches "Diff with switches: "))))
+  (if switches
+      (diff-backup (dired-get-filename) switches)
+    (diff-backup (dired-get-filename))))
+
+(defun dired-emerge (arg file out-file)
+  "Merge file at point with FILE using `emerge'.
+FILE defaults to the file at the mark."
+  (interactive
+   (let ((file (dired-diff-read-file-name "Merge")))
+     (list
+      current-prefix-arg
+      file
+      (and current-prefix-arg (emerge-read-file-name
+			       "Output file"
+			       emerge-last-dir-output
+			       (dired-abbreviate-file-name file) file)))))
+  (emerge-files arg file (dired-get-filename) out-file))
+
+(defun dired-emerge-with-ancestor (arg file ancestor file-out)
+  "Merge file at point with FILE, using a common ANCESTOR file.
+FILE defaults to the file at the mark."
+  (interactive
+   (let ((file (dired-diff-read-file-name "Merge")))
+     (list
+      current-prefix-arg
+      file
+      (emerge-read-file-name "Ancestor file" emerge-last-dir-ancestor nil file)
+      (and current-prefix-arg (emerge-read-file-name
+			       "Output file"
+			       emerge-last-dir-output
+			       (dired-abbreviate-file-name file) file)))))
+  (emerge-files-with-ancestor arg file (dired-get-filename)
+			      ancestor file-out))
+
+(defun dired-ediff (file)
+  "Ediff file at point with FILE.
+FILE defaults to the file at the mark."
+  (interactive (list (dired-diff-read-file-name "Ediff")))
+  (ediff-files file (dired-get-filename)))
+
+(defun dired-epatch (file)
+  "Patch file at point using `epatch'."
+  (interactive
+   (let ((file (dired-get-filename)))
+     (list
+      (and (or (memq 'patch dired-no-confirm)
+	       (y-or-n-p (format "Patch %s? "
+				(file-name-nondirectory file))))
+	   file))))
+  (if file
+      (ediff-patch-file file)
+    (message "No file patched.")))
+
+;;; Autoloads
+
+;;; Diff (diff)
+
+(autoload 'diff "diff" "Diff two files." t)
+(autoload 'diff-backup "diff"
+	  "Diff this file with its backup or vice versa." t)
+
+;;; Emerge
+
+(autoload 'emerge-files "emerge" "Merge two files." t)
+(autoload 'emerge-files-with-ancestor "emerge"
+	 "Merge two files having a common ancestor." t)
+(autoload 'emerge-read-file-name "emerge")
+
+;; Ediff
+
+(autoload 'ediff-files "ediff" "Ediff two files." t)
+(autoload 'ediff-patch-file "ediff" "Patch a file." t)
+
+;;; end of dired-diff.el