aboutsummaryrefslogtreecommitdiffstats
path: root/CVSROOT/cfg.pm
blob: 2ab0d18f89871beeed3bca10117ee7f431a1a159 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
# $FreeBSD$

####################################################################
####################################################################
# This file contains the default configuration for the CVSROOT
# perl scripts.  You are advised to override the configuration
# in the cfg_local.pm file instead of here.
#
# WARNING: You are strongly advised to check for syntax errors
# in this file before committing it.  Use: perl -cw cfg.pm
####################################################################
####################################################################

package cfg;
use strict;
use vars qw(
    $ADD_TO_LINE $AVAIL_FILE $CHECK_HEADERS $COMMITCHECK_EXTRA
    @COMMIT_HOSTS $COMMITTER $DEBUG $DIFF_BLOCK_TOTAL_LINES $EXCLUDE_FILE
    $FILE_PREFIX $IDHEADER $LAST_FILE @LOG_FILE_MAP $MAILADDRS $MAILBANNER
    $MAILCMD $MAIL_BRANCH_HDR $MAIL_ON_DIR_CREATION $MAIL_TRANSFORM
    $MINCVSVERSION $MAX_DIFF_SIZE $NO_DOS_LINEBREAKS $PID $PROG_CVS
    $PROG_MV %TEMPLATE_HEADERS $TMPDIR $TZ $UNEXPAND_RCSID $WARN_HEADERS
);
use POSIX qw(tzset);

my $CVSROOT = $ENV{'CVSROOT'} || die "Can't determine \$CVSROOT!";



######################
### global options ###
######################
### WARNING: these aren't global across all the scripts yet.
### This is work in progress.

# Process group id; used as a unique number in temporary file names.
$PID = getpgrp();

# Debug level, 0 = off, 1 = on.
$DEBUG = 0;

# Location of temporary directory.
$TMPDIR = "/tmp/";

# The filename prefix used for temporary files.
$FILE_PREFIX = "#cvs.files.$PID";

# The file used to store the name of the last directory examined
# when processing a multi-directory commit.
$LAST_FILE = "$TMPDIR/$FILE_PREFIX.lastdir";
# System tools.
$PROG_CVS = '/usr/bin/cvs';     # cvs(1)
$PROG_MV =  '/bin/mv';      # mv(1)

# The username of the committer.
$COMMITTER = $ENV{"LOGNAME"} || $ENV{'USER'} || getlogin
        || (getpwuid($<))[0] || sprintf("uid#%d",$<);

# Time zone
$TZ = undef;

###################
### commitcheck ###
###################

# A list of hosts the it's ok to commit on.  Useful if your committers
# take local copies of the repository to work off-line.
# (Empty if you don't want checks.)
@COMMIT_HOSTS = ();

# The minimum version of cvs that we will work with.
$MINCVSVERSION = "1090900";  # 1.9.9p0

# Additional commit time checks.  This is an anonymous subroutine
# that gets called early on in the validation process to see whether
# the committer is allowed to commit.  It should return true if
# everything is ok, otherwise the commit will be terminated.
$COMMITCHECK_EXTRA = "";


###################
### cvs_acls.pl ###
###################

# The name of the avail file that defines who's allow to
# commit to what.
$AVAIL_FILE = "$CVSROOT/CVSROOT/avail";


################
### logcheck ###
################

# These are the optional headers that can be filled at the end of
# each commit message.  The associated value is a regular-expression
# that is used to type-check the entered value.  If a match fails
# then the commit is rejected.  (See rcstemplate).
#
# Make sure that these are also described in the rcstemplate to
# make their usage clear to committers.
#
# In addition any of these entries that are left blank are removed
# from the log at commit time.  [Please note that for them to be
# removed from the rcslog in the repository you need to be running
# the version of cvs in the FreeBSD source tree.  We've got a local
# patch that causes cvs to read back the commit message after the
# commit_prep.pl script has had a chance to modify it (via the
# 'commitinfo' hook). ]
%TEMPLATE_HEADERS = (
#   "Reviewed by"       => '.*',
#   "Submitted by"      => '.*',
#   "Obtained from"     => '.*',
#   "Approved by"       => '.*',
#   "PR"            => '.*',
#   "MFC after"     => '\d+(\s+(days?|weeks?|months?))?'
);


######################
### commit_prep.pl ###
######################

# Check for instances of $IDHEADER in committed files, and
# bomb out if they're not present, or corrupted.
# Exclusions can be specified in the exclude file.
# Currently $IDHEADER must be an instance of '$ CVSHeader $', or an alias
# defined in CVSROOT/options.
$CHECK_HEADERS = 0;
$EXCLUDE_FILE = "$CVSROOT/CVSROOT/exclude";

# Make a header check a non-fatal error - just warn, don't exit.
$WARN_HEADERS = 0;

# WARNING: You will also need to be running the version of cvs that
# the FreeBSD project is using; I believe that we have some local patches
# that aren't in the main 'cvs' source.
# Additionally you'll need to tweak CVSROOT/options if you wish to use your
# own ident header.
$IDHEADER = 'CVSHeader';

# Contract any instances of $IDHEADER in the source file before committing.
# This is useful because it means that expanded headers aren't stored in
# the repository as part of the delta.
$UNEXPAND_RCSID = 0;

# Check for DOS/WINDOWS/MAC linebreaks in the file, bomb out if present.
# Exclusions can be specified in the exclude file.
$NO_DOS_LINEBREAKS = 0;


####################
### log_accum.pl ###
####################

# The command used to mail the log messages.
# Usually something like '/usr/sbin/sendmail'.
$MAILCMD = "/usr/sbin/sendmail";

# Email addresses of recipients of commit mail.
$MAILADDRS = 'nobody';

# Extra banner added to the top of commit email.
# Use "" if you don't want one.
# i.e. $MAILBANNER = "Project X CVS Repository";
$MAILBANNER = "";

# Send mail when directories are created in the repository.
# 0 = off, 1 = on.
$MAIL_ON_DIR_CREATION = 0;

# Include the names of the branches committed to in the commit email,
# using this header (leave off the trailing ':').
# Use "" if you don't want one.
$MAIL_BRANCH_HDR  = "X-CVS-Branch";

# Include a 'To:' header in the generated commit mail?
$ADD_TO_LINE = 1;

# This is a way to post-process the log email before it is mailed.
# Some people find it useful to use this to create URLs in their
# commit mails to show the patch in a web page (using cvsweb) for
# instance.
#
# The $MAIL_TRANSFORM variable should be "" if you don't want to
# use this feature.  Otherwise it should be a reference to a
# subroutine that is passed the email message as a list, and returns
# the modified list to the log_accum.pl script.  The list has one
# element per email line, with no trailing line feeds.  This function
# shouldn't add them.  If $DEBUG is switched on the log_accum.pl
# script will show the before and after on stdout at commit time.
#
# The example below shows a way of inserting links to cvsweb.
$MAIL_TRANSFORM = "";
#$MAIL_TRANSFORM = sub {
#   add_cvsweb_entry("http://www.example.org/cgi-bin/cvsweb.cgi", @_);
#};

# A copy of the commit summary is saved locally as well as being
# emailed to the committers.  The name of the local log is obtained
# by performing a pattern match on the directory that the files are
# in.  The following map defines the file names and their associated
# pattern match.  They are checked in order. The name 'other' is
# used if none of the patterns match.
#
# XXX The directory that the logs are placed in should be a
# configuration option too.
@LOG_FILE_MAP = (
    'CVSROOT'   => '^CVSROOT/',
    'doc'       => '^doc/',
    'user'      => '^src/',
    'other'     => '.*'
);

# Include diffs of not greater than this size in kbytes in the
# commit mail for each file modified. (0 = off).
$MAX_DIFF_SIZE = 0;

# Maximum size of in lines of the diff block.
$DIFF_BLOCK_TOTAL_LINES = 200;


######################
# EXAMPLES
######################
# A function for post-processing a log message
# and outputing it with URLs to a cvsweb.cgi in.
sub add_cvsweb_entry {
    my $url_to_cvsweb = shift;
    my @input = @_;
    my @output = ();

    # Skip down to the revision summary.
    while (1) {
        my $line = shift @input;
        last unless defined($line);

        push @output, $line;
        last if $line =~ /^\s*Revision\s*Changes\s*Path\s*$/;
    }

    # Add the url links
    my $skip = 0;
    foreach (@input) {
        # The revision block is terminated with an empty line.
        $skip = 1 if $_ =~ /^\s*$/;

        push @output, $_;
        next if $skip;

        my ($rev, $add, $sub, $file, $status) = split;

        $rev =~ /(?:(.*)\.)?([^\.]+)\.([^\.]+)$/;
        my ($base, $r1, $r2) = ($1, $2, $3);
        my $prevrev = "";
        if ($r2 == 1) {
            $prevrev = $base;
        } else {
            $prevrev = "$base." if $base;
            $prevrev .= "$r1." . ($r2 - 1);
        }

        my $baseurl = "$url_to_cvsweb/$file";
        my $extra;
        if (defined($status)) {
            $rev = $prevrev if $status =~ /dead/;
            $extra = "?rev=$rev&content-type=text/plain";
        } else {
            $extra = ".diff?r1=$prevrev&r2=$rev&f=h";
        }
        push @output, "$baseurl$extra";
    }

    return @output;
};


######################################################################
# Load the local configuration file, that allows the entries in this
# file to be overridden.
######################################################################
eval { require "$CVSROOT/CVSROOT/cfg_local.pm" }
    if -e "$CVSROOT/CVSROOT/cfg_local.pm";
warn $@ if $@;

if (defined $TZ) {
    $ENV{'TZ'} = $TZ;
} else {
    delete $ENV{'TZ'};
}
tzset;

1; # Perl requires all modules to return true.  Don't delete!!!!
#end