update_branches revision 01163d188b89911c3a23fe1125a4cab6764a408c
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#!/usr/local/bin/perl -w
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
a908d41cb4b0658c958383375c5a8f0bcaaf843dFrancis Dupont# Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC")
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# Permission to use, copy, modify, and distribute this software for any
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# purpose with or without fee is hereby granted, provided that the above
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# copyright notice and this permission notice appear in all copies.
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# PERFORMANCE OF THIS SOFTWARE.
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# $Id: update_branches,v 1.9 2005/05/16 23:38:45 marka Exp $
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# Track which branches are still open or not in the bind9 cvs repository.
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# This is done so that work that is "in progress" (active) doesn't get
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# so easily forgotten about.
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# This script updates doc/private/branches by adding new branches and moving
dbb012765c735ee0d82dedb116cdc7cf18957814Evan Hunt# closed branches to the end of the file. New branches are found by walking
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# the cvs repository and extracting the new branches from the header fields
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# of the files there.
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# doc/private/branches has one line per branch in the following field order:
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# name, status, to whom the branch belongs and comments. Comments are
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# in '(',')'. The first three field are single words.
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews%branches = ();
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews%whom = ();
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews%comments = ();
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# Make sure we have a up to date copy. If the previous ran failed for
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# any reason remove it (-C).
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews!system("cvs", "-d", "/proj/cvs/prod", "update", "-C", "doc/private/branches") || die "cannot update doc/private/branches: $!";
2ae159b376dac23870d8005563c585acf85a4b5aEvan Hunt
2ae159b376dac23870d8005563c585acf85a4b5aEvan Hunt#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# load existing content
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewsopen(BRANCHES, "<doc/private/branches") || die "can't open util/branches: $!";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewswhile (<BRANCHES>) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews chomp;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews next if (/^-/);
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews next if (/^Branch/);
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $c = "";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews if (m/\(.*\)/) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $c = $_;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $c =~ s/.*(\(.*\)).*$/$1/;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews s/\(.*\)//;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews }
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews s/\s$//;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews next if (/^\s*$/);
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews ($branch, $status, $who) = split;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $status = "new" if (!defined($status));
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $branches{$branch} = $status;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $who = "" if (!defined($who));
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $whom{$branch} = $who;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $comments{$branch} = $c;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews}
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewsclose (BRANCHES);
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# Search repository for new branches.
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewsopen(FILES, "find /proj/cvs/prod/bind9 -type f -name *,v -print |") || die "can't start find: $!";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewswhile (<FILES>) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews chomp;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews # print "file: $_\n"; # debug
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews # $file = $_; # save for branch debug below.
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews open(FILE, "<$_") || die "can't open $_: $!";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews while (<FILE>) {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt chomp;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt next unless m/^symbols$/; # skip until we find the tags
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews while (<FILE>) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews chomp;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews last if (m/^locks;/); # we are past the tags
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews next unless m/\.0\.\d$/; # skip if not a branch
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews s/\s(.*):.*/$1/; # extract label
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews if (!$branches{$_}) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $branches{$_} = "new";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $whom{$_} = "";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $comments{$_} = "";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews # print "branch: $_ $file\n"; # debug
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews }
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews }
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews last;
1059bc2e42e8214f8b73d3b4cd181d8394a94a6aFrancis Dupont }
1059bc2e42e8214f8b73d3b4cd181d8394a94a6aFrancis Dupont close(FILE);
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews}
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewsclose(FILES);
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# Write out updated version.
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewsopen(BRANCHES, ">doc/private/newbranches") || die "can't open doc/private/branches: $!";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewsprint BRANCHES "\nBranch\t\t\t\tStatus\tWhom\t(Comments)\n";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewsprint BRANCHES "----------------------------------------------------------\n\n";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewsforeach $key (sort keys %branches) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews next if ($branches{$key} eq "closed");
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews print BRANCHES "$key";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $len = length($key);
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews if ($len >= 32) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $tabs = 1;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews } else {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $needed = int (32 - $len);
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $tabs = int ($needed / 8);
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews if ($needed % 8 != 0) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $tabs++;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews }
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews }
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews for ($i = 0; $i < $tabs; $i++) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews printf BRANCHES "\t";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews }
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews print BRANCHES "$branches{$key}\t";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews print BRANCHES "$whom{$key}";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews print BRANCHES "\t$comments{$key}" if ($comments{$key} ne "");
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews print BRANCHES "\n";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews}
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewsprint BRANCHES "\n\n";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewsforeach $key (sort keys %branches) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews next if ($branches{$key} ne "closed");
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews print BRANCHES "$key";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $len = length($key);
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews if ($len >= 32) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $tabs = 1;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews } else {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $needed = int (32 - $len);
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $tabs = int ($needed / 8);
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews if ($needed % 8 != 0) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews $tabs++;
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews }
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews }
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews for ($i = 0; $i < $tabs; $i++) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews printf BRANCHES "\t";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews }
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews print BRANCHES "$branches{$key}";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews print BRANCHES "\t\t$comments{$key}" if ($comments{$key} ne "");
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews print BRANCHES "\n";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews}
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewsclose(BRANCHES);
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews# Update if changed.
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews#
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrewsif (system("cmp", "-s", "doc/private/newbranches", "doc/private/branches")) {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews rename("doc/private/newbranches", "doc/private/branches") || die "Cannot rename: doc/private/newbranches -> doc/private/branches: $!";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews !system("cvs", "-d", "/proj/cvs/prod", "commit", "-m", "auto update", "doc/private/branches") || die "cvs commit failed: $!";
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews} else {
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews unlink("doc/private/newbranches");
98922b2b2b024dcca25be7c220cf3b16b1e6c4b5Evan Hunt}
98922b2b2b024dcca25be7c220cf3b16b1e6c4b5Evan Hunt