summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2002-05-01 06:03:28 +0000
committerJohn Wiegley <johnw@newartisans.com>2002-05-01 06:03:28 +0000
commit4917d45b9eb5a09002b2f5006fe9e5b818ecc608 (patch)
tree62a2ca93595212fe79e6490904cedfd756333d3e
parent652c8b322bf058c35eb48b5373976f22e3e3276f (diff)
autosaving is now much more efficient, and correct; still have to get
it correct for chess-network, though
-rw-r--r--PLAN5
-rw-r--r--chess-autosave.el103
-rw-r--r--chess-common.el3
3 files changed, 59 insertions, 52 deletions
diff --git a/PLAN b/PLAN
index c7cd54e..b32e76b 100644
--- a/PLAN
+++ b/PLAN
@@ -17,6 +17,11 @@ chess
chess-autosave
- recovering from an autosave against crafty does not seem to work
+chess-network
+- how to correctly handle autosaved games, since it's not appropriate
+ to ask at initialize time for this module, or chess-irc! And yet,
+ we don't want to entirely disable autosaves either.
+
BEFORE FINAL RELEASE
use more asserts throughout the code
diff --git a/chess-autosave.el b/chess-autosave.el
index 9296785..03c7574 100644
--- a/chess-autosave.el
+++ b/chess-autosave.el
@@ -22,29 +22,33 @@
(defun chess-autosave-handler (game event &rest args)
(cond
((eq event 'initialize)
- (let ((result t))
- (if (file-readable-p chess-autosave-file)
- (if (y-or-n-p (chess-string 'chess-read-autosave))
- (progn
- (chess-autosave-read game chess-autosave-file)
- (delete-file chess-autosave-file))
- (if (y-or-n-p (chess-string 'chess-delete-autosave))
- (delete-file chess-autosave-file)
- (if (y-or-n-p (chess-string 'chess-disable-autosave))
- (setq result nil)))))
- (kill-buffer (current-buffer))
- (set-buffer (find-file-noselect chess-autosave-file t))
- result))
+ (kill-buffer (current-buffer))
+ (set-buffer (find-file-noselect chess-autosave-file t))
+ (buffer-disable-undo)
+ (setq buffer-auto-save-file-name nil)
+ t)
- ((eq event 'post-move)
- (chess-autosave-write game chess-autosave-file))
+ ((eq event 'check-autosave)
+ (if (file-readable-p chess-autosave-file)
+ (if (y-or-n-p (chess-string 'chess-read-autosave))
+ (progn
+ (chess-autosave-read game chess-autosave-file)
+ (erase-buffer))
+ (if (y-or-n-p (chess-string 'chess-delete-autosave))
+ (erase-buffer)
+ (if (y-or-n-p (chess-string 'chess-disable-autosave))
+ (chess-autosave-handler game 'disable-autosave))))))
((eq event 'disable-autosave)
(chess-autosave-handler game 'destroy)
(chess-module-destroy (current-buffer)))
+ ((eq event 'post-move)
+ (chess-autosave-write game chess-autosave-file))
+
((eq event 'destroy)
- (if (file-readable-p chess-autosave-file)
+ (set-buffer-modified-p nil)
+ (if (file-exists-p chess-autosave-file)
(delete-file chess-autosave-file)))))
(defun chess-prin1-ply (ply)
@@ -68,45 +72,42 @@
(defun chess-autosave-write (game file)
"Write a chess GAME to FILE as raw Lisp."
- (with-current-buffer (find-file-noselect file t)
- (let ((index (chess-game-index game)))
- (if (or (= 1 index) (eobp))
- (progn
- (erase-buffer)
- (prin1 (chess-game-tags game)
- (current-buffer))
- (insert "\n(\n;;## ply 0\n"))
- (goto-char (point-max))
- (re-search-backward "^;;## ply")
- (forward-line)
- (delete-region (point) (point-max)))
- (chess-prin1-ply (chess-game-ply game (1- index)))
- (insert (format "\n;;## ply %d\n" index))
- (chess-prin1-ply (chess-game-ply game))
- (insert ")\n")
- (basic-save-buffer)
- (message nil))))
+ (let ((index (chess-game-index game)))
+ (if (or (= 1 index) (and (bobp) (eobp)))
+ (progn
+ (erase-buffer)
+ (prin1 (chess-game-tags game)
+ (current-buffer))
+ (insert "\n(\n;;## ply 0\n"))
+ (goto-char (point-max))
+ (re-search-backward "^;;## ply")
+ (forward-line)
+ (delete-region (point) (point-max)))
+ (chess-prin1-ply (chess-game-ply game (1- index)))
+ (insert (format "\n;;## ply %d\n" index))
+ (chess-prin1-ply (chess-game-ply game))
+ (insert ")\n")
+ (basic-save-buffer)
+ (message nil)))
(defun chess-autosave-read (game file)
"Read a chess game as raw Lisp from FILE."
- (with-current-buffer (find-file-noselect file t)
- (goto-char (point-min))
- (chess-game-set-tags game (read (current-buffer)))
-
- (let* ((plies (read (current-buffer)))
- (game-plies plies)
- prev-ply)
- (while plies
- (if prev-ply
- (chess-pos-set-preceding-ply (chess-ply-pos (car plies))
- prev-ply))
- (if (cdr plies)
- (chess-ply-set-keyword (car plies) :next-pos
- (chess-ply-pos (cadr plies))))
- (setq prev-ply (car plies)
- plies (cdr plies)))
+ (goto-char (point-min))
+ (chess-game-set-tags game (read (current-buffer)))
+ (let* ((plies (read (current-buffer)))
+ (game-plies plies)
+ prev-ply)
+ (while plies
+ (if prev-ply
+ (chess-pos-set-preceding-ply (chess-ply-pos (car plies))
+ prev-ply))
+ (if (cdr plies)
+ (chess-ply-set-keyword (car plies) :next-pos
+ (chess-ply-pos (cadr plies))))
+ (setq prev-ply (car plies)
+ plies (cdr plies)))
- (chess-game-set-plies game game-plies))))
+ (chess-game-set-plies game game-plies)))
(provide 'chess-autosave)
diff --git a/chess-common.el b/chess-common.el
index 22bedcc..462050f 100644
--- a/chess-common.el
+++ b/chess-common.el
@@ -46,7 +46,8 @@
proc))
((eq event 'ready)
- (chess-game-set-data game 'active t))
+ (chess-game-set-data game 'active t)
+ (chess-game-run-hooks game 'check-autosave))
((eq event 'destroy)
(let ((proc (get-buffer-process (current-buffer))))