#!/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 # ########################################################################### =begin comment This script updates a curldown file to current/better curldown. Example: cd2cd [--in-place] > --in-place: if used, it replaces the original file with the cleaned up version. When this is used, cd2cd accepts multiple files to work on and it ignores errors on single files. =end comment =cut my $cd2cd = "0.1"; # to keep check my $dir; my $extension; my $inplace = 0; while(1) { if($ARGV[0] eq "--in-place") { shift @ARGV; $inplace = 1; } else { last; } } use POSIX qw(strftime); my @ts; if (defined($ENV{SOURCE_DATE_EPOCH})) { @ts = localtime($ENV{SOURCE_DATE_EPOCH}); } else { @ts = localtime; } my $date = strftime "%B %d %Y", @ts; sub outseealso { my (@sa) = @_; my $comma = 0; my @o; push @o, ".SH SEE ALSO\n"; for my $s (sort @sa) { push @o, sprintf "%s.BR $s", $comma ? ",\n": ""; $comma = 1; } push @o, "\n"; return @o; } sub single { my @head; my @seealso; my ($f)=@_; my $title; my $section; my $source; my $start = 0; my $d; my $line = 0; open(F, "<:crlf", "$f") || return 1; while() { $line++; $d = $_; if(!$start) { if(/^---/) { # header starts here $start = 1; push @head, $d; } next; } if(/^Title: *(.*)/i) { $title=$1; } elsif(/^Section: *(.*)/i) { $section=$1; } elsif(/^Source: *(.*)/i) { $source=$1; } elsif(/^See-also: +(.*)/i) { $salist = 0; push @seealso, $1; } elsif(/^See-also: */i) { if($seealso[0]) { print STDERR "$f:$line:1:ERROR: bad See-Also, needs list\n"; return 2; } $salist = 1; } elsif(/^ +- (.*)/i) { # the only list we support is the see-also if($salist) { push @seealso, $1; } } # REUSE-IgnoreStart elsif(/^C: (.*)/i) { $copyright=$1; } elsif(/^SPDX-License-Identifier: (.*)/i) { $spdx=$1; } # REUSE-IgnoreEnd elsif(/^---/) { # end of the header section if(!$title) { print STDERR "ERROR: no 'Title:' in $f\n"; return 1; } if(!$section) { print STDERR "ERROR: no 'Section:' in $f\n"; return 2; } if(!$seealso[0]) { print STDERR "$f:$line:1:ERROR: no 'See-also:' present\n"; return 2; } if(!$copyright) { print STDERR "$f:$line:1:ERROR: no 'C:' field present\n"; return 2; } if(!$spdx) { print STDERR "$f:$line:1:ERROR: no 'SPDX-License-Identifier:' field present\n"; return 2; } last; } else { chomp; print STDERR "WARN: unrecognized line in $f, ignoring:\n:'$_';" } } if(!$start) { print STDERR "$f:$line:1:ERROR: no header present\n"; return 2; } my @desc; push @desc, sprintf <, et al. SPDX-License-Identifier: curl Title: $title Section: $section Source: $source HEAD ; push @desc, "See-also:\n"; for my $s (sort @seealso) { push @desc, " - $s\n" if($s); } push @desc, "---\n"; my $blankline = 0; while() { $d = $_; $line++; if($d =~ /^[ \t]*\n/) { $blankline++; } else { $blankline = 0; } # *italics* for curl symbol links get the asterisks removed $d =~ s/\*((lib|)curl[^ ]*\(3\))\*/$1/gi; if(length($d) > 90) { print STDERR "$f:$line:1:WARN: excessive line length\n"; } push @desc, $d if($blankline < 2); } close(F); if($inplace) { open(O, ">$f") || return 1; print O @desc; close(O); } else { print @desc; } return 0; } if($inplace) { for my $a (@ARGV) { # this ignores errors single($a); } } else { exit single($ARGV[0]); }