diff options
author | Sean Whitton <spwhitton@spwhitton.name> | 2018-07-26 15:44:20 +0800 |
---|---|---|
committer | Sean Whitton <spwhitton@spwhitton.name> | 2018-07-26 15:44:20 +0800 |
commit | 27cd090f22f502c927ba2ae0734e71c258ee0a78 (patch) | |
tree | 029d1e65585f48b86f4819082e55317b91035359 /notmuch-extract-patch/notmuch-extract-patch | |
parent | a66cd40929440a86670f2bff97700fe07052d661 (diff) | |
parent | f6b282d91af581178150e36369e7fe03a9c813d4 (diff) | |
download | mailscripts-27cd090f22f502c927ba2ae0734e71c258ee0a78.tar.gz |
Add 'notmuch-extract-patch/' from commit 'f6b282d91af581178150e36369e7fe03a9c813d4'
git-subtree-dir: notmuch-extract-patch
git-subtree-mainline: a66cd40929440a86670f2bff97700fe07052d661
git-subtree-split: f6b282d91af581178150e36369e7fe03a9c813d4
Diffstat (limited to 'notmuch-extract-patch/notmuch-extract-patch')
-rwxr-xr-x | notmuch-extract-patch/notmuch-extract-patch | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/notmuch-extract-patch/notmuch-extract-patch b/notmuch-extract-patch/notmuch-extract-patch new file mode 100755 index 0000000..df87a6c --- /dev/null +++ b/notmuch-extract-patch/notmuch-extract-patch @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +# +# Extract git patchset from notmuch emails +# +# Copyright (C) 2017 Aurelien Aptel <aurelien.aptel@gmail.com> +# +# 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 <http://www.gnu.org/licenses/>. + +import mailbox +import sys +import tempfile +import subprocess +import re + +def get_body(message): + body = None + if message.is_multipart(): + for part in message.walk(): + if part.is_multipart(): + for subpart in part.walk(): + if subpart.get_content_type() == 'text/plain': + body = subpart.get_payload(decode=True) + elif part.get_content_type() == 'text/plain': + body = part.get_payload(decode=True) + elif message.get_content_type() == 'text/plain': + body = message.get_payload(decode=True) + + if isinstance(body, bytes): + body = body.decode('utf-8') + return body + + +def is_git_patch(msg): + # we want to skip cover letters, hence why we look for @@ + body = get_body(msg) + match = re.search(r'''\n@@ [0-9 +,-]+ @@''', body) + # return ("git-send-email" in msg['x-mailer'] and match) + return match + +def main(): + query = sys.argv[1:] + with tempfile.NamedTemporaryFile() as in_mb_file: + out = subprocess.check_output(['notmuch', 'show', '--format=mbox']+query) + in_mb_file.write(out) + in_mb_file.flush() + + in_mb = mailbox.mbox(in_mb_file.name) + with tempfile.NamedTemporaryFile() as out_mb_file: + out_mb = mailbox.mbox(out_mb_file.name) + for m in in_mb: + if is_git_patch(m): + sys.stderr.write(m['subject']+"\n") + out_mb.add(m) + out_mb.flush() + print(open(out_mb_file.name).read()) + +if __name__ == '__main__': + main() |