#!/usr/bin/perl
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 2018-2020, 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.haxx.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.
#
###########################################################################

# 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 | 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 tag was set
$bcontribs = `git show $start:docs/THANKS | grep -c '^[^ ]'`;
# delta
$contribs = $acontribs - $bcontribs;

# number of setops:
$asetopts=`grep '^  CURLOPT(' include/curl/curl.h  | grep -cv OBSOLETE`;
$bsetopts=`git show $start:include/curl/curl.h | grep '^  CURLOPT(' | grep -cv OBSOLETE`;
$nsetopts = $asetopts - $bsetopts;

# Number of command line options:
$aoptions=`grep -c '{"....--' src/tool_help.c`;
$boptions=`git show $start:src/tool_help.c | grep -c '{"....--'`;
$noptions=$aoptions - $boptions;

# Number of files in git
$afiles=`git ls-files | wc -l`;
$deletes=`git diff-tree --diff-filter=A -r --summary origin/master $start | wc -l`;
$creates=`git diff-tree --diff-filter=D -r --summary origin/master $start | 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

# 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;

# 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 ==\n";
printf "Commits: %d (out of %d)\n",
    $commits, $acommits;
printf "Commit authors: %d out of which %d are new (out of %d)\n",
    $committers, $ncommitters, $acommitters;
printf "Contributors in RELEASE-NOTES: %d\n",
    $numcontributors;
printf "New contributors: %d (out of %d)\n",
    $contribs, $acontribs;
printf "New curl_easy_setopt() options: %d (out of %d)\n",
    $nsetopts, $asetopts;
printf "New command line options: %d (out of %d)\n",
    $noptions, $aoptions;

printf "Deleted %d files, added %d files (total %d)\n",
    $deletes, $creates, $afiles;

printf "Elapsed time: %.1f days (since$taggednice)\n",
    $elapsed / 3600 / 24;
printf "Changes logged: %d\n", $numchanges;
printf "Bugfixes logged: %d\n", $numbugfixes;

printf "New public functions: %d (out of %d)\n",
    $public, $apublic;
