Merge branch 'master' of wking.cfbe
authorChris Ball <cjb@laptop.org>
Fri, 25 Jun 2010 02:48:15 +0000 (22:48 -0400)
committerChris Ball <cjb@laptop.org>
Fri, 25 Jun 2010 02:48:15 +0000 (22:48 -0400)
Pull .be/ directory from cfbe.

Conflicts:
update_copyright.py

1  2 
update_copyright.py

index a600eac7e68455bb9426837137f18ec8a6b22785,c2c7322fdb0d6b513e37ab8354028bc1aab5e26e..2490ba975291cb900b46be6487a4446489f1b71f
@@@ -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 <http://www.gnu.org/licenses/>.
- """.strip()
- COPY_RIGHT_TAG='-xyz-COPY' + '-RIGHT-zyx-' # unlikely to occur in the wild :p
- # Convert author names to canonical forms.
- # ALIASES[<canonical name>] = <list of aliases>
- # for example,
- # ALIASES = {
- #     'John Doe <jdoe@a.com>':
- #         ['John Doe', 'jdoe', 'J. Doe <j@doe.net>'],
- #     }
- # Git-based projects are encouraged to use .mailmap instead of
- # ALIASES.  See git-shortlog(1) for details.
- ALIASES = {
-     'Aaron Bentley <abentley@panoramicfeedback.com>':
-         ['Aaron Bentley <aaron.bentley@utoronto.ca>'],
-     'Panometrics, Inc.':
-         ['Aaron Bentley and Panometrics, Inc.'],
-     'Ben Finney <benf@cybersource.com.au>':
-         ['Ben Finney <ben+python@benfinney.id.au>',
-          'John Doe <jdoe@example.com>'],
-     'Chris Ball <cjb@laptop.org>':
-         ['Chris Ball <cjb@thunk.printf.net>'],
-     'Gianluca Montecchi <gian@grys.it>':
-         ['gian <gian@li82-39>',
-          'gianluca <gian@galactica>'],
-     'W. Trevor King <wking@drexel.edu>':
-         ['wking <wking@mjolnir>',
-          'wking <wking@thialfi>'],
-     None:
-         ['j^ <j@oil21.org>'],
-     }
- # 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[<path tuple>] = [<missing authors]
- # for example, if John Doe contributed to module.py but wasn't listed
- # in the VCS history of that file:
- # AUTHOR_HACKS = {
- #     ('path', 'to', 'module.py'):['John Doe'],
- #     }
- AUTHOR_HACKS = {}
- # Work around missing year holes in the VCS history.
- # YEAR_HACKS[<path tuple>] = <original year>
- # 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 email>
-         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 <benf@cybersource.com.au>',
+      'Ben Finney <ben+python@benfinney.id.au>',
+      'John Doe <jdoe@example.com>'],
+     ['Chris Ball <cjb@laptop.org>',
 -     'Chris Ball <cjb@t60>',
+      'Chris Ball <cjb@thunk.printf.net>'],
+     ['Gianluca Montecchi <gian@grys.it>',
+      'gian <gian@li82-39>',
+      'gianluca <gian@galactica>'],
+     ['W. Trevor King <wking@drexel.edu>',
 -     'wking <wking@mjolnir>',
 -     'wking <wking@thialfi>'],
++     'wking <wking@mjolnir>'],
+     [None,
+      'j^ <j@oil21.org>'],
+     ]
+ COPYRIGHT_ALIASES = [
+     ['Aaron Bentley and Panometrics, Inc.',
+      'Aaron Bentley <abentley@panoramicfeedback.com>'],
+     ]
+ EXCLUDES = [
+     ['Aaron Bentley and Panometrics, Inc.',
+      'Aaron Bentley <aaron.bentley@utoronto.ca>',]
+     ]
+ 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 <jdoe@a.com>')
      ['J Doe']
      >>> _strip_email('J Doe <jdoe@a.com>', 'JJJ Smith <jjjs@a.com>')