~bzr-pqm/bzr/bzr.dev

0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
1
#!/usr/bin/env python
2
"""\
3
Generate a changeset and send it by mail.
4
"""
5
6
import bzrlib, bzrlib.changeset
7
import common, smtplib
8
9
from email import Encoders
10
from email.Message import Message
11
from email.MIMEBase import MIMEBase
12
from email.MIMEMultipart import MIMEMultipart
13
from email.MIMEText import MIMEText
14
15
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
16
def send_changeset(branch, revisions, to_address, message, file):
0.5.32 by John Arbash Meinel
Fixed location of bzrlib.osutils
17
    import bzrlib.osutils
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
18
    from bzrlib import find_branch
19
    from bzrlib.commands import BzrCommandError
20
    import gen_changeset
21
    import send_changeset
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
22
    from cStringIO import StringIO
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
23
0.5.36 by John Arbash Meinel
Updated so that read_changeset is able to parse the output
24
    base_rev_id, target_rev_id = common.canonicalize_revision(branch, revisions)
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
25
    rev = branch.get_revision(target_rev_id)
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
26
    if not message:
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
27
        message = rev.message.split('\n')[0]
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
28
29
    from_address = bzrlib.osutils._get_user_id()
30
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
31
    outer = MIMEMultipart()
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
32
    outer['Subject'] = '[PATCH] ' + message
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
33
    outer['To'] = to_address
34
    outer['From'] = from_address
35
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
36
    # Either read the mail body from the specified file, or spawn
37
    # an editor and let the user type a description.
38
    if file:
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
39
        mail_body = open(file, "U").read()
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
40
    else:
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
41
        info = "Changeset by %s\n" % rev.committer
42
        info += "From %s\n" % base_rev_id
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
43
        info += "with the following message:\n"
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
44
        for line in rev.message.split('\n'):
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
45
            info += "  " + line + "\n"
46
47
        mail_body = bzrlib.osutils.get_text_message(info)
48
        if mail_body is None:
49
            raise BzrCommandError("aborted")
50
    outer.attach(MIMEText(mail_body))
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
51
    
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
52
    changeset_fp = StringIO()
53
    gen_changeset.show_changeset(branch, revisions, to_file=changeset_fp)
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
54
    outer.attach(MIMEText(changeset_fp.getvalue()))
55
56
    try:
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
57
        fp = open(os.path.join(bzrlib.osutils.config_dir(), 'smtp-host'), 'U')
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
58
        smtpconn = smtplib.SMTP(fp.readline().strip('\n'))
59
    except:
60
        smtpconn = smtplib.SMTP()
61
62
    smtpconn.connect()
63
    smtpconn.sendmail(from_address, to_address, outer.as_string())
64
    smtpconn.close()