Thread: [Ejtools-cvs] CVS: CVSROOT syncmail,1.1,1.2
Brought to you by:
letiemble
From: Laurent E. <let...@us...> - 2002-05-30 21:38:09
|
Update of /cvsroot/ejtools/CVSROOT In directory usw-pr-cvs1:/tmp/cvs-serv12218 Modified Files: syncmail Log Message: Update to 3.21 Index: syncmail =================================================================== RCS file: /cvsroot/ejtools/CVSROOT/syncmail,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** syncmail 3 Apr 2002 20:07:10 -0000 1.1 --- syncmail 30 May 2002 21:38:04 -0000 1.2 *************** *** 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,79 **** --- 111,119 ---- DIFF_TRUNCATE_IF_LARGER = 1000 + EMPTYSTRING = '' + SPACE = ' ' + DOT = '.' + COMMASPACE = ', ' + PROGRAM = sys.argv[0] *************** *** 82,85 **** --- 122,130 ---- ] + 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" + + def usage(code, msg=''): *************** *** 92,100 **** 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: *************** *** 102,106 **** 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() *************** *** 110,113 **** --- 175,180 ---- 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[:] *************** *** 126,131 **** 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() *************** *** 143,147 **** ! 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! *************** *** 150,162 **** # 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) *************** *** 165,176 **** # 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'): *************** *** 185,188 **** --- 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 *************** *** 192,196 **** 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] *************** *** 201,208 **** # 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 *************** *** 213,224 **** 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.' |