update_branches revision 514f6f14245f42c96f3d5e90462ce2ebe0597d2e
333fe280eb574439ef3f828d8755dd9e243ec855Andreas Gustafsson#!/usr/local/bin/perl -w
276e28f813ffef042d5a6e9f3373ef4e2ad37996Mark Andrews#
a6a23642eaf383add7a0be045c01e7dd8278ccafAndreas Gustafsson# Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC")
250ed9e230b3903b1b264dd1ed2f691fc7cd2f8fAndreas Gustafsson#
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# Permission to use, copy, modify, and distribute this software for any
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# purpose with or without fee is hereby granted, provided that the above
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# copyright notice and this permission notice appear in all copies.
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews#
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# PERFORMANCE OF THIS SOFTWARE.
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews
bcf15a19ae0efa72a22cdfb50666a3c6ce39eb9fTinderbox User# $Id: update_branches,v 1.19 2007/01/30 06:00:00 marka Exp $
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews#
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# Track which branches are still open or not in the bind9 cvs repository.
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# This is done so that work that is "in progress" (active) doesn't get
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# so easily forgotten about.
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews#
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# This script updates doc/private/branches by adding new branches and moving
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# closed branches to the end of the file. New branches are found by walking
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# the cvs repository and extracting the new branches from the header fields
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# of the files there.
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews#
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# doc/private/branches has one line per branch in the following field order:
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# name, status, to whom the branch belongs and comments. Comments are
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# in '(',')'. The first three field are single words.
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews#
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# Note: this is intended to be run on the machine hosting the CVS repository.
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews#
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews%branches = ();
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews%whom = ();
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews%comments = ();
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews%history = ();
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews%dates = ();
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt$repository = "/proj/cvs/prod";
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt$module = "bind9";
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews#
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# Make sure we have a up to date copy. If the previous ran failed for
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews# any reason remove it (-C).
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews#
2895f101b5585a19015ac2c2c1e1812ac467fa12Automatic Updater!system("cvs", "-d", $repository, "update", "-C", "doc/private/branches") || die "cannot update doc/private/branches: $!";
2895f101b5585a19015ac2c2c1e1812ac467fa12Automatic Updater
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews#
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt# load existing content
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt#
67adc03ef81fb610f8df093b17f55275ee816754Evan Huntopen(BRANCHES, "<doc/private/branches") || die "can't open util/branches: $!";
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrewswhile (<BRANCHES>) {
250ed9e230b3903b1b264dd1ed2f691fc7cd2f8fAndreas Gustafsson chomp;
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews next if (/^-/);
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews next if (/^Branch/);
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews next if (/^\s/);
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews $c = "";
82d13321f4dcc79a9aec992c7a1c4aaff8983adaAutomatic Updater if (m://.*:) {
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews $c = $_;
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews $c =~ s:.*?//\s*(.*)$:$1:;
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews s:(.*?)//.*:$1:;
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews } else {
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews #
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews # look for old style comment
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews #
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews if (m/\(.*\)/) {
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews $c = $_;
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews $c =~ s/.*\((.*)\).*$/$1/;
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews s/\(.*\)//;
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt }
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt }
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt s/\s*$//;
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt next if (/^\s*$/);
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt ($branch, $status, $who) = split;
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews $status = "new" if (!defined($status));
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt $branches{$branch} = $status;
0ddeab91cf922fd977f37318620b4c69dccf8364Automatic Updater $who = "" if (!defined($who));
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews $whom{$branch} = $who;
36da16fa31fa2a582afe67010ba449a57177fd2fAutomatic Updater $comments{$branch} = $c;
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater}
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updaterclose (BRANCHES);
7a7a44400d49122d4cc207b43922a7b9c5afe443Automatic Updater
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson# T 1999-03-15 21:15 +0000 vixie bind [ietf44:A]
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrewsopen(HISTORY, "cvs history -T -a 2> /dev/null |") || die("can't get history");
e2e4d321999340802f77adaacd19c797d04b4b95Automatic Updaterwhile (<HISTORY>) {
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews chomp;
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews s/[][]//g;
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews s/:[^ \t]+$//;
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews s/\s+/ /g;
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews ($tag, $date, $time, $tz, $who, $mod, $branch) = split;
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews next if ($mod ne $module );
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews next if ($tag ne "T" );
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews next if (exists($history{$branch}));
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews $history{$branch} = $who;
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson $dates{$branch} = "$date $time $tz";
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson print "$_\n";
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson}
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updaterclose (HISTORY);
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updater
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updater#
afb33f777af856f8c3382604a7a8ffdfe2b512c5Automatic Updater# Search repository for new branches.
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews#
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson# New branches have the following format "name:<revision>.0.#"
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews# where # is the number of potential branches from this the revision.
058e44186b74531402c1f99088eb9dbe4926f8daMark Andrews#
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrewsopen(FILES, "find $repository/$module -type f -name *,v -print |") || die "can't start find: $!";
e334405421979688f2d838805ac67ee47bd62976Mark Andrewswhile (<FILES>) {
e334405421979688f2d838805ac67ee47bd62976Mark Andrews chomp;
e334405421979688f2d838805ac67ee47bd62976Mark Andrews # print "file: $_\n"; # debug
e334405421979688f2d838805ac67ee47bd62976Mark Andrews # $file = $_; # save for branch debug below.
e334405421979688f2d838805ac67ee47bd62976Mark Andrews s:^$repository/::;
e334405421979688f2d838805ac67ee47bd62976Mark Andrews s:/Attic/([^/]*)$:/$1:;
e334405421979688f2d838805ac67ee47bd62976Mark Andrews s:,v$::;
e334405421979688f2d838805ac67ee47bd62976Mark Andrews #
65ad89971ee9973074cd11c207af92bf5440df01Automatic Updater # use cvs so that the file is locked.
65ad89971ee9973074cd11c207af92bf5440df01Automatic Updater #
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews #print "cvs -d $repository rlog -h $_\n";
089c63b69cdf6803aa8901aae3f2fbae58969511Automatic Updater open(FILE, "cvs -d $repository rlog -h $_|") || die "can't start cvs rlog -h $_: $!";
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews while (<FILE>) {
db6353c9b89628e16f6e729ce57baabad3460c49Automatic Updater chomp;
36da16fa31fa2a582afe67010ba449a57177fd2fAutomatic Updater next unless m/^symbolic names:$/; # skip until we find the tags
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews while (<FILE>) {
089c63b69cdf6803aa8901aae3f2fbae58969511Automatic Updater chomp;
9ce6056d520aaf5241560fab6ab096c0d4e87b36Automatic Updater last if (m/^locks;/); # we are past the tags
ebabe300b615154d08f5577822cfd8726d2643c8Automatic Updater last if (m/^keyword/); # we are past the tags
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt next unless m/\.0\.\d+$/; # skip if not a branch
1f8dc520d4bbc5406d551724282df1e5f7626e19Automatic Updater s/\s(.*):.*/$1/; # extract label
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt if (!$branches{$_}) {
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt $branches{$_} = "new";
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt if (exists($history{$_})) {
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson $whom{$_} = $history{$_};
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews $comments{$_} = $dates{$_};
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews } else {
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews $whom{$_} = "";
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews $comments{$_} = "";
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson }
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews # print "branch: $_ $file\n"; # debug
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson }
3a32ac2a720653083c7a22cb654b86c398f6d4c8Tinderbox User }
3a32ac2a720653083c7a22cb654b86c398f6d4c8Tinderbox User chomp while (<FILE>); # let cvs rlog exit normally.
3a32ac2a720653083c7a22cb654b86c398f6d4c8Tinderbox User }
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews close(FILE);
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews}
67adc03ef81fb610f8df093b17f55275ee816754Evan Huntclose(FILES);
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson#
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson# Write out updated version.
97bb3725292d3f74bcb0a32be6a76b2da34ba494Andreas Gustafsson#
428dc9698871ecfeda63eab31cd3523dd4befb31Mark Andrewsopen(BRANCHES, ">doc/private/newbranches") || die "can't open doc/private/branches: $!";
97bb3725292d3f74bcb0a32be6a76b2da34ba494Andreas Gustafssonprint BRANCHES "\nBranch\t\t\t\tStatus\tWhom\t// Comments\n";
c978c6cb6e0c38d8378b6cd1f6b5aac3cf91e36aAutomatic Updaterprint BRANCHES "-----------------------------------------------------------\n\n";
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafssonprint BRANCHES "\t\t\t\tnew\t\tnot yet classified\n";
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrewsprint BRANCHES "\t\t\t\topen\t\tdevelopement branch\n";
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrewsprint BRANCHES "\t\t\t\tactive\t\tnot a development branch\n";
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrewsprint BRANCHES "\t\t\t\treview\t\tready for review\n";
67adc03ef81fb610f8df093b17f55275ee816754Evan Huntprint BRANCHES "\t\t\t\tprivate\t\tprivate branch\n";
67adc03ef81fb610f8df093b17f55275ee816754Evan Huntprint BRANCHES "\t\t\t\tclosed\t\tfinished with\n";
67adc03ef81fb610f8df093b17f55275ee816754Evan Huntprint BRANCHES "\n";
67adc03ef81fb610f8df093b17f55275ee816754Evan Huntforeach $key (sort keys %branches) {
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews next if ($branches{$key} eq "closed");
36025dc74f4bbba81a4b00f4d1a8a74cf4a1a46dAutomatic Updater print BRANCHES "$key";
43b94483957d3168796a816ed86cf097518817dcTinderbox User $len = length($key);
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson if ($len >= 32) {
276e28f813ffef042d5a6e9f3373ef4e2ad37996Mark Andrews $tabs = 1;
8b1cba45ade83893c009b37f47d5478e97eb61d2Automatic Updater } else {
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews $needed = int (32 - $len);
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews $tabs = int ($needed / 8);
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews if ($needed % 8 != 0) {
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews $tabs++;
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews }
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews }
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews for ($i = 0; $i < $tabs; $i++) {
edaa0648858316d9f4ad2a4093f16e05dbf2fe50Tinderbox User printf BRANCHES "\t";
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews }
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews print BRANCHES "$branches{$key}\t";
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews print BRANCHES "$whom{$key}";
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews print BRANCHES "\t// $comments{$key}" if ($comments{$key} ne "");
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews print BRANCHES "\n";
71eeac3530eabb7f70f4b6bdba5addb40a5bca27Mark Andrews}
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrewsprint BRANCHES "\n\n";
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrewsforeach $key (sort keys %branches) {
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews next if ($branches{$key} ne "closed");
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews print BRANCHES "$key";
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson $len = length($key);
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson if ($len >= 32) {
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews $tabs = 1;
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews } else {
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt $needed = int (32 - $len);
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt $tabs = int ($needed / 8);
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt if ($needed % 8 != 0) {
67adc03ef81fb610f8df093b17f55275ee816754Evan Hunt $tabs++;
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews }
848dcebe28e032abfc66e7f10686e1b04a8516feMark Andrews }
97bb3725292d3f74bcb0a32be6a76b2da34ba494Andreas Gustafsson for ($i = 0; $i < $tabs; $i++) {
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson printf BRANCHES "\t";
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews }
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews print BRANCHES "$branches{$key}";
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews print BRANCHES "\t\t// $comments{$key}" if ($comments{$key} ne "");
a3edcadfffbe617a419cdbe1bebb95f68a0eda1eMark Andrews print BRANCHES "\n";
8dcabaace18bbfd2f9a09a0cb0f524cbb326cbabMark Andrews}
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updaterclose(BRANCHES);
984c2e9f76e66e86f7d9aca99a774836ddf196eaAutomatic Updater
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson#
c7f299247ca4460807f44b43f84ba19719646cc9Tinderbox User# Update if changed.
c7f299247ca4460807f44b43f84ba19719646cc9Tinderbox User#
c7f299247ca4460807f44b43f84ba19719646cc9Tinderbox Userif (system("cmp", "-s", "doc/private/newbranches", "doc/private/branches")) {
c7f299247ca4460807f44b43f84ba19719646cc9Tinderbox User rename("doc/private/newbranches", "doc/private/branches") || die "Cannot rename: doc/private/newbranches -> doc/private/branches: $!";
d0d1dbab0fe2b940ffb4354dcadb30885f160770Tinderbox User !system("cvs", "-d", $repository, "commit", "-m", "auto update", "doc/private/branches") || die "cvs commit failed: $!";
d0d1dbab0fe2b940ffb4354dcadb30885f160770Tinderbox User} else {
c7f299247ca4460807f44b43f84ba19719646cc9Tinderbox User unlink("doc/private/newbranches");
c7f299247ca4460807f44b43f84ba19719646cc9Tinderbox User}
c7f299247ca4460807f44b43f84ba19719646cc9Tinderbox User