update_branches revision 8f8634e66351e292925dde8ab6b0418a0141f86a
d6fa26d0adaec6c910115be34fe7a5a5f402c14fMark Andrews#!/usr/local/bin/perl -w
ddccd5811feff696ba460dabfb666ce61040f545Andreas Gustafsson#
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User# Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC")
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User# Permission to use, copy, modify, and distribute this software for any
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User# purpose with or without fee is hereby granted, provided that the above
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User# copyright notice and this permission notice appear in all copies.
ddccd5811feff696ba460dabfb666ce61040f545Andreas Gustafsson#
d6fa26d0adaec6c910115be34fe7a5a5f402c14fMark Andrews# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User# PERFORMANCE OF THIS SOFTWARE.
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User# $Id: update_branches,v 1.17 2005/05/18 03:31:31 marka Exp $
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Track which branches are still open or not in the bind9 cvs repository.
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User# This is done so that work that is "in progress" (active) doesn't get
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# so easily forgotten about.
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# This script updates doc/private/branches by adding new branches and moving
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User# closed branches to the end of the file. New branches are found by walking
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# the cvs repository and extracting the new branches from the header fields
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# of the files there.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User# doc/private/branches has one line per branch in the following field order:
e21a2904f02a03fa06b6db04d348f65fe9c67b2bMark Andrews# name, status, to whom the branch belongs and comments. Comments are
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User# in '(',')'. The first three field are single words.
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Note: this is intended to be run on the machine hosting the CVS repository.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User%branches = ();
e21a2904f02a03fa06b6db04d348f65fe9c67b2bMark Andrews%whom = ();
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User%comments = ();
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User$repository = "/proj/cvs/prod";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein$module = "bind9";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Make sure we have a up to date copy. If the previous ran failed for
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User# any reason remove it (-C).
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein!system("cvs", "-d", $repository, "update", "-C", "doc/private/branches") || die "cannot update doc/private/branches: $!";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# load existing content
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox Useropen(BRANCHES, "<doc/private/branches") || die "can't open util/branches: $!";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox Userwhile (<BRANCHES>) {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein chomp;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein next if (/^-/);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein next if (/^Branch/);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein next if (/^\s/);
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User $c = "";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if (m://.*:) {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $c = $_;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $c =~ s:.*?//\s*(.*)$:$1:;
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User s:(.*?)//.*:$1:;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein } else {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User # look for old style comment
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User #
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if (m/\(.*\)/) {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $c = $_;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $c =~ s/.*\((.*)\).*$/$1/;
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User s/\(.*\)//;
e21a2904f02a03fa06b6db04d348f65fe9c67b2bMark Andrews }
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User }
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein s/\s*$//;
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User next if (/^\s*$/);
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User ($branch, $status, $who) = split;
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User $status = "new" if (!defined($status));
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User $branches{$branch} = $status;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $who = "" if (!defined($who));
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $whom{$branch} = $who;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $comments{$branch} = $c;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinclose (BRANCHES);
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Search repository for new branches.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# New branches have the following format "name:<revision>.0.#"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# where # is the number of potential branches from this the revision.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox Useropen(FILES, "find $repository/$module -type f -name *,v -print |") || die "can't start find: $!";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinwhile (<FILES>) {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein chomp;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # print "file: $_\n"; # debug
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # $file = $_; # save for branch debug below.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein s:^$repository/::;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein s:/Attic/([^/]*)$:/$1:;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein s:,v$::;
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User #
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # use cvs so that the file is locked.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #print "cvs -d $repository rlog -h $_\n";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein open(FILE, "cvs -d $repository rlog -h $_|") || die "can't start cvs rlog -h $_: $!";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein while (<FILE>) {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein chomp;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein next unless m/^symbolic names:$/; # skip until we find the tags
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein while (<FILE>) {
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User chomp;
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User last if (m/^locks;/); # we are past the tags
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User last if (m/^keyword/); # we are past the tags
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User next unless m/\.0\.\d$/; # skip if not a branch
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein s/\s(.*):.*/$1/; # extract label
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if (!$branches{$_}) {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $branches{$_} = "new";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $whom{$_} = "";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $comments{$_} = "";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # print "branch: $_ $file\n"; # debug
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein }
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein }
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User chomp while (<FILE>); # let cvs rlog exit normally.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein }
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein close(FILE);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinclose(FILES);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User# Write out updated version.
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User#
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox Useropen(BRANCHES, ">doc/private/newbranches") || die "can't open doc/private/branches: $!";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox Userprint BRANCHES "\nBranch\t\t\t\tStatus\tWhom\t// Comments\n";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox Userprint BRANCHES "-----------------------------------------------------------\n\n";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinprint BRANCHES "\t\t\t\tnew\t\tnot yet classified\n";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox Userprint BRANCHES "\t\t\t\topen\t\tdevelopement branch\n";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox Userprint BRANCHES "\t\t\t\tactive\t\tnot a development branch\n";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox Userprint BRANCHES "\t\t\t\treview\t\tready for review\n";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox Userprint BRANCHES "\t\t\t\tprivate\t\tprivate branch\n";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinprint BRANCHES "\t\t\t\tclosed\t\tfinished with\n";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox Userprint BRANCHES "\n";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinforeach $key (sort keys %branches) {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein next if ($branches{$key} eq "closed");
print BRANCHES "$key";
$len = length($key);
if ($len >= 32) {
$tabs = 1;
} else {
$needed = int (32 - $len);
$tabs = int ($needed / 8);
if ($needed % 8 != 0) {
$tabs++;
}
}
for ($i = 0; $i < $tabs; $i++) {
printf BRANCHES "\t";
}
print BRANCHES "$branches{$key}\t";
print BRANCHES "$whom{$key}";
print BRANCHES "\t// $comments{$key}" if ($comments{$key} ne "");
print BRANCHES "\n";
}
print BRANCHES "\n\n";
foreach $key (sort keys %branches) {
next if ($branches{$key} ne "closed");
print BRANCHES "$key";
$len = length($key);
if ($len >= 32) {
$tabs = 1;
} else {
$needed = int (32 - $len);
$tabs = int ($needed / 8);
if ($needed % 8 != 0) {
$tabs++;
}
}
for ($i = 0; $i < $tabs; $i++) {
printf BRANCHES "\t";
}
print BRANCHES "$branches{$key}";
print BRANCHES "\t\t// $comments{$key}" if ($comments{$key} ne "");
print BRANCHES "\n";
}
close(BRANCHES);
#
# Update if changed.
#
if (system("cmp", "-s", "doc/private/newbranches", "doc/private/branches")) {
rename("doc/private/newbranches", "doc/private/branches") || die "Cannot rename: doc/private/newbranches -> doc/private/branches: $!";
!system("cvs", "-d", $repository, "commit", "-m", "auto update", "doc/private/branches") || die "cvs commit failed: $!";
} else {
unlink("doc/private/newbranches");
}