Mercurial > hg > xemacs-beta
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