Annotation of embedaddon/curl/scripts/updatemanpages.pl, revision 1.1.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>