[PATCH] send changesets via mail

Johan Rydberg jrydberg at gnu.org
Tue Jun 28 17:50:07 BST 2005


Hi,

This is an experimantal patch to send changesets via mail.  It's based
on Johns work with changesets (plugins/changeset) and simply wraps it
up in a mail. 

It also invokes an editor to enable me to write this little text that
describes the changes.

The patch needs a few improvements; use of StringIO instead of
TemporaryFile.  Also I would like to incorportate stuff like signing
of the mails using GnuGP.

~j
-------------- next part --------------
# Bazaar-NG (bzr) changeset v0.0.5
# This changeset can be applied with bzr apply-changeset
# 
# committer: Johan Rydberg <jrydberg at gnu.org>
# date: Tue 2005-06-28 18:42:22 +0200
# revno: 803
# message:
#    send changesets via mail
# revision: jrydberg at gnu.org-20050628164221-24c2f87feb97f1cf
# precursor: mbp at sourcefrog.net-20050628111441-db4512efe25b418a
# precursor revno: 802
# 

*** added file 'plugins/changeset/send_changeset.py'
--- /dev/null 
+++ plugins/changeset/send_changeset.py 
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+"""\
+Generate a changeset and send it by mail.
+"""
+
+import bzrlib, bzrlib.changeset
+import common, smtplib
+
+from email import Encoders
+from email.Message import Message
+from email.MIMEBase import MIMEBase
+from email.MIMEMultipart import MIMEMultipart
+from email.MIMEText import MIMEText
+
+
+def send_changeset(to_address, from_address, subject, 
+                   changeset_fp, message):
+    # Create the enclosing (outer) message
+    outer = MIMEMultipart()
+    outer['Subject'] = '[PATCH] ' + subject
+    outer['To'] = to_address
+    outer['From'] = from_address
+
+    if message:
+        msg = MIMEText(message)
+        outer.attach(msg)
+
+    msg = MIMEText(changeset_fp.read())
+    #msg.add_header('Content-Disposition', 'attachment', filename=')
+
+    outer.attach(msg)
+
+    s = smtplib.SMTP()
+    s.connect()
+    s.sendmail(from_address, to_address, outer.as_string())
+    s.close()
+    

*** modified file 'plugins/changeset/__init__.py'
--- plugins/changeset/__init__.py 
+++ plugins/changeset/__init__.py 
@@ -7,6 +7,64 @@
 """
 
 import bzrlib, bzrlib.commands
+
+class cmd_send_changeset(bzrlib.commands.Command):
+    """Send a bundled up changset via mail.
+
+    If no revision has been specified, the last commited change will
+    be sent.
+
+    Subject of the mail can be specified by the --subject option,
+    otherwise information from the changeset log will be used.
+    """
+    takes_options = ['revision', 'subject', 'diff-options']
+    takes_args = ['to?']
+
+    def run(self, to=None, subject=None, revision=None, diff_options=None):
+        from tempfile import TemporaryFile
+        from bzrlib import find_branch
+        from bzrlib.commands import BzrCommandError
+        import gen_changeset
+        import send_changeset
+        import sys
+
+        if isinstance(revision, (list, tuple)):
+            if len(revision) > 1:
+                raise BzrCommandError('We do not support rollup-changesets yet.')
+            revision = revision[0]
+
+        b = find_branch('.')
+
+        if not to:
+            try:
+                to = b.controlfile('x-send-address', 'rb').read().strip('\n')
+            except:
+                raise BzrCommandError('destination address is not known')
+
+        if not revision:
+            revision = b.revno()
+
+        rev = b.get_revision(b.lookup_revision(revision))
+        if not subject:
+            subject = rev.message.split('\n')[0]
+
+        info = "Changset for revision %d by %s\n" % (revision, rev.committer)
+        info += "with the following message:\n"
+        for line in rev.message.split('\n'):
+            info += "  " + line + "\n"
+
+        message = bzrlib.osutils.get_text_message(info)
+
+        # FIXME: StringIO instead of temporary file
+        changeset_fp = TemporaryFile()
+        gen_changeset.show_changeset(b, revision,
+                                     external_diff_options=diff_options,
+                                     to_file=changeset_fp)
+        
+        changeset_fp.seek(0)
+        send_changeset.send_changeset(to, bzrlib.osutils._get_user_id(),
+                                      subject, changeset_fp, message)
+
 
 class cmd_changeset(bzrlib.commands.Command):
     """Generate a bundled up changeset.
@@ -97,9 +155,11 @@
 bzrlib.commands.register_command(cmd_changeset)
 bzrlib.commands.register_command(cmd_verify_changeset)
 bzrlib.commands.register_command(cmd_apply_changeset)
+bzrlib.commands.register_command(cmd_send_changeset)
 
 bzrlib.commands.OPTIONS['reverse'] = None
 bzrlib.commands.OPTIONS['auto-commit'] = None
+bzrlib.commands.OPTIONS['subject'] = str
 cmd_apply_changeset.takes_options.append('reverse')
 cmd_apply_changeset.takes_options.append('auto-commit')
 

# BEGIN BZR FOOTER
# revision sha1: 64594f9252a9c9c4e0144fa5fcd1f1d2e03f5926
# precursor sha1: b954c6d86480b423baded26171150f9511f795cf
# timestamp: 1119976942.025374889
# timezone: 7200
# tree root id: TREE_ROOT
# file ids:
#    plugins/changeset/__init__.py	__init__.py-20050622090833-aaa07fa64abea70c	changeset-20050622090833-4173d7d0dcc5dde3
#    plugins/changeset	changeset-20050622090833-4173d7d0dcc5dde3	plugins-20050622090833-e6d6498bece7e1ae
#    plugins/changeset/send_changeset.py	send_changeset.py-20050628164110-42ea9c9699dbf4fb	changeset-20050622090833-4173d7d0dcc5dde3
#    plugins	plugins-20050622090833-e6d6498bece7e1ae	TREE_ROOT
# END BZR FOOTER


More information about the bazaar mailing list