[Expat-checkins] CVS: CVSROOT syncmail,1.4,1.5
Fred L. Drake
fdrake@users.sourceforge.net
Thu May 9 05:12:03 2002
Update of /cvsroot/expat/CVSROOT
In directory usw-pr-cvs1:/tmp/cvs-serv22520
Modified Files:
syncmail
Log Message:
Update to the latest version of syncmail.
Index: syncmail
===================================================================
RCS file: /cvsroot/expat/CVSROOT/syncmail,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** syncmail 27 Jul 2001 14:24:24 -0000 1.4
--- syncmail 9 May 2002 12:11:57 -0000 1.5
***************
*** 1,4 ****
#! /usr/bin/python
! # -*- Python -*-
"""Complicated notification for CVS checkins.
--- 1,6 ----
#! /usr/bin/python
!
! # NOTE: Until SourceForge installs a modern version of Python on the cvs
! # servers, this script MUST be compatible with Python 1.5.2.
"""Complicated notification for CVS checkins.
***************
*** 30,34 ****
%(PROGRAM)s [options] <%%S> email-addr [email-addr ...]
! Where options is:
--cvsroot=<path>
--- 32,36 ----
%(PROGRAM)s [options] <%%S> email-addr [email-addr ...]
! Where options are:
--cvsroot=<path>
***************
*** 36,43 ****
variable must exist in the environment.
- --help
- -h
- Print this text.
-
--context=#
-C #
--- 38,41 ----
***************
*** 48,52 ****
-u
! Produce a unified diff (smaller, but harder to read).
<%%S>
--- 46,64 ----
-u
! Produce a unified diff (smaller).
!
! --quiet / -q
! Don't print as much status to stdout.
!
! --fromhost=hostname
! -f hostname
! The hostname that email messages appear to be coming from. The From:
! header will of the outgoing message will look like user@hostname. By
! default, hostname is the machine's fully qualified domain name.
!
! --help / -h
! Print this text.
!
! The rest of the command line arguments are:
<%%S>
***************
*** 59,73 ****
email-addrs
At least one email address.
-
"""
-
import os
import sys
! import string
import time
import getopt
! # Notification command
! MAILCMD = '/bin/mail -s "CVS: %(SUBJECT)s" %(PEOPLE)s 2>&1 > /dev/null'
# Diff trimming stuff
--- 71,108 ----
email-addrs
At least one email address.
"""
import os
import sys
! import re
import time
+ import string
import getopt
+ import smtplib
+ import pwd
+ import socket
! try:
! from socket import getfqdn
! except ImportError:
! def getfqdn():
! # Python 1.5.2 :(
! hostname = socket.gethostname()
! byaddr = socket.gethostbyaddr(socket.gethostbyname(hostname))
! aliases = byaddr[1]
! aliases.insert(0, byaddr[0])
! aliases.insert(0, hostname)
! for fqdn in aliases:
! if '.' in fqdn:
! break
! else:
! fqdn = 'localhost.localdomain'
! return fqdn
!
!
! from cStringIO import StringIO
!
! # Which SMTP server to do we connect to? Empty string means localhost.
! MAILHOST = ''
! MAILPORT = 25
# Diff trimming stuff
***************
*** 76,86 ****
DIFF_TRUNCATE_IF_LARGER = 1000
PROGRAM = sys.argv[0]
! if hasattr(string, "ascii_whitespace"):
! _whitespace = string.ascii_whitespace
! else:
! _whitespace = string.whitespace
--- 111,128 ----
DIFF_TRUNCATE_IF_LARGER = 1000
+ EMPTYSTRING = ''
+ SPACE = ' '
+ DOT = '.'
+ COMMASPACE = ', '
+
PROGRAM = sys.argv[0]
+ BINARY_EXPLANATION_LINES = [
+ "(This appears to be a binary file; contents omitted.)\n"
+ ]
! REVCRE = re.compile("^(NONE|[0-9.]+)$")
! NOVERSION = "Couldn't generate diff; no version number found in filespec: %s"
! BACKSLASH = "Couldn't generate diff: backslash in filespec's filename: %s"
***************
*** 95,103 ****
def calculate_diff(filespec, contextlines):
! try:
! file, oldrev, newrev = string.split(filespec, ',')
! except ValueError:
! # No diff to report
! return '***** Bogus filespec: %s' % filespec
if oldrev == 'NONE':
try:
--- 137,165 ----
def calculate_diff(filespec, contextlines):
! file, oldrev, newrev = string.split(filespec, ',')
! # Make sure we can find a CVS version number
! if not REVCRE.match(oldrev):
! return NOVERSION % filespec
! if not REVCRE.match(newrev):
! return NOVERSION % filespec
!
! if string.find(file, '\\') <> -1:
! # I'm sorry, a file name that contains a backslash is just too much.
! # XXX if someone wants to figure out how to escape the backslashes in
! # a safe way to allow filenames containing backslashes, this is the
! # place to do it. --Zooko 2002-03-17
! return BACKSLASH % filespec
!
! if string.find(file, "'") <> -1:
! # Those crazy users put single-quotes in their file names! Now we
! # have to escape everything that is meaningful inside double-quotes.
! filestr = string.replace(file, '`', '\`')
! filestr = string.replace(filestr, '"', '\"')
! filestr = string.replace(filestr, '$', '\$')
! # and quote it with double-quotes.
! filestr = '"' + filestr + '"'
! else:
! # quote it with single-quotes.
! filestr = "'" + file + "'"
if oldrev == 'NONE':
try:
***************
*** 105,109 ****
fp = open(file)
else:
! update_cmd = 'cvs -fn update -r %s -p %s' % (newrev, file)
fp = os.popen(update_cmd)
lines = fp.readlines()
--- 167,171 ----
fp = open(file)
else:
! update_cmd = "cvs -fn update -r %s -p %s" % (newrev, filestr)
fp = os.popen(update_cmd)
lines = fp.readlines()
***************
*** 111,126 ****
# Is this a binary file? Let's look at the first few
# lines to figure it out:
- binary = 0
for line in lines[:5]:
! for c in line:
if c < ' ' or c > chr(127):
! if c in _whitespace:
! continue
! binary = 1
break
- if binary:
- lines = [
- "(This appears to be a binary file; contents omitted.)\n"
- ]
lines.insert(0, '--- NEW FILE: %s ---\n' % file)
except IOError, e:
--- 173,183 ----
# Is this a binary file? Let's look at the first few
# lines to figure it out:
for line in lines[:5]:
! for c in string.rstrip(line):
! if c in string.whitespace:
! continue
if c < ' ' or c > chr(127):
! lines = BINARY_EXPLANATION_LINES[:]
break
lines.insert(0, '--- NEW FILE: %s ---\n' % file)
except IOError, e:
***************
*** 136,141 ****
else:
difftype = "-u"
! diffcmd = "/usr/bin/cvs -f diff -kk %s --minimal -r %s -r %s '%s'" % (
! difftype, oldrev, newrev, file)
fp = os.popen(diffcmd)
lines = fp.readlines()
--- 193,198 ----
else:
difftype = "-u"
! diffcmd = "/usr/bin/cvs -f diff -kk %s --minimal -r %s -r %s %s" \
! % (difftype, oldrev, newrev, filestr)
fp = os.popen(diffcmd)
lines = fp.readlines()
***************
*** 153,157 ****
! def blast_mail(mailcmd, filestodiff, contextlines):
# cannot wait for child process or that will cause parent to retain cvs
# lock for too long. Urg!
--- 210,214 ----
! def blast_mail(subject, people, filestodiff, contextlines, fromhost):
# cannot wait for child process or that will cause parent to retain cvs
# lock for too long. Urg!
***************
*** 160,172 ****
# give up the lock you cvs thang!
time.sleep(2)
! fp = os.popen(mailcmd, 'w')
! fp.write(sys.stdin.read())
! fp.write('\n')
! # append the diffs if available
! for file in filestodiff:
! fp.write(calculate_diff(file, contextlines))
! fp.write('\n')
! fp.close()
! # doesn't matter what code we return, it isn't waited on
os._exit(0)
--- 217,246 ----
# give up the lock you cvs thang!
time.sleep(2)
! # Create the smtp connection to the localhost
! conn = smtplib.SMTP()
! conn.connect(MAILHOST, MAILPORT)
! user = pwd.getpwuid(os.getuid())[0]
! domain = fromhost or getfqdn()
! author = '%s@%s' % (user, domain)
! s = StringIO()
! sys.stdout = s
! try:
! print '''\
! From: %(author)s
! To: %(people)s
! Subject: %(subject)s
! ''' % {'author' : author,
! 'people' : string.join(people, COMMASPACE),
! 'subject': subject,
! }
! s.write(sys.stdin.read())
! # append the diffs if available
! print
! for file in filestodiff:
! print calculate_diff(file, contextlines)
! finally:
! sys.stdout = sys.__stdout__
! resp = conn.sendmail(author, people, s.getvalue())
! conn.close()
os._exit(0)
***************
*** 175,186 ****
# scan args for options
def main():
- contextlines = 2
try:
! opts, args = getopt.getopt(sys.argv[1:], 'hC:cu',
! ['context=', 'cvsroot=', 'help'])
except getopt.error, msg:
usage(1, msg)
# parse the options
for opt, arg in opts:
if opt in ('-h', '--help'):
--- 249,263 ----
# scan args for options
def main():
try:
! opts, args = getopt.getopt(
! sys.argv[1:], 'hC:cuqf:',
! ['fromhost=', 'context=', 'cvsroot=', 'help', 'quiet'])
except getopt.error, msg:
usage(1, msg)
# parse the options
+ contextlines = 2
+ verbose = 1
+ fromhost = None
for opt, arg in opts:
if opt in ('-h', '--help'):
***************
*** 195,198 ****
--- 272,279 ----
elif opt == '-u':
contextlines = 0
+ elif opt in ('-q', '--quiet'):
+ verbose = 0
+ elif opt in ('-f', '--fromhost'):
+ fromhost = arg
# What follows is the specification containing the files that were
***************
*** 202,206 ****
if not args:
usage(1, 'No CVS module specified')
! SUBJECT = args[0]
specs = string.split(args[0])
del args[0]
--- 283,287 ----
if not args:
usage(1, 'No CVS module specified')
! subject = args[0]
specs = string.split(args[0])
del args[0]
***************
*** 211,218 ****
# Now do the mail command
! PEOPLE = string.join(args)
! mailcmd = MAILCMD % vars()
- print 'Mailing %s...' % PEOPLE
if specs == ['-', 'Imported', 'sources']:
return
--- 292,300 ----
# Now do the mail command
! people = args
!
! if verbose:
! print 'Mailing %s...' % string.join(people, COMMASPACE)
if specs == ['-', 'Imported', 'sources']:
return
***************
*** 223,234 ****
for s in specs[2:]:
prev = L[-1]
! if string.count(prev, ",") < 2:
L[-1] = "%s %s" % (prev, s)
else:
L.append(s)
specs = L
! print 'Generating notification message...'
! blast_mail(mailcmd, specs[1:], contextlines)
! print 'Generating notification message... done.'
--- 305,319 ----
for s in specs[2:]:
prev = L[-1]
! if string.count(prev, ',') < 2:
L[-1] = "%s %s" % (prev, s)
else:
L.append(s)
specs = L
!
! if verbose:
! print 'Generating notification message...'
! blast_mail(subject, people, specs[1:], contextlines, fromhost)
! if verbose:
! print 'Generating notification message... done.'