xref: /aosp_15_r20/external/curl/scripts/cd2cd (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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