[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