guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: gnu-patches back log


From: Ludovic Courtès
Subject: Re: gnu-patches back log
Date: Sat, 11 Mar 2017 22:30:50 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux)

Hi Hartmut,

Hartmut Goebel <address@hidden> skribis:

> Am 06.03.2017 um 17:14 schrieb Ludovic Courtès:
>> add Reviewed-by tags
>
> Can git add this automatically? Otherwise it would mean additional
> manual work.

Actually Git already distinguishes between committer and author, so
you’re probably right.

Based on that, the attached Guile-Git program gives the number of
patches committed on behalf of someone else, and…  [drum roll] we get:

--8<---------------cut here---------------start------------->8---
scheme@(guile-user)> ,pp (sort (reviewers repo) reviewer<)
$6 = ((0 . "Nikita Karetnikov")
 (0 . "Cyril Roelandt")
 (0 . "John Darrington")
 (0 . "Jason Self")
 (0 . "Federico Beffa")
 (0 . "rekado")
 (0 . "Taylan Ulrich Bayırlı/Kammer")
 (0 . "Tomáš Čech")
 (0 . "Paul van der Walt")
 (0 . "Ben J. Woodcroft")
 (0 . "Alex Sassmannshausen")
 (0 . "Julien Lepiller")
 (1 . "Andy Wingo")
 (2 . "cyril")
 (2 . "Manolis Ragkousis")
 (2 . "Roel Janssen")
 (2 . "Tobias Geerinckx-Rice")
 (6 . "Christopher Allan Webber")
 (9 . "Hartmut Goebel")
 (13 . "Danny Milosavljevic")
 (17 . "Mathieu Lirzin")
 (29 . "Eric Bavier")
 (36 . "Andreas Enge")
 (38 . "David Craven")
 (40 . "Ben Woodcroft")
 (51 . "David Thompson")
 (52 . "Kei Kebreau")
 (68 . "宋文武")
 (81 . "Mark H Weaver")
 (88 . "Alex Kost")
 (94 . "Ricardo Wurmus")
 (99 . "Marius Bakke")
 (101 . "Efraim Flashner")
 (336 . "Leo Famulari")
 (641 . "Ludovic Courtès"))
--8<---------------cut here---------------end--------------->8---

Not sure if it’s 100% accurate, but it should be a good approximation.
To those with a 1-digit number, please take a look at
<https://bugs.gnu.org/guix-patches> and try to beat your fellow hackers!
:-)

Ludo’.

(use-modules (git)
             (git repository)
             (git reference)
             (git oid)
             (git tag)
             (git commit)
             (git structs)                        ;signature-email, etc.
             (srfi srfi-1)
             (srfi srfi-26)
             (ice-9 match)
             (ice-9 vlist))

(define commit-author*
  (compose signature-name commit-author))
(define commit-committer*
  (compose signature-name commit-committer))

(define-syntax-rule (false-if-git-error exp)
  (catch 'git-error
    (lambda () exp)
    (const #f)))

(define* (fold-commits proc seed repo
                       #:key
                       (start (reference-target
                               (repository-head repo)))
                       end)
  "Call PROC on each commit of REPO, starting at START (an OID), and until
END if specified."
  (let loop ((commit (commit-lookup repo start))
             (result seed))
    (let ((parent (false-if-git-error (commit-parent commit))))
      (if parent
          (if (and end (oid=? (commit-id parent) end))
              (proc parent result)
              (loop parent (proc parent result)))
          result))))

(define (reviewers repo)
  "Return a list of review count/committer pairs."
  (define vhash
    (fold-commits (lambda (commit result)
                    (if (string=? (commit-author* commit)
                                  (commit-committer* commit))
                        result
                        (vhash-cons (commit-committer* commit) #t
                                    result)))
                  vlist-null
                  repo))

  (define committers
    (delete-duplicates
     (fold-commits (lambda (commit result)
                     (cons (commit-committer* commit)
                           result))
                   '()
                   repo)))

  (map (lambda (committer)
         (cons (vhash-fold* (lambda (_ count)
                              (+ 1 count))
                            0
                            committer
                            vhash)
               committer))
       committers))

(define (reviewer< r1 r2)
  (match r1
    ((count1 . name1)
     (match r2
       ((count2 . name2)
        (< count1 count2))))))

(libgit2-init!)

(define repo
  (repository-open "."))

reply via email to

[Prev in Thread] Current Thread [Next in Thread]