#!/usr/bin/env bash # # @license Apache-2.0 # # Copyright (c) 2017 The Stdlib Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Prints the number of days an author has committed. # # # # Notes: # # - The percentage is computed based on the date of the first repository commit. # * `git log` # - Show logs. # * `awk '{}'` # - Compute statistics. # * `sort -k3nr` # - Sort in reverse numerical order based on the number of days active. git log --format=format:"%ad %aN" --date=format:"%b %d %Y" --use-mailmap | awk ' BEGIN { # Get the date of the first commit: cmd = "git log --reverse --date=short | grep Date | head -n 1" (cmd | getline tmp) close(cmd) split(tmp, date, OFS) split(date[2], t1, "-") # Get the date for "now": cmd = "date '\''+%Y %m %d'\''" (cmd | getline now) close(cmd) split(now, t2, OFS) # Compute the number of days between the first commit and "now": num = daynum(t1[1], t2[1], 0+t1[2], 0+t2[2], 0+t1[3], 0+t2[3]) } { day = $1 OFS $2 OFS $3 lines[day,$4,$5] = 1 } END { for (k in lines) { split(k, keys, SUBSEP) name = keys[2] OFS keys[3] names[name] += 1 } for (k in names) { n = names[k] pct = n/num print k OFS n OFS pct } } # Computes the number of days between a start date and an end date. # # Parameters: # y1 - start year # y2 - end year # m1 - start month # m2 - end month # d1 - start day # d2 - end day # # Returns: # number of days # function daynum(y1, y2, m1, m2, d1, d2, days, i, n) { split("31 28 31 30 31 30 31 31 30 31 30 31", days) # 365 days in a year, plus one during a leap year: if (y2 > y1) { n = (y2-y1)*365 + int((y2-y1)/4) } # Adjust number of days in February if leap year... if (y2 % 4 == 0) { days[2] += 1 } if ( m2 > m1 ) { for (i = m1; i < m2; i++) { n += days[i] } } else if ( m2 < m1 ) { for (i = m1; i >= m2; i--) { n -= days[i] } } return n + d2 - d1 } ' | sort -k3nr