diff options
| author | John Wiegley <johnw@newartisans.com> | 2002-05-01 06:03:28 +0000 |
|---|---|---|
| committer | John Wiegley <johnw@newartisans.com> | 2002-05-01 06:03:28 +0000 |
| commit | 4917d45b9eb5a09002b2f5006fe9e5b818ecc608 (patch) | |
| tree | 62a2ca93595212fe79e6490904cedfd756333d3e | |
| parent | 652c8b322bf058c35eb48b5373976f22e3e3276f (diff) | |
autosaving is now much more efficient, and correct; still have to get
it correct for chess-network, though
| -rw-r--r-- | PLAN | 5 | ||||
| -rw-r--r-- | chess-autosave.el | 103 | ||||
| -rw-r--r-- | chess-common.el | 3 |
3 files changed, 59 insertions, 52 deletions
@@ -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)))) |
