[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