Home | History | Annotate | Download | only in scripts
      1 #!/usr/bin/env perl
      2 #***************************************************************************
      3 #                                  _   _ ____  _
      4 #  Project                     ___| | | |  _ \| |
      5 #                             / __| | | | |_) | |
      6 #                            | (__| |_| |  _ <| |___
      7 #                             \___|\___/|_| \_\_____|
      8 #
      9 # Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel (at] 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
    356