[prev in list] [next in list] [prev in thread] [next in thread]
List: subversion-commits
Subject: svn commit: r1913309 - /subversion/trunk/tools/hook-scripts/mailer/mailer.py
From: gstein () apache ! org
Date: 2023-10-25 4:53:41
Message-ID: 20231025045341.8A3A717B797 () svn01-us-east ! apache ! org
[Download RAW message or body]
Author: gstein
Date: Wed Oct 25 04:53:41 2023
New Revision: 1913309
URL: http://svn.apache.org/viewvc?rev=1913309&view=rev
Log:
The subject line is based on the action type, not the output
mechanism. Move it from OutputBase to Messenger. Adjust the various
dataflows to account for the move.
* tools/hook-scripts/mailer/mailer.py:
(OutputBase.__init__): remove .SUBJECT
(OutputBase.make_subject): take the BASIC_SUBJECT to be used for
construction a complete subject line, rather than relying on
self.subject
Note: this should probably move, too; future commit.
(OutputBase.start): take the BASIC_SUBJECT. Update docstring.
(MailedOutput.start): take the BASIC_SUBJECT. Unused.
(MailedOutput.mail_headers): take the BASIC_SUBJECT and pass it
along to .make_subject()
(SMTPOutput.start, PipeOutput.start): take BASIC_SUBJECT and pass
along to the .mail_headers() method
(StandardOutput.start): take BASIC_SUBJECT and pass along to
the .make_subject() method
(Messenger.__init__): remove .pool as unused. Add the .basic_subject
instance variable.
(Commit.__init__, PropChange.__init__, Lock.__init):
initialize .basic_subject
(Commit.generate, PropChange.generate, Lock.generate):
pass .basic_subject to .output.start()
Modified:
subversion/trunk/tools/hook-scripts/mailer/mailer.py
Modified: subversion/trunk/tools/hook-scripts/mailer/mailer.py
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/hook-scripts/mailer/mailer.py?rev=1913309&r1=1913308&r2=1913309&view=diff
==============================================================================
--- subversion/trunk/tools/hook-scripts/mailer/mailer.py (original)
+++ subversion/trunk/tools/hook-scripts/mailer/mailer.py Wed Oct 25 04:53:41 2023
@@ -179,16 +179,12 @@ class OutputBase:
self.prefix_param = prefix_param
self._CHUNKSIZE = 128 * 1024
- # This is a public member variable. This must be assigned a suitable
- # piece of descriptive text before make_subject() is called.
- self.subject = ""
-
- def make_subject(self, group, params):
+ def make_subject(self, basic_subject, group, params):
prefix = self.cfg.get(self.prefix_param, group, params)
if prefix:
- subject = prefix + ' ' + self.subject
+ subject = prefix + ' ' + basic_subject
else:
- subject = self.subject
+ subject = basic_subject
try:
truncate_subject = int(
@@ -208,15 +204,19 @@ class OutputBase:
return subject
- def start(self, group, params):
+ def start(self, basic_subject, group, params):
"""Override this method.
- Begin writing an output representation. GROUP is the name of the
- configuration file group which is causing this output to be produced.
- PARAMS is a dictionary of any named subexpressions of regular expressions
- defined in the configuration file, plus the key 'author' contains the
- author of the action being reported.
- Return a Writer instance."""
+ Begin writing an output representation. BASIC_SUBJECT is a subject line
+ describing the action (commit, properties, lock), which may be tweaked
+ given other conditions. GROUP is the name of the configuration file
+ group which is causing this output to be produced. PARAMS is a
+ dictionary of any named subexpressions of regular expressions defined
+ in the configuration file, plus the key 'author' contains the author
+ of the action being reported.
+
+ Return a Writer instance.
+ """
raise NotImplementedError
def finish(self):
@@ -244,7 +244,7 @@ class OutputBase:
class MailedOutput(OutputBase):
- def start(self, group, params):
+ def start(self, basic_subject, group, params):
# whitespace (or another character) separated list of addresses
# which must be split into a clean list
to_addr_in = self.cfg.get('to_addr', group, params)
@@ -289,10 +289,11 @@ class MailedOutput(OutputBase):
return ' '.join(map(_maybe_encode_header, hdr.split()))
- def mail_headers(self, group, params):
+ def mail_headers(self, basic_subject, group, params):
from email import utils
- subject = self._rfc2047_encode(self.make_subject(group, params))
+ subject = self._rfc2047_encode(
+ self.make_subject(basic_subject, group, params))
from_hdr = self._rfc2047_encode(self.from_addr)
to_hdr = self._rfc2047_encode(', '.join(self.to_addrs))
@@ -320,13 +321,13 @@ class MailedOutput(OutputBase):
class SMTPOutput(MailedOutput):
"Deliver a mail message to an MTA using SMTP."
- def start(self, group, params):
- MailedOutput.start(self, group, params)
+ def start(self, basic_subject, group, params):
+ MailedOutput.start(self, basic_subject, group, params)
self.buffer = BytesIO()
writer = Writer(self.buffer.write)
- writer.write(self.mail_headers(group, params))
+ writer.write(self.mail_headers(basic_subject, group, params))
return writer
@@ -403,12 +404,14 @@ class SMTPOutput(MailedOutput):
class StandardOutput(OutputBase):
"Print the commit message to stdout."
- def start(self, group, params):
+ def start(self, basic_subject, group, params):
encoding = sys.stdout.encoding if PY3 else 'utf-8'
writer = Writer(_stdout.write, encoding)
writer.write("Group: " + (group or "defaults") + "\n")
- writer.write("Subject: " + self.make_subject(group, params) + "\n\n")
+ writer.write("Subject: "
+ + self.make_subject(basic_subject, group, params)
+ + "\n\n")
return writer
@@ -425,8 +428,8 @@ class PipeOutput(MailedOutput):
# figure out the command for delivery
self.cmd = cfg.general.mail_command.split()
- def start(self, group, params):
- MailedOutput.start(self, group, params)
+ def start(self, basic_subject, group, params):
+ MailedOutput.start(self, basic_subject, group, params)
### gotta fix this. this is pretty specific to sendmail and qmail's
### mailwrapper program. should be able to use option param substitution
@@ -438,7 +441,7 @@ class PipeOutput(MailedOutput):
writer = Writer(self.pipe.stdin.write)
# start writing out the mail message
- writer.write(self.mail_headers(group, params))
+ writer.write(self.mail_headers(basic_subject, group, params))
return writer
@@ -452,10 +455,13 @@ class PipeOutput(MailedOutput):
class Messenger:
def __init__(self, pool, cfg, repos, prefix_param):
- self.pool = pool
self.cfg = cfg
self.repos = repos
+ # Subclasses should set this instance variable to describe the action
+ # being performed. See OutputBase.start() docstring.
+ self.basic_subject = ''
+
if cfg.is_set('general.mail_command'):
cls = PipeOutput
elif cfg.is_set('general.smtp_hostname'):
@@ -514,9 +520,9 @@ class Commit(Messenger):
dirlist.sort()
dirlist = ' '.join(dirlist)
if commondir:
- self.output.subject = 'r%d - in %s: %s' % (repos.rev, commondir, dirlist)
+ self.basic_subject = 'r%d - in %s: %s' % (repos.rev, commondir, dirlist)
else:
- self.output.subject = 'r%d - %s' % (repos.rev, dirlist)
+ self.basic_subject = 'r%d - %s' % (repos.rev, dirlist)
def generate(self, scratch_pool):
"Generate email for the various groups and option-params."
@@ -532,7 +538,7 @@ class Commit(Messenger):
for (group, param_tuple), (params, paths) in sorted(self.groups.items()):
try:
- writer = self.output.start(group, params)
+ writer = self.output.start(self.basic_subject, group, params)
# generate the content for this group and set of params
generate_content(writer, self.cfg, self.repos, self.changelist,
@@ -561,7 +567,7 @@ class PropChange(Messenger):
param_list = sorted(params.items())
self.groups[group, tuple(param_list)] = params
- self.output.subject = 'r%d - %s' % (repos.rev, propname)
+ self.basic_subject = 'r%d - %s' % (repos.rev, propname)
def generate(self, scratch_pool):
actions = { 'A': 'added', 'M': 'modified', 'D': 'deleted' }
@@ -570,7 +576,7 @@ class PropChange(Messenger):
for (group, param_tuple), params in self.groups.items():
try:
- writer = self.output.start(group, params)
+ writer = self.output.start(self.basic_subject, group, params)
writer.write('Author: %s\n'
'Revision: %s\n'
'Property Name: %s\n'
@@ -667,12 +673,11 @@ class Lock(Messenger):
commondir, dirlist = get_commondir(self.dirlist)
# compose the basic subject line. later, we can prefix it.
- dirlist.sort()
- dirlist = ' '.join(dirlist)
+ dirlist_s = ' '.join(sorted(dirlist))
if commondir:
- self.output.subject = '%s: %s' % (commondir, dirlist)
+ self.basic_subject = '%s: %s' % (commondir, dirlist_s)
else:
- self.output.subject = '%s' % (dirlist)
+ self.basic_subject = dirlist_s
# The lock comment is the same for all paths, so we can just pull
# the comment for the first path in the dirlist and cache it.
@@ -684,7 +689,7 @@ class Lock(Messenger):
ret = 0
for (group, param_tuple), (params, paths) in sorted(self.groups.items()):
try:
- writer = self.output.start(group, params)
+ writer = self.output.start(self.basic_subject, group, params)
writer.write('Author: %s\n'
'%s paths:\n' %
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic