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>