elisp-vcs/dvc/lisp/tla-gnus.el
2009-10-10 08:02:43 +02:00

169 lines
6.1 KiB
EmacsLisp

;;; tla-gnus.el --- dvc integration to gnus
;; Copyright (C) 2003-2006 by all contributors
;; Author: Stefan Reichoer, <stefan@xsteve.at>
;; Xtla is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.
;; Xtla is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'tla-core)
(require 'dvc-gnus)
;; gnus is optional. Load it at compile-time to avoid warnings.
(eval-when-compile
(condition-case nil
(progn
(require 'gnus)
(require 'gnus-art)
(require 'gnus-sum))
(error nil)))
;; Integration into gnus
(autoload 'tla-categories-string "tla")
(autoload 'tla-branches-string "tla")
(autoload 'tla-versions-string "tla")
(autoload 'tla-revisions-string "tla")
(autoload 'tla--button-revision-fn "tla")
(defun tla-gnus-setup-buttons ()
"Make archive@host.com/something clickable in Gnus Article buffer."
(interactive)
(add-to-list 'gnus-button-alist
'((tla-make-name-regexp 0 t t) 1 t
tla-categories-string 1))
(add-to-list 'gnus-button-alist
'((tla-make-name-regexp 1 t t) 1 t
tla-branches-string 1))
(add-to-list 'gnus-button-alist
'((tla-make-name-regexp 2 t t) 1 t
tla-versions-string 1))
(add-to-list 'gnus-button-alist
'((tla-make-name-regexp 3 t t) 1 t
tla-revisions-string 1))
(add-to-list 'gnus-button-alist
'((tla-make-name-regexp 4 t t) 1 t
tla--button-revision-fn 1)))
;;;###autoload
(defun tla-insinuate-gnus ()
"Integrate the tla backend of DVC into Gnus.
Add the `tla-submit-patch-done' function to the
`message-sent-hook'.
The archives/categories/branches/version/revision names are buttonized
in the *Article* buffers."
(interactive)
(add-hook 'message-sent-hook 'tla-submit-patch-done)
(tla-gnus-setup-buttons))
(defun tla-gnus-article-view-patch (n)
"View MIME part N in a gnus article, as a tla changeset.
The patch can be embedded or external. If external, the
parameter N is ignored."
(interactive)
(gnus-summary-select-article-buffer)
(if (> (gnus-article-mime-total-parts) 1)
(tla-gnus-article-view-attached-patch 2)
(tla-gnus-article-view-external-patch)))
(defun tla-gnus-article-view-attached-patch (n)
"View MIME part N, as tla patchset."
(interactive "p")
(gnus-article-part-wrapper n 'tla-gnus-view-patch))
(defun tla-gnus-article-view-external-patch ()
"View an external patch that is referenced in this mail.
The mail must either contain a line starting with 'Committed ' and ending
with the fully qualified revision name.
The second supported format contains an extra line for Revision and Archive."
(interactive)
(let ((revision)
(archive)
(version)
(window-conf (current-window-configuration)))
(gnus-summary-select-article-buffer)
(split-window-vertically)
(goto-char (point-min))
(cond ((re-search-forward (concat "Committed " (tla-make-name-regexp 4 nil t)) nil t)
(setq version (buffer-substring-no-properties
(+ (match-beginning 0) 10) (- (match-end 0) 1))))
(t
(when (search-forward "Revision: " nil t)
(setq revision (buffer-substring-no-properties (point) (line-end-position))))
(when (search-forward "Archive: " nil t)
(setq archive (buffer-substring-no-properties (point) (line-end-position))))
(when (and archive revision)
(setq version (concat archive "/" revision)))))
(gnus-article-show-summary)
(if version
(progn
(tla-get-changeset version t)
(save-excursion
(set-buffer (dvc-get-buffer tla-arch-branch 'changeset version))
(dvc-buffer-push-previous-window-config window-conf)))
(message "No external arch patch found in this article.")
(set-window-configuration window-conf))))
(defun tla-gnus-view-patch (handle)
"View a patch within gnus. HANDLE should be the handle of the part."
(let ((archive-name (dvc-make-temp-name "gnus-patch-tgz"))
(window-conf (current-window-configuration)))
(mm-save-part-to-file handle archive-name)
(gnus-summary-select-article-buffer)
(split-window-vertically)
(tla-show-changeset-from-tgz archive-name)
(dvc-buffer-push-previous-window-config window-conf)
(delete-file archive-name)))
(defun tla-gnus-article-apply-patch (n)
"Apply MIME part N, as tla patchset.
When called with no prefix arg, set N := 2."
(interactive "p")
(unless current-prefix-arg
(setq n 2))
(gnus-article-part-wrapper n 'tla-gnus-apply-patch))
(defun tla-gnus-apply-patch (handle)
"Apply the patch corresponding to HANDLE."
(dvc-gnus-article-extract-log-message)
(let ((archive-name (dvc-make-temp-name "gnus-patch-tgz"))
(tree-dir (tla--name-match-from-list
(when dvc-memorized-version
(tla--name-split dvc-memorized-version))
tla-apply-patch-mapping))
(tree)
(window-conf (current-window-configuration)))
(mm-save-part-to-file handle archive-name)
(gnus-summary-select-article-buffer)
(split-window-vertically)
(tla-show-changeset-from-tgz archive-name)
(dvc-buffer-push-previous-window-config window-conf)
(setq tree (dvc-read-directory-name "Apply to tree: "
tree-dir tree-dir))
(tla-apply-changeset-from-tgz archive-name tree nil)
(delete-file archive-name)
(when (eq major-mode 'tla-inventory-mode)
(delete-other-windows))))
(provide 'tla-gnus)
;;; tla-gnus.el ends here