summaryrefslogtreecommitdiff
path: root/lisp/vc/log-edit.el
diff options
context:
space:
mode:
authorDmitry Gutov <dgutov@yandex.ru>2012-10-02 04:24:18 +0400
committerDmitry Gutov <dgutov@yandex.ru>2012-10-02 04:24:18 +0400
commit9f7b98f812674d2824d713b460973842e6e0943b (patch)
tree2d478c90d4e0c080af097560decc9b1acfe8d72d /lisp/vc/log-edit.el
parent81550bf43d3f306f998fdc06d1924aeb9de36f66 (diff)
downloademacs-9f7b98f812674d2824d713b460973842e6e0943b.tar.gz
Support git commit --amend/--signoff
* lisp/vc/log-edit.el (log-edit-font-lock-keywords): Allow hyphens in header names. (log-edit-toggle-header): New function. (log-edit-extract-headers): Accept function values in HEADERS alist. * lisp/vc/vc-git.el (vc-git-log-edit-toggle-signoff): New function. (vc-git-log-edit-toggle-amend): New function. (vc-git-log-edit-toggle-signoff): New function. (vc-git-log-edit-mode): New major mode. (vc-git-log-edit-mode-map): Keymap for it. (vc-git-checkin): Handle "Amend" and "Sign-Off" headers.
Diffstat (limited to 'lisp/vc/log-edit.el')
-rw-r--r--lisp/vc/log-edit.el50
1 files changed, 41 insertions, 9 deletions
diff --git a/lisp/vc/log-edit.el b/lisp/vc/log-edit.el
index 932abb9818c..3c34a762a1b 100644
--- a/lisp/vc/log-edit.el
+++ b/lisp/vc/log-edit.el
@@ -341,7 +341,7 @@ automatically."
(defvar log-edit-font-lock-keywords
;; Copied/inspired by message-font-lock-keywords.
`((log-edit-match-to-eoh
- (,(concat "^\\(\\([[:alpha:]]+\\):\\)" log-edit-header-contents-regexp)
+ (,(concat "^\\(\\([[:alpha:]-]+\\):\\)" log-edit-header-contents-regexp)
(progn (goto-char (match-beginning 0)) (match-end 0)) nil
(1 (if (assoc-string (match-string 2) log-edit-headers-alist t)
'log-edit-header
@@ -900,14 +900,44 @@ Rename relative filenames in the ChangeLog entry as FILES."
(insert "\n"))
log-edit-author))
+(defun log-edit-toggle-header (header value)
+ "Toggle a boolean-type header in the current buffer.
+If the value of HEADER is VALUE, clear it. Otherwise, add the
+header if it's not present and set it to VALUE. Then make sure
+there is an empty line after the headers. Return t if toggled
+on, otherwise nil."
+ (let ((val t)
+ (line (concat header ": " value "\n")))
+ (save-excursion
+ (save-restriction
+ (rfc822-goto-eoh)
+ (narrow-to-region (point-min) (point))
+ (goto-char (point-min))
+ (if (re-search-forward (concat "^" header ":"
+ log-edit-header-contents-regexp)
+ nil t)
+ (if (setq val (not (string= (match-string 1) value)))
+ (replace-match line t t)
+ (replace-match "" t t nil 1))
+ (insert line)))
+ (rfc822-goto-eoh)
+ (delete-horizontal-space)
+ (unless (looking-at "\n")
+ (insert "\n")))
+ val))
+
(defun log-edit-extract-headers (headers comment)
"Extract headers from COMMENT to form command line arguments.
-HEADERS should be an alist with elements of the form (HEADER . CMDARG)
-associating header names to the corresponding cmdline option name and the
-result is then a list of the form (MSG CMDARG1 HDRTEXT1 CMDARG2 HDRTEXT2...).
-where MSG is the remaining text from STRING.
-If \"Summary\" is not in HEADERS, then the \"Summary\" header is extracted
-anyway and put back as the first line of MSG."
+HEADERS should be an alist with elements (HEADER . CMDARG)
+or (HEADER . FUNCTION) associating headers to command line
+options and the result is then a list of the form (MSG ARGUMENTS...)
+where MSG is the remaining text from COMMENT.
+FUNCTION should be a function of one argument that takes the
+header value and returns the list of strings to be appended to
+ARGUMENTS. CMDARG will be added to ARGUMENTS followed by the
+header value. If \"Summary\" is not in HEADERS, then the
+\"Summary\" header is extracted anyway and put back as the first
+line of MSG."
(with-temp-buffer
(insert comment)
(rfc822-goto-eoh)
@@ -923,8 +953,10 @@ anyway and put back as the first line of MSG."
nil t)
(if (eq t (cdr header))
(setq summary (match-string 1))
- (push (match-string 1) res)
- (push (or (cdr header) (car header)) res))
+ (if (functionp (cdr header))
+ (setq res (nconc res (funcall (cdr header) (match-string 1))))
+ (push (match-string 1) res)
+ (push (or (cdr header) (car header)) res)))
(replace-match "" t t)))
;; Remove header separator if the header is empty.
(widen)