[prev in list] [next in list] [prev in thread] [next in thread] 

List:       leaf-cvs-commits
Subject:    [Leaf-cvs-commits] CVSROOT syncmail,1.4,1.5
From:       Mike Noyes <mhnoyes () projects ! sourceforge ! net>
Date:       2004-01-25 16:56:19
Message-ID: E1AknYZ-0000wE-TN () sc8-pr-cvs1 ! sourceforge ! net
[Download RAW message or body]

Update of /cvsroot/leaf/CVSROOT
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31213

Modified Files:
	syncmail 
Log Message:
updated to cvs-syncmail cvs -r 1.38

Index: syncmail
===================================================================
RCS file: /cvsroot/leaf/CVSROOT/syncmail,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** syncmail	19 Mar 2003 17:43:24 -0000	1.4
--- syncmail	25 Jan 2004 16:39:14 -0000	1.5
***************
*** 1,10 ****
  #! /usr/bin/python
  
! # Copyright (c) 2002, Barry Warsaw, Fred Drake, and contributors
  # All rights reserved.
  # See the accompanying LICENSE file for details.
  
! # 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.
--- 1,10 ----
  #! /usr/bin/python
  
! # Copyright (c) 2002, 2003, Barry Warsaw, Fred Drake, and contributors
  # All rights reserved.
  # See the accompanying LICENSE file for details.
  
! # NOTE: SourceForge currently runs Python 2.2.3, so we need to remain
! # compatible with the Python 2.2 line.
  
  """Complicated notification for CVS checkins.
***************
*** 89,93 ****
          At least one email address.
  """
! __version__ = '1.2'
  
  import os
