1*6236dae4SAndroid Build Coastguard Worker#!/usr/bin/env perl 2*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 3*6236dae4SAndroid Build Coastguard Worker# _ _ ____ _ 4*6236dae4SAndroid Build Coastguard Worker# Project ___| | | | _ \| | 5*6236dae4SAndroid Build Coastguard Worker# / __| | | | |_) | | 6*6236dae4SAndroid Build Coastguard Worker# | (__| |_| | _ <| |___ 7*6236dae4SAndroid Build Coastguard Worker# \___|\___/|_| \_\_____| 8*6236dae4SAndroid Build Coastguard Worker# 9*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al. 10*6236dae4SAndroid Build Coastguard Worker# 11*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which 12*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms 13*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html. 14*6236dae4SAndroid Build Coastguard Worker# 15*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell 16*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is 17*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file. 18*6236dae4SAndroid Build Coastguard Worker# 19*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 20*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied. 21*6236dae4SAndroid Build Coastguard Worker# 22*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl 23*6236dae4SAndroid Build Coastguard Worker# 24*6236dae4SAndroid Build Coastguard Worker########################################################################### 25*6236dae4SAndroid Build Coastguard Worker 26*6236dae4SAndroid Build Coastguard Worker=begin comment 27*6236dae4SAndroid Build Coastguard Worker 28*6236dae4SAndroid Build Coastguard WorkerThis script updates a curldown file to current/better curldown. 29*6236dae4SAndroid Build Coastguard Worker 30*6236dae4SAndroid Build Coastguard WorkerExample: cd2cd [--in-place] <file.md> > <file.md> 31*6236dae4SAndroid Build Coastguard Worker 32*6236dae4SAndroid Build Coastguard Worker--in-place: if used, it replaces the original file with the cleaned up 33*6236dae4SAndroid Build Coastguard Worker version. When this is used, cd2cd accepts multiple files to work 34*6236dae4SAndroid Build Coastguard Worker on and it ignores errors on single files. 35*6236dae4SAndroid Build Coastguard Worker 36*6236dae4SAndroid Build Coastguard Worker=end comment 37*6236dae4SAndroid Build Coastguard Worker=cut 38*6236dae4SAndroid Build Coastguard Worker 39*6236dae4SAndroid Build Coastguard Workermy $cd2cd = "0.1"; # to keep check 40*6236dae4SAndroid Build Coastguard Workermy $dir; 41*6236dae4SAndroid Build Coastguard Workermy $extension; 42*6236dae4SAndroid Build Coastguard Workermy $inplace = 0; 43*6236dae4SAndroid Build Coastguard Worker 44*6236dae4SAndroid Build Coastguard Workerwhile(1) { 45*6236dae4SAndroid Build Coastguard Worker if($ARGV[0] eq "--in-place") { 46*6236dae4SAndroid Build Coastguard Worker shift @ARGV; 47*6236dae4SAndroid Build Coastguard Worker $inplace = 1; 48*6236dae4SAndroid Build Coastguard Worker } 49*6236dae4SAndroid Build Coastguard Worker else { 50*6236dae4SAndroid Build Coastguard Worker last; 51*6236dae4SAndroid Build Coastguard Worker } 52*6236dae4SAndroid Build Coastguard Worker} 53*6236dae4SAndroid Build Coastguard Worker 54*6236dae4SAndroid Build Coastguard Worker 55*6236dae4SAndroid Build Coastguard Workeruse POSIX qw(strftime); 56*6236dae4SAndroid Build Coastguard Workermy @ts; 57*6236dae4SAndroid Build Coastguard Workerif (defined($ENV{SOURCE_DATE_EPOCH})) { 58*6236dae4SAndroid Build Coastguard Worker @ts = localtime($ENV{SOURCE_DATE_EPOCH}); 59*6236dae4SAndroid Build Coastguard Worker} else { 60*6236dae4SAndroid Build Coastguard Worker @ts = localtime; 61*6236dae4SAndroid Build Coastguard Worker} 62*6236dae4SAndroid Build Coastguard Workermy $date = strftime "%B %d %Y", @ts; 63*6236dae4SAndroid Build Coastguard Worker 64*6236dae4SAndroid Build Coastguard Workersub outseealso { 65*6236dae4SAndroid Build Coastguard Worker my (@sa) = @_; 66*6236dae4SAndroid Build Coastguard Worker my $comma = 0; 67*6236dae4SAndroid Build Coastguard Worker my @o; 68*6236dae4SAndroid Build Coastguard Worker push @o, ".SH SEE ALSO\n"; 69*6236dae4SAndroid Build Coastguard Worker for my $s (sort @sa) { 70*6236dae4SAndroid Build Coastguard Worker push @o, sprintf "%s.BR $s", $comma ? ",\n": ""; 71*6236dae4SAndroid Build Coastguard Worker $comma = 1; 72*6236dae4SAndroid Build Coastguard Worker } 73*6236dae4SAndroid Build Coastguard Worker push @o, "\n"; 74*6236dae4SAndroid Build Coastguard Worker return @o; 75*6236dae4SAndroid Build Coastguard Worker} 76*6236dae4SAndroid Build Coastguard Worker 77*6236dae4SAndroid Build Coastguard Workersub single { 78*6236dae4SAndroid Build Coastguard Worker my @head; 79*6236dae4SAndroid Build Coastguard Worker my @seealso; 80*6236dae4SAndroid Build Coastguard Worker my ($f)=@_; 81*6236dae4SAndroid Build Coastguard Worker my $title; 82*6236dae4SAndroid Build Coastguard Worker my $section; 83*6236dae4SAndroid Build Coastguard Worker my $source; 84*6236dae4SAndroid Build Coastguard Worker my $start = 0; 85*6236dae4SAndroid Build Coastguard Worker my $d; 86*6236dae4SAndroid Build Coastguard Worker my $line = 0; 87*6236dae4SAndroid Build Coastguard Worker open(F, "<:crlf", "$f") || 88*6236dae4SAndroid Build Coastguard Worker return 1; 89*6236dae4SAndroid Build Coastguard Worker while(<F>) { 90*6236dae4SAndroid Build Coastguard Worker $line++; 91*6236dae4SAndroid Build Coastguard Worker $d = $_; 92*6236dae4SAndroid Build Coastguard Worker if(!$start) { 93*6236dae4SAndroid Build Coastguard Worker if(/^---/) { 94*6236dae4SAndroid Build Coastguard Worker # header starts here 95*6236dae4SAndroid Build Coastguard Worker $start = 1; 96*6236dae4SAndroid Build Coastguard Worker push @head, $d; 97*6236dae4SAndroid Build Coastguard Worker } 98*6236dae4SAndroid Build Coastguard Worker next; 99*6236dae4SAndroid Build Coastguard Worker } 100*6236dae4SAndroid Build Coastguard Worker if(/^Title: *(.*)/i) { 101*6236dae4SAndroid Build Coastguard Worker $title=$1; 102*6236dae4SAndroid Build Coastguard Worker } 103*6236dae4SAndroid Build Coastguard Worker elsif(/^Section: *(.*)/i) { 104*6236dae4SAndroid Build Coastguard Worker $section=$1; 105*6236dae4SAndroid Build Coastguard Worker } 106*6236dae4SAndroid Build Coastguard Worker elsif(/^Source: *(.*)/i) { 107*6236dae4SAndroid Build Coastguard Worker $source=$1; 108*6236dae4SAndroid Build Coastguard Worker } 109*6236dae4SAndroid Build Coastguard Worker elsif(/^See-also: +(.*)/i) { 110*6236dae4SAndroid Build Coastguard Worker $salist = 0; 111*6236dae4SAndroid Build Coastguard Worker push @seealso, $1; 112*6236dae4SAndroid Build Coastguard Worker } 113*6236dae4SAndroid Build Coastguard Worker elsif(/^See-also: */i) { 114*6236dae4SAndroid Build Coastguard Worker if($seealso[0]) { 115*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: bad See-Also, needs list\n"; 116*6236dae4SAndroid Build Coastguard Worker return 2; 117*6236dae4SAndroid Build Coastguard Worker } 118*6236dae4SAndroid Build Coastguard Worker $salist = 1; 119*6236dae4SAndroid Build Coastguard Worker } 120*6236dae4SAndroid Build Coastguard Worker elsif(/^ +- (.*)/i) { 121*6236dae4SAndroid Build Coastguard Worker # the only list we support is the see-also 122*6236dae4SAndroid Build Coastguard Worker if($salist) { 123*6236dae4SAndroid Build Coastguard Worker push @seealso, $1; 124*6236dae4SAndroid Build Coastguard Worker } 125*6236dae4SAndroid Build Coastguard Worker } 126*6236dae4SAndroid Build Coastguard Worker # REUSE-IgnoreStart 127*6236dae4SAndroid Build Coastguard Worker elsif(/^C: (.*)/i) { 128*6236dae4SAndroid Build Coastguard Worker $copyright=$1; 129*6236dae4SAndroid Build Coastguard Worker } 130*6236dae4SAndroid Build Coastguard Worker elsif(/^SPDX-License-Identifier: (.*)/i) { 131*6236dae4SAndroid Build Coastguard Worker $spdx=$1; 132*6236dae4SAndroid Build Coastguard Worker } 133*6236dae4SAndroid Build Coastguard Worker # REUSE-IgnoreEnd 134*6236dae4SAndroid Build Coastguard Worker elsif(/^---/) { 135*6236dae4SAndroid Build Coastguard Worker # end of the header section 136*6236dae4SAndroid Build Coastguard Worker if(!$title) { 137*6236dae4SAndroid Build Coastguard Worker print STDERR "ERROR: no 'Title:' in $f\n"; 138*6236dae4SAndroid Build Coastguard Worker return 1; 139*6236dae4SAndroid Build Coastguard Worker } 140*6236dae4SAndroid Build Coastguard Worker if(!$section) { 141*6236dae4SAndroid Build Coastguard Worker print STDERR "ERROR: no 'Section:' in $f\n"; 142*6236dae4SAndroid Build Coastguard Worker return 2; 143*6236dae4SAndroid Build Coastguard Worker } 144*6236dae4SAndroid Build Coastguard Worker if(!$seealso[0]) { 145*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: no 'See-also:' present\n"; 146*6236dae4SAndroid Build Coastguard Worker return 2; 147*6236dae4SAndroid Build Coastguard Worker } 148*6236dae4SAndroid Build Coastguard Worker if(!$copyright) { 149*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: no 'C:' field present\n"; 150*6236dae4SAndroid Build Coastguard Worker return 2; 151*6236dae4SAndroid Build Coastguard Worker } 152*6236dae4SAndroid Build Coastguard Worker if(!$spdx) { 153*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: no 'SPDX-License-Identifier:' field present\n"; 154*6236dae4SAndroid Build Coastguard Worker return 2; 155*6236dae4SAndroid Build Coastguard Worker } 156*6236dae4SAndroid Build Coastguard Worker last; 157*6236dae4SAndroid Build Coastguard Worker } 158*6236dae4SAndroid Build Coastguard Worker else { 159*6236dae4SAndroid Build Coastguard Worker chomp; 160*6236dae4SAndroid Build Coastguard Worker print STDERR "WARN: unrecognized line in $f, ignoring:\n:'$_';" 161*6236dae4SAndroid Build Coastguard Worker } 162*6236dae4SAndroid Build Coastguard Worker } 163*6236dae4SAndroid Build Coastguard Worker 164*6236dae4SAndroid Build Coastguard Worker if(!$start) { 165*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: no header present\n"; 166*6236dae4SAndroid Build Coastguard Worker return 2; 167*6236dae4SAndroid Build Coastguard Worker } 168*6236dae4SAndroid Build Coastguard Worker 169*6236dae4SAndroid Build Coastguard Worker my @desc; 170*6236dae4SAndroid Build Coastguard Worker 171*6236dae4SAndroid Build Coastguard Worker push @desc, sprintf <<HEAD 172*6236dae4SAndroid Build Coastguard Worker--- 173*6236dae4SAndroid Build Coastguard Workerc: Copyright (C) Daniel Stenberg, <[email protected]>, et al. 174*6236dae4SAndroid Build Coastguard WorkerSPDX-License-Identifier: curl 175*6236dae4SAndroid Build Coastguard WorkerTitle: $title 176*6236dae4SAndroid Build Coastguard WorkerSection: $section 177*6236dae4SAndroid Build Coastguard WorkerSource: $source 178*6236dae4SAndroid Build Coastguard WorkerHEAD 179*6236dae4SAndroid Build Coastguard Worker ; 180*6236dae4SAndroid Build Coastguard Worker push @desc, "See-also:\n"; 181*6236dae4SAndroid Build Coastguard Worker for my $s (sort @seealso) { 182*6236dae4SAndroid Build Coastguard Worker push @desc, " - $s\n" if($s); 183*6236dae4SAndroid Build Coastguard Worker } 184*6236dae4SAndroid Build Coastguard Worker push @desc, "---\n"; 185*6236dae4SAndroid Build Coastguard Worker 186*6236dae4SAndroid Build Coastguard Worker my $blankline = 0; 187*6236dae4SAndroid Build Coastguard Worker while(<F>) { 188*6236dae4SAndroid Build Coastguard Worker $d = $_; 189*6236dae4SAndroid Build Coastguard Worker $line++; 190*6236dae4SAndroid Build Coastguard Worker if($d =~ /^[ \t]*\n/) { 191*6236dae4SAndroid Build Coastguard Worker $blankline++; 192*6236dae4SAndroid Build Coastguard Worker } 193*6236dae4SAndroid Build Coastguard Worker else { 194*6236dae4SAndroid Build Coastguard Worker $blankline = 0; 195*6236dae4SAndroid Build Coastguard Worker } 196*6236dae4SAndroid Build Coastguard Worker # *italics* for curl symbol links get the asterisks removed 197*6236dae4SAndroid Build Coastguard Worker $d =~ s/\*((lib|)curl[^ ]*\(3\))\*/$1/gi; 198*6236dae4SAndroid Build Coastguard Worker 199*6236dae4SAndroid Build Coastguard Worker if(length($d) > 90) { 200*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:WARN: excessive line length\n"; 201*6236dae4SAndroid Build Coastguard Worker } 202*6236dae4SAndroid Build Coastguard Worker 203*6236dae4SAndroid Build Coastguard Worker push @desc, $d if($blankline < 2); 204*6236dae4SAndroid Build Coastguard Worker } 205*6236dae4SAndroid Build Coastguard Worker close(F); 206*6236dae4SAndroid Build Coastguard Worker 207*6236dae4SAndroid Build Coastguard Worker if($inplace) { 208*6236dae4SAndroid Build Coastguard Worker open(O, ">$f") || return 1; 209*6236dae4SAndroid Build Coastguard Worker print O @desc; 210*6236dae4SAndroid Build Coastguard Worker close(O); 211*6236dae4SAndroid Build Coastguard Worker } 212*6236dae4SAndroid Build Coastguard Worker else { 213*6236dae4SAndroid Build Coastguard Worker print @desc; 214*6236dae4SAndroid Build Coastguard Worker } 215*6236dae4SAndroid Build Coastguard Worker return 0; 216*6236dae4SAndroid Build Coastguard Worker} 217*6236dae4SAndroid Build Coastguard Worker 218*6236dae4SAndroid Build Coastguard Workerif($inplace) { 219*6236dae4SAndroid Build Coastguard Worker for my $a (@ARGV) { 220*6236dae4SAndroid Build Coastguard Worker # this ignores errors 221*6236dae4SAndroid Build Coastguard Worker single($a); 222*6236dae4SAndroid Build Coastguard Worker } 223*6236dae4SAndroid Build Coastguard Worker} 224*6236dae4SAndroid Build Coastguard Workerelse { 225*6236dae4SAndroid Build Coastguard Worker exit single($ARGV[0]); 226*6236dae4SAndroid Build Coastguard Worker} 227