comparison lisp/auto-save.el @ 371:cc15677e0335 r21-2b1

Import from CVS: tag r21-2b1
author cvs
date Mon, 13 Aug 2007 11:03:08 +0200
parents 19dcec799385
children a300bb07d72d
comparison
equal deleted inserted replaced
370:bd866891f083 371:cc15677e0335
184 ;;;; end of customization 184 ;;;; end of customization
185 185
186 186
187 ;;; Preparations to be done at load time 187 ;;; Preparations to be done at load time
188 188
189 ;; Do not call expand-file-name! This is evaluated at dump time now! 189 (defvar auto-save-directory-fallback (expand-file-name "~/.autosave/")
190 (defvar auto-save-directory-fallback "~/.autosave/"
191 ;; not user-variable-p, see above 190 ;; not user-variable-p, see above
192 "Directory used for local autosaving of remote files if 191 "Directory used for local autosaving of remote files if
193 both `auto-save-directory' and `efs-auto-save-remotely' are nil. 192 both `auto-save-directory' and `efs-auto-save-remotely' are nil.
194 Also used if a working directory to be used for autosaving is not writable. 193 Also used if a working directory to be used for autosaving is not writable.
195 This *must* always be the name of directory that exists or can be 194 This *must* always be the name of directory that exists or can be
198 (defvar auto-save-hash-directory 197 (defvar auto-save-hash-directory
199 (expand-file-name "hash/" (or auto-save-directory 198 (expand-file-name "hash/" (or auto-save-directory
200 auto-save-directory-fallback)) 199 auto-save-directory-fallback))
201 "If non-nil, directory used for hashed autosave filenames.") 200 "If non-nil, directory used for hashed autosave filenames.")
202 201
203 (defun auto-save-checked-directory (dir) 202 (defun auto-save-check-directory (var)
204 "Make sure the directory DIR exists and return it expanded if non-nil." 203 (let ((dir (symbol-value var)))
205 (when dir 204 (if (null dir)
206 (setq dir (expand-file-name dir)) 205 nil
206 ;; Expand and store back into the variable
207 (set var (setq dir (expand-file-name dir)))
207 ;; Make sure directory exists 208 ;; Make sure directory exists
208 (unless (file-directory-p dir) 209 (if (file-directory-p dir)
210 nil
209 ;; Else we create and chmod 0700 the directory 211 ;; Else we create and chmod 0700 the directory
210 (setq dir (directory-file-name dir)) ; some systems need this 212 (setq dir (directory-file-name dir)) ; some systems need this
211 (make-directory dir) 213 (make-directory dir)
212 (set-file-modes dir #o700)) 214 (set-file-modes dir #o700)))))
213 dir)) 215
214 216 (mapc #'auto-save-check-directory
215 ;; This make no sense at dump time 217 '(auto-save-directory auto-save-directory-fallback))
216 ;; (mapc #'auto-save-check-directory 218
217 ; '(auto-save-directory auto-save-directory-fallback)) 219 (and auto-save-hash-p
218 220 (auto-save-check-directory 'auto-save-hash-directory))
219 ;(and auto-save-hash-p
220 ; (auto-save-check-directory 'auto-save-hash-directory))
221 221
222 222
223 ;;; Computing an autosave name for a file and vice versa 223 ;;; Computing an autosave name for a file and vice versa
224 224
225 ;; #### Now that this file is dumped, we should turn off the routine 225 ;; #### Now that this file is dumped, we should turn off the routine
333 (savedir (file-name-directory savename))) 333 (savedir (file-name-directory savename)))
334 (cond ((or (not (auto-save-file-name-p basename)) 334 (cond ((or (not (auto-save-file-name-p basename))
335 (string-match "^#%" basename)) 335 (string-match "^#%" basename))
336 nil) 336 nil)
337 ;; now we know it looks like #...# thus substring is safe to use 337 ;; now we know it looks like #...# thus substring is safe to use
338 ((or (equal savedir 338 ((or (equal savedir auto-save-directory) ; 2nd arg may be nil
339 (and auto-save-directory 339 (equal savedir auto-save-directory-fallback))
340 (expand-file-name auto-save-directory)))
341 ; 2nd arg may be nil
342 (equal savedir
343 (expand-file-name auto-save-directory-fallback)))
344 ;; it is of the `-fixed-directory' type 340 ;; it is of the `-fixed-directory' type
345 (auto-save-slashify-name (substring basename 1 -1))) 341 (auto-save-slashify-name (substring basename 1 -1)))
346 (t 342 (t
347 ;; else it is of `-same-directory' type 343 ;; else it is of `-same-directory' type
348 (concat savedir (substring basename 1 -1)))))) 344 (concat savedir (substring basename 1 -1))))))
360 "#"))) 356 "#")))
361 (if (and auto-save-hash-p 357 (if (and auto-save-hash-p
362 auto-save-hash-directory 358 auto-save-hash-directory
363 (> (length base-name) 14)) 359 (> (length base-name) 14))
364 (expand-file-name (auto-save-cyclic-hash-14 filename) 360 (expand-file-name (auto-save-cyclic-hash-14 filename)
365 (auto-save-checked-directory auto-save-hash-directory)) 361 auto-save-hash-directory)
366 (expand-file-name base-name 362 (expand-file-name base-name
367 (auto-save-checked-directory 363 (or auto-save-directory
368 (or auto-save-directory 364 auto-save-directory-fallback)))))
369 auto-save-directory-fallback))))))
370 365
371 (defun auto-save-name-in-same-directory (filename &optional prefix) 366 (defun auto-save-name-in-same-directory (filename &optional prefix)
372 ;; Enclose the non-directory part of FILENAME in `#' to make an auto 367 ;; Enclose the non-directory part of FILENAME in `#' to make an auto
373 ;; save file in the same directory as FILENAME. But if this 368 ;; save file in the same directory as FILENAME. But if this
374 ;; directory is not writable, use auto-save-directory-fallback. 369 ;; directory is not writable, use auto-save-directory-fallback.
377 ;; comes from a buffer name then), the fallback is used then. 372 ;; comes from a buffer name then), the fallback is used then.
378 ;; Optional PREFIX is string to use instead of "#" to prefix name. 373 ;; Optional PREFIX is string to use instead of "#" to prefix name.
379 (let ((directory (file-name-directory filename))) 374 (let ((directory (file-name-directory filename)))
380 (or (null directory) 375 (or (null directory)
381 (file-writable-p directory) 376 (file-writable-p directory)
382 (setq directory (auto-save-checked-directory 377 (setq directory auto-save-directory-fallback))
383 auto-save-directory-fallback)))
384 (concat directory ; (concat nil) is "" 378 (concat directory ; (concat nil) is ""
385 (or prefix "#") 379 (or prefix "#")
386 (file-name-nondirectory filename) 380 (file-name-nondirectory filename)
387 "#"))) 381 "#")))
388 382
501 t "\\`#" nil t)) 495 t "\\`#" nil t))
502 afile ; the auto save file 496 afile ; the auto save file
503 file ; its original file 497 file ; its original file
504 (total 0) ; # of files offered to recover 498 (total 0) ; # of files offered to recover
505 (count 0)) ; # of files actually recovered 499 (count 0)) ; # of files actually recovered
506 (or (equal (expand-file-name auto-save-directory) 500 (or (equal auto-save-directory auto-save-directory-fallback)
507 (expand-file-name auto-save-directory-fallback))
508 (setq savefiles 501 (setq savefiles
509 (nconc savefiles 502 (nconc savefiles
510 (directory-files auto-save-directory-fallback 503 (directory-files auto-save-directory-fallback
511 t "\\`#" nil t)))) 504 t "\\`#" nil t))))
512 (while savefiles 505 (while savefiles