update_branches revision d6dc0d4f584352d2e4305435599ae8c93776d9b4
c40265eba0c99708887d68e67901924065ba2514Brian Wellington#!/usr/local/bin/perl -w
dba3c818ae00b10388d31703e86a28415db398acTinderbox User#
75c0816e8295e180f4bc7f10db3d0d880383bc1cMark Andrews# Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC")
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
4a14ce5ba00ab7bc55c99ffdcf59c7a4ab902721Automatic Updater# Permission to use, copy, modify, and distribute this software for any
c40265eba0c99708887d68e67901924065ba2514Brian Wellington# purpose with or without fee is hereby granted, provided that the above
c40265eba0c99708887d68e67901924065ba2514Brian Wellington# copyright notice and this permission notice appear in all copies.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
af5073d03288a53b646ec3b807ac25ced64d7879Mark Andrews# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
af5073d03288a53b646ec3b807ac25ced64d7879Mark Andrews# 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,
af5073d03288a53b646ec3b807ac25ced64d7879Mark Andrews# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
af5073d03288a53b646ec3b807ac25ced64d7879Mark Andrews# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
af5073d03288a53b646ec3b807ac25ced64d7879Mark Andrews# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
af5073d03288a53b646ec3b807ac25ced64d7879Mark Andrews# PERFORMANCE OF THIS SOFTWARE.
c40265eba0c99708887d68e67901924065ba2514Brian Wellington
ea94d370123a5892f6c47a97f21d1b28d44bb168Tinderbox User# $Id: update_branches,v 1.15 2005/05/17 03:50:55 marka Exp $
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Track which branches are still open or not in the bind9 cvs repository.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# This is done so that work that is "in progress" (active) doesn't get
e21a2904f02a03fa06b6db04d348f65fe9c67b2bMark Andrews# so easily forgotten about.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# This script updates doc/private/branches by adding new branches and moving
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews# 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.
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# doc/private/branches has one line per branch in the following field order:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# name, status, to whom the branch belongs and comments. Comments are
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# in '(',')'. The first three field are single words.
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox User#
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox User
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein%branches = ();
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein%whom = ();
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox User%comments = ();
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein$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
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# any reason remove it (-C).
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews#
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews!system("cvs", "-d", $repository, "update", "-C", "doc/private/branches") || die "cannot update doc/private/branches: $!";
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews#
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews# load existing content
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews#
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrewsopen(BRANCHES, "<doc/private/branches") || die "can't open util/branches: $!";
f6da30bb5447c23d880b09f601441e70c5313557Mark Andrewswhile (<BRANCHES>) {
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews chomp;
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews next if (/^-/);
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews next if (/^Branch/);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein next if (/^\s/);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $c = "";
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox User if (m://.*:) {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $c = $_;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $c =~ s:.*?//\s*(.*)$:$1:;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein s:(.*?)//.*:$1:;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein } else {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
f7b41fd9291b8f4dba27e2b57e1d93f0913a4f1dMark Andrews # look for old style comment
f7b41fd9291b8f4dba27e2b57e1d93f0913a4f1dMark Andrews #
f7b41fd9291b8f4dba27e2b57e1d93f0913a4f1dMark Andrews if (m/\(.*\)/) {
f7b41fd9291b8f4dba27e2b57e1d93f0913a4f1dMark Andrews $c = $_;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $c =~ s/.*\((.*)\).*$/$1/;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein s/\(.*\)//;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein }
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein }
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein s/\s*$//;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein next if (/^\s*$/);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ($branch, $status, $who) = split;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $status = "new" if (!defined($status));
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $branches{$branch} = $status;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $who = "" if (!defined($who));
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $whom{$branch} = $who;
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox User $comments{$branch} = $c;
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox User}
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox Userclose (BRANCHES);
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox User
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox User#
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox User# Search repository for new branches.
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox User#
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox User# New branches have the following format "name:<revision>.0.#"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# where # is the number of potential branches from this the revision.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinopen(FILES, "find $repository/$module -type f -name *,v -print |") || die "can't start find: $!";
9fbbfb5757a1e3e86d7dea62c4e63ffc2303ca2bAutomatic Updaterwhile (<FILES>) {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein chomp;
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews # print "file: $_\n"; # debug
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews # $file = $_; # save for branch debug below.
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews s:^$repository/::;
d71e2e0c61df16ff37c9934c371a4a60c08974f7Mark Andrews s:/Attic/([^/]*)$:/$1:;
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews s:,v$::;
a057e8e33baa5fa369be28a9680585200ce3ff73Mark Andrews #
a057e8e33baa5fa369be28a9680585200ce3ff73Mark Andrews # use cvs so that the file is locked.
a057e8e33baa5fa369be28a9680585200ce3ff73Mark Andrews #
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews #print "cvs -d $repository rlog -h $_\n";
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews open(FILE, "cvs -d $repository rlog -h $_|") || die "can't start cvs rlog -h $_: $!";
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews while (<FILE>) {
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews chomp;
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews next unless m/^symbols$/; # skip until we find the tags
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews while (<FILE>) {
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews chomp;
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews last if (m/^locks;/); # we are past the tags
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews last if (m/^keyword/); # we are past the tags
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews next unless m/\.0\.\d$/; # skip if not a branch
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews s/\s(.*):.*/$1/; # extract label
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews if (!$branches{$_}) {
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews $branches{$_} = "new";
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews $whom{$_} = "";
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews $comments{$_} = "";
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews # print "branch: $_ $file\n"; # debug
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews }
d71e2e0c61df16ff37c9934c371a4a60c08974f7Mark Andrews }
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews chomp while (<FILE>); # let cvs rlog exit normally.
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews }
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews close(FILE);
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews}
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrewsclose(FILES);
a057e8e33baa5fa369be28a9680585200ce3ff73Mark Andrews
a057e8e33baa5fa369be28a9680585200ce3ff73Mark Andrews#
a057e8e33baa5fa369be28a9680585200ce3ff73Mark Andrews# Write out updated version.
a057e8e33baa5fa369be28a9680585200ce3ff73Mark Andrews#
a057e8e33baa5fa369be28a9680585200ce3ff73Mark Andrewsopen(BRANCHES, ">doc/private/newbranches") || die "can't open doc/private/branches: $!";
a057e8e33baa5fa369be28a9680585200ce3ff73Mark Andrewsprint BRANCHES "\nBranch\t\t\t\tStatus\tWhom\t// Comments\n";
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrewsprint BRANCHES "-----------------------------------------------------------\n\n";
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrewsprint BRANCHES "\t\t\t\tnew\t\tnot yet classified\n";
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrewsprint BRANCHES "\t\t\t\topen\t\tdevelopement branch\n";
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrewsprint BRANCHES "\t\t\t\tactive\t\tnot a development branch\n";
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrewsprint BRANCHES "\t\t\t\treview\t\tready for review\n";
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrewsprint BRANCHES "\t\t\t\tprivate\t\tprivate branch\n";
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrewsprint BRANCHES "\t\t\t\tclosed\t\tfinished with\n";
dba3c818ae00b10388d31703e86a28415db398acTinderbox Userprint BRANCHES "\n";
dba3c818ae00b10388d31703e86a28415db398acTinderbox Userforeach $key (sort keys %branches) {
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews next if ($branches{$key} eq "closed");
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews print BRANCHES "$key";
72938578c985138165e7a4b0a38f16daacbad95eAutomatic Updater $len = length($key);
72938578c985138165e7a4b0a38f16daacbad95eAutomatic Updater if ($len >= 32) {
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews $tabs = 1;
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews } else {
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews $needed = int (32 - $len);
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews $tabs = int ($needed / 8);
72938578c985138165e7a4b0a38f16daacbad95eAutomatic Updater if ($needed % 8 != 0) {
72938578c985138165e7a4b0a38f16daacbad95eAutomatic Updater $tabs++;
dba3c818ae00b10388d31703e86a28415db398acTinderbox User }
dba3c818ae00b10388d31703e86a28415db398acTinderbox User }
dba3c818ae00b10388d31703e86a28415db398acTinderbox User for ($i = 0; $i < $tabs; $i++) {
dba3c818ae00b10388d31703e86a28415db398acTinderbox User printf BRANCHES "\t";
dba3c818ae00b10388d31703e86a28415db398acTinderbox User }
dba3c818ae00b10388d31703e86a28415db398acTinderbox User print BRANCHES "$branches{$key}\t";
dba3c818ae00b10388d31703e86a28415db398acTinderbox User print BRANCHES "$whom{$key}";
dba3c818ae00b10388d31703e86a28415db398acTinderbox User print BRANCHES "\t// $comments{$key}" if ($comments{$key} ne "");
dba3c818ae00b10388d31703e86a28415db398acTinderbox User print BRANCHES "\n";
72938578c985138165e7a4b0a38f16daacbad95eAutomatic Updater}
72938578c985138165e7a4b0a38f16daacbad95eAutomatic Updater
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinprint BRANCHES "\n\n";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
bf056b7184b38281c1b0bf0cf21b5982fa1a4edaMark Andrewsforeach $key (sort keys %branches) {
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews next if ($branches{$key} ne "closed");
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews print BRANCHES "$key";
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews $len = length($key);
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews if ($len >= 32) {
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews $tabs = 1;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein } else {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $needed = int (32 - $len);
97e74139b19368e385a3564746d42db70879195eAutomatic Updater $tabs = int ($needed / 8);
97e74139b19368e385a3564746d42db70879195eAutomatic Updater if ($needed % 8 != 0) {
dba3c818ae00b10388d31703e86a28415db398acTinderbox User $tabs++;
dba3c818ae00b10388d31703e86a28415db398acTinderbox User }
dba3c818ae00b10388d31703e86a28415db398acTinderbox User }
dba3c818ae00b10388d31703e86a28415db398acTinderbox User for ($i = 0; $i < $tabs; $i++) {
97e74139b19368e385a3564746d42db70879195eAutomatic Updater printf BRANCHES "\t";
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews }
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews print BRANCHES "$branches{$key}";
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews print BRANCHES "\t\t// $comments{$key}" if ($comments{$key} ne "");
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews print BRANCHES "\n";
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews}
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrewsclose(BRANCHES);
3a3705ef7747327df182bf8d009333d2472253d5Mark Andrews
3b4098640dd85040270f39b9a5ee5e22de99d3d6Mark Andrews#
3b4098640dd85040270f39b9a5ee5e22de99d3d6Mark Andrews# Update if changed.
3b4098640dd85040270f39b9a5ee5e22de99d3d6Mark Andrews#
3b4098640dd85040270f39b9a5ee5e22de99d3d6Mark Andrewsif (system("cmp", "-s", "doc/private/newbranches", "doc/private/branches")) {
3b4098640dd85040270f39b9a5ee5e22de99d3d6Mark Andrews rename("doc/private/newbranches", "doc/private/branches") || die "Cannot rename: doc/private/newbranches -> doc/private/branches: $!";
3b4098640dd85040270f39b9a5ee5e22de99d3d6Mark Andrews !system("cvs", "-d", $repository, "commit", "-m", "auto update", "doc/private/branches") || die "cvs commit failed: $!";
3b4098640dd85040270f39b9a5ee5e22de99d3d6Mark Andrews} else {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein unlink("doc/private/newbranches");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein