xref: /aosp_15_r20/external/curl/scripts/delta (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# Display changes done in the repository from [tag] until now.
27*6236dae4SAndroid Build Coastguard Worker#
28*6236dae4SAndroid Build Coastguard Worker# Uses git for repo data.
29*6236dae4SAndroid Build Coastguard Worker# Uses docs/THANKS and RELEASE-NOTES for current status.
30*6236dae4SAndroid Build Coastguard Worker#
31*6236dae4SAndroid Build Coastguard Worker# In the git clone root, invoke 'scripts/delta [release tag]'
32*6236dae4SAndroid Build Coastguard Worker
33*6236dae4SAndroid Build Coastguard Worker$start = $ARGV[0];
34*6236dae4SAndroid Build Coastguard Worker
35*6236dae4SAndroid Build Coastguard Workerif($start eq "-h") {
36*6236dae4SAndroid Build Coastguard Worker    print "Usage: summary [tag]\n";
37*6236dae4SAndroid Build Coastguard Worker    exit;
38*6236dae4SAndroid Build Coastguard Worker}
39*6236dae4SAndroid Build Coastguard Workerelsif($start eq "") {
40*6236dae4SAndroid Build Coastguard Worker    $start = `git tag --sort=taggerdate | grep "^curl-" | tail -1`;
41*6236dae4SAndroid Build Coastguard Worker    chomp $start;
42*6236dae4SAndroid Build Coastguard Worker}
43*6236dae4SAndroid Build Coastguard Worker
44*6236dae4SAndroid Build Coastguard Worker$commits = `git log --oneline $start.. | wc -l`;
45*6236dae4SAndroid Build Coastguard Worker$committers = `git shortlog -s $start.. | wc -l`;
46*6236dae4SAndroid Build Coastguard Worker$bcommitters = `git shortlog -s $start | wc -l`;
47*6236dae4SAndroid Build Coastguard Worker
48*6236dae4SAndroid Build Coastguard Worker$acommits = `git log --oneline | wc -l`;
49*6236dae4SAndroid Build Coastguard Worker$acommitters = `git shortlog -s | wc -l`;
50*6236dae4SAndroid Build Coastguard Worker
51*6236dae4SAndroid Build Coastguard Worker# delta from now compared to before
52*6236dae4SAndroid Build Coastguard Worker$ncommitters = $acommitters - $bcommitters;
53*6236dae4SAndroid Build Coastguard Worker
54*6236dae4SAndroid Build Coastguard Worker# number of contributors right now
55*6236dae4SAndroid Build Coastguard Worker$acontribs = `./scripts/contrithanks.sh | grep -c '^[^ ]'`;
56*6236dae4SAndroid Build Coastguard Worker# number when the tag was set
57*6236dae4SAndroid Build Coastguard Worker$bcontribs = `git show $start:docs/THANKS | grep -c '^[^ ]'`;
58*6236dae4SAndroid Build Coastguard Worker# delta
59*6236dae4SAndroid Build Coastguard Worker$contribs = $acontribs - $bcontribs;
60*6236dae4SAndroid Build Coastguard Worker
61*6236dae4SAndroid Build Coastguard Worker# number of setops:
62*6236dae4SAndroid Build Coastguard Workersub setopts {
63*6236dae4SAndroid Build Coastguard Worker    my ($f)=@_;
64*6236dae4SAndroid Build Coastguard Worker    open(H, "$f");
65*6236dae4SAndroid Build Coastguard Worker    my $opts;
66*6236dae4SAndroid Build Coastguard Worker    while(<H>) {
67*6236dae4SAndroid Build Coastguard Worker        if(/^  CURLOPT(|DEPRECATED)\(/ && ($_ !~ /OBSOLETE/))  {
68*6236dae4SAndroid Build Coastguard Worker            $opts++;
69*6236dae4SAndroid Build Coastguard Worker        }
70*6236dae4SAndroid Build Coastguard Worker    }
71*6236dae4SAndroid Build Coastguard Worker    close(H);
72*6236dae4SAndroid Build Coastguard Worker    return $opts;
73*6236dae4SAndroid Build Coastguard Worker}
74*6236dae4SAndroid Build Coastguard Worker$asetopts = setopts("<include/curl/curl.h");
75*6236dae4SAndroid Build Coastguard Worker$bsetopts = setopts("git show $start:include/curl/curl.h|");
76*6236dae4SAndroid Build Coastguard Worker$nsetopts = $asetopts - $bsetopts;
77*6236dae4SAndroid Build Coastguard Worker
78*6236dae4SAndroid Build Coastguard Worker# Number of command line options:
79*6236dae4SAndroid Build Coastguard Worker$aoptions=`grep -c '{"....--' src/tool_listhelp.c`;
80*6236dae4SAndroid Build Coastguard Worker$boptions=`git show $start:src/tool_listhelp.c 2>/dev/null | grep -c '{"....--'`;
81*6236dae4SAndroid Build Coastguard Worker$noptions=$aoptions - $boptions;
82*6236dae4SAndroid Build Coastguard Worker
83*6236dae4SAndroid Build Coastguard Worker# current local branch
84*6236dae4SAndroid Build Coastguard Worker$branch=`git rev-parse --abbrev-ref HEAD 2>/dev/null`;
85*6236dae4SAndroid Build Coastguard Workerchomp $branch;
86*6236dae4SAndroid Build Coastguard Worker# Number of files in git
87*6236dae4SAndroid Build Coastguard Worker$afiles=`git ls-files | wc -l`;
88*6236dae4SAndroid Build Coastguard Worker$deletes=`git diff-tree --diff-filter=A -r --summary origin/$branch $start 2>/dev/null | wc -l`;
89*6236dae4SAndroid Build Coastguard Worker$creates=`git diff-tree --diff-filter=D -r --summary origin/$branch $start 2>/dev/null| wc -l`;
90*6236dae4SAndroid Build Coastguard Worker
91*6236dae4SAndroid Build Coastguard Worker# Time since that tag
92*6236dae4SAndroid Build Coastguard Worker$tagged=`git for-each-ref --format="%(refname:short) | %(taggerdate:unix)" refs/tags/* | grep ^$start | cut "-d|" -f2`; # Unix timestamp
93*6236dae4SAndroid Build Coastguard Worker$taggednice=`git for-each-ref --format="%(refname:short) | %(creatordate)" refs/tags/* | grep ^$start | cut '-d|' -f2`; # human readable time
94*6236dae4SAndroid Build Coastguard Workerchomp $taggednice;
95*6236dae4SAndroid Build Coastguard Worker$now=`date +%s`;
96*6236dae4SAndroid Build Coastguard Worker$elapsed=$now - $tagged; # number of seconds since tag
97*6236dae4SAndroid Build Coastguard Worker$total=$now - `date -d 19980320 +%s`;
98*6236dae4SAndroid Build Coastguard Worker
99*6236dae4SAndroid Build Coastguard Worker# Number of public functions in libcurl
100*6236dae4SAndroid Build Coastguard Worker$apublic=`git grep ^CURL_EXTERN -- include/curl | wc -l`;
101*6236dae4SAndroid Build Coastguard Worker$bpublic=`git grep ^CURL_EXTERN $start -- include/curl | wc -l`;
102*6236dae4SAndroid Build Coastguard Worker$public = $apublic - $bpublic;
103*6236dae4SAndroid Build Coastguard Worker
104*6236dae4SAndroid Build Coastguard Worker# diffstat
105*6236dae4SAndroid Build Coastguard Worker$diffstat=`git diff --stat $start.. | tail -1`;
106*6236dae4SAndroid Build Coastguard Workerif($diffstat =~ /^ *(\d+) files changed, (\d+) insertions\(\+\), (\d+)/) {
107*6236dae4SAndroid Build Coastguard Worker    ($fileschanged, $insertions, $deletions)=($1, $2, $3);
108*6236dae4SAndroid Build Coastguard Worker}
109*6236dae4SAndroid Build Coastguard Worker
110*6236dae4SAndroid Build Coastguard Worker# Changes/bug-fixes currently logged
111*6236dae4SAndroid Build Coastguard Workeropen(F, "<RELEASE-NOTES");
112*6236dae4SAndroid Build Coastguard Workerwhile(<F>) {
113*6236dae4SAndroid Build Coastguard Worker    if($_ =~ /following changes:/) {
114*6236dae4SAndroid Build Coastguard Worker        $mode=1;
115*6236dae4SAndroid Build Coastguard Worker    }
116*6236dae4SAndroid Build Coastguard Worker    elsif($_ =~ /following bugfixes:/) {
117*6236dae4SAndroid Build Coastguard Worker        $mode=2;
118*6236dae4SAndroid Build Coastguard Worker    }
119*6236dae4SAndroid Build Coastguard Worker    elsif($_ =~ /known bugs:/) {
120*6236dae4SAndroid Build Coastguard Worker        $mode=3;
121*6236dae4SAndroid Build Coastguard Worker    }
122*6236dae4SAndroid Build Coastguard Worker    elsif($_ =~ /like these:/) {
123*6236dae4SAndroid Build Coastguard Worker        $mode=4;
124*6236dae4SAndroid Build Coastguard Worker    }
125*6236dae4SAndroid Build Coastguard Worker    if($_ =~ /^ o /) {
126*6236dae4SAndroid Build Coastguard Worker        if($mode == 1) {
127*6236dae4SAndroid Build Coastguard Worker            $numchanges++;
128*6236dae4SAndroid Build Coastguard Worker        }
129*6236dae4SAndroid Build Coastguard Worker        elsif($mode == 2) {
130*6236dae4SAndroid Build Coastguard Worker            $numbugfixes++;
131*6236dae4SAndroid Build Coastguard Worker        }
132*6236dae4SAndroid Build Coastguard Worker    }
133*6236dae4SAndroid Build Coastguard Worker    if(($mode == 4) && ($_ =~ /^  \((\d+) contributors/)) {
134*6236dae4SAndroid Build Coastguard Worker        $numcontributors = $1;
135*6236dae4SAndroid Build Coastguard Worker    }
136*6236dae4SAndroid Build Coastguard Worker}
137*6236dae4SAndroid Build Coastguard Workerclose(F);
138*6236dae4SAndroid Build Coastguard Worker
139*6236dae4SAndroid Build Coastguard Worker########################################################################
140*6236dae4SAndroid Build Coastguard Worker# Produce the summary
141*6236dae4SAndroid Build Coastguard Worker
142*6236dae4SAndroid Build Coastguard Workerprint "== Since $start $taggednice ==\n";
143*6236dae4SAndroid Build Coastguard Workermy $days = $elapsed / 3600 / 24;
144*6236dae4SAndroid Build Coastguard Workerprintf "Elapsed time:                   %.1f days (total %d)\n",
145*6236dae4SAndroid Build Coastguard Worker    $days, $total / 3600 / 24;
146*6236dae4SAndroid Build Coastguard Workerprintf "Commits:                        %d (total %d)\n",
147*6236dae4SAndroid Build Coastguard Worker    $commits, $acommits;
148*6236dae4SAndroid Build Coastguard Workerprintf "Commit authors:                 %d, %d new (total %d)\n",
149*6236dae4SAndroid Build Coastguard Worker    $committers, $ncommitters, $acommitters;
150*6236dae4SAndroid Build Coastguard Workerprintf "Contributors:                   %d, %d new (total %d)\n",
151*6236dae4SAndroid Build Coastguard Worker    $numcontributors, $contribs, $acontribs;
152*6236dae4SAndroid Build Coastguard Workerprintf "New public functions:           %d (total %d)\n",
153*6236dae4SAndroid Build Coastguard Worker    $public, $apublic;
154*6236dae4SAndroid Build Coastguard Workerprintf "New curl_easy_setopt() options: %d (total %d)\n",
155*6236dae4SAndroid Build Coastguard Worker    $nsetopts, $asetopts;
156*6236dae4SAndroid Build Coastguard Workerprintf "New command line options:       %d (total %d)\n",
157*6236dae4SAndroid Build Coastguard Worker    $noptions, $aoptions;
158*6236dae4SAndroid Build Coastguard Workerprintf "Changes logged:                 %d\n", $numchanges;
159*6236dae4SAndroid Build Coastguard Workerprintf "Bugfixes logged:                %d (%.2f per day)\n",
160*6236dae4SAndroid Build Coastguard Worker    $numbugfixes, $numbugfixes / $days;
161*6236dae4SAndroid Build Coastguard Workerprintf "Added files:                    %d (total %d)\n",
162*6236dae4SAndroid Build Coastguard Worker    $creates, $afiles;
163*6236dae4SAndroid Build Coastguard Workerprintf "Deleted files:                  %d (delta: %d)\n", $deletes,
164*6236dae4SAndroid Build Coastguard Worker    $creates - $deletes;
165*6236dae4SAndroid Build Coastguard Workerprint "Diffstat:$diffstat" if(!$fileschanged);
166*6236dae4SAndroid Build Coastguard Workerprintf "Files changed:                  %d (%.2f%%)\n", $fileschanged, $fileschanged*100/$afiles;
167*6236dae4SAndroid Build Coastguard Workerprintf "Lines inserted:                 %d\n", $insertions;
168*6236dae4SAndroid Build Coastguard Workerprintf "Lines deleted:                  %d (delta: %d)\n", $deletions,
169*6236dae4SAndroid Build Coastguard Worker    $insertions - $deletions;
170