Changeset 206980 in webkit


Ignore:
Timestamp:
Oct 9, 2016 10:22:09 PM (8 years ago)
Author:
Simon Fraser
Message:

Make validate-committer-lists show inactive reviewers
https://bugs.webkit.org/show_bug.cgi?id=163193

Reviewed by Sam Weinig.

In preparation for updating contributors.json with the WebKit policy of retiring
inactive reviewers, make validate-committer-lists show the list of reviewers who
have not reviewed in the past year.

This list is computed by grepping the output of 'git log --since=1.year" for
the reviewer line, and looking up reviewers via Contributor.mentioned_in_text(),
which looks for full names, aliases, irc nicks and email addresses.

Support for aliases is added to Contributor. Aliases are alternates
or misspellings of the reviewer's name. Some common aliases were added to
contributors.json by manual examination of "Reviewed by" lines.

  • Scripts/validate-committer-lists:

(CommitterListFromGit.possibly_expired_committers):
(CommitterListFromGit):
(CommitterListFromGit.possibly_inactive_reviewers):
(CommitterListFromGit.print_possibly_expired_committers):
(CommitterListFromGit.print_possibly_inactive_reviewers):

  • Scripts/webkitpy/common/config/committers.py:

(Contributor.init):
(Contributor.contains_string):
(Contributor.mentioned_in_text):
(Contributor.as_dict):
(Committer.init):
(Reviewer.init):
(CommitterList.load_json):

  • Scripts/webkitpy/common/config/contributors.json:
Location:
trunk/Tools
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r206973 r206980  
     12016-10-09  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Make validate-committer-lists show inactive reviewers
     4        https://bugs.webkit.org/show_bug.cgi?id=163193
     5
     6        Reviewed by Sam Weinig.
     7       
     8        In preparation for updating contributors.json with the WebKit policy of retiring
     9        inactive reviewers, make validate-committer-lists show the list of reviewers who
     10        have not reviewed in the past year.
     11       
     12        This list is computed by grepping the output of 'git log --since=1.year" for
     13        the reviewer line, and looking up reviewers via Contributor.mentioned_in_text(),
     14        which looks for full names, aliases, irc nicks and email addresses.
     15       
     16        Support for aliases is added to Contributor. Aliases are alternates
     17        or misspellings of the reviewer's name. Some common aliases were added to
     18        contributors.json by manual examination of "Reviewed by" lines.
     19
     20        * Scripts/validate-committer-lists:
     21        (CommitterListFromGit.possibly_expired_committers):
     22        (CommitterListFromGit):
     23        (CommitterListFromGit.possibly_inactive_reviewers):
     24        (CommitterListFromGit.print_possibly_expired_committers):
     25        (CommitterListFromGit.print_possibly_inactive_reviewers):
     26        * Scripts/webkitpy/common/config/committers.py:
     27        (Contributor.__init__):
     28        (Contributor.contains_string):
     29        (Contributor.mentioned_in_text):
     30        (Contributor.as_dict):
     31        (Committer.__init__):
     32        (Reviewer.__init__):
     33        (CommitterList.load_json):
     34        * Scripts/webkitpy/common/config/contributors.json:
     35
    1362016-10-09  Simon Fraser  <simon.fraser@apple.com>
    237
  • trunk/Tools/Scripts/validate-committer-lists

    r206967 r206980  
    4141
    4242from webkitpy.common.config.committers import CommitterList
     43from webkitpy.common.checkout.changelog import ChangeLogEntry
    4344from webkitpy.common.checkout.scm import Git
    4445from webkitpy.common.net.bugzilla import Bugzilla
     
    227228        return retired_authors_and_last_commits
    228229
     230    def possibly_inactive_reviewers(self, committer_list):
     231        git_log_args = ['git', 'log', '--since=1.year']
     232        process = subprocess.Popen(git_log_args, stdout=subprocess.PIPE)
     233        git_output, err = process.communicate()
     234
     235        comment_regex = re.compile(r'^Date: .+?\n+(.+?)(?:^commit |\Z)', re.MULTILINE | re.DOTALL)
     236        reviewed_by_regexp = re.compile(ChangeLogEntry.reviewed_by_regexp, re.MULTILINE)
     237       
     238        reviewers = committer_list.reviewers()
     239
     240        for comment in comment_regex.findall(git_output):
     241            reviewer_match = reviewed_by_regexp.search(comment)
     242            if reviewer_match:
     243                reviewers_text = reviewer_match.group('reviewer').decode('utf-8', 'backslashreplace')
     244                # reviewers might be something like "Darin Adler and Dave Hyatt".
     245                # Rather than trying to fuzzy match names, find known reviewers and remove them from the list.
     246                for reviewer in reviewers:
     247                    if reviewer.mentioned_in_text(reviewers_text):
     248                        reviewers.remove(reviewer)
     249                        break
     250
     251        return reviewers
     252
    229253    def print_possibly_expired_committers(self, committer_list):
    230254        retired_authors_and_last_commits = self.possibly_expired_committers(committer_list)
     
    238262            self._print_three_column_row(column_widths, (str(last_commit_date), author, committer_record))
    239263
     264    def print_possibly_inactive_reviewers(self, committer_list):
     265        inactive_reviewers = self.possibly_inactive_reviewers(committer_list)
     266       
     267        column_widths = [13, 25]
     268        print
     269        print "Reviewers who have not reviewed within one year:"
     270        for contributor in inactive_reviewers:
     271            print "\"{}\" {}".format(contributor.full_name.encode("utf-8"), contributor.bugzilla_email())
     272
    240273    def print_committers_missing_from_committer_list(self, committer_list):
    241274        missing_from_contributors_json = []
     
    295328        print """\n\nWARNING: validate-committer-lists requires a git checkout.
    296329The following checks are disabled:
    297  - List of committers ordered by last commit
     330 - List of inactive committers
     331 - List of inactive reviewers
    298332 - List of historical committers missing from contributors.json
    299333"""
     
    302336    svn_committer_list = CommitterListFromGit()
    303337    svn_committer_list.print_possibly_expired_committers(committer_list)
     338    svn_committer_list.print_possibly_inactive_reviewers(committer_list)
    304339    svn_committer_list.print_committers_missing_from_committer_list(committer_list)
    305340
  • trunk/Tools/Scripts/webkitpy/common/config/committers.py

    r206973 r206980  
    3939
    4040class Contributor(object):
    41     def __init__(self, name, email_or_emails, irc_nickname_or_nicknames=None, expertise=None):
     41    def __init__(self, name, email_or_emails, irc_nickname_or_nicknames=None, alias_or_aliases=None, expertise=None):
    4242        assert(name)
    4343        assert(email_or_emails)
     
    4949        self._case_preserved_emails = self.emails
    5050        self.emails = map(lambda email: email.lower(), self.emails)  # Emails are case-insensitive.
     51
    5152        if isinstance(irc_nickname_or_nicknames, str):
    5253            self.irc_nicknames = [irc_nickname_or_nicknames]
    5354        else:
    5455            self.irc_nicknames = irc_nickname_or_nicknames
     56
     57        if isinstance(alias_or_aliases, str):
     58            self.aliases = [alias_or_aliases]
     59        else:
     60            self.aliases = alias_or_aliases
     61
    5562        self.expertise = expertise
    5663        self.can_commit = False
     
    8592                if string in nickname.lower():
    8693                    return True
     94        if self.aliases:
     95            for alias in self.aliases:
     96                if string in alias.lower():
     97                    return True
    8798        for email in self.emails:
    8899            if string in email:
     100                return True
     101        return False
     102
     103    def mentioned_in_text(self, text):
     104        lower_text = text.lower()
     105        if self.full_name.lower() in lower_text:
     106            return True
     107        if self.irc_nicknames:
     108            for nickname in self.irc_nicknames:
     109                if nickname.lower() in lower_text:
     110                    return True
     111        if self.aliases:
     112            for alias in self.aliases:
     113                if alias.lower() in lower_text:
     114                    return True
     115        for email in self.emails:
     116            if email in lower_text:
    89117                return True
    90118        return False
     
    105133        info = {"emails" : self._case_preserved_emails}
    106134
     135        if self.aliases:
     136            info["aliases"] = self.aliases
     137
    107138        if self.can_review:
    108139            info["status"] = "reviewer"
     
    120151
    121152class Committer(Contributor):
    122     def __init__(self, name, email_or_emails, irc_nickname=None, expertise=None):
    123         Contributor.__init__(self, name, email_or_emails, irc_nickname, expertise)
     153    def __init__(self, name, email_or_emails, irc_nickname=None, alias_or_aliases=None, expertise=None):
     154        Contributor.__init__(self, name, email_or_emails, irc_nickname, alias_or_aliases, expertise)
    124155        self.can_commit = True
    125156
    126157
    127158class Reviewer(Committer):
    128     def __init__(self, name, email_or_emails, irc_nickname=None, expertise=None):
    129         Committer.__init__(self, name, email_or_emails, irc_nickname, expertise)
     159    def __init__(self, name, email_or_emails, irc_nickname=None, alias_or_aliases=None, expertise=None):
     160        Committer.__init__(self, name, email_or_emails, irc_nickname, alias_or_aliases, expertise)
    130161        self.can_review = True
    131162
     
    163194            status = data.get('status')
    164195            if status == "reviewer":
    165                 contributor = Reviewer(name, data.get('emails'), data.get('nicks'), data.get('expertise'))
     196                contributor = Reviewer(name, data.get('emails'), data.get('nicks'), data.get('aliases'), data.get('expertise'))
    166197                self._reviewers.append(contributor)
    167198                self._committers.append(contributor)
    168199            elif status == "committer":
    169                 contributor = Committer(name, data.get('emails'), data.get('nicks'), data.get('expertise'))
     200                contributor = Committer(name, data.get('emails'), data.get('nicks'), data.get('aliases'), data.get('expertise'))
    170201                self._committers.append(contributor)
    171202            else:
    172                 contributor = Contributor(name, data.get('emails'), data.get('nicks'), data.get('expertise'))
     203                contributor = Contributor(name, data.get('emails'), data.get('nicks'), data.get('aliases'), data.get('expertise'))
    173204
    174205            self._contributors.append(contributor)
  • trunk/Tools/Scripts/webkitpy/common/config/contributors.json

    r206973 r206980  
    446446   },
    447447   "Andreas Kling" : {
     448      "aliases" : [
     449         "Andreas Goran Kling"
     450      ],
    448451      "emails" : [
    449452         "akling@apple.com",
     
    846849   },
    847850   "Benjamin Poulain" : {
     851      "aliases" : [
     852         "Ben Poulain"
     853      ],
    848854      "emails" : [
    849855         "benjamin@webkit.org",
     
    859865   },
    860866   "Beth Dakin" : {
     867      "aliases" : [
     868         "Deth Bakin"
     869      ],
    861870      "emails" : [
    862871         "bdakin@apple.com"
     
    11301139   },
    11311140   "Chris Dumez" : {
     1141      "aliases" : [
     1142         "Christophe Dumez"
     1143      ],
    11321144      "emails" : [
    11331145         "cdumez@apple.com",
     
    12901302   },
    12911303   "Dan Bernstein" : {
     1304      "aliases" : [
     1305         "mitz"
     1306      ],
    12921307      "emails" : [
    12931308         "mitz@webkit.org",
     
    14311446   },
    14321447   "David Hyatt" : {
     1448      "aliases" : [
     1449         "Dave Hyatt"
     1450      ],
    14331451      "emails" : [
    14341452         "hyatt@apple.com"
     
    14421460   },
    14431461   "David Kilzer" : {
     1462      "aliases" : [
     1463         "Dave Kilzer"
     1464      ],
    14441465      "emails" : [
    14451466         "ddkilzer@webkit.org",
     
    16621683   },
    16631684   "Don Melton" : {
     1685      "aliases" : [
     1686         "Gramps"
     1687      ],
    16641688      "emails" : [
    16651689         "gramps@apple.com"
     
    17831807   },
    17841808   "Emil A Eklund" : {
     1809      "aliases" : [
     1810         "Emil Eklund"
     1811      ],
    17851812      "emails" : [
    17861813         "eae@chromium.org"
     
    19341961   },
    19351962   "Filip Pizlo" : {
     1963      "aliases" : [
     1964         "Phil Pizlo"
     1965      ],
    19361966      "emails" : [
    19371967         "fpizlo@apple.com"
     
    20482078   },
    20492079   "Geoffrey Garen" : {
     2080      "aliases" : [
     2081         "Geoff Garen"
     2082      ],
    20502083      "emails" : [
    20512084         "ggaren@apple.com"
     
    22762309   },
    22772310   "Holger Freyther" : {
     2311      "aliases" : [
     2312         "Holger Hans Peter Freyther"
     2313      ],
    22782314      "emails" : [
    22792315         "zecke@selfish.org",
     
    28842920   },
    28852921   "Jon Honeycutt" : {
     2922      "aliases" : [
     2923         "John Honeycutt"
     2924      ],
    28862925      "emails" : [
    28872926         "jhoneycutt@apple.com"
     
    29873026   },
    29883027   "Joseph Pecoraro" : {
     3028      "aliases" : [
     3029         "Joe Pecoraro"
     3030      ],
    29893031      "emails" : [
    29903032         "joepeck@webkit.org",
     
    32133255   },
    32143256   "Kenneth Rohde Christiansen" : {
     3257      "aliases" : [
     3258         "Kenneth Christiansen"
     3259      ],
    32153260      "emails" : [
    32163261         "kenneth@webkit.org",
     
    32283273   },
    32293274   "Kenneth Russell" : {
     3275      "aliases" : [
     3276         "Ken Russell"
     3277      ],
    32303278      "emails" : [
    32313279         "kbr@google.com",
     
    40654113   },
    40664114   "Myles C. Maxfield" : {
     4115      "aliases" : [
     4116         "Myles Maxfield"
     4117      ],
    40674118      "emails" : [
    40684119         "mmaxfield@apple.com"
     
    41784229   },
    41794230   "Nikolas Zimmermann" : {
     4231      "aliases" : [
     4232         "Niko Zimmermann"
     4233      ],
    41804234      "emails" : [
    41814235         "zimmermann@kde.org",
     
    51485202   },
    51495203   "Tim Horton" : {
     5204      "aliases" : [
     5205         "Timothy Horton"
     5206      ],
    51505207      "emails" : [
    51515208         "thorton@apple.com",
     
    51735230   },
    51745231   "Timothy Hatcher" : {
     5232      "aliases" : [
     5233         "Tim Hatcher"
     5234      ],
    51755235      "emails" : [
    51765236         "timothy@apple.com",
     
    56755735   },
    56765736   "Zoltan Herczeg" : {
     5737      "aliases" : [
     5738         "Zolt\u00e1n Herczeg"
     5739      ],
    56775740      "emails" : [
    56785741         "zherczeg@webkit.org",
Note: See TracChangeset for help on using the changeset viewer.