169 строки
5.6 KiB
Perl
Executable File
169 строки
5.6 KiB
Perl
Executable File
#!/usr/bin/env perl
|
|
#***************************************************************************
|
|
# _ _ ____ _
|
|
# Project ___| | | | _ \| |
|
|
# / __| | | | |_) | |
|
|
# | (__| |_| | _ <| |___
|
|
# \___|\___/|_| \_\_____|
|
|
#
|
|
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, 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
|
|
#
|
|
###########################################################################
|
|
|
|
# Display changes done in the repository from [tag] until now.
|
|
#
|
|
# Uses git for repo data.
|
|
# Uses docs/THANKS and RELEASE-NOTES for current status.
|
|
#
|
|
# In the git clone root, invoke 'scripts/delta [release tag]'
|
|
|
|
$start = $ARGV[0];
|
|
|
|
if($start eq "-h") {
|
|
print "Usage: summary [tag]\n";
|
|
exit;
|
|
}
|
|
elsif($start eq "") {
|
|
$start = `git tag --sort=taggerdate | grep "^curl-" | tail -1`;
|
|
chomp $start;
|
|
}
|
|
|
|
$commits = `git log --oneline $start.. | wc -l`;
|
|
$committers = `git shortlog -s $start.. | wc -l`;
|
|
$bcommitters = `git shortlog -s $start | wc -l`;
|
|
|
|
$acommits = `git log --oneline | wc -l`;
|
|
$acommitters = `git shortlog -s | wc -l`;
|
|
|
|
# delta from now compared to before
|
|
$ncommitters = $acommitters - $bcommitters;
|
|
|
|
# number of contributors right now
|
|
$acontribs = `./scripts/contrithanks.sh | grep -c '^[^ ]'`;
|
|
# number when the tag was set
|
|
$bcontribs = `git show $start:docs/THANKS | grep -c '^[^ ]'`;
|
|
# delta
|
|
$contribs = $acontribs - $bcontribs;
|
|
|
|
# number of setops:
|
|
sub setopts {
|
|
my ($f)=@_;
|
|
open(H, "$f");
|
|
my $opts;
|
|
while(<H>) {
|
|
if(/^ CURLOPT(|DEPRECATED)\(/ && ($_ !~ /OBSOLETE/)) {
|
|
$opts++;
|
|
}
|
|
}
|
|
close(H);
|
|
return $opts;
|
|
}
|
|
$asetopts = setopts("<include/curl/curl.h");
|
|
$bsetopts = setopts("git show $start:include/curl/curl.h|");
|
|
$nsetopts = $asetopts - $bsetopts;
|
|
|
|
# Number of command line options:
|
|
$aoptions=`grep -c '{"....--' src/tool_listhelp.c`;
|
|
$boptions=`git show $start:src/tool_listhelp.c 2>/dev/null | grep -c '{"....--'`;
|
|
$noptions=$aoptions - $boptions;
|
|
|
|
# current local branch
|
|
$branch=`git rev-parse --abbrev-ref HEAD 2>/dev/null`;
|
|
chomp $branch;
|
|
# Number of files in git
|
|
$afiles=`git ls-files | wc -l`;
|
|
$deletes=`git diff-tree --diff-filter=A -r --summary origin/$branch $start 2>/dev/null | wc -l`;
|
|
$creates=`git diff-tree --diff-filter=D -r --summary origin/$branch $start 2>/dev/null| wc -l`;
|
|
|
|
# Time since that tag
|
|
$tagged=`git for-each-ref --format="%(refname:short) | %(taggerdate:unix)" refs/tags/* | grep ^$start | cut "-d|" -f2`; # unix timestamp
|
|
$taggednice=`git for-each-ref --format="%(refname:short) | %(creatordate)" refs/tags/* | grep ^$start | cut '-d|' -f2`; # human readable time
|
|
chomp $taggednice;
|
|
$now=`date +%s`;
|
|
$elapsed=$now - $tagged; # number of seconds since tag
|
|
$total=$now - `date -d 19980320 +%s`;
|
|
|
|
# Number of public functions in libcurl
|
|
$apublic=`git grep ^CURL_EXTERN -- include/curl | wc -l`;
|
|
$bpublic=`git grep ^CURL_EXTERN $start -- include/curl | wc -l`;
|
|
$public = $apublic - $bpublic;
|
|
|
|
# diffstat
|
|
$diffstat=`git diff --stat $start.. | tail -1`;
|
|
if($diffstat =~ /^ *(\d+) files changed, (\d+) insertions\(\+\), (\d+)/) {
|
|
($fileschanged, $insertions, $deletions)=($1, $2, $3);
|
|
}
|
|
|
|
# Changes/bug-fixes currently logged
|
|
open(F, "<RELEASE-NOTES");
|
|
while(<F>) {
|
|
if($_ =~ /following changes:/) {
|
|
$mode=1;
|
|
}
|
|
elsif($_ =~ /following bugfixes:/) {
|
|
$mode=2;
|
|
}
|
|
elsif($_ =~ /known bugs:/) {
|
|
$mode=3;
|
|
}
|
|
elsif($_ =~ /like these:/) {
|
|
$mode=4;
|
|
}
|
|
if($_ =~ /^ o /) {
|
|
if($mode == 1) {
|
|
$numchanges++;
|
|
}
|
|
elsif($mode == 2) {
|
|
$numbugfixes++;
|
|
}
|
|
}
|
|
if(($mode == 4) && ($_ =~ /^ \((\d+) contributors/)) {
|
|
$numcontributors = $1;
|
|
}
|
|
}
|
|
close(F);
|
|
|
|
########################################################################
|
|
# Produce the summary
|
|
|
|
print "== Since $start $taggednice ==\n";
|
|
printf "Elapsed time: %.1f days (total %d)\n",
|
|
$elapsed / 3600 / 24,
|
|
$total / 3600 / 24;
|
|
printf "Commits: %d (total %d)\n",
|
|
$commits, $acommits;
|
|
printf "Commit authors: %d, %d new (total %d)\n",
|
|
$committers, $ncommitters, $acommitters;
|
|
printf "Contributors: %d, %d new (total %d)\n",
|
|
$numcontributors, $contribs, $acontribs;
|
|
printf "New public functions: %d (total %d)\n",
|
|
$public, $apublic;
|
|
printf "New curl_easy_setopt() options: %d (total %d)\n",
|
|
$nsetopts, $asetopts;
|
|
printf "New command line options: %d (total %d)\n",
|
|
$noptions, $aoptions;
|
|
printf "Changes logged: %d\n", $numchanges;
|
|
printf "Bugfixes logged: %d\n", $numbugfixes;
|
|
printf "Added files: %d (total %d)\n",
|
|
$creates, $afiles;
|
|
printf "Deleted files: %d (delta: %d)\n", $deletes,
|
|
$creates - $deletes;
|
|
print "Diffstat:$diffstat" if(!$fileschanged);
|
|
printf "Files changed: %d (%.2f%%)\n", $fileschanged, $fileschanged*100/$afiles;
|
|
printf "Lines inserted: %d\n", $insertions;
|
|
printf "Lines deleted: %d (delta: %d)\n", $deletions,
|
|
$insertions - $deletions;
|