1 ;;; planner-psvn.el --- psvn.el integration for the Emacs Planner
3 ;; Copyright (C) 2005, 2006 Free Software Foundation, Inc.
5 ;; Author: Stefan Reichör <stefan@xsteve.at>
6 ;; Keywords: planner, psvn
8 ;; This file is part of Planner. It is not part of GNU Emacs.
10 ;; Planner is free software; you can redistribute it and/or modify it
11 ;; under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
15 ;; Planner is distributed in the hope that it will be useful, but
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 ;; General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with Planner; see the file COPYING. If not, write to the
22 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23 ;; Boston, MA 02110-1301, USA.
27 ;; This file allows you to refer to your svn changesets easily from within
30 ;; Example: the changeset
31 ;; [[psvn://http://my.svn-repos.at/svn/project1/trunk@39][project1#39]]
32 ;; can be shown easily via psvn.
34 ;; Additionally there is functionality to generate a note for your
35 ;; commits via subversion, just set
36 ;; `planner-psvn-log-edit-notice-commit-function' to t.
40 ;; Seth Falcon provided a patch to write the note to planner-today
41 ;; rather than *temp*.muse.
43 ;; Yann Hodique helped port this to Muse.
50 (defgroup planner-psvn nil
51 "Planner options for the psvn integration."
52 :prefix
"planner-psvn-"
55 (defcustom planner-psvn-log-edit-include-files-flag
57 "Non-nil means include a list of committed files in the note."
61 (defcustom planner-psvn-log-edit-notice-commit-function nil
62 "Function that should return non-nil if this commit should be noted.
63 The function will be run in the log buffer."
65 (const :tag
"Always note commits" t
)
70 ;; compatibility for older psvn.el revisions
71 (cond ((fboundp 'svn-run
)
72 (defalias 'planner-svn-run
'svn-run
))
73 ((fboundp 'svn-run-svn
)
74 (defalias 'planner-svn-run
'svn-run-svn
))
76 (error "No `svn-run' command found")))
78 (defun planner-psvn-generate-url (repo-path revision
&optional link-prefix no-link-postfix
)
79 (planner-make-link (concat "psvn://" repo-path
"@" revision
)
83 (concat link-prefix revision
))
84 (concat "svn-rev#" revision
))))
87 (defun planner-annotation-from-psvn ()
88 "If called from a psvn *svn-log-view* buffer, return an annotation.
89 Suitable for use in `planner-annotation-functions'."
90 (when (eq major-mode
'svn-log-view-mode
)
91 (svn-status-parse-info t
)
92 (planner-psvn-generate-url (svn-status-base-info->url
)
93 (svn-log-revision-at-point))))
96 (defun planner-psvn-browse-url (url)
97 "If this is a psvn url, handle it."
98 (when (string-match "\\`psvn:/?/?\\(.+\\)@\\([0-9]+\\)" url
)
99 (let ((repo-path (match-string 1 url
))
100 (svn-rev (string-to-number (match-string 2 url
)))
101 (cur-buf (current-buffer)))
102 (planner-svn-run nil t
'diff
"diff"
103 (concat repo-path
"@" (number-to-string (- svn-rev
1)))
104 (concat repo-path
"@" (number-to-string svn-rev
)))
105 (svn-status-activate-diff-mode))
108 (defun planner-psvn-log-edit-extract-file-name (file-info)
109 (svn-status-line-info->filename file-info
))
112 (defun planner-psvn-log-edit-add-note ()
113 "Add a note describing the commit via psvn to the current planner page."
114 (when (if (functionp planner-psvn-log-edit-notice-commit-function
)
115 (funcall planner-psvn-log-edit-notice-commit-function
)
116 planner-psvn-log-edit-notice-commit-function
)
117 (svn-status-parse-info t
)
118 (save-window-excursion
119 (planner-create-note nil
)
121 (insert (concat " " (planner-psvn-generate-url
122 (svn-status-base-info->url
)
123 (number-to-string svn-status-commit-rev-number
)
124 (when svn-status-module-name
125 (concat svn-status-module-name
"#")))))
127 (when (and planner-psvn-log-edit-include-files-flag
128 svn-status-files-to-commit
)
130 (insert (mapconcat 'planner-psvn-log-edit-extract-file-name
131 svn-status-files-to-commit
" "))
134 (insert-buffer-substring "*svn-log-edit*"))))
136 (add-hook 'svn-log-edit-done-hook
'planner-psvn-log-edit-add-note
)
138 (planner-add-protocol "psvn:/?/?" 'planner-psvn-browse-url nil
)
139 (add-hook 'planner-annotation-functions
'planner-annotation-from-psvn
)
140 (custom-add-option 'planner-annotation-functions
'planner-annotation-from-psvn
)
142 (provide 'planner-psvn
)
144 ;;; planner-psvn.el ends here