From: Chris Ball Date: Fri, 25 Jun 2010 02:48:15 +0000 (-0400) Subject: Merge branch 'master' of wking.cfbe X-Git-Tag: 1.0.0~53 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=6da12060ee520bb876c2dd8d2bdb9f7c01443f22;p=be.git Merge branch 'master' of wking.cfbe Pull .be/ directory from cfbe. Conflicts: update_copyright.py --- 6da12060ee520bb876c2dd8d2bdb9f7c01443f22 diff --cc update_copyright.py index a600eac,c2c7322..2490ba9 --- a/update_copyright.py +++ b/update_copyright.py @@@ -34,319 -21,61 +21,59 @@@ import r import sys import time + import os + import sys + import select + from threading import Thread - PROJECT_INFO = { - 'project': 'Bugs Everywhere', - 'vcs': 'Git', - } - - # Break "copyright" into "copy" and "right" to avoid matching the - # REGEXP. - COPY_RIGHT_TEXT=""" - This file is part of %(project)s. - - %(project)s is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 2 of the License, or (at your - option) any later version. - - %(project)s 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with %(project)s. If not, see . - """.strip() - - COPY_RIGHT_TAG='-xyz-COPY' + '-RIGHT-zyx-' # unlikely to occur in the wild :p - - # Convert author names to canonical forms. - # ALIASES[] = - # for example, - # ALIASES = { - # 'John Doe ': - # ['John Doe', 'jdoe', 'J. Doe '], - # } - # Git-based projects are encouraged to use .mailmap instead of - # ALIASES. See git-shortlog(1) for details. - ALIASES = { - 'Aaron Bentley ': - ['Aaron Bentley '], - 'Panometrics, Inc.': - ['Aaron Bentley and Panometrics, Inc.'], - 'Ben Finney ': - ['Ben Finney ', - 'John Doe '], - 'Chris Ball ': - ['Chris Ball '], - 'Gianluca Montecchi ': - ['gian ', - 'gianluca '], - 'W. Trevor King ': - ['wking ', - 'wking '], - None: - ['j^ '], - } - - # List of paths that should not be scanned for copyright updates. - # IGNORED_PATHS = ['./.git/'] - IGNORED_PATHS = ['./.be/', './.git/', './build/', './doc/.build/'] - # List of files that should not be scanned for copyright updates. - # IGNORED_FILES = ['COPYING'] - IGNORED_FILES = ['COPYING', 'catmutt'] - - # Work around missing author holes in the VCS history. - # AUTHOR_HACKS[] = [] = - # for example, if module.py was published in 2008 but the VCS history - # only goes back to 2010: - # YEAR_HACKS = { - # ('path', 'to', 'module.py'):2008, - # } - YEAR_HACKS = {} - - # 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 - - if PROJECT_INFO['vcs'] == 'Git': - - import subprocess - - _MSWINDOWS = sys.platform == 'win32' - _POSIX = not _MSWINDOWS - - def invoke(args, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, expect=(0,)): - """ - expect should be a tuple of allowed exit codes. - """ - try : - if _POSIX: - q = subprocess.Popen(args, stdin=subprocess.PIPE, - stdout=stdout, stderr=stderr) - else: - assert _MSWINDOWS == True, 'invalid platform' - # win32 don't have os.execvp() so run the command in a shell - q = subprocess.Popen(args, stdin=subprocess.PIPE, - stdout=stdout, stderr=stderr, shell=True) - except OSError, e: - raise ValueError([args, e]) - stdout,stderr = q.communicate(input=stdin) - status = q.wait() - if status not in expect: - raise ValueError([args, status, stdout, stderr]) - return status, stdout, stderr - - def git_cmd(*args): - status,stdout,stderr = invoke(['git'] + list(args)) - return stdout.rstrip('\n') - - version = git_cmd('--version').split(' ')[-1] - if version.startswith('1.5.'): - # Author name - author_format = '--pretty=format:%an <%ae>' - year_format = ['--pretty=format:%ai'] # Author date - # YYYY-MM-DD HH:MM:SS Z - # Earlier versions of Git don't seem to recognize --date=short - else: - author_format = '--pretty=format:%aN <%aE>' - year_format = ['--pretty=format:%ad', # Author date - '--date=short'] # YYYY-MM-DD - - def original_year(filename, year_hacks=YEAR_HACKS): - output = git_cmd(*(['log', '--follow'] - + year_format - + [filename])) - if version.startswith('1.5.'): - output = '\n'.join([x.split()[0] for x in output.splitlines()]) - 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, author_hacks=AUTHOR_HACKS): - output = git_cmd('log', '--follow', author_format, - filename) - ret = list(set(output.splitlines())) - if splitpath(filename) in author_hacks: - ret.extend(author_hacks[splitpath(filename)]) - return ret - - def authors_list(author_hacks=AUTHOR_HACKS): - output = git_cmd('log', author_format) - ret = list(set(output.splitlines())) - for path,authors in author_hacks.items(): - ret.extend(authors) - return ret - - def is_versioned(filename): - output = git_cmd('log', '--follow', filename) - if len(output) == 0: - return False - return True - - elif PROJECT_INFO['vcs'] == 'Mercurial': - - import StringIO - import mercurial - import mercurial.dispatch - - def mercurial_cmd(*args): - cwd = os.getcwd() - stdout = sys.stdout - stderr = sys.stderr - tmp_stdout = StringIO.StringIO() - tmp_stderr = StringIO.StringIO() - sys.stdout = tmp_stdout - sys.stderr = tmp_stderr - try: - mercurial.dispatch.dispatch(list(args)) - finally: - os.chdir(cwd) - sys.stdout = stdout - sys.stderr = stderr - return (tmp_stdout.getvalue().rstrip('\n'), - tmp_stderr.getvalue().rstrip('\n')) - - 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, author_hacks=AUTHOR_HACKS): - output,error = mercurial_cmd('log', '--follow', - '--template', '{author}\n', - filename) - ret = list(set(output.splitlines())) - if splitpath(filename) in author_hacks: - ret.extend(author_hacks[splitpath(filename)]) - return ret - - def authors_list(author_hacks=AUTHOR_HACKS): - output,error = mercurial_cmd('log', '--template', '{author}\n') - 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', filename) - if len(error) > 0: - return False - return True - - elif PROJECT_INFO['vcs'] == 'Bazaar': - - import StringIO - import bzrlib - import bzrlib.builtins - import bzrlib.log - - class LogFormatter (bzrlib.log.LogFormatter): - supports_merge_revisions = True - preferred_levels = 0 - supports_deta = False - supports_tags = False - supports_diff = False - - def log_revision(self, revision): - raise NotImplementedError - - class YearLogFormatter (LogFormatter): - def log_revision(self, revision): - self.to_file.write( - time.strftime('%Y', time.gmtime(revision.rev.timestamp)) - +'\n') - - class AuthorLogFormatter (LogFormatter): - def log_revision(self, revision): - authors = revision.rev.get_apparent_authors() - self.to_file.write('\n'.join(authors)+'\n') - - def original_year(filename, year_hacks=YEAR_HACKS): - cmd = bzrlib.builtins.cmd_log() - cmd.outf = StringIO.StringIO() - cmd.run(file_list=[filename], log_format=YearLogFormatter, levels=0) - years = [int(year) for year in set(cmd.outf.getvalue().splitlines())] - if splitpath(filename) in year_hacks: - years.append(year_hacks[splitpath(filename)]) - years.sort() - return years[0] - - def authors(filename, author_hacks=AUTHOR_HACKS): - cmd = bzrlib.builtins.cmd_log() - cmd.outf = StringIO.StringIO() - cmd.run(file_list=[filename], log_format=AuthorLogFormatter, levels=0) - ret = list(set(cmd.outf.getvalue().splitlines())) - if splitpath(filename) in author_hacks: - ret.extend(author_hacks[splitpath(filename)]) - return ret - - def authors_list(author_hacks=AUTHOR_HACKS): - cmd = bzrlib.builtins.cmd_log() - cmd.outf = StringIO.StringIO() - cmd.run(log_format=AuthorLogFormatter, levels=0) - output = cmd.outf.getvalue() - ret = list(set(cmd.outf.getvalue().splitlines())) - for path,authors in author_hacks.items(): - ret.extend(authors) - return ret - - def is_versioned(filename): - cmd = bzrlib.builtins.cmd_log() - cmd.outf = StringIO.StringIO() - cmd.run(file_list=[filename]) - return True - - else: - raise NotImplementedError('Unrecognized VCS: %(vcs)s' % PROJECT_INFO) + from libbe.util.subproc import Pipe - # General utility commands + COPYRIGHT_TEXT="""# + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2 of the License, or + # (at your option) any later version. + # + # This program 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 General Public License for more details. + # + # You should have received a copy of the GNU General Public License along + # with this program; if not, write to the Free Software Foundation, Inc., + # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.""" + + COPYRIGHT_TAG='-xyz-COPYRIGHT-zyx-' # unlikely to occur in the wild :p + + ALIASES = [ + ['Ben Finney ', + 'Ben Finney ', + 'John Doe '], + ['Chris Ball ', - 'Chris Ball ', + 'Chris Ball '], + ['Gianluca Montecchi ', + 'gian ', + 'gianluca '], + ['W. Trevor King ', - 'wking ', - 'wking '], ++ 'wking '], + [None, + 'j^ '], + ] + COPYRIGHT_ALIASES = [ + ['Aaron Bentley and Panometrics, Inc.', + 'Aaron Bentley '], + ] + EXCLUDES = [ + ['Aaron Bentley and Panometrics, Inc.', + 'Aaron Bentley ',] + ] + + + IGNORED_PATHS = ['./.be/', './.bzr/', './build/'] + IGNORED_FILES = ['COPYING', 'update_copyright.py', 'catmutt'] def _strip_email(*args): - """Remove email addresses from a series of names. - - Examples - -------- - + """ >>> _strip_email('J Doe ') ['J Doe'] >>> _strip_email('J Doe ', 'JJJ Smith ')