--- 89,93 ----
          At least one email address.
  """
! __version__ = '1.3'
  
  import os
***************
*** 95,99 ****
  import re
  import time
- import string
  import getopt
  import smtplib
--- 95,98 ----
***************
*** 101,122 ****
  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
  
--- 100,103 ----
***************
*** 130,136 ****
  DIFF_TRUNCATE_IF_LARGER = 1000
  
- EMPTYSTRING = ''
- SPACE = ' '
- DOT = '.'
  COMMASPACE = ', '
  
--- 111,114 ----
***************
*** 141,146 ****
      ]
  
! 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"
  
--- 119,123 ----
      ]
  
! NOVERSION = "Couldn't generate diff; no version number found for file: %s"
  BACKSLASH = "Couldn't generate diff: backslash in filespec's filename: %s"
  
***************
*** 155,189 ****
  
  
! def calculate_diff(filespec, contextlines):
!     spec = string.split(filespec, ',')
!     if len(spec) < 3:
!         # Too few parts; command line probable used a replacement
!         # other than "%{sVv}"; don't fail, but don't produce a diff
!         # since we can't be sure what diff to generate.
!         return ''
!     # This allows filenames that contain commas:
!     file = string.join(spec[:-2], ",")
!     oldrev = spec[-2]
!     newrev = spec[-1]
  
      # 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 + '"'
--- 132,151 ----
  
  
! def calculate_diff(entry, contextlines):
!     file = entry.name
!     oldrev = entry.revision
!     newrev = entry.new_revision
  
      # Make sure we can find a CVS version number
!     if oldrev is None and newrev is None:
!         return NOVERSION % file
  
!     if file.find("'") <> -1:
          # Those crazy users put single-quotes in their file names!  Now we
          # have to escape everything that is meaningful inside double-quotes.
!         filestr = filestr.replace('\\', '\\\\')
!         filestr = filestr.replace('`', '\`')
!         filestr = filestr.replace('"', '\"')
!         filestr = filestr.replace('$', '\$')
          # and quote it with double-quotes.
          filestr = '"' + filestr + '"'
***************
*** 191,195 ****
          # quote it with single-quotes.
          filestr = "'" + file + "'"
!     if oldrev == 'NONE':
          # File is being added.
          try:
--- 153,157 ----
          # quote it with single-quotes.
          filestr = "'" + file + "'"
!     if oldrev is None:
          # File is being added.
          try:
***************
*** 204,209 ****
              # 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):
--- 166,171 ----
              # lines to figure it out:
              for line in lines[:5]:
!                 for c in line.rstrip():
!                     if c.isspace():
                          continue
                      if c < ' ' or c > chr(127):
***************
*** 214,218 ****
              lines = ['***** Error reading new file: ',
                       str(e), '\n***** file: ', file, ' cwd: ', os.getcwd()]
!     elif newrev == 'NONE':
          lines = ['--- %s DELETED ---\n' % file]
      else:
--- 176,180 ----
              lines = ['***** Error reading new file: ',
                       str(e), '\n***** file: ', file, ' cwd: ', os.getcwd()]
!     elif newrev is None:
          lines = ['--- %s DELETED ---\n' % file]
      else:
***************
*** 228,235 ****
          fp = os.popen(diffcmd)
          lines = fp.readlines()
-         sts = fp.close()
          # ignore the error code, it always seems to be 1 :(
! ##        if sts:
! ##            return 'Error code %d occurred during diff\n' % (sts >> 8)
      if len(lines) > DIFF_TRUNCATE_IF_LARGER:
          removedlines = len(lines) - DIFF_HEAD_LINES - DIFF_TAIL_LINES
--- 190,195 ----
          fp = os.popen(diffcmd)
          lines = fp.readlines()
          # ignore the error code, it always seems to be 1 :(
!         fp.close()
      if len(lines) > DIFF_TRUNCATE_IF_LARGER:
          removedlines = len(lines) - DIFF_HEAD_LINES - DIFF_TAIL_LINES
***************
*** 237,241 ****
          lines.insert(DIFF_HEAD_LINES,
                       '[...%d lines suppressed...]\n' % removedlines)
!     return string.join(lines, '')
  
  
--- 197,201 ----
          lines.insert(DIFF_HEAD_LINES,
                       '[...%d lines suppressed...]\n' % removedlines)
!     return ''.join(lines)
  
  
***************
*** 245,249 ****
  def quotename(name):
      if name and rfc822_specials_re.search(name):
!         return '"%s"' % string.replace(name, '"', '\\"')
      else:
          return name
--- 205,209 ----
  def quotename(name):
      if name and rfc822_specials_re.search(name):
!         return '"%s"' % name.replace('"', '\\"')
      else:
          return name
***************
*** 251,255 ****
  
  
! def blast_mail(subject, people, filestodiff, contextlines, fromhost, replyto):
      # cannot wait for child process or that will cause parent to retain cvs
      # lock for too long.  Urg!
--- 211,215 ----
  
  
! def blast_mail(subject, people, entries, contextlines, fromhost, replyto):
      # cannot wait for child process or that will cause parent to retain cvs
      # lock for too long.  Urg!
***************
*** 261,276 ****
          conn = smtplib.SMTP()
          conn.connect(MAILHOST, MAILPORT)
!         user = pwd.getpwuid(os.getuid())[0]
!         name = string.split(pwd.getpwuid(os.getuid())[4], ',')[0]
!         domain = fromhost or getfqdn()
          address = '%s@%s' % (user, domain)
          s = StringIO()
          sys.stdout = s
          try:
              vars = {'address' : address,
                      'name'    : quotename(name),
!                     'people'  : string.join(people, COMMASPACE),
                      'subject' : subject,
                      'version' : __version__,
                      }
              print '''\
--- 221,240 ----
          conn = smtplib.SMTP()
          conn.connect(MAILHOST, MAILPORT)
!         pwinfo = pwd.getpwuid(os.getuid())
!         user = pwinfo[0]
!         name = pwinfo[4].split(',')[0]
!         domain = fromhost or socket.getfqdn()
          address = '%s@%s' % (user, domain)
          s = StringIO()
          sys.stdout = s
+         datestamp = time.strftime('%a, %d %b %Y %H:%M:%S +0000',
+                                   time.gmtime(time.time()))
          try:
              vars = {'address' : address,
                      'name'    : quotename(name),
!                     'people'  : COMMASPACE.join(people),
                      'subject' : subject,
                      'version' : __version__,
+                     'date'    : datestamp,
                      }
              print '''\
***************
*** 281,284 ****
--- 245,249 ----
              print '''\
  Subject: %(subject)s
+ Date: %(date)s
  X-Mailer: Python syncmail %(version)s <http://sf.net/projects/cvs-syncmail>
  ''' % vars
***************
*** 286,291 ****
              # append the diffs if available
              print
!             for file in filestodiff:
!                 print calculate_diff(file, contextlines)
          finally:
              sys.stdout = sys.__stdout__
--- 251,256 ----
              # append the diffs if available
              print
!             for entry in entries:
!                 print calculate_diff(entry, contextlines)
          finally:
              sys.stdout = sys.__stdout__
***************
*** 296,299 ****
--- 261,360 ----
  
  
+ class CVSEntry:
+     def __init__(self, name, revision, timestamp, conflict, options, tagdate):
+         self.name = name
+         self.revision = revision
+         self.timestamp = timestamp
+         self.conflict = conflict
+         self.options = options
+         self.tagdate = tagdate
+ 
+ def get_entry(prefix, mapping, line, filename):
+     line = line.strip()
+     parts = line.split("/")
+     _, name, revision, timestamp, options, tagdate = parts
+     key = namekey(prefix, name)
+     try:
+         entry = mapping[key]
+     except KeyError:
+         if revision == "0":
+             revision = None
+         if timestamp.find("+") != -1:
+             timestamp, conflict = tuple(timestamp.split("+"))
+         else:
+             conflict = None
+         entry = CVSEntry(key, revision, timestamp, conflict,
+                          options, tagdate)
+         mapping[key] = entry
+     return entry
+ 
+ def namekey(prefix, name):
+     if prefix:
+         return os.path.join(prefix, name)
+     else:
+         return name
+ 
+ def load_change_info(prefix=None):
+     if prefix is not None:
+         entries_fn = os.path.join(prefix, "CVS", "Entries")
+     else:
+         entries_fn = os.path.join("CVS", "Entries")
+     entries_log_fn = entries_fn + ".Log"
+     mapping = {}
+     f = open(entries_fn)
+     while 1:
+         line = f.readline()
+         if not line:
+             break
+ ##        if line.strip() == "D":
+ ##            continue
+         # we could recurse down subdirs, except the Entries.Log files
+         # we need haven't been written to the subdirs yet, so it
+         # doesn't do us any good
+ ##        if line[0] == "D":
+ ##            name = line.split("/")[1]
+ ##            dirname = namekey(prefix, name)
+ ##            if os.path.isdir(dirname):
+ ##                m = load_change_info(dirname)
+ ##                mapping.update(m)
+         if line[0] == "/":
+             # normal file
+             get_entry(prefix, mapping, line, entries_fn)
+         # else: bogus Entries line
+     f.close()
+     if os.path.isfile(entries_log_fn):
+         f = open(entries_log_fn)
+         while 1:
+             line = f.readline()
+             if not line:
+                 break
+             if line[1:2] != ' ':
+                 # really old version of CVS
+                 break
+             entry = get_entry(prefix, mapping, line[2:], entries_log_fn)
+             parts = line.split("/")[1:]
+             if line[0] == "A":
+                 # adding a file
+                 entry.new_revision = parts[1]
+             elif line[0] == "R":
+                 # removing a file
+                 entry.new_revision = None
+         f.close()
+     for entry in mapping.values():
+         if not hasattr(entry, "new_revision"):
+             print 'confused about file', entry.name, '-- ignoring'
+             del mapping[entry.name]
+     return mapping
+ 
+ def load_branch_name():
+     tag_fn = os.path.join("CVS", "Tag")
+     if os.path.isfile(tag_fn):
+         f = open(tag_fn)
+         line = f.readline().strip()
+         f.close()
+         if line[:1] == "T":
+             return line[1:]
+     return None
+ 
  # scan args for options
  def main():
***************
*** 346,350 ****
          usage(1, 'No CVS module specified')
      subject = subject_prefix + args[0]
!     specs = string.split(args[0])
      del args[0]
  
--- 407,411 ----
          usage(1, 'No CVS module specified')
      subject = subject_prefix + args[0]
!     specs = args[0].split()
      del args[0]
  
***************
*** 356,379 ****
      people = args
  
-     if verbose:
-         print 'Mailing %s...' % string.join(people, COMMASPACE)
- 
      if specs[-3:] == ['-', 'Imported', 'sources']:
          return
!     if specs[-3:] == ['-', 'New', 'directory']:
!         del specs[-3:]
!     elif len(specs) > 2:
!         L = specs[:2]
!         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, replyto)
      if verbose:
          print 'Generating notification message... done.'
--- 417,432 ----
      people = args
  
      if specs[-3:] == ['-', 'Imported', 'sources']:
+         print 'Not sending email for imported sources.'
          return
! 
!     branch = load_branch_name()
!     changes = load_change_info()
  
      if verbose:
+         print 'Mailing %s...' % COMMASPACE.join(people)
          print 'Generating notification message...'
!     blast_mail(subject, people, changes.values(),
!                contextlines, fromhost, replyto)
      if verbose:
          print 'Generating notification message... done.'



-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn
_______________________________________________
Leaf-cvs-commits mailing list
Leaf-cvs-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/leaf-cvs-commits
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic