changeset 6782:a48802bf7134

Merge stable
author Mads Kiilerich <mads@kiilerich.com>
date Thu, 27 Jul 2017 03:02:37 +0200
parents 84d8cff41282 (current diff) 9b9258f5e2b2 (diff)
children 880e2f07651b
files CONTRIBUTORS kallithea/templates/about.html
diffstat 5 files changed, 292 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/.hgsigs	Tue Jul 25 16:22:16 2017 +0200
+++ b/.hgsigs	Thu Jul 27 03:02:37 2017 +0200
@@ -1,3 +1,4 @@
 9b3e9e242f5c97cc0c7657e5ac93dce7de61ca16 0 iQEcBAABAgAGBQJWDuAdAAoJEJ1bI/kYT6UUAlYH/ReCa7Im5tvy+ot5oAc7xey/O2rCVHp2h6i82tTWK/0i9EaS4DP+eTbAjV4WJA4qWF5DPenEJ3X9JhrTLNvGkR0f7lUqiFVMTJ472YlSsvIWg38gVFruzwk1cODRfq72o8ERYcRSfzrL4cDpIqjEd/vVVCV/gKVvPmzr4/FED/ZmS0X6T9gxWJo/eWSuLNAxHHtE/pCWDO3XEe+iOm+hHjkyz4Hn2r9/+ucrirnzycH6DnYO/kWvQzBnzgMjJm+1rLZ5cfU89V8zfhv6z0pd8CHZfpKGc2Z8EwVJq9LR+M4/76uDlYXx7IfZAxhRNqN6MC+yvPmDo3382dNr7Wkopi0=
 9bf8eb837e785b6856ccfac264e977ce3ebe1535 0 iQEcBAABAgAGBQJW5XaVAAoJEJ1bI/kYT6UUbeMH/AsGg21jTc0tTT+228T+WfrfkbxrPkkULQF/Eo3ChlrhnFZ5B1y7ellSx6XGas7yKpqHHtNmrVwY3KBfUaYEljML/osEt1kvM6JGcd0vDbAW1uA2sdJR2AXmf32MjguFVhmYi9Lj79WYtgg241YGPe4dH0ompNFVqazNxCfmDBZijzSkF57FURMpV2e6+MyNq0txSo9Q82eALy0GAIX7NKQcxtynxG9ETzVzuVpeNE9MEZh0ObbUtPGezd55GXXcVqI8ZEurZwf6KHnd5M+5wxIZf84gM/k4QgQbRiIxNj4QfVmTZlVNSkC7PwSbF8twZPjlAprwldYvMi/c7ZVocEY=
 a84d40e9481fcea4dafadee86b03f0dd401527d6 0 iQEcBAABAgAGBQJXJ4XhAAoJEJ1bI/kYT6UUKaIH/i33ZiT95pWF3pHEftgrZWvMwvz9tAuoHgf7ntkIUPnxfNteXKw8FiKcSQ9f8I41VyML+rqsnBBIfltJknfoqTV+9jNkHwc62OfcqQ3RbBDXQbcSi1CHn2ihJiZadqiKEyUw7JJqOMyWp+AWQyywcF/ea+pwXPJG5A2fd4vnBWHSxhD+6Ig1KipZNORzZY7fAec185M7NOZCZC+5qOLIkoQZaGq+D2Aipx5eZkpgFd4W+0LQY1ywMV5CiOY1OG0mry7l6NfIZvPY9Kiwg37G6ZUi8fhwVvn6Y8UACcAnWunBfKt9PWK0rAgNyJ9HDk/+3S5g6HcNKUb6YRTzEcLshIc=
+64ea7ea0923618a0c117acebb816a6f0d162bfdb 0 iQEvBAABCAAZBQJZeN4NEhxhbmRyZXdAc2hhZHVyYS5tZQAKCRCdWyP5GE+lFGi/CACBEWfdtZNumWz5LJ6yHbiceEDXZ+9aD44EU3J3VfbRwLeZhQ7J0WwBCFg0qPxh08O+TMaeRP4ur20hczyR6u8fwmIc9KDmNZHujlG0Q6GkNSMizyfJgf/MYJD+03q2Z0S4e9QdPfc746TBZKaqqauV0uVjtd7+m3L4R+Qh5shxBNxshqGGWtMtXpO9iojCJEqxde9RVm+w9NidKdCLGoDlVpJ42iFSrUMeWBnVUMRhOiz6XKUrIPEjUfWMFe0gOR55wZcF3tJo8XBqqqhecI69cmLmkv1xG92V+jC5gTC3STYTASJqXHKEp2cRvUGbHrFF9ODBvcYjj+VsY5r2aU1l
--- a/.hgtags	Tue Jul 25 16:22:16 2017 +0200
+++ b/.hgtags	Thu Jul 27 03:02:37 2017 +0200
@@ -64,3 +64,4 @@
 9b3e9e242f5c97cc0c7657e5ac93dce7de61ca16 0.3
 9bf8eb837e785b6856ccfac264e977ce3ebe1535 0.3.1
 a84d40e9481fcea4dafadee86b03f0dd401527d6 0.3.2
+64ea7ea0923618a0c117acebb816a6f0d162bfdb 0.3.3
--- a/CONTRIBUTORS	Tue Jul 25 16:22:16 2017 +0200
+++ b/CONTRIBUTORS	Thu Jul 27 03:02:37 2017 +0200
@@ -1,18 +1,30 @@
 List of contributors to Kallithea project:
 
-    Mads Kiilerich <madski@unity3d.com> 2012-2016
+    Mads Kiilerich <madski@unity3d.com> 2012-2017
+    Unity Technologies 2012-2017
+    Andrew Shadura <andrew@shadura.me> 2012 2014-2017
+    Dominik Ruf <dominikruf@gmail.com> 2012 2014-2017
+    Thomas De Schampheleire <thomas.de.schampheleire@gmail.com> 2014-2017
+    Søren Løvborg <sorenl@unity3d.com> 2015-2017
+    Sam Jaques <sam.jaques@me.com> 2015 2017
+    Asterios Dimitriou <steve@pci.gr> 2016-2017
+    Mads Kiilerich <mads@kiilerich.com> 2016-2017
+    Alessandro Molina <alessandro.molina@axant.it> 2017
+    Anton Schur <tonich.sh@gmail.com> 2017
+    Ching-Chen Mao <mao@lins.fju.edu.tw> 2017
+    Eivind Tagseth <eivindt@gmail.com> 2017
+    FUJIWARA Katsunori <foozy@lares.dti.ne.jp> 2017
+    Karl Goetz <karl@kgoetz.id.au> 2017
+    Marko Semet <markosemet@googlemail.com> 2017
+    Viktar Vauchkevich <victorenator@gmail.com> 2017
     Takumi IINO <trot.thunder@gmail.com> 2012-2016
-    Unity Technologies 2012-2016
-    Andrew Shadura <andrew@shadura.me> 2012 2014-2016
-    Dominik Ruf <dominikruf@gmail.com> 2012 2014-2016
-    Thomas De Schampheleire <thomas.de.schampheleire@gmail.com> 2014-2016
     Étienne Gilli <etienne.gilli@gmail.com> 2015-2016
     Jan Heylen <heyleke@gmail.com> 2015-2016
     Robert Martinez <ntttq@inboxen.org> 2015-2016
     Robert Rauch <mail@robertrauch.de> 2015-2016
-    Søren Løvborg <sorenl@unity3d.com> 2015-2016
     Angel Ezquerra <angel.ezquerra@gmail.com> 2016
-    Asterios Dimitriou <steve@pci.gr> 2016
+    Anton Shestakov <av6@dwimlabs.net> 2016
+    Brandon Jones <bjones14@gmail.com> 2016
     Kateryna Musina <kateryna@unity3d.com> 2016
     Konstantin Veretennicov <kveretennicov@gmail.com> 2016
     Oscar Curero <oscar@naiandei.net> 2016
@@ -49,7 +61,6 @@
     Niemand Jedermann <predatorix@web.de> 2015
     Peter Vitt <petervitt@web.de> 2015
     Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> 2015
-    Sam Jaques <sam.jaques@me.com> 2015
     Tuux <tuxa@galaxie.eu.org> 2015
     Viktar Palstsiuk <vipals@gmail.com> 2015
     Ante Ilic <ante@unity3d.com> 2014
--- a/kallithea/templates/about.html	Tue Jul 25 16:22:16 2017 +0200
+++ b/kallithea/templates/about.html	Thu Jul 27 03:02:37 2017 +0200
@@ -27,19 +27,30 @@
   necessarily limited to the following:</p>
   <ul>
 
-  <li>Copyright &copy; 2012&ndash;2016, Mads Kiilerich</li>
+  <li>Copyright &copy; 2012&ndash;2017, Mads Kiilerich</li>
+  <li>Copyright &copy; 2012&ndash;2017, Unity Technologies</li>
+  <li>Copyright &copy; 2012, 2014&ndash;2017, Andrew Shadura</li>
+  <li>Copyright &copy; 2012, 2014&ndash;2017, Dominik Ruf</li>
+  <li>Copyright &copy; 2014&ndash;2017, Thomas De Schampheleire</li>
+  <li>Copyright &copy; 2015&ndash;2017, Søren Løvborg</li>
+  <li>Copyright &copy; 2015, 2017, Sam Jaques</li>
+  <li>Copyright &copy; 2016&ndash;2017, Asterios Dimitriou</li>
+  <li>Copyright &copy; 2017, Alessandro Molina</li>
+  <li>Copyright &copy; 2017, Anton Schur</li>
+  <li>Copyright &copy; 2017, Ching-Chen Mao</li>
+  <li>Copyright &copy; 2017, Eivind Tagseth</li>
+  <li>Copyright &copy; 2017, FUJIWARA Katsunori</li>
+  <li>Copyright &copy; 2017, Karl Goetz</li>
+  <li>Copyright &copy; 2017, Marko Semet</li>
+  <li>Copyright &copy; 2017, Viktar Vauchkevich</li>
   <li>Copyright &copy; 2012&ndash;2016, Takumi IINO</li>
-  <li>Copyright &copy; 2012&ndash;2016, Unity Technologies</li>
-  <li>Copyright &copy; 2012, 2014&ndash;2016, Andrew Shadura</li>
-  <li>Copyright &copy; 2012, 2014&ndash;2016, Dominik Ruf</li>
-  <li>Copyright &copy; 2014&ndash;2016, Thomas De Schampheleire</li>
   <li>Copyright &copy; 2015&ndash;2016, Étienne Gilli</li>
   <li>Copyright &copy; 2015&ndash;2016, Jan Heylen</li>
   <li>Copyright &copy; 2015&ndash;2016, Robert Martinez</li>
   <li>Copyright &copy; 2015&ndash;2016, Robert Rauch</li>
-  <li>Copyright &copy; 2015&ndash;2016, Søren Løvborg</li>
   <li>Copyright &copy; 2016, Angel Ezquerra</li>
-  <li>Copyright &copy; 2016, Asterios Dimitriou</li>
+  <li>Copyright &copy; 2016, Anton Shestakov</li>
+  <li>Copyright &copy; 2016, Brandon Jones</li>
   <li>Copyright &copy; 2016, Kateryna Musina</li>
   <li>Copyright &copy; 2016, Konstantin Veretennicov</li>
   <li>Copyright &copy; 2016, Oscar Curero</li>
@@ -76,7 +87,6 @@
   <li>Copyright &copy; 2015, Niemand Jedermann</li>
   <li>Copyright &copy; 2015, Peter Vitt</li>
   <li>Copyright &copy; 2015, Ronny Pfannschmidt</li>
-  <li>Copyright &copy; 2015, Sam Jaques</li>
   <li>Copyright &copy; 2015, Tuux</li>
   <li>Copyright &copy; 2015, Viktar Palstsiuk</li>
   <li>Copyright &copy; 2014, Ante Ilic</li>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/update-copyrights.py	Thu Jul 27 03:02:37 2017 +0200
@@ -0,0 +1,253 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+
+"""
+Kallithea script for maintaining contributor lists from version control
+history.
+
+This script and the data in it is a best effort attempt at reverse engineering
+previous attributions and correlate that with version control history while
+preserving all existing copyright statements and attribution. This script is
+processing and summarizing information found elsewhere - it is not by itself
+making any claims. Comments in the script are an attempt at reverse engineering
+possible explanations - they are not showing any intent or confirming it is
+correct.
+
+Three files are generated / modified by this script:
+
+kallithea/templates/about.html claims to show copyright holders, and the GPL
+license requires such existing "legal notices" to be preserved. We also try to
+keep it updated with copyright holders, but do not claim it is a correct list.
+
+CONTRIBUTORS has the purpose of giving credit where credit is due and list all
+the contributor names in the source.
+
+kallithea/templates/base/base.html contains the copyright years in the page
+footer.
+
+Both make a best effort of listing all copyright holders, but revision control
+history might be a better and more definitive source.
+
+Contributors are sorted "fairly" by copyright year and amount of
+contribution.
+
+New contributors are listed, without considering if the contribution contains
+copyrightable work.
+
+When the copyright might belong to a different legal entity than the
+contributor, the legal entity is given credit too.
+"""
+
+
+# Some committers are so wrong that it doesn't point at any contributor:
+total_ignore = set()
+total_ignore.add('*** failed to import extension hggit: No module named hggit')
+total_ignore.add('<>')
+
+# Normalize some committer names where people have contributed under different
+# names or email addresses:
+name_fixes = {}
+name_fixes['Andrew Shadura'] = "Andrew Shadura <andrew@shadura.me>"
+name_fixes['aparkar'] = "Aparkar <aparkar@icloud.com>"
+name_fixes['Aras Pranckevicius'] = "Aras Pranckevičius <aras@unity3d.com>"
+name_fixes['Augosto Hermann'] = "Augusto Herrmann <augusto.herrmann@planejamento.gov.br>"
+name_fixes['"Bradley M. Kuhn" <bkuhn@ebb.org>'] = "Bradley M. Kuhn <bkuhn@sfconservancy.org>"
+name_fixes['dmitri.kuznetsov'] = "Dmitri Kuznetsov"
+name_fixes['Dmitri Kuznetsov'] = "Dmitri Kuznetsov"
+name_fixes['domruf'] = "Dominik Ruf <dominikruf@gmail.com>"
+name_fixes['Ingo von borstel'] = "Ingo von Borstel <kallithea@planetmaker.de>"
+name_fixes['Jan Heylen'] = "Jan Heylen <heyleke@gmail.com>"
+name_fixes['Jason F. Harris'] = "Jason Harris <jason@jasonfharris.com>"
+name_fixes['Jelmer Vernooij'] = "Jelmer Vernooij <jelmer@samba.org>"
+name_fixes['jfh <jason@jasonfharris.com>'] = "Jason Harris <jason@jasonfharris.com>"
+name_fixes['Leonardo Carneiro<leonardo@unity3d.com>'] = "Leonardo Carneiro <leonardo@unity3d.com>"
+name_fixes['leonardo'] = "Leonardo Carneiro <leonardo@unity3d.com>"
+name_fixes['Leonardo <leo@unity3d.com>'] = "Leonardo Carneiro <leonardo@unity3d.com>"
+name_fixes['Les Peabody'] = "Les Peabody <lpeabody@gmail.com>"
+name_fixes['"Lorenzo M. Catucci" <lorenzo@sancho.ccd.uniroma2.it>'] = "Lorenzo M. Catucci <lorenzo@sancho.ccd.uniroma2.it>"
+name_fixes['Lukasz Balcerzak'] = "Łukasz Balcerzak <lukaszbalcerzak@gmail.com>"
+name_fixes['mao <mao@lins.fju.edu.tw>'] = "Ching-Chen Mao <mao@lins.fju.edu.tw>"
+name_fixes['marcink'] = "Marcin Kuźmiński <marcin@python-works.com>"
+name_fixes['Marcin Kuzminski'] = "Marcin Kuźmiński <marcin@python-works.com>"
+name_fixes['nansenat16@null.tw'] = "nansenat16 <nansenat16@null.tw>"
+name_fixes['Peter Vitt'] = "Peter Vitt <petervitt@web.de>"
+name_fixes['philip.j@hostdime.com'] = "Philip Jameson <philip.j@hostdime.com>"
+name_fixes['Søren Løvborg'] = "Søren Løvborg <sorenl@unity3d.com>"
+name_fixes['Thomas De Schampheleire'] = "Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>"
+name_fixes['Weblate'] = "<>"
+name_fixes['xpol'] = "xpol <xpolife@gmail.com>"
+
+
+# Some committer email address domains that indicate that another entity might
+# hold some copyright too:
+domain_extra = {}
+domain_extra['unity3d.com'] = "Unity Technologies"
+domain_extra['rhodecode.com'] = "RhodeCode GmbH"
+
+# Repository history show some old contributions that traditionally hasn't been
+# listed in about.html - preserve that:
+no_about = set(total_ignore)
+# The following contributors were traditionally not listed in about.html and it
+# seems unclear if the copyright is personal or belongs to a company.
+no_about.add(('Thayne Harbaugh <thayne@fusionio.com>', '2011'))
+no_about.add(('Dies Koper <diesk@fast.au.fujitsu.com>', '2012'))
+no_about.add(('Erwin Kroon <e.kroon@smartmetersolutions.nl>', '2012'))
+no_about.add(('Vincent Caron <vcaron@bearstech.com>', '2012'))
+# These contributors' contributions might be too small to be copyrightable:
+no_about.add(('philip.j@hostdime.com', '2012'))
+no_about.add(('Stefan Engel <mail@engel-stefan.de>', '2012'))
+no_about.add(('Ton Plomp <tcplomp@gmail.com>', '2013'))
+# Was reworked and contributed later and shadowed by other contributions:
+no_about.add(('Sean Farley <sean.michael.farley@gmail.com>', '2013'))
+
+# Preserve contributors listed in about.html but not appearing in repository
+# history:
+other_about = [
+    ("2011", "Aparkar <aparkar@icloud.com>"),
+    ("2010", "RhodeCode GmbH"),
+    ("2011", "RhodeCode GmbH"),
+    ("2012", "RhodeCode GmbH"),
+    ("2013", "RhodeCode GmbH"),
+]
+
+# Preserve contributors listed in CONTRIBUTORS but not appearing in repository
+# history:
+other_contributors = [
+    ("", "Andrew Kesterson <andrew@aklabs.net>"),
+    ("", "cejones"),
+    ("", "David A. Sjøen <david.sjoen@westcon.no>"),
+    ("", "James Rhodes <jrhodes@redpointsoftware.com.au>"),
+    ("", "Jonas Oberschweiber <jonas.oberschweiber@d-velop.de>"),
+    ("", "larikale"),
+    ("", "RhodeCode GmbH"),
+    ("", "Sebastian Kreutzberger <sebastian@rhodecode.com>"),
+    ("", "Steve Romanow <slestak989@gmail.com>"),
+    ("", "SteveCohen"),
+    ("", "Thomas <thomas@rhodecode.com>"),
+    ("", "Thomas Waldmann <tw-public@gmx.de>"),
+]
+
+
+import os
+import re
+from collections import defaultdict
+
+
+def sortkey(x):
+    """Return key for sorting contributors "fairly":
+    * latest contribution
+    * first contribution
+    * number of contribution years
+    * name (with some unicode normalization)
+    The entries must be 2-tuples of a list of string years and the unicode name"""
+    return (x[0] and -int(x[0][-1]),
+            x[0] and int(x[0][0]),
+            -len(x[0]),
+            x[1].decode('utf8').lower().replace(u'\xe9', u'e').replace(u'\u0142', u'l')
+        )
+
+
+def nice_years(l, dash='-', join=' '):
+    """Convert a list of years into brief range like '1900-1901, 1921'."""
+    if not l:
+        return ''
+    start = end = int(l[0])
+    ranges = []
+    for year in l[1:] + [0]:
+        year = int(year)
+        if year == end + 1:
+            end = year
+            continue
+        if start == end:
+            ranges.append('%s' % start)
+        else:
+            ranges.append('%s%s%s' % (start, dash, end))
+        start = end = year
+    assert start == 0 and end == 0, (start, end)
+    return join.join(ranges)
+
+
+def insert_entries(
+        filename,
+        all_entries,
+        no_entries,
+        domain_extra,
+        split_re,
+        normalize_name,
+        format_f):
+    """Update file with contributor information.
+    all_entries: list of tuples with year and name
+    no_entries: set of names or name and year tuples to ignore
+    domain_extra: map domain name to extra credit name
+    split_re: regexp matching the part of file to rewrite
+    normalize_name: function to normalize names for grouping and display
+    format_f: function formatting year list and name to a string
+    """
+    name_years = defaultdict(set)
+
+    for year, name in all_entries:
+        if name in no_entries or (name, year) in no_entries:
+            continue
+        domain = name.split('@', 1)[-1].rstrip('>')
+        if domain in domain_extra:
+            name_years[domain_extra[domain]].add(year)
+        name_years[normalize_name(name)].add(year)
+
+    l = [(list(sorted(year for year in years if year)), name)
+         for name, years in name_years.items()]
+    l.sort(key=sortkey)
+
+    with file(filename) as f:
+        pre, post = re.split(split_re, f.read())
+
+    with file(filename, 'w') as f:
+        f.write(pre +
+                ''.join(format_f(years, name) for years, name in l) +
+                post)
+
+
+def main():
+    repo_entries = [
+        (year, name_fixes.get(name) or name_fixes.get(name.rsplit('<', 1)[0].strip()) or name)
+        for year, name in
+        (line.strip().split(' ', 1)
+         for line in os.popen("""hg log -r '::.' -T '{date(date,"%Y")} {author}\n'""").readlines())
+        ]
+
+    insert_entries(
+        filename='kallithea/templates/about.html',
+        all_entries=repo_entries + other_about,
+        no_entries=no_about,
+        domain_extra=domain_extra,
+        split_re=r'(?:  <li>Copyright &copy; [^\n]*</li>\n)*',
+        normalize_name=lambda name: name.split('<', 1)[0].strip(),
+        format_f=lambda years, name: '  <li>Copyright &copy; %s, %s</li>\n' % (nice_years(years, '&ndash;', ', '), name),
+        )
+
+    insert_entries(
+        filename='CONTRIBUTORS',
+        all_entries=repo_entries + other_contributors,
+        no_entries=total_ignore,
+        domain_extra=domain_extra,
+        split_re=r'(?:    [^\n]*\n)*',
+        normalize_name=lambda name: name,
+        format_f=lambda years, name: ('    %s%s%s\n' % (name, ' ' if years else '', nice_years(years))),
+        )
+
+    insert_entries(
+        filename='kallithea/templates/base/base.html',
+        all_entries=repo_entries,
+        no_entries=total_ignore,
+        domain_extra={},
+        split_re=r'(?<=&copy;) .* (?=by various authors)',
+        normalize_name=lambda name: '',
+        format_f=lambda years, name: ' ' + nice_years(years, '&ndash;', ', ') + ' ',
+        )
+
+
+if __name__ == '__main__':
+    main()
+
+
+# To list new contributors since last tagging:
+# { hg log -r '::tagged()' -T '    {author}\n    {author}\n'; hg log -r '::.' -T '    {author}\n' | sort | uniq; } | sort | uniq -u