From: Ash Berlin Date: Tue, 27 Nov 2007 11:21:30 +0000 (+0000) Subject: Branch for diff refactoring X-Git-Tag: v0.11008~348^2~15 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=f0630c2dbf17af6846c1c69cb811f00a2cc81907;p=dbsrgits%2FSQL-Translator.git Branch for diff refactoring --- diff --git a/CVSROOT/checkoutlist b/CVSROOT/checkoutlist new file mode 100644 index 0000000..4c45a69 --- /dev/null +++ b/CVSROOT/checkoutlist @@ -0,0 +1,14 @@ +# The "checkoutlist" file is used to support additional version controlled +# administrative files in $CVSROOT/CVSROOT, such as template files. +# +# The first entry on a line is a filename which will be checked out from +# the corresponding RCS file in the $CVSROOT/CVSROOT directory. +# The remainder of the line is an error message to use if the file cannot +# be checked out. +# +# File format: +# +# [] +# +# comment lines begin with '#' +syncmail diff --git a/CVSROOT/commitinfo b/CVSROOT/commitinfo new file mode 100644 index 0000000..b19e7b7 --- /dev/null +++ b/CVSROOT/commitinfo @@ -0,0 +1,15 @@ +# The "commitinfo" file is used to control pre-commit checks. +# The filter on the right is invoked with the repository and a list +# of files to check. A non-zero exit of the filter program will +# cause the commit to be aborted. +# +# The first entry on a line is a regular expression which is tested +# against the directory that the change is being committed to, relative +# to the $CVSROOT. For the first match that is found, then the remainder +# of the line is the name of the filter to run. +# +# If the repository name does not match any of the regular expressions in this +# file, the "DEFAULT" line is used, if it is specified. +# +# If the name "ALL" appears as a regular expression it is always used +# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/config b/CVSROOT/config new file mode 100644 index 0000000..ff43ec0 --- /dev/null +++ b/CVSROOT/config @@ -0,0 +1,14 @@ +# Set this to "no" if pserver shouldn't check system users/passwords +#SystemAuth=no + +# Put CVS lock files in this directory rather than directly in the repository. +#LockDir=/var/lock/cvs + +# Set `TopLevelAdmin' to `yes' to create a CVS directory at the top +# level of the new working directory when using the `cvs checkout' +# command. +#TopLevelAdmin=no + +# Set `LogHistory' to `all' or `TOFEWGCMAR' to log all transactions to the +# history file, or a subset as needed (ie `TMAR' logs all write operations) +#LogHistory=TOFEWGCMAR diff --git a/CVSROOT/cvswrappers b/CVSROOT/cvswrappers new file mode 100644 index 0000000..0accaf1 --- /dev/null +++ b/CVSROOT/cvswrappers @@ -0,0 +1,23 @@ +# This file affects handling of files based on their names. +# +# The -t/-f options allow one to treat directories of files +# as a single file, or to transform a file in other ways on +# its way in and out of CVS. +# +# The -m option specifies whether CVS attempts to merge files. +# +# The -k option specifies keyword expansion (e.g. -kb for binary). +# +# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers) +# +# wildcard [option value][option value]... +# +# where option is one of +# -f from cvs filter value: path to filter +# -t to cvs filter value: path to filter +# -m update methodology value: MERGE or COPY +# -k expansion mode value: b, o, kkv, &c +# +# and value is a single-quote delimited value. +# For example: +#*.gif -k 'b' diff --git a/CVSROOT/editinfo b/CVSROOT/editinfo new file mode 100644 index 0000000..d78886c --- /dev/null +++ b/CVSROOT/editinfo @@ -0,0 +1,21 @@ +# The "editinfo" file is used to allow verification of logging +# information. It works best when a template (as specified in the +# rcsinfo file) is provided for the logging procedure. Given a +# template with locations for, a bug-id number, a list of people who +# reviewed the code before it can be checked in, and an external +# process to catalog the differences that were code reviewed, the +# following test can be applied to the code: +# +# Making sure that the entered bug-id number is correct. +# Validating that the code that was reviewed is indeed the code being +# checked in (using the bug-id number or a seperate review +# number to identify this particular code set.). +# +# If any of the above test failed, then the commit would be aborted. +# +# Actions such as mailing a copy of the report to each reviewer are +# better handled by an entry in the loginfo file. +# +# One thing that should be noted is the the ALL keyword is not +# supported. There can be only one entry that matches a given +# repository. diff --git a/CVSROOT/loginfo b/CVSROOT/loginfo new file mode 100644 index 0000000..5f86b6f --- /dev/null +++ b/CVSROOT/loginfo @@ -0,0 +1,27 @@ +# The "loginfo" file controls where "cvs commit" log information +# is sent. The first entry on a line is a regular expression which must match +# the directory that the change is being made to, relative to the +# $CVSROOT. If a match is found, then the remainder of the line is a filter +# program that should expect log information on its standard input. +# +# If the repository name does not match any of the regular expressions in this +# file, the "DEFAULT" line is used, if it is specified. +# +# If the name ALL appears as a regular expression it is always used +# in addition to the first matching regex or DEFAULT. +# +# You may specify a format string as part of the +# filter. The string is composed of a `%' followed +# by a single format character, or followed by a set of format +# characters surrounded by `{' and `}' as separators. The format +# characters are: +# +# s = file name +# V = old version number (pre-checkin) +# v = new version number (post-checkin) +# +# For example: +#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog +# or +#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog +DEFAULT $CVSROOT/CVSROOT/syncmail %{sVv} sqlfairy-commits@lists.sourceforge.net diff --git a/CVSROOT/modules b/CVSROOT/modules new file mode 100644 index 0000000..cb9e9ef --- /dev/null +++ b/CVSROOT/modules @@ -0,0 +1,26 @@ +# Three different line formats are valid: +# key -a aliases... +# key [options] directory +# key [options] directory files... +# +# Where "options" are composed of: +# -i prog Run "prog" on "cvs commit" from top-level of module. +# -o prog Run "prog" on "cvs checkout" of module. +# -e prog Run "prog" on "cvs export" of module. +# -t prog Run "prog" on "cvs rtag" of module. +# -u prog Run "prog" on "cvs update" of module. +# -d dir Place module in directory "dir" instead of module name. +# -l Top-level directory only -- do not recurse. +# +# NOTE: If you change any of the "Run" options above, you'll have to +# release and re-checkout any working directories of these modules. +# +# And "directory" is a path to a directory relative to $CVSROOT. +# +# The "-a" option specifies an alias. An alias is interpreted as if +# everything on the right of the "-a" had been typed on the command line. +# +# You can encode a module within a module by using the special '&' +# character to interpose another module into the current module. This +# can be useful for creating a module that consists of many directories +# spread out over the entire source repository. diff --git a/CVSROOT/notify b/CVSROOT/notify new file mode 100644 index 0000000..34f0bc2 --- /dev/null +++ b/CVSROOT/notify @@ -0,0 +1,12 @@ +# The "notify" file controls where notifications from watches set by +# "cvs watch add" or "cvs edit" are sent. The first entry on a line is +# a regular expression which is tested against the directory that the +# change is being made to, relative to the $CVSROOT. If it matches, +# then the remainder of the line is a filter program that should contain +# one occurrence of %s for the user to notify, and information on its +# standard input. +# +# "ALL" or "DEFAULT" can be used in place of the regular expression. +# +# For example: +#ALL mail %s -s "CVS notification" diff --git a/CVSROOT/rcsinfo b/CVSROOT/rcsinfo new file mode 100644 index 0000000..49e59f4 --- /dev/null +++ b/CVSROOT/rcsinfo @@ -0,0 +1,13 @@ +# The "rcsinfo" file is used to control templates with which the editor +# is invoked on commit and import. +# +# The first entry on a line is a regular expression which is tested +# against the directory that the change is being made to, relative to the +# $CVSROOT. For the first match that is found, then the remainder of the +# line is the name of the file that contains the template. +# +# If the repository name does not match any of the regular expressions in this +# file, the "DEFAULT" line is used, if it is specified. +# +# If the name "ALL" appears as a regular expression it is always used +# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/syncmail b/CVSROOT/syncmail new file mode 100755 index 0000000..c8b8318 --- /dev/null +++ b/CVSROOT/syncmail @@ -0,0 +1,187 @@ +#!/usr/bin/python +# -*- Python -*- + +"""Complicated notification for CVS checkins. + +This script is used to provide email notifications of changes to the CVS +repository. These email changes will include context diffs of the changes. +Really big diffs will be trimmed. + +This script is run from a CVS loginfo file (see $CVSROOT/CVSROOT/loginfo). To +set this up, create a loginfo entry that looks something like this: + + mymodule /path/to/this/script %%s some-email-addr@your.domain + +In this example, whenever a checkin that matches `mymodule' is made, this +script is invoked, which will generate the diff containing email, and send it +to some-email-addr@your.domain. + + Note: This module used to also do repository synchronizations via + rsync-over-ssh, but since the repository has been moved to SourceForge, + this is no longer necessary. The syncing functionality has been ripped + out in the 3.0, which simplifies it considerably. Access the 2.x versions + to refer to this functionality. Because of this, the script is misnamed. + +It no longer makes sense to run this script from the command line. Doing so +will only print out this usage information. + + +Usage: + + %(PROGRAM)s [options] <%%S> email-addr [email-addr ...] + +Where options is: + + --cvsroot= + Use as the environment variable CVSROOT. Otherwise this + variable must exist in the environment. + + --help + -h + Print this text. + + <%%S> + CVS %%s loginfo expansion. When invoked by CVS, this will be a single + string containing the directory the checkin is being made in, relative + to $CVSROOT, followed by the list of files that are changing. If the + %%s in the loginfo file is %%{sVv}, context diffs for each of the + modified files are included in any email messages that are generated. + + 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 +DIFF_HEAD_LINES = 20 +DIFF_TAIL_LINES = 20 +DIFF_TRUNCATE_IF_LARGER = 1000 + +PROGRAM = sys.argv[0] + + + +def usage(code, msg=''): + print __doc__ % globals() + if msg: + print msg + sys.exit(code) + + + +def calculate_diff(filespec): + try: + file, oldrev, newrev = string.split(filespec, ',') + except ValueError: + # No diff to report + return '***** Bogus filespec: %s' % filespec + if oldrev == 'NONE': + try: + if os.path.exists(file): + fp = open(file) + else: + update_cmd = 'cvs -fn update -r %s -p %s' % (newrev, file) + fp = os.popen(update_cmd) + lines = fp.readlines() + fp.close() + lines.insert(0, '--- NEW FILE ---\n') + except IOError, e: + lines = ['***** Error reading new file: ', + str(e), '\n***** file: ', file, ' cwd: ', os.getcwd()] + elif newrev == 'NONE': + lines = ['--- %s DELETED ---\n' % file] + else: + # This /has/ to happen in the background, otherwise we'll run into CVS + # lock contention. What a crock. + diffcmd = '/usr/bin/cvs -f diff -kk -C 2 -w -r %s -r %s %s' % ( + oldrev, newrev, file) + 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 + del lines[DIFF_HEAD_LINES:-DIFF_TAIL_LINES] + lines.insert(DIFF_HEAD_LINES, + '[...%d lines suppressed...]\n' % removedlines) + return string.join(lines, '') + + + +def blast_mail(mailcmd, filestodiff): + # cannot wait for child process or that will cause parent to retain cvs + # lock for too long. Urg! + if not os.fork(): + # in the child + # 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)) + fp.write('\n') + fp.close() + # doesn't matter what code we return, it isn't waited on + os._exit(0) + + + +# scan args for options +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], 'h', ['cvsroot=', 'help']) + except getopt.error, msg: + usage(1, msg) + + # parse the options + for opt, arg in opts: + if opt in ('-h', '--help'): + usage(0) + elif opt == '--cvsroot': + os.environ['CVSROOT'] = arg + + # What follows is the specification containing the files that were + # modified. The argument actually must be split, with the first component + # containing the directory the checkin is being made in, relative to + # $CVSROOT, followed by the list of files that are changing. + if not args: + usage(1, 'No CVS module specified') + SUBJECT = args[0] + specs = string.split(args[0]) + del args[0] + + # The remaining args should be the email addresses + if not args: + usage(1, 'No recipients specified') + + # Now do the mail command + PEOPLE = string.join(args) + mailcmd = MAILCMD % vars() + + print 'Mailing %s...' % PEOPLE + if specs == ['-', 'Imported', 'sources']: + return + if specs[-3:] == ['-', 'New', 'directory']: + del specs[-3:] + print 'Generating notification message...' + blast_mail(mailcmd, specs[1:]) + print 'Generating notification message... done.' + + + +if __name__ == '__main__': + main() + sys.exit(0) diff --git a/CVSROOT/taginfo b/CVSROOT/taginfo new file mode 100644 index 0000000..274a46d --- /dev/null +++ b/CVSROOT/taginfo @@ -0,0 +1,20 @@ +# The "taginfo" file is used to control pre-tag checks. +# The filter on the right is invoked with the following arguments: +# +# $1 -- tagname +# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d +# $3 -- repository +# $4-> file revision [file revision ...] +# +# A non-zero exit of the filter program will cause the tag to be aborted. +# +# The first entry on a line is a regular expression which is tested +# against the directory that the change is being committed to, relative +# to the $CVSROOT. For the first match that is found, then the remainder +# of the line is the name of the filter to run. +# +# If the repository name does not match any of the regular expressions in this +# file, the "DEFAULT" line is used, if it is specified. +# +# If the name "ALL" appears as a regular expression it is always used +# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/verifymsg b/CVSROOT/verifymsg new file mode 100644 index 0000000..86f747c --- /dev/null +++ b/CVSROOT/verifymsg @@ -0,0 +1,21 @@ +# The "verifymsg" file is used to allow verification of logging +# information. It works best when a template (as specified in the +# rcsinfo file) is provided for the logging procedure. Given a +# template with locations for, a bug-id number, a list of people who +# reviewed the code before it can be checked in, and an external +# process to catalog the differences that were code reviewed, the +# following test can be applied to the code: +# +# Making sure that the entered bug-id number is correct. +# Validating that the code that was reviewed is indeed the code being +# checked in (using the bug-id number or a seperate review +# number to identify this particular code set.). +# +# If any of the above test failed, then the commit would be aborted. +# +# Actions such as mailing a copy of the report to each reviewer are +# better handled by an entry in the loginfo file. +# +# One thing that should be noted is the the ALL keyword is not +# supported. There can be only one entry that matches a given +# repository.