[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.'