Annotation of embedaddon/curl/scripts/updatemanpages.pl, revision 1.1

1.1     ! misho       1: #!/usr/bin/env perl
        !             2: #***************************************************************************
        !             3: #                                  _   _ ____  _
        !             4: #  Project                     ___| | | |  _ \| |
        !             5: #                             / __| | | | |_) | |
        !             6: #                            | (__| |_| |  _ <| |___
        !             7: #                             \___|\___/|_| \_\_____|
        !             8: #
        !             9: # Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
        !            10: #
        !            11: # This software is licensed as described in the file COPYING, which
        !            12: # you should have received as part of this distribution. The terms
        !            13: # are also available at https://curl.haxx.se/docs/copyright.html.
        !            14: #
        !            15: # You may opt to use, copy, modify, merge, publish, distribute and/or sell
        !            16: # copies of the Software, and permit persons to whom the Software is
        !            17: # furnished to do so, under the terms of the COPYING file.
        !            18: #
        !            19: # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
        !            20: # KIND, either express or implied.
        !            21: #
        !            22: ###########################################################################
        !            23: 
        !            24: # Update man pages.
        !            25: 
        !            26: use strict;
        !            27: use warnings;
        !            28: use Tie::File;
        !            29: 
        !            30: # Data from the command line.
        !            31: 
        !            32: my $curlver = $ARGV[0];
        !            33: my $curldate = $ARGV[1];
        !            34: 
        !            35: # Directories and extensions.
        !            36: 
        !            37: my @dirlist = ("docs/", "docs/libcurl/", "docs/libcurl/opts/", "tests/");
        !            38: my @extlist = (".1", ".3");
        !            39: my @excludelist = ("mk-ca-bundle.1", "template.3");
        !            40: 
        !            41: # Subroutines
        !            42: 
        !            43: sub printargs{
        !            44:   # Print arguments and exit.
        !            45: 
        !            46:   print "usage: updatemanpages.pl <version> <date>\n";
        !            47:   exit;
        !            48: }
        !            49: 
        !            50: sub getthline{
        !            51:   # Process file looking for .TH section.
        !            52: 
        !            53:   my $filename = shift;
        !            54:   my $file_handle;
        !            55:   my $file_line;
        !            56: 
        !            57:   # Open the file.
        !            58: 
        !            59:   open($file_handle, $filename);
        !            60: 
        !            61:   # Look for the .TH section, process it into an array,
        !            62:   # modify it and write to file.
        !            63: 
        !            64:   tie(my @file_data, 'Tie::File', $filename);
        !            65:   foreach my $file_data_line(@file_data) {
        !            66:     if($file_data_line =~ /^.TH/) {
        !            67:       $file_line = $file_data_line;
        !            68:       last;
        !            69:     }
        !            70:   }
        !            71: 
        !            72:   # Close the file.
        !            73: 
        !            74:   close($file_handle);
        !            75:   return $file_line;
        !            76: }
        !            77: 
        !            78: sub extractth{
        !            79:   # Extract .TH section as an array.
        !            80: 
        !            81:   my $input = shift;
        !            82: 
        !            83:   # Split the line into an array.
        !            84: 
        !            85:   my @tharray;
        !            86:   my $inputsize = length($input);
        !            87:   my $inputcurrent = "";
        !            88:   my $quotemode = 0;
        !            89: 
        !            90:   for(my $inputseek = 0; $inputseek < $inputsize; $inputseek++) {
        !            91: 
        !            92:     if(substr($input, $inputseek, 1) eq " " && $quotemode eq 0) {
        !            93:       push(@tharray, $inputcurrent);
        !            94:       $inputcurrent = "";
        !            95:       next;
        !            96:     }
        !            97: 
        !            98:     $inputcurrent = $inputcurrent . substr($input, $inputseek, 1);
        !            99: 
        !           100:     if(substr($input, $inputseek, 1) eq "\"") {
        !           101:       if($quotemode eq 0) {
        !           102:         $quotemode = 1;
        !           103:       }
        !           104:       else {
        !           105:         $quotemode = 0;
        !           106:       }
        !           107:     }
        !           108:   }
        !           109: 
        !           110:   if($inputcurrent ne "") {
        !           111:     push(@tharray, $inputcurrent);
        !           112:   }
        !           113: 
        !           114:   return @tharray;
        !           115: }
        !           116: 
        !           117: sub getdate{
        !           118:   # Get the date from the .TH section.
        !           119: 
        !           120:   my $filename = shift;
        !           121:   my $thline;
        !           122:   my @tharray;
        !           123:   my $date = "";
        !           124: 
        !           125:   $thline = getthline($filename);
        !           126: 
        !           127:   # Return nothing if there is no .TH section found.
        !           128: 
        !           129:   if(!$thline || $thline eq "") {
        !           130:     return "";
        !           131:   }
        !           132: 
        !           133:   @tharray = extractth($thline);
        !           134: 
        !           135:   # Remove the quotes at the start and end.
        !           136: 
        !           137:   $date = substr($tharray[3], 1, -1);
        !           138:   return $date;
        !           139: }
        !           140: 
        !           141: sub processth{
        !           142:   # Process .TH section.
        !           143: 
        !           144:   my $input = shift;
        !           145:   my $date = shift;
        !           146: 
        !           147:   # Split the line into an array.
        !           148: 
        !           149:   my @tharray = extractth($input);
        !           150: 
        !           151:   # Alter the date.
        !           152: 
        !           153:   my $itemdate = "\"";
        !           154:   $itemdate .= $date;
        !           155:   $itemdate .= "\"";
        !           156:   $tharray[3] = $itemdate;
        !           157: 
        !           158:   # Alter the item version.
        !           159: 
        !           160:   my $itemver = $tharray[4];
        !           161:   my $itemname = "";
        !           162: 
        !           163:   for(my $itemnameseek = 1;
        !           164:     $itemnameseek < length($itemver);
        !           165:     $itemnameseek++) {
        !           166:     if(substr($itemver, $itemnameseek, 1) eq " " ||
        !           167:       substr($itemver, $itemnameseek, 1) eq "\"") {
        !           168:       last;
        !           169:     }
        !           170:     $itemname .= substr($itemver, $itemnameseek, 1);
        !           171:   }
        !           172: 
        !           173:   $itemver = "\"";
        !           174:   $itemver .= $itemname;
        !           175:   $itemver .= " ";
        !           176:   $itemver .= $curlver;
        !           177:   $itemver .= "\"";
        !           178: 
        !           179:   $tharray[4] = $itemver;
        !           180: 
        !           181:   my $thoutput = "";
        !           182: 
        !           183:   foreach my $thvalue (@tharray) {
        !           184:     $thoutput .= $thvalue;
        !           185:     $thoutput .= " ";
        !           186:   }
        !           187:   $thoutput =~ s/\s+$//;
        !           188:   $thoutput .= "\n";
        !           189: 
        !           190:   # Return updated string.
        !           191: 
        !           192:   return $thoutput;
        !           193: }
        !           194: 
        !           195: sub processfile{
        !           196:   # Process file looking for .TH section.
        !           197: 
        !           198:   my $filename = shift;
        !           199:   my $date = shift;
        !           200:   my $file_handle;
        !           201:   my $file_dist_handle;
        !           202:   my $filename_dist;
        !           203: 
        !           204:   # Open a handle for the original file and a second file handle
        !           205:   # for the dist file.
        !           206: 
        !           207:   $filename_dist = $filename . ".dist";
        !           208: 
        !           209:   open($file_handle, $filename);
        !           210:   open($file_dist_handle, ">" . $filename_dist);
        !           211: 
        !           212:   # Look for the .TH section, process it into an array,
        !           213:   # modify it and write to file.
        !           214: 
        !           215:   tie(my @file_data, 'Tie::File', $filename);
        !           216:   foreach my $file_data_line (@file_data) {
        !           217:     if($file_data_line =~ /^.TH/) {
        !           218:       my $file_dist_line = processth($file_data_line, $date);
        !           219:       print $file_dist_handle $file_dist_line . "\n";
        !           220:     }
        !           221:     else {
        !           222:       print $file_dist_handle $file_data_line . "\n";
        !           223:     }
        !           224:   }
        !           225: 
        !           226:   # Close the file.
        !           227: 
        !           228:   close($file_handle);
        !           229:   close($file_dist_handle);
        !           230: }
        !           231: 
        !           232: # Check that $curlver is set, otherwise print arguments and exit.
        !           233: 
        !           234: if(!$curlver) {
        !           235:   printargs();
        !           236: }
        !           237: 
        !           238: # check to see that the git command works, it requires git 2.6 something
        !           239: my $gitcheck = `git log -1 --date="format:%B %d, %Y" $dirlist[0] 2>/dev/null`;
        !           240: if(length($gitcheck) < 1) {
        !           241:     print "git version too old or $dirlist[0] is a bad argument\n";
        !           242:     exit;
        !           243: }
        !           244: 
        !           245: # Look in each directory.
        !           246: 
        !           247: my $dir_handle;
        !           248: 
        !           249: foreach my $dirname (@dirlist) {
        !           250:   foreach my $extname (@extlist) {
        !           251:     # Go through the directory looking for files ending with
        !           252:     # the current extension.
        !           253: 
        !           254:     opendir($dir_handle, $dirname);
        !           255:     my @filelist = grep(/.$extname$/i, readdir($dir_handle));
        !           256: 
        !           257:     foreach my $file (@filelist) {
        !           258:       # Skip if file is in exclude list.
        !           259: 
        !           260:       if(grep(/^$file$/, @excludelist)) {
        !           261:         next;
        !           262:       }
        !           263: 
        !           264:       # Load the file and get the date.
        !           265: 
        !           266:       my $filedate;
        !           267: 
        !           268:       # Check if dist version exists and load date from that
        !           269:       # file if it does.
        !           270: 
        !           271:       if(-e ($dirname . $file . ".dist")) {
        !           272:         $filedate = getdate(($dirname . $file . ".dist"));
        !           273:       }
        !           274:       else {
        !           275:         $filedate = getdate(($dirname . $file));
        !           276:       }
        !           277: 
        !           278:       # Skip if value is empty.
        !           279: 
        !           280:       if(!$filedate || $filedate eq "") {
        !           281:         next;
        !           282:       }
        !           283: 
        !           284:       # Check the man page in the git repository.
        !           285: 
        !           286:       my $repodata = `LC_TIME=C git log -1 --date="format:%B %d, %Y" \\
        !           287:                        --since="$filedate" $dirname$file | grep ^Date:`;
        !           288: 
        !           289:       # If there is output then update the man page
        !           290:       # with the new date/version.
        !           291: 
        !           292:       # Process the file if there is output.
        !           293: 
        !           294:       if($repodata) {
        !           295:         my $thisdate;
        !           296:         if(!$curldate) {
        !           297:           if($repodata =~ /^Date: +(.*)/) {
        !           298:             $thisdate = $1;
        !           299:           }
        !           300:           else {
        !           301:             print STDERR "Warning: " . ($dirname . $file) . ": found no " .
        !           302:                            "date\n";
        !           303:           }
        !           304:         }
        !           305:         else {
        !           306:           $thisdate = $curldate;
        !           307:         }
        !           308:         processfile(($dirname . $file), $thisdate);
        !           309:         print $dirname . $file . " page updated to $thisdate\n";
        !           310:       }
        !           311:     }
        !           312:     closedir($dir_handle);
        !           313:   }
        !           314: }
        !           315: 
        !           316: __END__
        !           317: 
        !           318: =pod
        !           319: 
        !           320: =head1 updatemanpages.pl
        !           321: 
        !           322: Updates the man pages with the version number and optional date. If the date
        !           323: isn't provided, the last modified date from git is used.
        !           324: 
        !           325: =head2 USAGE
        !           326: 
        !           327: updatemanpages.pl version [date]
        !           328: 
        !           329: =head3 version
        !           330: 
        !           331: Specifies version (required)
        !           332: 
        !           333: =head3 date
        !           334: 
        !           335: Specifies date (optional)
        !           336: 
        !           337: =head2 SETTINGS
        !           338: 
        !           339: =head3 @dirlist
        !           340: 
        !           341: Specifies the list of directories to look for files in.
        !           342: 
        !           343: =head3 @extlist
        !           344: 
        !           345: Specifies the list of files with extensions to process.
        !           346: 
        !           347: =head3 @excludelist
        !           348: 
        !           349: Specifies the list of files to not process.
        !           350: 
        !           351: =head2 NOTES
        !           352: 
        !           353: This script is used during maketgz.
        !           354: 
        !           355: =cut

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>