Hacker News new | ask | show | jobs
by kazinator 454 days ago
Tiny prototype implementation:

Run on log from GNU Bison. We anonymize names so that search engines don't index this comment to those names:

  $ ./gwho git-log-stat.txt
  NAME                     LAST-SEEN                      FILES    LINES+   LINES- COMMITS
  A___ D_______            Tue Sep 20 08:19:02 2022 +0200 17083    356066   255931    4440
  P___ E_____              Mon Mar 17 17:46:43 2025 -0700  4496     61898    71486    1123
  J___ E_ D____            Sun Aug 21 17:35:26 2011 -0400  3922     75517    50121     612
  R_____ A_____            Thu May 2 16:43:00 2002 +0000    101      7631     4522      23
  J____ T____              Sun Jan 21 16:43:58 2001 +0000   200      8308     3205      60
  P___ H________           Tue Feb 26 16:28:36 2013 -0800   122      5057     2864      26
  A___ R_______            Wed Jan 5 15:47:25 2011 +0200    124      5297     2101      30
  T________ R______        Tue Nov 13 10:38:49 2012 +0000   229      3841     2744      94
  V_______ T_____          Wed Nov 11 18:55:15 2020 +0100    67      4739     1128      17
  J__ M_______             Sat Jan 18 20:52:21 2020 -0800   337      1569     3894      45
  J___ M_____ G_______     Mon May 12 00:58:38 2008 +0000    91      2570     2060      49
  R______ M_ S_______      Mon Jan 5 00:25:39 1998 +0000    134      2978     1155      64
  P____ B______            Tue Nov 11 13:37:36 2008 +0100    90      2991      786      17
  A____ V___               Mon Sep 19 19:09:20 2022 +0200   130      2335      943      46
  M___ A_____              Sun Jan 20 15:59:34 2002 +0000   201      1797     1291      76
  D____ J__                Sun Dec 7 21:54:45 2008 -0800     57      2142      816      15
  P_____ B___              Fri Oct 19 11:03:50 2001 +0000    67      1771     1182      19
  E___ B____               Thu Aug 27 10:56:53 2009 -0600    61      2172      590      22
  V_____ S_____            Fri Jun 29 16:23:42 2012 +0200    64       865      918       9
  D____ M________          Thu Nov 10 22:34:22 1994 +0000    26      1526       84      18
  D_____ H_________        Thu Jun 13 10:08:19 2013 +0200     6      1142       54       1
  V______ I______          Sat Jan 23 13:25:18 2021 -0500    47       824      360      16
  A_____ V___________      Thu Feb 27 09:52:03 2020 +0100    25       524      189      13
  V_____ M______ C______   Fri Feb 14 18:41:55 2020 +0100    16       284      364       1
  J_____ W___              Tue Feb 16 08:00:28 2021 -0600    18       306       33       3
  W_______ P____           Thu Feb 21 17:08:18 2008 +0000    13       195       76       9
  J___ S____               Wed Jul 26 00:30:05 2017 -0400    67        88       88      63
  E___ S_ R______          Wed Feb 13 10:39:54 2019 -0500     2       133       33       1
  Y_______ K_____          Mon Nov 11 08:57:15 2019 +0900     5       125       13       2
  K______ K_______         Sun Jan 27 06:58:17 2019 +0100     3        85       24       1
  H_ S_ T___               Fri Mar 1 06:16:54 2019 +0100      1        45       51       1
  T__ L__________          Tue Mar 27 19:28:02 2012 +0000     9        81        9       5
  T__ V__ H_____           Fri Jan 11 15:32:06 2002 +0000     7        55       34       3
  A________ D_________     Wed May 14 18:41:48 2003 +0000     3        66       16       1
  L_____ V_____            Fri Aug 9 14:24:14 2019 +0200      8        71        2       2
  M______ D_ B_________    Thu Jul 30 20:53:35 2020 +0200    10        30       29       3
  J______                  Tue Nov 20 22:02:20 2018 +0100     3        30       28       3
  J_______ N_____          Tue Dec 15 22:03:18 2009 -0600    10        42       13       3
  N___ F_______            Mon Sep 6 19:51:09 1993 +0000      7        36       18       7
  K__ K______              Tue Oct 13 15:39:41 2020 -0700     5        26       28       2
  E_____ S________         Mon Dec 10 15:18:37 2018 +0200    10        25       25       1
  M_____ R____             Wed Nov 18 09:10:01 2020 +0100    10        26       13       2
  J___ B_____              Mon Oct 2 20:04:58 2000 +0000      3        26        8       1
  T_____ P________         Tue May 19 22:05:22 2020 +0200     4        29        2       1
  A_____ B_______          Sun Mar 6 22:19:18 2011 -0500      6        24        2       2
  N___ G_____              Tue Oct 27 06:12:27 2020 +0000     4        14       11       3
  B____ K_____             Sat Feb 19 19:24:07 2011 -0500     6        22        2       2
  A___ S______             Wed Oct 31 14:01:31 2018 +0000     1        12        9       1
  S_____ T______           Mon Nov 24 15:27:49 2008 +0100     1        11        6       1
  F______ K____            Tue May 14 00:25:23 2002 +0000     3        11        6       2
  A______ H______          Fri Apr 29 04:08:35 2022 -0400     2         8        6       1
  B____ H_____             Sat Dec 18 18:45:46 2021 +0100     4         3        9       2
  T___ C_ M_____           Tue Nov 10 07:36:11 2020 +0100     2         8        3       1
  E______ S_________       Fri Nov 4 11:50:32 2022 -0700      3         5        5       1
  k_____ y                 Mon Nov 11 23:27:37 2019 +0900     3         3        3       3
  S______ L________        Sat Jul 21 17:24:23 2012 +0200     3         3        3       2
  A____ D_______           Sat Feb 15 10:49:14 2020 +0100     2         2        2       2
  J_____ L_                Fri Aug 24 17:35:32 2018 +0000     1         1        1       1
  D_____ H______           Wed Nov 29 01:26:22 1995 +0000     1         1        1       1
  A______ S_____           Sat Sep 28 00:00:34 2013 +0200     1         1        1       1
  A_____ R___              Mon Jun 14 21:54:40 2021 +0000     1         1        1       1
Code:

  #!/usr/bin/env txr
  @(do
     (defstruct author ()
       name
       e-mail
       last-seen
       (files 0)
       (lines+ 0)
       (lines- 0)
       (commits 0))

     (defvarl ah (hash)))
  @(repeat)
  Author: @name <@addr>
  Date: @date
  @(skip)
   @files file@nil changed, @ins insertion@nil, @del deletion@nil
  @  (set name @(flow name ;; anonymize name
                  (spl " ")
                  (map (op map (do if (plusp @2) #\_ @1) @1 0))
                  (join-with " ")))
  @  (do (let ((a (or [ah name]
                      (new author
                           name name
                           e-mail addr
                           last-seen date))))
           (inc a.commits)
           (inc a.files (tointz files))
           (inc a.lines+ (tointz ins))
           (inc a.lines- (tointz del))
           (set [ah name] a)))
  @(end)
  @(do
     (flow (hash-values ah)
       (csort @1 > [callf + .lines+ .lines-])
       (cons (new author
                  name "NAME" last-seen "LAST-SEEN" files "FILES"
                  lines+ "LINES+" lines- "LINES-" commits "COMMITS"))
       (each ((a @1))
         (put-line `@{a.name 24} @{a.last-seen 30} @{a.files -5} \ \
                    @{a.lines+ -8} @{a.lines- -8} @{a.commits -7}`))))