#!/usr/bin/env perl #*************************************************************************** # _ _ ____ _ # Project ___| | | | _ \| | # / __| | | | |_) | | # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # # Copyright (C) Daniel Stenberg, , et al. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms # are also available at https://curl.se/docs/copyright.html. # # You may opt to use, copy, modify, merge, publish, distribute and/or sell # copies of the Software, and permit persons to whom the Software is # furnished to do so, under the terms of the COPYING file. # # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY # KIND, either express or implied. # # SPDX-License-Identifier: curl # ########################################################################### # Update man pages. use strict; use warnings; use Tie::File; # Data from the command line. my $curlver = $ARGV[0]; my $curldate = $ARGV[1]; # Directories and extensions. my @dirlist = ("docs/", "docs/libcurl/", "docs/libcurl/opts/", "tests/"); my @extlist = (".1", ".3"); my @excludelist = ("mk-ca-bundle.1", "template.3"); # Subroutines sub printargs{ # Print arguments and exit. print "usage: updatemanpages.pl \n"; exit; } sub getthline{ # Process file looking for .TH section. my $filename = shift; my $file_handle; my $file_line; # Open the file. open($file_handle, $filename); # Look for the .TH section, process it into an array, # modify it and write to file. tie(my @file_data, 'Tie::File', $filename); foreach my $file_data_line(@file_data) { if($file_data_line =~ /^.TH/) { $file_line = $file_data_line; last; } } # Close the file. close($file_handle); return $file_line; } sub extractth{ # Extract .TH section as an array. my $input = shift; # Split the line into an array. my @tharray; my $inputsize = length($input); my $inputcurrent = ""; my $quotemode = 0; for(my $inputseek = 0; $inputseek < $inputsize; $inputseek++) { if(substr($input, $inputseek, 1) eq " " && $quotemode eq 0) { push(@tharray, $inputcurrent); $inputcurrent = ""; next; } $inputcurrent = $inputcurrent . substr($input, $inputseek, 1); if(substr($input, $inputseek, 1) eq "\"") { if($quotemode eq 0) { $quotemode = 1; } else { $quotemode = 0; } } } if($inputcurrent ne "") { push(@tharray, $inputcurrent); } return @tharray; } sub getdate{ # Get the date from the .TH section. my $filename = shift; my $thline; my @tharray; my $date = ""; $thline = getthline($filename); # Return nothing if there is no .TH section found. if(!$thline || $thline eq "") { return ""; } @tharray = extractth($thline); # Remove the quotes at the start and end. $date = substr($tharray[3], 1, -1); return $date; } sub processth{ # Process .TH section. my $input = shift; my $date = shift; # Split the line into an array. my @tharray = extractth($input); # Alter the date. my $itemdate = "\""; $itemdate .= $date; $itemdate .= "\""; $tharray[3] = $itemdate; # Alter the item version. my $itemver = $tharray[4]; my $itemname = ""; for(my $itemnameseek = 1; $itemnameseek < length($itemver); $itemnameseek++) { if(substr($itemver, $itemnameseek, 1) eq " " || substr($itemver, $itemnameseek, 1) eq "\"") { last; } $itemname .= substr($itemver, $itemnameseek, 1); } $itemver = "\""; $itemver .= $itemname; $itemver .= " "; $itemver .= $curlver; $itemver .= "\""; $tharray[4] = $itemver; my $thoutput = ""; foreach my $thvalue (@tharray) { $thoutput .= $thvalue; $thoutput .= " "; } $thoutput =~ s/\s+$//; $thoutput .= "\n"; # Return updated string. return $thoutput; } sub processfile{ # Process file looking for .TH section. my $filename = shift; my $date = shift; my $file_handle; my $file_dist_handle; my $filename_dist; # Open a handle for the original file and a second file handle # for the dist file. $filename_dist = $filename . ".dist"; open($file_handle, $filename); open($file_dist_handle, ">" . $filename_dist); # Look for the .TH section, process it into an array, # modify it and write to file. tie(my @file_data, 'Tie::File', $filename); foreach my $file_data_line (@file_data) { if($file_data_line =~ /^.TH/) { my $file_dist_line = processth($file_data_line, $date); print $file_dist_handle $file_dist_line . "\n"; } else { print $file_dist_handle $file_data_line . "\n"; } } # Close the file. close($file_handle); close($file_dist_handle); } # Check that $curlver is set, otherwise print arguments and exit. if(!$curlver) { printargs(); } # check to see that the git command works, it requires git 2.6 something my $gitcheck = `git log -1 --date="format:%B %d, %Y" $dirlist[0] 2>/dev/null`; if(length($gitcheck) < 1) { print "git version too old or $dirlist[0] is a bad argument\n"; exit; } # Look in each directory. my $dir_handle; foreach my $dirname (@dirlist) { foreach my $extname (@extlist) { # Go through the directory looking for files ending with # the current extension. opendir($dir_handle, $dirname); my @filelist = grep(/.$extname$/i, readdir($dir_handle)); foreach my $file (@filelist) { # Skip if file is in exclude list. if(grep(/^$file$/, @excludelist)) { next; } # Load the file and get the date. my $filedate; # Check if dist version exists and load date from that # file if it does. if(-e ($dirname . $file . ".dist")) { $filedate = getdate(($dirname . $file . ".dist")); } else { $filedate = getdate(($dirname . $file)); } # Skip if value is empty. if(!$filedate || $filedate eq "") { next; } # Check the man page in the git repository. my $repodata = `LC_TIME=C git log -1 --date="format:%B %d, %Y" \\ --since="$filedate" $dirname$file | grep ^Date:`; # If there is output then update the man page # with the new date/version. # Process the file if there is output. if($repodata) { my $thisdate; if(!$curldate) { if($repodata =~ /^Date: +(.*)/) { $thisdate = $1; } else { print STDERR "Warning: " . ($dirname . $file) . ": found no " . "date\n"; } } else { $thisdate = $curldate; } processfile(($dirname . $file), $thisdate); print $dirname . $file . " page updated to $thisdate\n"; } } closedir($dir_handle); } } __END__ =pod =head1 updatemanpages.pl Updates the man pages with the version number and optional date. If the date isn't provided, the last modified date from git is used. =head2 USAGE updatemanpages.pl version [date] =head3 version Specifies version (required) =head3 date Specifies date (optional) =head2 SETTINGS =head3 @dirlist Specifies the list of directories to look for files in. =head3 @extlist Specifies the list of files with extensions to process. =head3 @excludelist Specifies the list of files to not process. =head2 NOTES This script is used during maketgz. =cut