mirror of
https://github.com/nwchemgit/nwchem.git
synced 2026-07-21 06:25:21 -04:00
Script that executes and parses output of cvs log command. Helpful
when putting release notes together.
This commit is contained in:
parent
d8656c3fa0
commit
4699b52aae
1 changed files with 301 additions and 0 deletions
301
contrib/smartlog
Executable file
301
contrib/smartlog
Executable file
|
|
@ -0,0 +1,301 @@
|
|||
#!/usr/bin/env perl
|
||||
#
|
||||
# This script can be used to run the cvs log
|
||||
# command and extract comments made by a specific user
|
||||
# after a specific date.
|
||||
#
|
||||
# To use this script, first run
|
||||
#
|
||||
# ./smartlog -u <username> -d <yyyy-mm-dd> or <yyyy/mm/dd>
|
||||
#
|
||||
# to create a listing of all comments. If this is done in
|
||||
# a high level directory, it will take some time to complete.
|
||||
# The date can be in either the format
|
||||
# yyyy-mm-dd or yyyy/mm/dd.
|
||||
#
|
||||
# The script outputs two files. The first file is name cvs.log and contains
|
||||
# the output of the cvs log command. The second file is name cvs.out
|
||||
# contains the output of the comments made by a specific user after
|
||||
# a specific date.
|
||||
|
||||
################################################################################
|
||||
$FILENAME = "smartlog";
|
||||
#
|
||||
#
|
||||
$SYNTAX = "$FILENAME [-h] [-u <username>] [-d <yyyy-mm-dd> or <yyyy/mm/dd>]";
|
||||
#
|
||||
$DESCRIPTION = <<EOT;
|
||||
[-h] Display usage.
|
||||
[-u username] To specify a different user other than the current user.
|
||||
[-d <yyyy-mm-dd> or <yyyy/mm/dd>] Listing of all comments made by the user <username> after the date <date>.
|
||||
EOT
|
||||
################################################################################
|
||||
|
||||
use Getopt::Std;
|
||||
|
||||
# retrieve options
|
||||
if (!getopts('hu:d:')) {
|
||||
print "$SYNTAX\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
if ( $opt_h ) {
|
||||
print "$SYNTAX\n\n$DESCRIPTION\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
if ( $opt_u ){
|
||||
$me = $opt_u;
|
||||
}
|
||||
else{
|
||||
$me = `whoami`;
|
||||
chop($me);
|
||||
}
|
||||
|
||||
if( $opt_d ){
|
||||
$start_date = $opt_d;
|
||||
}
|
||||
|
||||
$status = `cvs log > cvs.log`;
|
||||
if($?){
|
||||
print "Unable to run cvs log command.\n";
|
||||
print "Please check to make sure the CVSROOT environment\n";
|
||||
print "variable is set or that the cvs executable is in your path.\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
$start_year = 0;
|
||||
$start_month = 0;
|
||||
$start_day = 0;
|
||||
if ($start_date =~ /\s*(\d+)\/0*(\d+)\/0*(\d+)\s*/ ||
|
||||
$start_date =~ /\s*(\d+)-0*(\d+)-0*(\d+)\s*/) {
|
||||
$start_year = $1;
|
||||
$start_month = $2;
|
||||
$start_day = $3;
|
||||
}
|
||||
|
||||
$break;
|
||||
$header = "";
|
||||
$comment = "";
|
||||
$output = "";
|
||||
$mycomment = "";
|
||||
$is_me = 0;
|
||||
$is_since = 0;
|
||||
$is_header = 1;
|
||||
$is_comment = 0;
|
||||
|
||||
%commentlog = ();
|
||||
%filelog = ();
|
||||
|
||||
open(CVSLOG, "cvs.log") or die "Unable to open cvs.log file. Did cvs log command run correctly?\n";
|
||||
|
||||
while (<CVSLOG>) {
|
||||
if ($is_header != 0) {
|
||||
if (/-------/) {
|
||||
$is_header = 0; #read through the file til we get to the first --------
|
||||
$is_comment = 1;
|
||||
$break = $_;
|
||||
}
|
||||
else {
|
||||
if(/RCS file/){
|
||||
|
||||
$filename = $_;
|
||||
|
||||
if( $filename =~ /(devroot\/\S*)/ ){ #if the file is from the Ecce tree
|
||||
$filename = $1;
|
||||
}
|
||||
elsif ( $filename =~ /(src\/\S*)/ ){ #if the file is from the NWChem tree
|
||||
$filename = $1;
|
||||
}
|
||||
else{ #don't know what tree the file is from, use the full filename
|
||||
}
|
||||
chop($filename);
|
||||
}
|
||||
else{
|
||||
$header .= $_;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (/=======/) {
|
||||
$header = "";
|
||||
$mycomment = "";
|
||||
$comment = "";
|
||||
$is_me = 0;
|
||||
$is_since = 0;
|
||||
$is_header = 1;
|
||||
$is_comment = 0;
|
||||
}
|
||||
elsif (/------/) {
|
||||
if ($is_me != 0 && $is_since != 0) {
|
||||
@mycomment = split(/\n/, $comment);
|
||||
|
||||
$revision = shift(@mycomment);
|
||||
|
||||
if($revision =~ /revision\s+(\S*)/){
|
||||
$revision = $1;
|
||||
}
|
||||
|
||||
$filedata = shift(@mycomment);
|
||||
|
||||
if($filedata =~ /date:\s+(\d+\/0*\d+\/0*\d+\s+\d+:\d+:\d+)/){
|
||||
$date = $1;
|
||||
}
|
||||
|
||||
if($filedata =~ /author:\s+(\w+)/){
|
||||
$author = $1;
|
||||
}
|
||||
|
||||
if($filedata =~ /lines:\s+(\+\d+\s-\d+)/){
|
||||
$lines = $1;
|
||||
}
|
||||
|
||||
$mycomment = join("\n", @mycomment);
|
||||
$filedata = $filename . $revision . "\t" . $date . "\t" . $author . "\t" . $lines . "\n";
|
||||
|
||||
|
||||
if ( $filelog{$filedata} ){
|
||||
$fileog{$filedata} .= $mycomment;
|
||||
}
|
||||
else{
|
||||
$filelog{$filedata} = $mycomment;
|
||||
}
|
||||
|
||||
|
||||
if ( $commentlog{$mycomment} ){
|
||||
$commentlog{$mycomment} .= $filedata;
|
||||
}
|
||||
else{
|
||||
$commentlog{$mycomment} = $filedata;
|
||||
}
|
||||
}
|
||||
$is_me = 0;
|
||||
$is_since = 0;
|
||||
$comment = "";
|
||||
$mycomment = "";
|
||||
@mycomment = "";
|
||||
$revision = "";
|
||||
$date = "";
|
||||
$author = "";
|
||||
$lines = "";
|
||||
$filedata = "";
|
||||
}
|
||||
else {
|
||||
if (/$me/) {
|
||||
$is_me = 1;
|
||||
}
|
||||
if (/date:\s+(\d+)\/0*(\d+)\/0*(\d+)/) {
|
||||
$cyear = $1;
|
||||
$cmonth = $2;
|
||||
$cday = $3;
|
||||
if ($cyear > $start_year) {
|
||||
$is_since = 1;
|
||||
}
|
||||
elsif ($cyear == $start_year) {
|
||||
if ($cmonth > $start_month) {
|
||||
$is_since = 1;
|
||||
}
|
||||
elsif ($cmonth == $start_month) {
|
||||
if ($cday >= $start_day) {
|
||||
$is_since = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$comment .= $_;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
close(CVSLOG);
|
||||
$begin = 0;
|
||||
$isduplicate = 0;
|
||||
@dcomment = "";
|
||||
|
||||
foreach $file (sort keys(%filelog)){
|
||||
|
||||
$file_key = $filelog{$file};
|
||||
@fname = split(/,/, $file);
|
||||
|
||||
if ($old_fname eq $fname[0]){
|
||||
$isduplicate = &Find_Duplicates($file_key, @dcomment);
|
||||
if($isduplicate == 0){
|
||||
print $fname[1];
|
||||
}
|
||||
}else{
|
||||
|
||||
if ($begin == 1){
|
||||
print "\n==================================";
|
||||
print "=========================\n\n";
|
||||
}else{
|
||||
$begin = 1;
|
||||
}
|
||||
|
||||
print "File: ";
|
||||
print $fname[0];
|
||||
print "\n";
|
||||
print $break;
|
||||
print $fname[1];
|
||||
}
|
||||
|
||||
$record = $commentlog{$file_key};
|
||||
$isduplicate = &Find_Duplicates($file_key, @dcomment);
|
||||
|
||||
@file_record = split(/\n/, $record);
|
||||
$rlength = @file_record;
|
||||
|
||||
for($i=0; $i < $rlength; $i++){
|
||||
@frecord= split(/,/, $file_record[$i]);
|
||||
$/ = "\n";
|
||||
chomp($fname[1]);
|
||||
if($frecord[0] eq $fname[0]){
|
||||
|
||||
if($frecord[1] ne $fname[1]){
|
||||
if( $isduplicate == 0 ){
|
||||
print $frecord[1];
|
||||
print "\n";
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if( $isduplicate == 0){
|
||||
print "file: ";
|
||||
print $frecord[0];
|
||||
print " ";
|
||||
print $frecord[1];
|
||||
print "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
if($isduplicate == 0){
|
||||
print $file_key;
|
||||
push (@dcomment, $file_key);
|
||||
print "\n";
|
||||
print $break;
|
||||
}
|
||||
$old_fname = $fname[0];
|
||||
}
|
||||
|
||||
|
||||
$status = `rm cvs.log`;
|
||||
if($?){
|
||||
print "Unable to remove cvs.log file.\n";
|
||||
print "File will need to be removed manually.\n";
|
||||
}
|
||||
|
||||
|
||||
sub Find_Duplicates{
|
||||
|
||||
$my_found = 0;
|
||||
my ($my_comment, @my_dcomment) = @_;
|
||||
#$my_found = grep (/$my_comment/, @my_dcomment);
|
||||
$dlength = @my_dcomment;
|
||||
for($k = 0; $k < $dlength; $k++){
|
||||
if($my_comment eq $my_dcomment[$k]){
|
||||
$my_found = 1;
|
||||
}
|
||||
}
|
||||
|
||||
return $my_found;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue