X-Git-Url: http://git.tremily.us/?p=update-copyright.git;a=blobdiff_plain;f=update_copyright.py;h=37f4ba5fa841cf234a3b35d30dcd71d6149503bd;hp=f4e39dfcbbfe226b43c97679bde290e0306af192;hb=60456481fe446c4ed2c1fa23ff65cc242952f410;hpb=82deee063ae32d4b12df66e8418c6b21479de6a9 diff --git a/update_copyright.py b/update_copyright.py index f4e39df..37f4ba5 100755 --- a/update_copyright.py +++ b/update_copyright.py @@ -1,6 +1,22 @@ #!/usr/bin/python # -# Copyright +# Copyright (C) 2010 W. Trevor King +# +# This file is part of Hooke. +# +# Hooke is free software: you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation, either +# version 3 of the License, or (at your option) any later version. +# +# Hooke is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with Hooke. If not, see +# . """Automatically update copyright boilerplate. @@ -50,21 +66,78 @@ License along with %(project)s. If not, see COPY_RIGHT_TAG='-xyz-COPY' + '-RIGHT-zyx-' # unlikely to occur in the wild :p ALIASES = { + 'A. Seeholzer': + ['A. Seeholzer'], 'Alberto Gomez-Casado': ['albertogomcas'], 'Massimo Sandal ': - ['devicerandom', + ['Massimo Sandal', + 'devicerandom', 'unknown'], - 'Fabrizio Benedetti':['fabrizio.benedetti'], - 'il':['illysam'], - 'Marco Brucale':['marcobrucale'], - 'pp':['pancaldi.paolo'], + 'Fabrizio Benedetti': + ['fabrizio.benedetti.82'], + 'Richard Naud ': + ['Richard Naud'], + 'Rolf Schmidt ': + ['Rolf Schmidt', + 'illysam'], + 'Marco Brucale': + ['marcobrucale'], + 'Pancaldi Paolo': + ['pancaldi.paolo'], } -IGNORED_PATHS = ['./.hg/', './doc/img', './test/data/', - './build/', '/doc/build/'] +IGNORED_PATHS = ['./.hg/', './doc/img/', './test/data/', + './build/', './doc/build/'] IGNORED_FILES = ['COPYING', 'COPYING.LESSER'] +# Work around missing author holes in the VCS history +AUTHOR_HACKS = { + ('hooke','driver','hdf5.py'):['Massimo Sandal'], + ('hooke','driver','mcs.py'):['Allen Chen'], + ('hooke','driver','mfp3d.py'):['A. Seeholzer','Richard Naud','Rolf Schmidt', + 'Alberto Gomez-Casado'], + ('hooke','util','peak.py'):['Fabrizio Benedetti'], + ('hooke','plugin','showconvoluted.py'):['Rolf Schmidt'], + ('hooke','ui','gui','formatter.py'):['Francesco Musiani','Massimo Sandal'], + ('hooke','ui','gui','prettyformat.py'):['Rolf Schmidt'], + } + +# Work around missing year holes in the VCS history +YEAR_HACKS = { + ('hooke','driver','hdf5.py'):2009, + ('hooke','driver','mfp3d.py'):2008, + ('hooke','driver','picoforce.py'):2006, + ('hooke','driver','picoforcealt.py'):2006, + ('hooke','util','peak.py'):2007, + ('hooke','plugin','showconvoluted.py'):2009, + ('hooke','plugin','tutorial.py'):2007, + ('hooke','ui','gui','formatter.py'):2006, + ('hooke','ui','gui','prettyformat.py'):2009, + } + +# Helpers for VCS-specific commands + +def splitpath(path): + """Recursively split a path into elements. + + Examples + -------- + + >>> splitpath(os.path.join('a', 'b', 'c')) + ('a', 'b', 'c') + >>> splitpath(os.path.join('.', 'a', 'b', 'c')) + ('a', 'b', 'c') + """ + path = os.path.normpath(path) + elements = [] + while True: + dirname,basename = os.path.split(path) + elements.insert(0,basename) + if dirname in ['', '.']: + break + path = dirname + return tuple(elements) # VCS-specific commands @@ -85,25 +158,33 @@ def mercurial_cmd(*args): return (tmp_stdout.getvalue().rstrip('\n'), tmp_stderr.getvalue().rstrip('\n')) -def original_year(filename): +def original_year(filename, year_hacks=YEAR_HACKS): # shortdate filter: YEAR-MONTH-DAY output,error = mercurial_cmd('log', '--follow', '--template', '{date|shortdate}\n', filename) years = [int(line.split('-', 1)[0]) for line in output.splitlines()] + if splitpath(filename) in year_hacks: + years.append(year_hacks[splitpath(filename)]) years.sort() return years[0] -def authors(filename): +def authors(filename, author_hacks=AUTHOR_HACKS): output,error = mercurial_cmd('log', '--follow', '--template', '{author}\n', filename) - return list(set(output.splitlines())) + ret = list(set(output.splitlines())) + if splitpath(filename) in author_hacks: + ret.extend(author_hacks[splitpath(filename)]) + return ret -def authors_list(): +def authors_list(author_hacks=AUTHOR_HACKS): output,error = mercurial_cmd('log', '--follow', '--template', '{author}\n') - return list(set(output.splitlines())) + ret = list(set(output.splitlines())) + for path,authors in author_hacks.items(): + ret.extend(authors) + return ret def is_versioned(filename): output,error = mercurial_cmd('log', '--follow', @@ -354,9 +435,11 @@ def _set_contents(filename, contents, original_contents=None, dry_run=False, # Update commands def update_authors(authors_fn=authors_list, dry_run=False, verbose=0): + authors = authors_fn() + authors = _replace_aliases(authors, with_email=True, aliases=ALIASES) new_contents = '%s was written by:\n%s\n' % ( PROJECT_INFO['project'], - '\n'.join(authors_fn()) + '\n'.join(authors) ) _set_contents('AUTHORS', new_contents, dry_run=dry_run, verbose=verbose)