Fixed.
[riece] / lisp / riece-log.el
index ee3aef8..70a87b0 100644 (file)
   :type 'directory
   :group 'riece-log)
 
-(defcustom riece-log-lock-directory
-  (expand-file-name "=lock" riece-log-directory)
-  "*Lock directory for riece-log.
-It is created if there is at least one instance of Emacs running riece-log."
-  :type 'directory
-  :group 'riece-log)
-
 (defcustom riece-log-directory-map nil
   "*The map of channel name and directory name."
   :type '(repeat (cons (string :tag "Channel name")
@@ -78,11 +71,6 @@ If integer, flash back only this line numbers. t means all lines."
   :type 'symbol
   :group 'riece-log)
 
-(defcustom riece-log-open-directory-function 'find-file
-  "*Function for opening a directory."
-  :type 'function
-  :group 'riece-log)
-
 (defface riece-log-date-face
   '((((class color)
       (background dark))
@@ -96,6 +84,13 @@ If integer, flash back only this line numbers. t means all lines."
   :group 'riece-highlight-faces)
 (defvar riece-log-date-face 'riece-log-date-face)
 
+(defvar riece-log-lock-file nil
+  "Lock file for riece-log.
+It is created if there is at least one instance of Emacs running riece-log.")
+
+(defconst riece-log-file-name-regexp
+  (concat (riece-make-interval-regexp "[0-9]" 8) "\\.txt\\(\\.\\(.*\\)\\)?$"))
+
 (defvar riece-log-enabled nil)
 
 (defconst riece-log-description
@@ -103,32 +98,48 @@ If integer, flash back only this line numbers. t means all lines."
 
 (defun riece-log-display-message-function (message)
   (if riece-log-enabled
-      (let ((file (riece-log-get-file (riece-message-target message)))
-           (coding-system-for-write riece-log-coding-system)
-           file-name-coding-system
-           default-file-name-coding-system)
+      (let* ((coding-system-for-write
+             (if (featurep 'mule)
+                 (or riece-log-coding-system
+                     (car (get-language-info current-language-environment
+                                             'coding-system)))))
+            (file (riece-log-make-file-name (riece-message-target message)
+                                            coding-system-for-write))
+            file-name-coding-system
+            default-file-name-coding-system)
        (unless (file-directory-p (file-name-directory file))
          (make-directory (file-name-directory file) t))
        (write-region (concat (format-time-string "%H:%M") " "
                              (riece-format-message message))
-                     nil file t 0))))
-
-(defun riece-log-get-file (identity)
-  (expand-file-name
-   (concat (format-time-string "%Y%m%d") ".txt")
-   (riece-log-get-directory identity)))
-
-(defun riece-log-get-files (identity)
-  (let ((directory (riece-log-get-directory identity)))
-    (if (file-directory-p directory)
-       (nreverse (sort (directory-files directory t
-                        (concat "^"
-                                (riece-make-interval-regexp "[0-9]" 8)
-                                "\\.txt$")
-                        t)
-                 #'string-lessp)))))
-
-(defun riece-log-get-directory (identity)
+                     nil file t 0
+                     riece-log-lock-file))))
+
+(defun riece-log-make-file-name (identity coding-system)
+  (expand-file-name (if (featurep 'mule)
+                       (format "%s.txt.%s"
+                               (format-time-string "%Y%m%d")
+                               coding-system)
+                     (format "%s.txt"
+                               (format-time-string "%Y%m%d")))
+                   (riece-log-directory identity)))
+
+(defun riece-log-list-files (identity time)
+  (let ((directory (riece-log-directory identity))
+       (time-prefix (format-time-string "%Y%m%d" (or time '(0 0))))
+       files)
+    (when (file-directory-p directory)
+      (setq files (nreverse (sort (directory-files
+                                  directory t
+                                  (concat "^" riece-log-file-name-regexp)
+                                  t)
+                                 #'string-lessp)))
+      (while (and files
+                 (string-lessp (file-name-nondirectory (car files))
+                               time-prefix))
+       (setq files (cdr files)))
+      files)))
+
+(defun riece-log-directory (identity)
   (let ((prefix (riece-identity-canonicalize-prefix
                 (riece-identity-prefix identity)))
        (server (riece-identity-server identity))
@@ -177,42 +188,54 @@ If integer, flash back only this line numbers. t means all lines."
 (defun riece-log-insert (identity lines)
   "Insert logs for IDENTITY at most LINES.
 If LINES is t, insert today's logs entirely."
-  (if (eq lines t)
-      (let* (file-name-coding-system
-            default-file-name-coding-system
-            (file (riece-log-get-file identity)))
-       (if (file-exists-p file)
-           (insert-file-contents file)))
-    (let* (file-name-coding-system
-          default-file-name-coding-system
-          (files (riece-log-get-files identity))
-          (lines (- lines))
-          name date point)
-      (while (and (< lines 0) files)
-       (if (and (file-exists-p (car files))
-                (string-match (concat (riece-make-interval-regexp "[0-9]" 8)
-                                      "\\.txt$")
-                              (setq name (file-name-nondirectory
-                                          (car files)))))
-           (save-restriction
-             (narrow-to-region (point) (point))
-             (insert-file-contents (car files))
-             (goto-char (point-max))
-             (setq lines (forward-line lines))
-             (delete-region (point-min) (point))
-             (unless (equal name (format-time-string "%Y%m%d.txt"))
-               (setq date (concat " (" (substring name 0 4) "/"
-                                  (substring name 4 6) "/"
-                                  (substring name 6 8) ")"))
-               (while (not (eobp))
-                 (end-of-line)
-                 (setq point (point))
-                 (insert date)
-                 (put-text-property point (point)
-                                    'riece-overlay-face 'riece-log-date-face)
-                 (forward-line))
-               (goto-char (point-min)))))
-       (setq files (cdr files))))))
+  (let* (file-name-coding-system
+        default-file-name-coding-system
+        (files (riece-log-list-files identity
+                                     (if (eq lines t) (current-time))))
+        name coding-system date point)
+    (while (and (or (eq lines t) (> lines 0)) files)
+      (save-restriction
+       (narrow-to-region (point) (point))
+       (if (and (string-match
+                 (concat "^" riece-log-file-name-regexp)
+                 (setq name (file-name-nondirectory (car files))))
+                (match-beginning 2))
+           (progn
+             (setq coding-system
+                   (intern (substring name (match-beginning 2))))
+             (if (featurep 'xemacs)
+                 (setq coding-system (find-coding-system coding-system))
+               (unless (coding-system-p coding-system)
+                 (setq coding-system nil)))
+             (if coding-system
+                 (let ((coding-system-for-read coding-system))
+                   (insert-file-contents (car files)))
+               ;;don't insert file contents if they use non
+               ;;supported coding-system.
+               ))
+         ;;if the filename has no coding-system suffix, decode with
+         ;;riece-log-coding-system.
+         (let ((coding-system-for-read riece-log-coding-system))
+           (insert-file-contents (car files))))
+       ;;lines in the file contents are in reversed order.
+       (unless (eq lines t)
+         (goto-char (point-max))
+         (setq lines (- (forward-line (- lines))))
+         (delete-region (point-min) (point)))
+       ;;add (YYYY/MM/dd) suffix on each line left in the current buffer.
+       (unless (equal (substring name 0 8) (format-time-string "%Y%m%d"))
+         (setq date (concat " (" (substring name 0 4) "/"
+                            (substring name 4 6) "/"
+                            (substring name 6 8) ")"))
+         (while (not (eobp))
+           (end-of-line)
+           (setq point (point))
+           (insert date)
+           (put-text-property point (point)
+                              'riece-overlay-face 'riece-log-date-face)
+           (forward-line))
+         (goto-char (point-min))))
+      (setq files (cdr files)))))
 
 (defun riece-log-flashback (identity)
   (when riece-log-flashback
@@ -242,12 +265,11 @@ If LINES is t, insert today's logs entirely."
       (set-window-point (get-buffer-window (current-buffer))
                        (point)))))
 
-(defun riece-log-open-directory (&optional channel)
+(defun riece-log-dired (&optional channel)
   (interactive)
-  (let ((directory (riece-log-get-directory
-                   (or channel riece-current-channel))))
+  (let ((directory (riece-log-directory (or channel riece-current-channel))))
     (if (file-directory-p directory)
-       (funcall riece-log-open-directory-function directory)
+       (dired directory)
       (error "No log directory"))))
 
 (defun riece-log-requires ()
@@ -255,6 +277,13 @@ If LINES is t, insert today's logs entirely."
       '(riece-button)))
 
 (defun riece-log-insinuate ()
+  (make-directory riece-log-directory t)
+  (setq riece-log-lock-file
+       (expand-file-name (format "!%s-%d-%d"
+                                 (riece-log-encode-file-name (system-name))
+                                 (user-uid)
+                                 (emacs-pid))
+                         riece-log-directory))
   ;; FIXME: Use `riece-after-insert-functions' for trapping change,
   ;; notice, wallops and so on. But must add argument.
   (add-hook 'riece-after-display-message-functions
@@ -264,18 +293,8 @@ If LINES is t, insert today's logs entirely."
 
 (defvar riece-command-mode-map)
 (defun riece-log-enable ()
-  (define-key riece-command-mode-map "\C-cd" 'riece-log-open-directory)
-  (make-directory riece-log-directory t)
-  (condition-case nil
-      (progn
-       (make-directory riece-log-lock-directory)
-       (add-hook 'riece-exit-hook
-                 (lambda ()
-                   (condition-case nil
-                       (delete-directory riece-log-lock-directory)
-                     (error))))
-       (setq riece-log-enabled t))
-    (error)))
+  (define-key riece-command-mode-map "\C-cd" 'riece-log-dired)
+  (setq riece-log-enabled t))
 
 (defun riece-log-disable ()
   (define-key riece-command-mode-map "\C-cd" nil)