;;; git-email.el --- Work with git and email -*- lexical-binding: t; -*- ;; Copyright (C) 2021 yoctocell ;; Author: yoctocell ;; URL: https://git.sr.ht/~yoctocell/git-email ;; Version: 0.1.0 ;; Package-Requires: ((emacs "25.1")) ;; Keywords: git email ;; License: GNU General Public License >= 3 ;; This program 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 3 of the License, or ;; (at your option) any later version. ;; This program 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 this program. If not, see . ;;; Commentary: ;; This package integrates with git and email and offers two main functions ;; - `git-email-send-email' and `git-email-apply-patch'. ;; ;; `git-email-send-email' sends an email based on a patch file generated by ;; 'git format-patch'. It inserts the relevant headers and the diff into the ;; message buffer. ;; ;; `git-email-apply-patch' will apply the patch that you are currently viewing ;; and it will ask to for the project that the patch belongs to. ;;; TODO: ;; * Add proper syntax highlighting to diffs in the message buffer. ;;; Code: (defgroup git-email nil "Work with git and email." :group 'convenience) (defcustom git-email--compose-message-function 'message-mail "The function used to compose patch mail." :group 'git-email :type 'symbol) (defun git-email--extract-header (header patch-file) "Extract HEADER from PATCH-FILE. If the header is not found, return an empty string." (with-temp-buffer (insert-file-contents patch-file) (goto-char (point-min)) (buffer-substring-no-properties (if (re-search-forward (format " *%s: +" header) nil t) (point) (point-at-eol)) (point-at-eol)))) (defun git-email--extract-diff (patch-file) "Extract the diff from PATCH-FILE." (with-temp-buffer (insert-file-contents patch-file) (goto-char (point-min)) (buffer-substring-no-properties (- (re-search-forward "\n\n") 1) (point-max)))) (defun git-email-send-email (patch-file) "Given a PATCH-FILE, send an email. Extracts the relevant headers and the diff from the PATCH-FILE and inserts them into the message buffer." (interactive) (let* ((default-directory (cdr (project-current))) (subject (git-email--extract-header "subject" patch-file)) (from (git-email--extract-header "from" patch-file)) (sendemail-to (shell-command-to-string "git config --list | grep sendemail.to")) (to (if (string-equal sendemail-to "") "to" (substring sendemail-to 13 -1))) ; Remove newline (in-reply-to (git-email--extract-header "in-reply-to" patch-file)) (msg-id (git-email--extract-header "message-id" patch-file)) (diff (git-email--extract-diff patch-file))) (funcall git-email--compose-message-function to subject `(("in-reply-to" ,in-reply-to) ("message-id" ,msg-id) ("from" ,from))) ;; (let ((body (or (re-search-forward "<#part .*>") ;; (re-search-forward "--text follows this line--")))) (goto-char (point-max)) (insert diff))) (provide 'git-email) ;;; git-email.el ends here