clm5/doc/UpdateChangelog.pl
2024-05-09 15:14:01 +08:00

209 lines
5.1 KiB
Perl

#!/usr/bin/env perl
#=======================================================================
#
# This is a script to update the ChangeLog
#
# Usage:
#
# perl ChangeLog tag-name One-line summary
#
#
#=======================================================================
use strict;
use Getopt::Long;
use IO::File;
#use warnings;
#use diagnostics;
use English;
my $ProgName;
($ProgName = $PROGRAM_NAME) =~ s!(.*)/!!; # name of program
my $ProgDir = $1; # name of directory where program lives
sub usage {
die <<EOF;
SYNOPSIS
$ProgName [options] <tag-name> <one-line-summary>
OPTIONS
-help [or -h] Help on this script.
-update [or -u] Just update the date/time for the latest tag
In this case no other arguments should be given.
ARGUMENTS
<tag-name> Tag name of tag to document
<one-line-summary> Short summary description of this tag
EXAMPLES:
To just update the date/time for the latest tag
$ProgName -update
To document a new tag
$ProgName ctsm5.3.099 "Description of this tag"
EOF
}
my %opts = {
help => 0,
update => 0,
};
GetOptions(
"h|help" => \$opts{'help'},
"u|update" => \$opts{'update'},
);
if ( $opts{'help'} ) {
usage();
}
my $tag; my $sum;
if ( ! $opts{'update'} ) {
if ( $#ARGV != 1 ) {
print "ERROR: wrong number of arguments: $ARGV\n";
usage();
}
$tag = $ARGV[0];
$sum = $ARGV[1];
# Tags should be something like ctsm5.3.001 or ctsm5.3.0
if ( ($tag !~ /ctsm[0-9]\.[0-9]\.([0-9][0-9][0-9]|[0-9][0-9])/) && ($tag !~ /ctsm[0-9]\.([0-9])\.([0-9])/) ) {
print "ERROR: bad tagname: $tag\n";
usage();
}
} else {
if ( $#ARGV != -1 ) {
print "ERROR: wrong number of arguments when update option picked: $ARGV\n";
usage();
}
}
my $EDITOR = $ENV{EDITOR};
if ( $EDITOR !~ /.+/ ) {
print "ERROR: editor NOT set -- set the env variable EDITOR to the text editor you would like to use\n";
usage();
}
my $template = ".ChangeLog_template";
my $changelog = "ChangeLog";
my $changesum = "ChangeSum";
my $changelog_tmp = "ChangeLog.tmp";
my $changesum_tmp = "ChangeSum.tmp";
my $user = $ENV{USER};
if ( $user !~ /.+/ ) {
die "ERROR: Could not get user name: $user";
}
my @list = getpwnam( $user );
my $fullname = $list[6];
my $date = `date`;
chomp( $date );
if ( $date !~ /.+/ ) {
die "ERROR: Could not get date: $date\n";
}
#
# Deal with ChangeLog file
#
my $fh = IO::File->new($changelog_tmp, '>') or die "** $ProgName - can't open file: $changelog_tmp\n";
#
# If adding a new tag -- read in template and add information in
#
if ( ! $opts{'update'} ) {
open( TL, "<$template" ) || die "ERROR:: trouble opening file: $template";
while( $_ = <TL> ) {
if ( $_ =~ /Tag name:/ ) {
chomp( $_ );
print $fh "$_ $tag\n";
} elsif ( $_ =~ /Originator/ ) {
chomp( $_ );
print $fh "$_ $user ($fullname)\n";
} elsif ( $_ =~ /Date:/ ) {
chomp( $_ );
print $fh "$_ $date\n";
} elsif ( $_ =~ /One-line Summary:/ ) {
chomp( $_ );
print $fh "$_ $sum\n";
} else {
print $fh $_;
}
}
close( TL );
}
open( CL, "<$changelog" ) || die "ERROR:: trouble opening file: $changelog";
my $update = $opts{'update'};
my $oldTag = "";
while( $_ = <CL> ) {
# If adding a new tag check that new tag name does NOT match any old tag
if ( $_ =~ /Tag name:[ ]*(ctsm.+)/ ) {
$oldTag = $1;
if ( (! $opts{'update'}) && ($tag eq $oldTag) ) {
close( CL );
close( $fh );
system( "/bin/rm -f $changelog_tmp" );
print "ERROR:: New tag $tag matches a old tag name\n";
usage();
}
# If updating the date -- find first occurance of data and change it
# Then turn the update option to off
} elsif ( ($update) && ($_ =~ /(Date:)/) ) {
print $fh "Date: $date\n";
print "Update $oldTag with new date: $date\n";
$update = undef;
$_ = <CL>;
}
print $fh $_;
}
# Close files and move to final name
close( CL );
$fh->close( );
system( "/bin/mv $changelog_tmp $changelog" );
#
# Deal with ChangeSum file
#
open( FH, ">$changesum_tmp" ) || die "ERROR:: trouble opening file: $changesum_tmp";
open( CS, "<$changesum" ) || die "ERROR:: trouble opening file: $changesum";
my $update = $opts{'update'};
$date = `date "+%m/%d/%Y"`;
chomp( $date );
while( $_ = <CS> ) {
# Find header line
if ( $_ =~ /=====================/ ) {
print FH $_;
my $format = "%18.18s %8.8s %10.10s %s\n";
if ( $update ) {
$_ = <CS>;
if ( /^(.{18}) (.{8}) (.{10}) (.+)$/ ) {
$tag = $1;
$user = $2;
$sum = $4;
} else {
die "ERROR: bad format for ChangeSum file\n";
}
}
printf FH $format, $tag, $user, $date, $sum;
$_ = <CS>;
}
print FH $_;
}
# Close files and move to final name
close( CS );
close( FH );
system( "/bin/mv $changesum_tmp $changesum" );
#
# Edit the files
#
if ( ! $opts{'update'} ) {
system( "$EDITOR $changelog" );
system( "$EDITOR $changesum" );
}