annotate lisp/packages/backup-dir.el @ 213:78f53ef88e17 r20-4b5

Import from CVS: tag r20-4b5
author cvs
date Mon, 13 Aug 2007 10:06:47 +0200
parents e45d5e7c476e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
1 ;;; BACKUP-DIR.EL: Emacs functions to allow backup files to live in
213
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
2 ;;; some other directory(s). Version 2.1
12
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
3 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
4 ;;; Copyright (C) 1992-97 Greg Klanderman
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
5 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
6 ;;; This program is free software; you can redistribute it and/or modify
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
7 ;;; it under the terms of the GNU General Public License as published by
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
8 ;;; the Free Software Foundation; either version 1, or (at your option)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
9 ;;; any later version.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
10 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
11 ;;; This program is distributed in the hope that it will be useful,
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
12 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
13 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
14 ;;; GNU General Public License for more details.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
15 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
16 ;;; A copy of the GNU General Public License can be obtained from
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
17 ;;; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
18 ;;; 02139, USA.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
19 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
20 ;;; Send bug reports, etc. to greg@alphatech.com or gregk@ai.mit.edu.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
21 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
22 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
23 ;;; Modification History
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
24 ;;; ====================
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
25 ;;;
213
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
26 ;;; 10/27/1997 Version 2.1
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
27 ;;; Updated to support GNU Emacs 20.2. The function `backup-extract-version'
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
28 ;;; now uses the free variable `backup-extract-version-start' rather than
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
29 ;;; `bv-length'. Note, we continue to support older GNU Emacs and XEmacsen.
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
30 ;;;
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
31 ;;; 10/22/1997
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
32 ;;; Customization by Karl M. Hegbloom <karlheg@inetarena.com>
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
33 ;;;
12
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
34 ;;; 12/28/1996 Version 2.0
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
35 ;;; Updated for XEmacs 19.15b4, much of code reorganized & cleaned up
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
36 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
37 ;;; 12/27/1996 Version 1.6
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
38 ;;; explicit loading of dired replaced to use dired-load-hook
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
39 ;;; (suggested by Thomas Feuster, feuster@tp4.physik.uni-giessen.de)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
40 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
41 ;;; 12/2/1996 Version 1.5
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
42 ;;; Took out obsolete byte compiler options
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
43 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
44 ;;; 9/24/1996 Version 1.4
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
45 ;;; Fix some bugs, change to alist OPTIONS list (ok-create, full-path..) from
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
46 ;;; separate fields for each option variable. Added search-upward option.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
47 ;;; Added new function `find-file-latest-backup' to find a file's latest backup.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
48 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
49 ;;; 1/26/1996 Version 1.3
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
50 ;;; Name change to backup-dir.el
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
51 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
52 ;;; 3/22/1995 Version 1.2
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
53 ;;; Added new definitions for functions `file-newest-backup', `latest-backup-file',
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
54 ;;; and `diff-latest-backup-file' so various other emacs functions will find the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
55 ;;; right backup files.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
56 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
57 ;;; 4/23/1993 Version 1.1
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
58 ;;; Reworked to allow different behavior for different files based on the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
59 ;;; alist `bkup-backup-directory-info'.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
60 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
61 ;;; Fall 1992 Version 1.0
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
62 ;;; Name change and added ability to make directories absolute. Added the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
63 ;;; full path stuff to make backup name unique for absolute directories.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
64 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
65 ;;; Spring 1992 Version 0.0
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
66 ;;; Original
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
67 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
68 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
69 ;;; Description:
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
70 ;;; ============
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
71 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
72 ;;; Allows backup files to be optionally stored in some directories, based on
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
73 ;;; the value of the alist, `bkup-backup-directory-info'. This variable is a
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
74 ;;; list of lists of the form (FILE-REGEXP BACKUP-DIR OPTIONS ...). If the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
75 ;;; filename to be backed up matches FILE-REGEXP, or FILE-REGEXP is t, then
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
76 ;;; BACKUP-DIR is used as the path for its backups. Directories may begin with
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
77 ;;; "/" to specify an absolute pathname. If BACKUP-DIR does not exist and
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
78 ;;; OPTIONS contains the symbol `ok-create', then it is created if possible.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
79 ;;; Otherwise the usual behavior (backup in the same directory as the file)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
80 ;;; results. If OPTIONS contains the symbol `full-path', then the full path of
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
81 ;;; the file being backed up is prepended to the backup file name, with each "/"
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
82 ;;; replaced by a "!". This is intended for cases where an absolute backup path
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
83 ;;; is used. If OPTIONS contains the symbol `search-upward' and the backup
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
84 ;;; directory BACKUP-DIR is a relative path, then a directory with that name is
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
85 ;;; searched for starting at the current directory and proceeding upward (..,
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
86 ;;; ../.., etc) until one is found of that name or the root is reached, and if
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
87 ;;; one is found it is used as the backup directory. Finally, if no FILE-REGEXP
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
88 ;;; matches the file name being backed up, then the usual behavior results.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
89 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
90 ;;; These lines from my .emacs load this file and set the values I like:
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
91 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
92 ;;; (require 'backup-dir)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
93 ;;; (setq bkup-backup-directory-info
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
94 ;;; '(("/home/greg/.*" "/~/.backups/" ok-create full-path)
213
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
95 ;;; ("^/[^/:]+:" ".backups/") ; handle EFS files specially: we don't
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
96 ;;; ("^/[^/:]+:" "./") ; want to search-upward... its very slow
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
97 ;;; (t ".backups/" full-path search-upward)))
12
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
98 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
99 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
100 ;;; The package also provides a new function, `find-file-latest-backup' to find
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
101 ;;; the latest backup file for the current buffer's file.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
102 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
103 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
104 ;;; This file is based on `files.el' from XEmacs 19.15b4.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
105 ;;; It has not been extensively tested on GNU Emacs past 18.58.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
106 ;;; It does not work under ms-dos.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
107
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
108
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
109 (byte-compiler-options
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
110 (optimize t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
111 (warnings (- free-vars)) ; Don't warn about free variables
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
112 )
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
113
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
114
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
115 ;;; New variables affecting backup file behavior
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
116 ;;; This is the only user-customizable variable for this package.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
117 ;;;
207
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
118 (defcustom bkup-backup-directory-info nil
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
119 "*Alist of (FILE-REGEXP BACKUP-DIR OPTIONS ...))
12
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
120 If the filename to be backed up matches FILE-REGEXP, or FILE-REGEXP is t,
207
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
121 then BACKUP-DIR is used as the path for its backups.
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
122
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
123 Directories may begin with \"/\" to specify an absolute pathname.
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
124
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
125 If BACKUP-DIR does not exist and OPTIONS contains the symbol `ok-create',
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
126 then it is created if possible. Otherwise the usual behavior (backup in the
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
127 same directory as the file) results.
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
128
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
129 If OPTIONS contains the symbol `full-path', then the full path of the file
12
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
130 being backed up is prepended to the backup file name, with each \"/\"
207
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
131 replaced by a \"!\". This is intended for cases where an absolute backup
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
132 path is used.
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
133
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
134 If OPTIONS contains the symbol `search-upward' and the backup directory
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
135 BACKUP-DIR is a relative path, then a directory with that name is searched
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
136 for starting at the current directory and proceeding upward (.., ../.., etc)
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
137 until one is found of that name, or the root is reached, and if one is found
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
138 it is used as the backup directory.
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
139
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
140 Finally, if no FILE-REGEXP matches the file name being backed up, then the
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
141 usual behavior results.
12
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
142
207
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
143 Once you save this variable with `M-x customize-variable',
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
144 `backup-dir' will be loaded for you each time you start XEmacs."
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
145 :type '(repeat
213
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
146 (list (regexp :tag "File regexp")
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
147 (string :tag "Backup Dir")
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
148 (set :inline t
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
149 (const ok-create)
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
150 (const full-path)
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
151 (const search-upward))))
207
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
152 :require 'backup-dir
e45d5e7c476e Import from CVS: tag r20-4b2
cvs
parents: 12
diff changeset
153 :group 'backup)
213
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
154
12
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
155
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
156 ;;; New functions
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
157 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
158 (defun bkup-search-upward-for-backup-dir (base bd-name)
213
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
159 "Search upward for a directory named BD-NAME, starting in the
12
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
160 directory BASE and continuing with its parent directories until
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
161 one is found or the root is reached."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
162 (let ((prev nil) (curr base) (gotit nil) (tryit nil))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
163 (while (and (not gotit)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
164 (not (equal prev curr))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
165 (not (equal curr "//")))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
166 (setq prev curr)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
167 (setq curr (expand-file-name (concat curr "../")))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
168 (setq tryit (expand-file-name bd-name curr))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
169 (if (and (file-directory-p tryit) (file-exists-p tryit))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
170 (setq gotit tryit)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
171 (if (and gotit
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
172 (eq (aref gotit (1- (length gotit))) ?/))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
173 (setq gotit (substring gotit 0 (1- (length gotit)))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
174 gotit))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
175
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
176 (defun bkup-replace-slashes-with-exclamations (s)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
177 "Replaces slashes in the string S with exclamations.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
178 A new string is produced and returned."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
179 (let ((ns (copy-sequence s))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
180 (i (1- (length s))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
181 (while (>= i 0)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
182 (if (= (aref ns i) ?/)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
183 (aset ns i ?!))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
184 (setq i (1- i)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
185 ns))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
186
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
187 (defun bkup-try-making-directory (dir)
213
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
188 "Try making directory DIR, return non-nil if successful"
12
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
189 (condition-case ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
190 (progn (make-directory dir t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
191 t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
192 (t
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
193 nil)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
194
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
195 (defun bkup-backup-basename (file full-path)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
196 "Gives the base part of the backup name for FILE, according to FULL-PATH."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
197 (if full-path
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
198 (bkup-replace-slashes-with-exclamations file)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
199 (file-name-nondirectory file)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
200
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
201 (defun bkup-backup-directory-and-basename (file)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
202 "Return the cons of the backup directory name
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
203 and backup file name base for FILE."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
204 (let ((file (expand-file-name file)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
205 (let ((dir (file-name-directory file))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
206 (alist bkup-backup-directory-info)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
207 (bk-dir nil)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
208 (bk-base nil))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
209 (if (listp alist)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
210 (while (and (not bk-dir) alist)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
211 (if (or (eq (car (car alist)) t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
212 (eq (string-match (car (car alist)) file) 0))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
213 (let* ((bd (car (cdr (car alist))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
214 (bd-rel-p (and (> (length bd) 0)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
215 (not (eq (aref bd 0) ?/))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
216 (bd-expn (expand-file-name bd dir))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
217 (bd-noslash (if (eq (aref bd-expn (1- (length bd-expn))) ?/)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
218 (substring bd-expn 0 (1- (length bd-expn)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
219 bd-expn))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
220 (options (cdr (cdr (car alist))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
221 (ok-create (and (memq 'ok-create options) t))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
222 (full-path (and (memq 'full-path options) t))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
223 (search-upward (and (memq 'search-upward options) t)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
224 (if bd-expn
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
225 (cond ((or (file-directory-p bd-expn)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
226 (and ok-create
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
227 (not (file-exists-p bd-expn))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
228 (bkup-try-making-directory bd-noslash)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
229 (setq bk-dir (concat bd-noslash "/")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
230 bk-base (bkup-backup-basename file full-path)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
231 ((and bd-rel-p search-upward)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
232 (let ((bd-up (bkup-search-upward-for-backup-dir dir bd)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
233 (if bd-up
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
234 (setq bk-dir (concat bd-up "/")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
235 bk-base (bkup-backup-basename file full-path)))))))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
236 (setq alist (cdr alist))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
237 (if (and bk-dir bk-base)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
238 (cons bk-dir bk-base)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
239 (cons dir (bkup-backup-basename file nil))))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
240
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
241
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
242 ;;; This next one is based on the following from `files.el'
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
243 ;;; but accepts a second optional argument
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
244
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
245 ;;(defun make-backup-file-name (file)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
246 ;; "Create the non-numeric backup file name for FILE.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
247 ;;This is a separate function so you can redefine it for customization."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
248 ;; (if (and (eq system-type 'ms-dos)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
249 ;; (not (msdos-long-file-names)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
250 ;; (let ((fn (file-name-nondirectory file)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
251 ;; (concat (file-name-directory file)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
252 ;; (if (string-match "\\([^.]*\\)\\(\\..*\\)?" fn)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
253 ;; (substring fn 0 (match-end 1)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
254 ;; ".bak"))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
255 ;; (concat file "~")))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
256
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
257 (defun bkup-make-backup-file-name (file &optional dir-n-base)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
258 "Create the non-numeric backup file name for FILE.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
259 Optionally accept a list containing the backup directory and
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
260 backup basename. NB: we don't really handle ms-dos."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
261 (if (and (eq system-type 'ms-dos)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
262 (not (and (fboundp 'msdos-long-file-names) (msdos-long-file-names))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
263 (let ((fn (file-name-nondirectory file)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
264 (concat (file-name-directory file)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
265 (if (string-match "\\([^.]*\\)\\(\\..*\\)?" fn)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
266 (substring fn 0 (match-end 1)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
267 ".bak"))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
268 (let ((d-n-b (or dir-n-base
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
269 (bkup-backup-directory-and-basename file))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
270 (concat (car d-n-b) (cdr d-n-b) "~"))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
271
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
272 (defun bkup-existing-backup-files (fn)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
273 "Return list of existing backup files for file"
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
274 (let* ((efn (expand-file-name fn))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
275 (dir-n-base (bkup-backup-directory-and-basename efn))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
276 (non-num-bk-name (bkup-make-backup-file-name efn dir-n-base))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
277 (non-num-bk (file-exists-p non-num-bk-name))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
278 (backup-dir (car dir-n-base))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
279 (base-versions (concat (cdr dir-n-base) ".~"))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
280 (possibilities (file-name-all-completions base-versions backup-dir))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
281 (poss (mapcar #'(lambda (name) (concat backup-dir name)) possibilities)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
282 (mapcar #'expand-file-name
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
283 (if non-num-bk (cons non-num-bk-name poss) poss))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
284
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
285 (defun find-file-latest-backup (file)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
286 "Find the latest backup file for FILE"
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
287 (interactive (list (read-file-name (format "Find latest backup of file (default %s): "
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
288 (file-name-nondirectory (buffer-file-name)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
289 nil (buffer-file-name) t)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
290 (let ((backup (file-newest-backup file)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
291 (if backup
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
292 (find-file backup)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
293 (message "no backups found for `%s'" file))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
294
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
295
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
296 ;;; Functions changed from `files.el' and elsewhere -- originals precede new versions
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
297
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
298 ;;(defun make-backup-file-name (file)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
299 ;; "Create the non-numeric backup file name for FILE.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
300 ;;This is a separate function so you can redefine it for customization."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
301 ;; (if (and (eq system-type 'ms-dos)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
302 ;; (not (msdos-long-file-names)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
303 ;; (let ((fn (file-name-nondirectory file)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
304 ;; (concat (file-name-directory file)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
305 ;; (if (string-match "\\([^.]*\\)\\(\\..*\\)?" fn)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
306 ;; (substring fn 0 (match-end 1)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
307 ;; ".bak"))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
308 ;; (concat file "~")))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
309
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
310 (defun make-backup-file-name (file)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
311 "Create the non-numeric backup file name for FILE.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
312 This is a separate function so you can redefine it for customization.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
313 *** Changed by \"backup-dir.el\""
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
314 (bkup-make-backup-file-name file))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
315
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
316
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
317 ;;(defun find-backup-file-name (fn)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
318 ;; "Find a file name for a backup file, and suggestions for deletions.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
319 ;;Value is a list whose car is the name for the backup file
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
320 ;; and whose cdr is a list of old versions to consider deleting now.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
321 ;;If the value is nil, don't make a backup."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
322 ;; (let ((handler (find-file-name-handler fn 'find-backup-file-name)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
323 ;; ;; Run a handler for this function so that ange-ftp can refuse to do it.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
324 ;; (if handler
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
325 ;; (funcall handler 'find-backup-file-name fn)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
326 ;; (if (eq version-control 'never)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
327 ;; (list (make-backup-file-name fn))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
328 ;; (let* ((base-versions (concat (file-name-nondirectory fn) ".~"))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
329 ;; ;; used by backup-extract-version:
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
330 ;; (bv-length (length base-versions))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
331 ;; possibilities
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
332 ;; (versions nil)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
333 ;; (high-water-mark 0)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
334 ;; (deserve-versions-p nil)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
335 ;; (number-to-delete 0))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
336 ;; (condition-case ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
337 ;; (setq possibilities (file-name-all-completions
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
338 ;; base-versions
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
339 ;; (file-name-directory fn))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
340 ;; versions (sort (mapcar
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
341 ;; #'backup-extract-version
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
342 ;; possibilities)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
343 ;; '<)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
344 ;; high-water-mark (apply #'max 0 versions)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
345 ;; deserve-versions-p (or version-control
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
346 ;; (> high-water-mark 0))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
347 ;; number-to-delete (- (length versions)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
348 ;; kept-old-versions kept-new-versions -1))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
349 ;; (file-error
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
350 ;; (setq possibilities nil)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
351 ;; (if (not deserve-versions-p)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
352 ;; (list (make-backup-file-name fn))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
353 ;; (cons (concat fn ".~" (int-to-string (1+ high-water-mark)) "~")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
354 ;; (if (and (> number-to-delete 0)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
355 ;; ;; Delete nothing if there is overflow
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
356 ;; ;; in the number of versions to keep.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
357 ;; (>= (+ kept-new-versions kept-old-versions -1) 0))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
358 ;; (mapcar #'(lambda (n)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
359 ;; (concat fn ".~" (int-to-string n) "~"))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
360 ;; (let ((v (nthcdr kept-old-versions versions)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
361 ;; (rplacd (nthcdr (1- number-to-delete) v) ())
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
362 ;; v))))))))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
363
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
364 (defun find-backup-file-name (fn)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
365 "Find a file name for a backup file, and suggestions for deletions.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
366 Value is a list whose car is the name for the backup file
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
367 and whose cdr is a list of old versions to consider deleting now.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
368 If the value is nil, don't make a backup.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
369 *** Changed by \"backup-dir.el\""
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
370 (let ((handler (find-file-name-handler fn 'find-backup-file-name)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
371 ;; Run a handler for this function so that ange-ftp can refuse to do it.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
372 (if handler
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
373 (funcall handler 'find-backup-file-name fn)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
374 (if (eq version-control 'never)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
375 (list (make-backup-file-name fn))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
376 (let* ((dir-n-base (bkup-backup-directory-and-basename fn)) ;add
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
377 (non-num-bk-name (bkup-make-backup-file-name fn dir-n-base)) ;add
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
378 (bk-dir (car dir-n-base)) ;add
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
379 (bk-base (cdr dir-n-base)) ;add
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
380 (base-versions (concat bk-base ".~")) ;mod
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
381 ;; used by backup-extract-version:
213
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
382 (bv-length (length base-versions)) ;; older GNU Emacsen and XEmacs
78f53ef88e17 Import from CVS: tag r20-4b5
cvs
parents: 207
diff changeset
383 (backup-extract-version-start (length base-versions)) ;; new GNU Emacs (20.2)
12
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
384 possibilities
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
385 (versions nil)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
386 (high-water-mark 0)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
387 (deserve-versions-p nil)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
388 (number-to-delete 0))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
389 (condition-case ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
390 (setq possibilities (file-name-all-completions
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
391 base-versions
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
392 bk-dir) ;mod
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
393 versions (sort (mapcar
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
394 #'backup-extract-version
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
395 possibilities)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
396 '<)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
397 high-water-mark (apply #'max 0 versions)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
398 deserve-versions-p (or version-control
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
399 (> high-water-mark 0))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
400 number-to-delete (- (length versions)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
401 kept-old-versions kept-new-versions -1))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
402 (file-error
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
403 (setq possibilities nil)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
404 (if (not deserve-versions-p)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
405 (list (bkup-make-backup-file-name fn dir-n-base)) ;mod
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
406 (cons (concat bk-dir base-versions (int-to-string (1+ high-water-mark)) "~") ;mod
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
407 (if (and (> number-to-delete 0)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
408 ;; Delete nothing if there is overflow
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
409 ;; in the number of versions to keep.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
410 (>= (+ kept-new-versions kept-old-versions -1) 0))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
411 (mapcar #'(lambda (n)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
412 (concat bk-dir base-versions (int-to-string n) "~")) ;mod
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
413 (let ((v (nthcdr kept-old-versions versions)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
414 (rplacd (nthcdr (1- number-to-delete) v) ())
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
415 v))))))))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
416
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
417
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
418 ;;(defun file-newest-backup (filename)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
419 ;; "Return most recent backup file for FILENAME or nil if no backups exist."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
420 ;; (let* ((filename (expand-file-name filename))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
421 ;; (file (file-name-nondirectory filename))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
422 ;; (dir (file-name-directory filename))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
423 ;; (comp (file-name-all-completions file dir))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
424 ;; newest tem)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
425 ;; (while comp
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
426 ;; (setq tem (car comp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
427 ;; comp (cdr comp))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
428 ;; (cond ((and (backup-file-name-p tem)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
429 ;; (string= (file-name-sans-versions tem) file))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
430 ;; (setq tem (concat dir tem))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
431 ;; (if (or (null newest)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
432 ;; (file-newer-than-file-p tem newest))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
433 ;; (setq newest tem)))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
434 ;; newest))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
435
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
436 (defun file-newest-backup (filename)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
437 "Return most recent backup file for FILENAME or nil if no backups exist.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
438 *** Changed by \"backup-dir.el\""
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
439 (let ((comp (bkup-existing-backup-files filename))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
440 (newest nil)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
441 (file nil))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
442 (while comp
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
443 (setq file (car comp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
444 comp (cdr comp))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
445 (if (and (backup-file-name-p file)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
446 (or (null newest) (file-newer-than-file-p file newest)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
447 (setq newest file)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
448 newest))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
449
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
450
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
451 ;;; patch `latest-backup-file' from "dired"
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
452 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
453 ;;; we use `dired-load-hook' to avoid loading dired now. This speeds things up
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
454 ;;; considerably according to Thomas Feuster, feuster@tp4.physik.uni-giessen.de
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
455 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
456 ;;; one really wonders why there are 3 functions to do the same thing...
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
457 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
458 (defun bkup-patch-latest-backup-file ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
459 (fset 'latest-backup-file (symbol-function 'file-newest-backup))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
460 (remove-hook 'dired-load-hook 'bkup-patch-latest-backup-file))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
461
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
462 (if (featurep 'dired)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
463 ;; if loaded, patch it now
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
464 (fset 'latest-backup-file (symbol-function 'file-newest-backup))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
465 ;; otherwise do it later
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
466 (add-hook 'dired-load-hook 'bkup-patch-latest-backup-file))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
467
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
468
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
469 ;;; patch `diff-latest-backup-file' from "diff"
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
470 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
471 (require 'diff)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
472 (fset 'diff-latest-backup-file (symbol-function 'file-newest-backup))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
473
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
474
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
475 ;;; finally, add to list of features
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
476 ;;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
477 (provide 'backup-dir)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
478
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
479 ;;; backup-dir.el ends here