#!/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 authors per hour. # # # * `git log` # - Show logs. # * `awk '{}'` # - Compute average number of authors per hour. # * `sort -n` # - Sort in numerical order. git log --format=format:"%ad %aN" --date=format:"%T %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]) } { split($1, time, ":") hr = time[1] key = hr OFS $2 OFS $3 OFS $4 OFS $5 OFS $6 if (key in lines) { next } lines[key] = 1 counts[hr] += 1 } END { hours = num for (hr in counts) { count = counts[hr] print hr OFS count OFS count/hours } } # 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 -n