]> granicus.if.org Git - curl/commitdiff
scripts/delta: show repo delta info from last release
authorDaniel Stenberg <daniel@haxx.se>
Tue, 11 Dec 2018 14:06:21 +0000 (15:06 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 11 Dec 2018 14:07:26 +0000 (15:07 +0100)
... where "last release" should be the git tag in the repo.

scripts/delta [new file with mode: 0755]

diff --git a/scripts/delta b/scripts/delta
new file mode 100755 (executable)
index 0000000..779ab50
--- /dev/null
@@ -0,0 +1,137 @@
+#!/usr/bin/perl
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2018, 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 respository 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 "") {
+    print "Usage: summary [tag]\n";
+    exit;
+}
+
+$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 (according to THANKS)
+$acontribs = `cat docs/THANKS | 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 "^  CINIT" include/curl/curl.h  | grep -cv OBSOLETE`;
+$bsetopts=`git show $start:include/curl/curl.h | grep "^  CINIT" | 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 -r --summary origin/master $start | grep -c create`;
+$creates=`git diff-tree -r --summary origin/master $start | grep -c delete`;
+
+# 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 currenly 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 (in THANKS): %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;