Reflect move of extension to https://hg.mozilla.org/hgcustom/version-control-tools/
authorGregory Szorc <gps@mozilla.com>
Wed, 05 Feb 2014 18:50:07 -0800
changeset 94 a62e2b9c9064
parent 93 ad8791a58e6e
child 95 96df46ab6a4f
push id68
push usergszorc@mozilla.com
push date2014-02-06 02:50 +0000
Reflect move of extension to https://hg.mozilla.org/hgcustom/version-control-tools/
__init__.py
flake8/CHANGES.rst
flake8/CONTRIBUTORS.txt
flake8/LICENSE
flake8/MANIFEST.in
flake8/PKG-INFO
flake8/README.rst
flake8/flake8.egg-info/PKG-INFO
flake8/flake8.egg-info/SOURCES.txt
flake8/flake8.egg-info/dependency_links.txt
flake8/flake8.egg-info/entry_points.txt
flake8/flake8.egg-info/requires.txt
flake8/flake8.egg-info/top_level.txt
flake8/flake8/__init__.py
flake8/flake8/_pyflakes.py
flake8/flake8/engine.py
flake8/flake8/hooks.py
flake8/flake8/main.py
flake8/flake8/run.py
flake8/flake8/tests/__init__.py
flake8/flake8/tests/test_flakes.py
flake8/flake8/util.py
flake8/scripts/flake8.cmd
flake8/setup.cfg
flake8/setup.py
mccabe/PKG-INFO
mccabe/README.rst
mccabe/mccabe.egg-info/PKG-INFO
mccabe/mccabe.egg-info/SOURCES.txt
mccabe/mccabe.egg-info/dependency_links.txt
mccabe/mccabe.egg-info/entry_points.txt
mccabe/mccabe.egg-info/not-zip-safe
mccabe/mccabe.egg-info/top_level.txt
mccabe/mccabe.py
mccabe/setup.cfg
mccabe/setup.py
mozautomation/__init__.py
mozautomation/bugzilla.py
mozautomation/buildbotdata.py
mozautomation/buildstatus.py
mozautomation/changetracker.py
mozautomation/commitparser.py
mozautomation/firefoxprofile.py
mozautomation/releases.py
mozautomation/repository.py
mozautomation/selfserve.py
mozautomation/treestatus.py
pep8/CHANGES.txt
pep8/MANIFEST.in
pep8/PKG-INFO
pep8/README.rst
pep8/docs/Makefile
pep8/docs/advanced.rst
pep8/docs/api.rst
pep8/docs/conf.py
pep8/docs/developer.rst
pep8/docs/index.rst
pep8/docs/intro.rst
pep8/docs/make.bat
pep8/pep8.egg-info/PKG-INFO
pep8/pep8.egg-info/SOURCES.txt
pep8/pep8.egg-info/dependency_links.txt
pep8/pep8.egg-info/entry_points.txt
pep8/pep8.egg-info/namespace_packages.txt
pep8/pep8.egg-info/not-zip-safe
pep8/pep8.egg-info/top_level.txt
pep8/pep8.py
pep8/setup.cfg
pep8/setup.py
pep8/testsuite/E10.py
pep8/testsuite/E11.py
pep8/testsuite/E12.py
pep8/testsuite/E12not.py
pep8/testsuite/E20.py
pep8/testsuite/E21.py
pep8/testsuite/E22.py
pep8/testsuite/E23.py
pep8/testsuite/E24.py
pep8/testsuite/E25.py
pep8/testsuite/E26.py
pep8/testsuite/E27.py
pep8/testsuite/E30.py
pep8/testsuite/E30not.py
pep8/testsuite/E40.py
pep8/testsuite/E50.py
pep8/testsuite/E70.py
pep8/testsuite/E71.py
pep8/testsuite/E72.py
pep8/testsuite/E90.py
pep8/testsuite/W19.py
pep8/testsuite/W29.py
pep8/testsuite/W39.py
pep8/testsuite/W60.py
pep8/testsuite/__init__.py
pep8/testsuite/latin-1.py
pep8/testsuite/noqa.py
pep8/testsuite/python3.py
pep8/testsuite/support.py
pep8/testsuite/test_all.py
pep8/testsuite/test_api.py
pep8/testsuite/test_shell.py
pep8/testsuite/utf-8-bom.py
pep8/testsuite/utf-8.py
pyflakes/AUTHORS
pyflakes/LICENSE
pyflakes/MANIFEST.in
pyflakes/NEWS.txt
pyflakes/PKG-INFO
pyflakes/README.rst
pyflakes/bin/pyflakes
pyflakes/pyflakes.egg-info/PKG-INFO
pyflakes/pyflakes.egg-info/SOURCES.txt
pyflakes/pyflakes.egg-info/dependency_links.txt
pyflakes/pyflakes.egg-info/entry_points.txt
pyflakes/pyflakes.egg-info/top_level.txt
pyflakes/pyflakes/__init__.py
pyflakes/pyflakes/__main__.py
pyflakes/pyflakes/api.py
pyflakes/pyflakes/checker.py
pyflakes/pyflakes/messages.py
pyflakes/pyflakes/reporter.py
pyflakes/pyflakes/scripts/__init__.py
pyflakes/pyflakes/scripts/pyflakes.py
pyflakes/pyflakes/test/__init__.py
pyflakes/pyflakes/test/harness.py
pyflakes/pyflakes/test/test_api.py
pyflakes/pyflakes/test/test_doctests.py
pyflakes/pyflakes/test/test_imports.py
pyflakes/pyflakes/test/test_other.py
pyflakes/pyflakes/test/test_undefined_names.py
pyflakes/setup.cfg
pyflakes/setup.py
--- a/__init__.py
+++ b/__init__.py
@@ -1,1514 +1,19 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
 """make Mozilla contributors more productive
 
 This extension adds Mozilla-centric commands and functionality to Mercurial
 to enable contributors to Firefox and related applications to be more
 productive.
-
-Included are commands that interface with Mozilla's automation infrastructure.
-These allow developers to quickly check the status of repositories and builds
-without having to leave the comfort of the terminal.
-
-Known Mozilla Repositories
-==========================
-
-This extension teaches Mercurial about known Mozilla repositories.
-
-Each main mozilla-central clone is given a common name. e.g. "mozilla-central"
-becomes "central" and "mozilla-inbound" becomes "inbound." In addition,
-repositories have short aliases to quickly refer to them. e.g.
-"mozilla-central" is can be references by "m-c" or "mc."
-
-The mechanism to resolve a repository string to a repository instance is
-supplemented with these known aliases. For example, to pull from
-mozilla-central, you can simply run `hg pull central`. There is no need to set
-up the [paths] section in your hgrc!
-
-To view the list of known repository aliases, run `hg moztrees`.
-
-Unified Repositories
-====================
-
-Gecko code is developed in parallel across a number of repositories that are
-cloned from the canonical repository, mozilla-central. Seasoned developers
-typically interact with multiple repositories.
-
-This extension provides mechanisms to create and maintain a single Mercurial
-repository that contains changesets from multiple "upstream" repositories.
-
-The recommended method to create a unified repository is to run `hg
-cloneunified`. This will pull changesets from all major release branches and
-mozilla-inbound.
-
-Once you have a unified repository, you can pull changesets from repositories
-by using `hg pull`, likely by specifying one of the tree aliases (see `hg
-moztrees`).
-
-One needs to be careful when pushing changesets when operating a unified
-repository. By default, `hg push` will attempt to push all local changesets not
-in a remote. This is obviously not desired (you wouldn't want to push
-mozilla-central to mozilla-beta)! Instead, you'll want to limit outgoing
-changesets to a specific head or revision. You can specify `hg push -r REV`.
-Or, for your convenience, the `hg pushtree` is made available. By default, this
-command will push the current "tip" revision to the tree specified. e.g. if you
-have patches on the current tip that need to land in inbound, you can run
-`hg pushtree inbound`.
-
-You can also get creative and push a "remote tracking revision" to another
-repository. e.g. `hg pushtree -r central/default inbound`.
-
-Remote References
-=================
-
-When pulling from known Gecko repositories, this extension automatically
-creates references to branches on the remote. These can be referenced via
-the revision <tree>/<name>. e.g. 'central/default'.
-
-Remote refs are read-only and are updated automatically during repository pull
-and push operations.
-
-This feature is similar to Git remote refs.
-
-If the config bool ``refs_as_bookmarks`` is True, remote references will be
-stored in the repo's bookmarks file. This is useful for hosted unified
-repositories.
-
-Static Analysis
-===============
-
-This extension provides static analysis to patches. Currently, only Python
-style checking is performed.
-
-To perform style checking for a single patch, run `hg critic`. By default,
-this will analyze the current working directory. If the working directory is
-clean, the tip changeset will be analyzed. By default, only changed lines are
-reported on.
-
-Static analysis is also performed automatically during qrefresh and commit
-operations. To disable this behavior, add "noautocritic = True" to the
-[mozext] section in your hgrc.
-
-Pushlog Data
-============
-
-This extension supports downloading pushlog data from Mozilla's repositories.
-Pushlog data records who pushed changesets where and when.
-
-To use this functionality, you'll need to sync pushlog data from the server to
-the local machine. This facilitates rapid data lookup and can be done by
-running `hg pushlogsync`.
-
-Once pushlog data is synced, you can use `hg changesetpushes` to look up push
-information for a specific changeset.
-
-Bug Info
-========
-
-Information about bugs is extracted from commit messages as changesets are
-introduced into the repository. You can look up information about specific
-bugs via `hg buginfo`.
-
-Revisions Sets
-==============
-
-This extension adds the following revision set selectors functions.
-
-bug(BUG)
-   Retreive changesets that reference a specific bug. e.g. ``bug(784841)``.
-
-dontbuild()
-   Retrieve changesets that are marked as DONTBUILD.
-
-me()
-   Retrieve changesets that you are involved with.
-
-   This retrieves changesets you authored (via ui.username) as well as
-   changesets you reviewed (via mozext.ircnick).
-
-nobug()
-   Retrieve changesets that don't reference a bug in the commit message.
-
-pushhead([TREE])
-   Retrieve changesets that are push heads.
-
-firstpushdate(DATE)
-   Retrieve changesets that were first pushed according to the date spec.
-
-firstpushtree(TREE)
-   Retrieve changesets that initially landed on the specified tree.
-
-pushdate(DATE)
-   Retrieve changesets that were pushed according to the date spec.
-
-reviewer(REVIEWER)
-   Retrieve changesets there were reviewed by the specified person.
-
-   The reviewer string matches the *r=* string specified in the commit. In
-   the future, we may consult a database of known aliases, etc.
-
-reviewed()
-   Retrieve changesets that have a reviewer marked.
-
-tree(TREE)
-   Retrieve changesets that are currently in the specified tree.
-
-   Trees are specified with a known alias. e.g. ``tree(central)``.
-
-   It's possible to see which changesets are in some tree but not others.
-   e.g. to find changesets in *inbound* that haven't merged to *central*
-   yet, do ``tree(inbound) - tree(central)``.
-
-Templates
-=========
-
-This extension provides keywords that can used with templates.
-
-bug
-   The bug primarily associated with a changeset.
-
-bugs
-   All the bugs associated with a changeset.
-
-firstrelease
-   The version number of the first release channel release a changeset
-   was present in.
-
-firstbeta
-   The version number of the first beta channel release a changeset was
-   present in.
-
-firstaurora
-   The version number of the first aurora channel release a changeset was
-   present in.
-
-firstnightly
-   The version number of the first nightly channel release a changeset was
-   present in.
-
-auroradate
-   The date of the first Aurora a changeset was likely present in.
-
-   This value may not be accurate. The value is currently obtained by
-   querying the pushlog data to see when a changeset was pushed to this
-   channel. The date of the next Aurora is then calculated from that
-   (essentially looking for the next early morning Pacific time day).
-   Aurora releases are not always consistent. A more robust method of
-   calculation involves grabbing information from release engineering
-   servers.
-
-nightlydate
-   The date of the first Nightly a changeset was likely present in.
-
-   See auroradate for accuracy information.
-
-firstpushuser
-   The username of the first person who pushed this changeset.
-
-firstpushtree
-   The name of the first tree this changeset was pushed to.
-
-firstpushtbpl
-   The URL of the TBPL results for the first push of this changeset.
-
-firstpushdate
-   The date of the first push of this changeset.
-
-pushdates
-   The list of dates a changeset was pushed.
-
-pushheaddates
-   The list of dates a changeset was pushed as a push head.
-
-trees
-   The list of trees a changeset has landed in.
-
-reltrees
-   The list of release trees a changeset has landed in.
-
-This extension provides the following template functions:
-
-dates(VALUES, [format, [sep]])
-   Format a list of dates.
-
-   If the second argument is defined, the specified date formatting
-   string will be used. Else, it defaults to '%Y-%m-%d'.
-
-   If the third argument is defined, elements will be separated by the
-   specified string. Else, ',' is used.
-
-Config Options
-==============
-
-This extension consults the following config options.
-
-mozext.headless
-   Indicates that this extension is running in *headless* mode. *headless*
-   mode is intended for server operation, not local development.
-
-mozext.ircnick
-   Your Mozilla IRC nickname. This string value will be used to look for
-   your reviews and patches.
-
-mozext.noautocritic
-   When this boolean flag is true, the code critic hook will not run
-   during commit and qrefresh operations.
-
-mozext.critic_merges
-   When this boolean flag is true, the code critic hook will run on merges.
-   By default, the hook does not run on merges.
-
-mozext.disable_local_database
-   When this boolean flag is true, the local SQLite database indexing
-   useful lookups (such as bugs and pushlog info) is not enabled.
-
-mozext.reject_pushes_with_repo_names
-   This boolean is used to enable a ``prepushkey`` hook that prevents
-   pushes to keys (bookmarks, tags, etc) whose name is prefixed with that
-   of an official Mozilla repository.
-
-   This hook is useful for servers exposing a monolithic repository where
-   each separate Mozilla repository is exposed through bookmarks and where
-   the server does not want to allow external users from changing the
-   *canonical* refs.
-
-   For example, with this flag set, pushes to bookmarks ``central/default``
-   and ``inbound/foobar`` will be rejected because they begin with the names
-   of official Mozilla repositories. However, pushes to the bookmark
-   ``gps/test`` will be allowed.
-
-mozext.refs_as_bookmarks
-   If enabled, this boolean flag will cause remote keys to be added to
-   the local repository's bookmarks during push and pull operations. This
-   is most useful on servers, as remote keys/refs are typically only
-   created dynamically at run-time via a mechanism independent of
-   bookmarks.
 """
 
-import calendar
-import datetime
-import errno
-import os
-import shutil
-import sys
-
-from operator import methodcaller
-
-from mercurial import (
-    revset,
-    templatefilters,
-    templatekw,
-    templater,
-)
-
-from mercurial.i18n import _
-from mercurial.commands import (
-    push,
-)
-from mercurial.error import (
-    ParseError,
-    RepoError,
-)
-from mercurial.localrepo import (
-    repofilecache,
-)
-from mercurial.node import (
-    hex,
-)
-from mercurial import (
-    commands,
-    cmdutil,
-    demandimport,
-    encoding,
-    extensions,
-    hg,
-    scmutil,
-    util,
-)
-
-from mozautomation.changetracker import (
-    ChangeTracker,
-)
-
-from mozautomation.commitparser import (
-    parse_bugs,
-    parse_reviewers,
-)
-
-from mozautomation.repository import (
-    MercurialRepository,
-    RELEASE_TREES,
-    REPOS,
-    resolve_trees_to_official,
-    resolve_trees_to_uris,
-    resolve_uri_to_tree,
-    tbpl_url,
-    TREE_ALIASES,
-)
-
-
-bz_available = False
-
-testedwith = '2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2'
-buglink = 'https://bugzilla.mozilla.org/enter_bug.cgi?product=Other%20Applications&component=mozext'
-
-commands.norepo += ' cloneunified moztrees treestatus'
-cmdtable = {}
-command = cmdutil.command(cmdtable)
-
-colortable = {
-    'buildstatus.success': 'green',
-    'buildstatus.failed': 'red',
-    'buildstatus.testfailed': 'cyan',
-}
-
-
-# Override peer path lookup such that common names magically get resolved to
-# known URIs.
-old_peerorrepo = hg._peerorrepo
-
-
-def peerorrepo(ui, path, *args, **kwargs):
-    # Always try the old mechanism first. That way if there is a local
-    # path that shares the name of a magic remote the local path is accessible.
-    try:
-        return old_peerorrepo(ui, path, *args, **kwargs)
-    except RepoError:
-        tree, uri = resolve_trees_to_uris([path])[0]
-
-        if not uri:
-            raise
-
-        path = uri
-        return old_peerorrepo(ui, path, *args, **kwargs)
-
-hg._peerorrepo = peerorrepo
-
-
-def critique(ui, repo, entire=False, node=None, **kwargs):
-    """Perform a critique of a changeset."""
-    demandimport.disable()
-
-    try:
-        from flake8.engine import get_style_guide
-    except ImportError:
-        our_dir = os.path.dirname(__file__)
-        for p in ('flake8', 'mccabe', 'pep8', 'pyflakes'):
-            sys.path.insert(0, os.path.join(our_dir, p))
-
-    from flake8.engine import get_style_guide
-    from pep8 import DiffReport, parse_udiff
-
-    style = get_style_guide(parse_argv=False, ignore='E128')
-
-    ctx = repo[node]
-
-    if not entire:
-        diff = ''.join(ctx.diff())
-        style.options.selected_lines = {}
-        for k, v in parse_udiff(diff).items():
-            if k.startswith('./'):
-                k = k[2:]
-
-            style.options.selected_lines[k] = v
-
-        style.options.report = DiffReport(style.options)
-
-    deleted = repo.status(ctx.p1().node(), ctx.node())[2]
-    files = [f for f in ctx.files() if f.endswith('.py') and f not in deleted]
-    style.check_files(files)
-
-    demandimport.enable()
-
-
-@command('moztrees', [], _('hg moztrees'))
-def moztrees(ui, **opts):
-    """Show information about Mozilla source trees."""
-    longest = max(len(tree) for tree in REPOS.keys())
-    ui.write('%s  %s\n' % (_('Repo').rjust(longest), _('Aliases')))
-
-    for name in sorted(REPOS):
-        aliases = []
-        for alias, targets in TREE_ALIASES.items():
-            if len(targets) > 1:
-                continue
-
-            if targets[0] == name:
-                aliases.append(alias)
-
-        ui.write('%s: %s\n' % (name.rjust(longest),
-            ', '.join(sorted(aliases))))
-
-
-@command('cloneunified', [], _('hg cloneunified [DEST]'))
-def cloneunified(ui, dest='gecko', **opts):
-    """Clone main Mozilla repositories into a unified local repository.
-
-    This command will clone the most common Mozilla repositories and will
-    add changesets and remote tracking markers into a common repository.
-
-    If the destination path is not given, 'gecko' will be used.
-
-    This command is effectively an alias for a number of other commands.
-    However, due to the way Mercurial internally stores data, it is recommended
-    to run this command to ensure optimal storage of data.
-    """
-    path = ui.expandpath(dest)
-    repo = hg.repository(ui, path, create=True)
-
-    success = False
-
-    try:
-        for tree in ('esr17', 'b2g18', 'release', 'beta', 'aurora', 'central',
-            'inbound'):
-            peer = hg.peer(ui, {}, tree)
-            ui.warn('Pulling from %s.\n' % peer.url())
-            repo.pull(peer)
-        res = hg.update(repo, repo.lookup('central/default'))
-        success = True
-        return res
-    finally:
-        if not success:
-            shutil.rmtree(path)
-
-
-@command('pushtree',
-    [('r', 'rev', 'tip', _('revision'), _('REV'))],
-    _('hg pushtree [-r REV] TREE'))
-def pushtree(ui, repo, tree=None, rev=None, **opts):
-    """Push changesets to a Mozilla repository.
-
-    If only the tree argument is defined, we will attempt to push the current
-    tip to the repository specified. This may fail due to pushed mq patches,
-    local changes, etc. Please note we only attempt to push the current tip and
-    it's ancestors, not all changesets not in the remote repository. This is
-    different from the default behavior of |hg push| and is the distinguishing
-    difference from that command.
-
-    If you would like to push a non-active head, specify it with -r REV. For
-    example, if you are currently on mozilla-central but wish to push inbound
-    to mozilla-inbound, run `hg pushtree -r inbound/default inbound`.
-    """
-    if not tree:
-        raise util.Abort(_('A tree must be specified.'))
-
-    tree, uri = resolve_trees_to_uris([tree], write_access=True)[0]
-
-    if not uri:
-        raise util.Abort("Don't know about tree: %s" % tree)
-
-    return push(ui, repo, rev=[rev], dest=uri)
-
-
-@command('treestatus', [], _('hg treestatus [TREE] ...'))
-def treestatus(ui, *trees, **opts):
-    """Show the status of the Mozilla repositories.
-
-    If trees are open, it is OK to land code on them.
-
-    If trees require approval, you'll need to obtain approval from
-    release management to land changes.
-
-    If trees are closed, you shouldn't push unless you are fixing the reason
-    the tree is closed.
-    """
-    from mozautomation.treestatus import TreeStatusClient
-
-    client = TreeStatusClient()
-    status = client.all()
-
-    trees = resolve_trees_to_official(trees)
-
-    if trees:
-        status = {k: status[k] for k in status if k in trees}
-
-    longest = max(len(s) for s in status)
-
-    for tree in sorted(status):
-        s = status[tree]
-        if s.status == 'closed':
-            ui.write('%s: %s (%s)\n' % (tree.rjust(longest), s.status,
-                s.reason))
-        else:
-            ui.write('%s: %s\n' % (tree.rjust(longest), s.status))
-
-
-@command('tbpl', [], _('hg tbpl [TREE] [REV]'))
-def tbpl(ui, repo, tree=None, rev=None, **opts):
-    """Open TBPL showing build status for the specified revision.
-
-    The command receives a tree name and a revision to query. The tree is
-    required because a revision/changeset may existing in multiple
-    repositories.
-    """
-    if not tree:
-        raise util.Abort('A tree must be specified.')
-
-    if not rev:
-        raise util.Abort('A revision must be specified.')
-
-    tree, repo_url = resolve_trees_to_uris([tree])[0]
-    if not repo_url:
-        raise util.Abort("Don't know about tree: %s" % tree)
-
-    r = MercurialRepository(repo_url)
-    node = repo[rev].hex()
-    push = r.push_info_for_changeset(node)
-
-    if not push:
-        raise util.Abort("Could not find push info for changeset %s" % node)
-
-    push_node = push.last_node
-
-    url = tbpl_url(tree, push_node[0:12])
-
-    import webbrowser
-    webbrowser.get('firefox').open(url)
-
-
-@command('critic',
-    [('e', 'entire', False,
-        _('Report on entire file content, not just changed parts'),
-        ''
-    )],
-    _('hg critic [REV]')
-)
-def critic(ui, repo, rev='.', entire=False, **opts):
-    """Perform a critique of changeset(s).
-
-    This will perform static analysis on changeset(s) and report any issues
-    found.
-    """
-    for r in scmutil.revrange(repo, [rev]):
-        critique(ui, repo, node=r, entire=entire, **opts)
-
-
-@command('pushlogsync', [], _('hg pushlogsync'))
-def syncpushinfo(ui, repo, tree=None, **opts):
-    """Synchronize the pushlog information for all known Gecko trees.
-
-    The pushlog info contains who, when, and where individual changesets were
-    pushed.
-
-    After running this command, you can query for push information for specific
-    changesets.
-    """
-    if not repo.changetracker:
-        ui.warn('Local database appears to be disabled.')
-        return 1
-
-    for i, tree in enumerate(sorted(REPOS)):
-        repo.changetracker.load_pushlog(tree)
-        ui.progress('pushlogsync', i, total=len(REPOS))
-
-    ui.progress('pushlogsync', None)
-
-
-def print_changeset_pushes(ui, repo, rev, all=False):
-    if not repo.changetracker:
-        ui.warn('Local database appears to be disabled.')
-        return 1
-
-    ctx = repo[rev]
-    node = ctx.node()
-
-    pushes = repo.changetracker.pushes_for_changeset(node)
-    pushes = [p for p in pushes if all or p[0] in RELEASE_TREES]
-    if not pushes:
-        ui.warn('No pushes recorded for changeset: ', str(ctx), '\n')
-        return 1
-
-    longest_tree = max(len(p[0]) for p in pushes) + 2
-    longest_user = max(len(p[3]) for p in pushes) + 2
-
-    ui.write(ctx.rev(), ':', str(ctx), ' ', ctx.description(), '\n')
-
-    ui.write('Release ', 'Tree'.ljust(longest_tree), 'Date'.ljust(20),
-            'Username'.ljust(longest_user), 'Build Info\n')
-    for tree, push_id, when, user, head_node in pushes:
-        releases = set()
-        release = ''
-        versions = {}
-
-        if tree == 'beta':
-            versions = repo._beta_releases()
-        elif tree == 'release':
-            versions = repo._release_releases()
-
-        for version, e in versions.items():
-            vctx = repo[e[0]]
-            if ctx.descendant(vctx):
-                releases.add(version)
-
-        if len(releases):
-            release = sorted(releases)[0]
-
-        tbpl = tbpl_url(tree, hex(head_node)[0:12])
-        date = datetime.datetime.fromtimestamp(when)
-        ui.write(release.ljust(8), tree.ljust(longest_tree), date.isoformat(),
-            ' ', user.ljust(longest_user), tbpl or '', '\n')
-
-
-@command('changesetpushes',
-    [('a', 'all', False, _('Show all trees, not just release trees.'), '')],
-    _('hg changesetpushes REV'))
-def changesetpushes(ui, repo, rev, all=False, **opts):
-    """Display pushlog information for a changeset.
-
-    This command prints pushlog entries for a given changeset. It is used to
-    answer the question: how did a changeset propagate to all the trees.
-    """
-    print_changeset_pushes(ui, repo, rev, all=all)
-
-
-@command('buginfo', [
-    ('a', 'all', False, _('Show all trees, not just release trees.'), ''),
-    ('', 'reset', False, _('Wipe and repopulate the bug database.'), ''),
-    ('', 'sync', False, _('Synchronize the bug database.'), ''),
-    ], _('hg buginfo [BUG] ...'))
-def buginfo(ui, repo, *bugs, **opts):
-    if not repo.changetracker:
-        ui.warning('Local database appears to be disabled')
-        return 1
-
-    if opts['sync']:
-        repo.sync_bug_database()
-        return
-
-    if opts['reset']:
-        repo.reset_bug_database()
-        return
-
-    tracker = repo.changetracker
-
-    nodes = set()
-    for bug in bugs:
-        nodes |= set(tracker.changesets_with_bug(bug))
-
-    # Sorting by topological order would probably be preferred. This is quick
-    # and easy.
-    contexts = sorted([repo[node] for node in nodes], key=methodcaller('rev'))
-
-    for ctx in contexts:
-        print_changeset_pushes(ui, repo, ctx.rev(), all=opts['all'])
-        ui.write('\n')
-
-
-def critic_hook(ui, repo, node=None, **opts):
-    # By default, don't run hook on merges.
-    ctx = repo[node]
-    if len(ctx.parents()) > 1 and not ui.configbool('mozext', 'critic_merges'):
-        return 0
-
-    critique(ui, repo, node=node, **opts)
-    return 0
-
-
-def reject_repo_names_hook(ui, repo, namespace=None, key=None, old=None,
-        new=None, **kwargs):
-    """prepushkey hook that prevents changes to reserved names.
-
-    Names that begin with the name of a repository identifier are rejected.
-    """
-    if key.lower().startswith(tuple(REPOS.keys())):
-        ui.warn('You are not allowed to push tags or bookmarks that share '
-            'names with official Mozilla repositories: %s\n' % key)
-        return True
-
-    return False
-
-
-def pullexpand(orig, ui, repo, source='default', **opts):
-    """Wraps built-in pull command to expand aliases to multiple sources."""
-    for tree, uri in resolve_trees_to_uris([source]):
-        result = orig(ui, repo, uri or tree, **opts)
-
-        if result:
-            return result
-
-    return 0
-
-
-class remoterefs(dict):
-    """Represents a remote refs file."""
-
-    def __init__(self, repo):
-        dict.__init__(self)
-        self._repo = repo
-
-        try:
-            for line in repo.vfs('remoterefs'):
-                line = line.strip()
-                if not line:
-                    continue
-
-                sha, ref = line.split(None, 1)
-                ref = encoding.tolocal(ref)
-                try:
-                    self[ref] = repo.changelog.lookup(sha)
-                except LookupError:
-                    pass
+from mercurial.util import Abort
 
-        except IOError as e:
-            if e.errno != errno.ENOENT:
-                raise
-
-    def write(self):
-        f = self._repo.vfs('remoterefs', 'w', atomictemp=True)
-        for ref in sorted(self):
-            f.write('%s %s\n' % (hex(self[ref]), encoding.fromlocal(ref)))
-        f.close()
-
-
-def revset_bug(repo, subset, x):
-    """``bug(N)```
-    Changesets referencing a specified Bugzilla bug. e.g. bug(123456).
-    """
-    err = _('bug() requires an integer argument.')
-    n = revset.getstring(x, err)
-
-    try:
-        n = int(n)
-    except Exception:
-        raise ParseError(err)
-
-    return [r for r in subset if n in parse_bugs(repo[r].description())]
-
-
-def revset_dontbuild(repo, subset, x):
-    if x:
-        raise ParseError(_('dontbuild() does not take any arguments'))
-
-    return [r for r in subset if 'DONTBUILD' in repo[r].description()]
-
-
-def revset_me(repo, subset, x):
-    """``me()``
-    Changesets that you are involved in.
-    """
-    if x:
-        raise ParseError(_('me() does not take any arguments'))
-
-    me = repo.ui.config('ui', 'username')
-    if not me:
-        raise util.Abort(_('"[ui] username" must be set to use me()'))
-
-    ircnick = repo.ui.config('mozext', 'ircnick')
-
-    n = encoding.lower(me)
-    kind, pattern, matcher = revset._substringmatcher(n)
-
-    revs = []
-
-    for r in subset:
-        ctx = repo[r]
-        if matcher(encoding.lower(ctx.user())):
-            revs.append(r)
-            continue
-
-        if ircnick:
-            if ircnick in parse_reviewers(ctx.description()):
-                revs.append(r)
-                continue
-
-    return revs
-
-
-def revset_nobug(repo, subset, x):
-    if x:
-        raise ParseError(_('nobug() does not take any arguments'))
-
-    return [r for r in subset if not parse_bugs(repo[r].description())]
-
-
-def revset_tree(repo, subset, x):
-    """``tree(X)``
-    Changesets currently in the specified Mozilla tree.
-
-    A tree is the name of a repository. e.g. ``central``.
-    """
-    err = _('tree() requires a string argument.')
-    tree = revset.getstring(x, err)
-
-    tree, uri = resolve_trees_to_uris([tree])[0]
-    if not uri:
-        raise util.Abort(_("Don't know about tree: %s") % tree)
-
-    ref = '%s/default' % tree
-
-    head = repo[ref].rev()
-    ancestors = set(repo.changelog.ancestors([head], inclusive=True))
-
-    return [r for r in subset if r in ancestors]
-
-
-def revset_firstpushdate(repo, subset, x):
-    """``firstpushdate(DATE)``
-    Changesets that were initially pushed according to the date spec provided.
-    """
-    ds = revset.getstring(x, _('firstpushdate() requires a string'))
-    dm = util.matchdate(ds)
-
-    revs = []
-
-    for rev in subset:
-        pushes = list(repo.changetracker.pushes_for_changeset(repo[rev].node()))
-
-        if not pushes:
-            continue
-
-        when = pushes[0][2]
-
-        if dm(when):
-            revs.append(rev)
-
-    return revs
-
-
-def revset_firstpushtree(repo, subset, x):
-    """``firstpushtree(X)``
-    Changesets that were initially pushed to tree X.
-    """
-    tree = revset.getstring(x, _('firstpushtree() requires a string argument.'))
-
-    tree, uri = resolve_trees_to_uris([tree])[0]
-    if not uri:
-        raise util.Abort(_("Don't know about tree: %s") % tree)
-
-    revs = []
-
-    for rev in subset:
-        pushes = list(repo.changetracker.pushes_for_changeset(
-            repo[rev].node()))
-
-        if not pushes:
-            continue
-
-        if pushes[0][0] == tree:
-            revs.append(rev)
-
-    return revs
-
-
-def revset_pushdate(repo, subset, x):
-    """``pushdate(DATE)``
-    Changesets that were pushed according to the date spec provided.
-
-    All pushes are examined.
-    """
-    ds = revset.getstring(x, _('pushdate() requires a string'))
-    dm = util.matchdate(ds)
-
-    revs = []
-
-    for rev in subset:
-        for push in repo.changetracker.pushes_for_changeset(repo[rev].node()):
-            when = push[2]
-
-            if dm(when):
-                revs.append(rev)
-                break
-
-    return revs
-
-
-def revset_pushhead(repo, subset, x):
-    """``pushhead([TREE])``
-    Changesets that are push heads.
-
-    A push head is a changeset that was a head when it was pushed to a
-    repository. In other words, the automation infrastructure likely
-    kicked off a build using this changeset.
-
-    If an argument is given, we limit ourselves to pushes on the specified
-    tree.
-
-    If no argument is given, we return all push heads for all trees. Note that
-    a changeset can be a push head multiple times. This function doesn't care
-    where the push was made if no argument was given.
-    """
-    # We have separate code paths because the single tree path uses a single
-    # query and is faster.
-    if x:
-        tree = revset.getstring(x, _('pushhead() requires a string argument.'))
-        tree, uri = resolve_trees_to_uris([tree])[0]
-
-        if not uri:
-            raise util.Abort(_("Don't know about tree: %s") % tree)
-
-        heads = set(repo[r[4]].rev() for r in
-            repo.changetracker.tree_push_heads(tree))
-
-        return [r for r in subset if r in heads]
-
-    revs = []
-
-    for r in subset:
-        node = repo[r].node()
-
-        for push in repo.changetracker.pushes_for_changeset(node):
-            if str(push[4]) == node:
-                revs.append(r)
-                break
-
-    return revs
-
-
-def revset_reviewer(repo, subset, x):
-    """``reviewer(REVIEWER)``
-    Changesets reviewed by a specific person.
-    """
-    n = revset.getstring(x, _('reviewer() requires a string argument.'))
-
-    return [r for r in subset if n in parse_reviewers(repo[r].description())]
-
-
-def revset_reviewed(repo, subset, x):
-    """``reviewed()``
-    Changesets that were reviewed.
-    """
-    if x:
-        raise ParseError(_('reviewed() does not take an argument'))
-
-    return [r for r in subset if list(parse_reviewers(repo[r].description()))]
-
-
-def template_bug(repo, ctx, **args):
-    """:bug: String. The bug this changeset is most associated with."""
-    bugs = parse_bugs(ctx.description())
-    return bugs[0] if bugs else None
-
-
-def template_bugs(repo, ctx, **args):
-    """:bugs: List of ints. The bugs associated with this changeset."""
-    return parse_bugs(ctx.description())
-
-
-def template_reviewer(repo, ctx, **args):
-    """:reviewer: String. The first reviewer of this changeset."""
-    reviewers = parse_reviewers(ctx.description())
-    return reviewers[0] if reviewers else None
-
-
-def template_reviewers(repo, ctx, **args):
-    """:reviewers: List of strings. The reviewers associated with tis
-    changeset."""
-    return parse_reviewers(ctx.description())
-
-
-def _compute_first_version(repo, ctx, what, cache):
-    rev = ctx.rev()
-    cache_key = '%s_ancestors' % what
-
-    if cache_key not in cache:
-        versions = getattr(repo, '_%s_releases' % what)()
-        cache[cache_key] = repo._earliest_version_ancestors(versions)
-
-    for version, ancestors in cache[cache_key].items():
-        if rev in ancestors:
-            return version
-
-    return None
-
-
-def template_firstrelease(repo, ctx, **args):
-    """:firstrelease: String. The version of the first release channel
-    release with this changeset.
-    """
-    return _compute_first_version(repo, ctx, 'release', args['cache'])
-
-
-def template_firstbeta(repo, ctx, **args):
-    """:firstbeta: String. The version of the first beta release with this
-    changeset.
-    """
-    return _compute_first_version(repo, ctx, 'beta', args['cache'])
-
-
-def _calculate_push_milestone(repo, ctx, tree):
-    # This function appears to be slow. Consider caching results.
-    pushes = repo.changetracker.pushes_for_changeset(ctx.node())
-    pushes = [p for p in pushes if p[0] == tree]
-
-    if not pushes:
-        return None
-
-    push = pushes[0]
-
-    return repo._revision_milestone(str(push[4]))
-
-
-def template_firstaurora(repo, ctx, **args):
-    """:firstaurora: String. The version of the first aurora release with
-    this changeset.
-    """
-    return _calculate_push_milestone(repo, ctx, 'aurora')
-
-
-def template_firstnightly(repo, ctx, **args):
-    """:firstnightly: String. The version of the first nightly release
-    with this changeset.
-    """
-    return _calculate_push_milestone(repo, ctx, 'central')
-
-
-def _calculate_next_daily_release(repo, ctx, tree):
-    pushes = repo.changetracker.pushes_for_changeset(ctx.node())
-    pushes = [p for p in pushes if p[0] == tree]
-
-    if not pushes:
-        return None
-
-    push = pushes[0]
-    when = push[2]
-
-    dt = datetime.datetime.utcfromtimestamp(when)
-
-    # Daily builds kick off at 3 AM in Mountain View. This is -7 hours
-    # from UTC during daylight savings and -8 during regular.
-    # Mercurial nor core Python have timezone info built-in, so we
-    # hack this calculation together here. This calculation is wrong
-    # for date before 2007, when the DST start/end days changed. It
-    # may not always be correct in the future. We should use a real
-    # timezone database.
-    dst_start = None
-    dst_end = None
-
-    c = calendar.Calendar(calendar.SUNDAY)
-    sunday_count = 0
-    for day in c.itermonthdates(dt.year, 3):
-        if day.month != 3:
-            continue
-
-        if day.weekday() == 6:
-            sunday_count += 1
-            if sunday_count == 2:
-                dst_start = day
-                break
-
-    for day in c.itermonthdates(dt.year, 11):
-        if day.month != 11:
-            if day.weekday() == 6:
-                dst_end = day
-                break
-
-    dst_start = datetime.datetime(dst_start.year, dst_start.month,
-        dst_start.day, 2)
-    dst_end = datetime.datetime(dst_end.year, dst_end.month,
-        dst_end.day, 2)
-
-    is_dst = dt >= dst_start and dt <= dst_end
-    utc_offset = 11 if is_dst else 10
-
-    if dt.hour > 3 + utc_offset:
-        dt += datetime.timedelta(days=1)
-
-    return dt.date().isoformat()
-
-
-def template_auroradate(repo, ctx, **args):
-    """:auroradate: String. The date of the first Aurora this
-    changeset was likely first active in as a YYYY-MM-DD value.
-    """
-    return _calculate_next_daily_release(repo, ctx, 'aurora')
-
-
-def template_nightlydate(repo, ctx, **args):
-    """:nightlydate: Date information. The date of the first Nightly this
-    changeset was likely first active in as a YYYY-MM-DD value.
-    """
-    return _calculate_next_daily_release(repo, ctx, 'central')
-
-
-def template_firstpushuser(repo, ctx, **args):
-    """:firstpushuser: String. The first person who pushed this changeset.
-    """
-    pushes = list(repo.changetracker.pushes_for_changeset(ctx.node()))
-
-    if not pushes:
-        return None
-
-    return pushes[0][3]
-
-
-def template_firstpushtree(repo, ctx, **args):
-    """:firstpushtree: String. The first tree this changeset was pushed to.
-    """
-    pushes = list(repo.changetracker.pushes_for_changeset(ctx.node()))
-
-    if not pushes:
-        return None
-
-    return pushes[0][0]
-
-
-def template_firstpushtbpl(repo, ctx, **args):
-    """:firstpushtbpl: String. TBPL URL for the first push of this changeset.
-    """
-    pushes = list(repo.changetracker.pushes_for_changeset(ctx.node()))
-    if not pushes:
-        return None
-
-    push = pushes[0]
-    tree, node = push[0], push[4]
-
-    return tbpl_url(tree, hex(node)[0:12])
-
-
-def template_firstpushdate(repo, ctx, **args):
-    """:firstpushdate: Date information. The date of the first push of this
-    changeset."""
-    pushes = list(repo.changetracker.pushes_for_changeset(ctx.node()))
-    if not pushes:
-        return None
-
-    return util.makedate(pushes[0][2])
-
-
-def template_pushdates(repo, ctx, **args):
-    """:pushdates: List of date information. The dates this changeset was
-    pushed to various trees."""
-    pushes = repo.changetracker.pushes_for_changeset(ctx.node())
-
-    return [util.makedate(p[2]) for p in pushes]
-
-
-def template_pushheaddates(repo, ctx, **args):
-    """:pushheaddates: List of date information. The dates this changeset
-    was pushed to various trees as a push head."""
-    node = ctx.node()
-    pushes = repo.changetracker.pushes_for_changeset(ctx.node())
-
-    return [util.makedate(p[2]) for p in pushes if str(p[4]) == node]
-
-
-def template_trees(repo, ctx, **args):
-    """:trees: List of strings. Trees this changeset has landed in.
-    """
-    return [p[0] for p in repo.changetracker.pushes_for_changeset(ctx.node())]
-
-
-def template_reltrees(repo, ctx, **args):
-    """:reltrees: List of strings. Release trees this changeset has landed in.
-    """
-    return [t for t in template_trees(repo, ctx, **args) if t in RELEASE_TREES]
-
-
-# [gps] This function may not be necessary. However, I was unable to figure out
-# how to do the equivalent with regular template syntax. Yes, I tried the
-# list operator.
-def template_dates(context, mapping, args):
-    """:dates(VALUES, [fmt, [sep]]): Format a list of dates."""
-    if not (1 <= len(args) <= 3):
-        raise ParseError(_("dates expects one, two, or three arguments"))
-
-    fmt = '%Y-%m-%d'
-    sep = ','
-
-    if len(args) > 1:
-        fmt = templatefilters.stringify(args[1][0](context, mapping,
-            args[1][1]))
-    if len(args) > 2:
-        sep = templatefilters.stringify(args[2][0](context, mapping,
-            args[2][1]))
-
-    return sep.join(util.datestr(d, fmt) for d in args[0][0](context, mapping,
-        args[0][1]))
+ERROR = 'The mozext extension has moved repositories. You can now \
+find the source code at https://hg.mozilla.org/hgcustom/version-control-tools. \
+Please clone that repository and update your hgrc to point to the new \
+location.'
 
 def extsetup(ui):
-    global bz_available
-    try:
-        extensions.find('bzexport')
-        bz_available = True
-    except KeyError:
-        pass
-
-    extensions.wrapcommand(commands.table, 'pull', pullexpand)
-
-    revset.symbols['bug'] = revset_bug
-    revset.symbols['dontbuild'] = revset_dontbuild
-    revset.symbols['me'] = revset_me
-    revset.symbols['nobug'] = revset_nobug
-    revset.symbols['reviewer'] = revset_reviewer
-    revset.symbols['reviewed'] = revset_reviewed
-
-    if not ui.configbool('mozext', 'disable_local_database'):
-        revset.symbols['pushhead'] = revset_pushhead
-        revset.symbols['tree'] = revset_tree
-        revset.symbols['firstpushdate'] = revset_firstpushdate
-        revset.symbols['firstpushtree'] = revset_firstpushtree
-        revset.symbols['pushdate'] = revset_pushdate
-
-    templatekw.keywords['bug'] = template_bug
-    templatekw.keywords['bugs'] = template_bugs
-    templatekw.keywords['reviewer'] = template_reviewer
-    templatekw.keywords['reviewers'] = template_reviewers
-
-    if not ui.configbool('mozext', 'disable_local_database'):
-        templatekw.keywords['firstrelease'] = template_firstrelease
-        templatekw.keywords['firstbeta'] = template_firstbeta
-        templatekw.keywords['firstaurora'] = template_firstaurora
-        templatekw.keywords['firstnightly'] = template_firstnightly
-        templatekw.keywords['auroradate'] = template_auroradate
-        templatekw.keywords['nightlydate'] = template_nightlydate
-        templatekw.keywords['firstpushuser'] = template_firstpushuser
-        templatekw.keywords['firstpushtree'] = template_firstpushtree
-        templatekw.keywords['firstpushtbpl'] = template_firstpushtbpl
-        templatekw.keywords['firstpushdate'] = template_firstpushdate
-        templatekw.keywords['pushdates'] = template_pushdates
-        templatekw.keywords['pushheaddates'] = template_pushheaddates
-        templatekw.keywords['trees'] = template_trees
-        templatekw.keywords['reltrees'] = template_reltrees
-
-    templater.funcs['dates'] = template_dates
-
-
-def reposetup(ui, repo):
-    """Custom repository implementation.
-
-    Our custom repository class tracks remote tree references so users can
-    reference specific revisions on remotes.
-    """
-
-    if not repo.local():
-        return
-
-    orig_findtags = repo._findtags
-    orig_lookup = repo.lookup
-    orig_pull = repo.pull
-    orig_push = repo.push
-
-    class remotestrackingrepo(repo.__class__):
-        @repofilecache('remoterefs')
-        def remoterefs(self):
-            return remoterefs(self)
-
-        @util.propertycache
-        def changetracker(self):
-            if ui.configbool('mozext', 'disable_local_database'):
-                return None
-            try:
-                return ChangeTracker(self.join('changetracker.db'))
-            except Exception as e:
-                raise util.Abort(e.message)
-
-        # Resolve remote ref symbols. For some reason, we need both lookup
-        # and findtags implemented.
-        def lookup(self, key):
-            try:
-                key = self.remoterefs[key]
-            except (KeyError, TypeError):
-                pass
-
-            return orig_lookup(key)
-
-        def _findtags(self):
-            tags, tagtypes = orig_findtags()
-            tags.update(self.remoterefs)
-
-            return tags, tagtypes
-
-        def pull(self, remote, *args, **kwargs):
-            # Pulls from known repositories will automatically update our
-            # remote tracking references.
-            old_rev = len(self)
-            res = orig_pull(remote, *args, **kwargs)
-            lock = self.wlock()
-            try:
-                tree = resolve_uri_to_tree(remote.url())
-
-                if tree:
-                    self._update_remote_refs(remote, tree)
-                    if self.changetracker:
-                        self.changetracker.load_pushlog(tree)
-
-                # Sync bug info.
-                for rev in self.changelog.revs(old_rev + 1):
-                    ctx = self[rev]
-                    bugs = parse_bugs(ctx.description())
-                    if bugs and self.changetracker:
-                        self.changetracker.associate_bugs_with_changeset(bugs,
-                            ctx.node())
-
-            finally:
-                lock.release()
-
-            return res
-
-        def push(self, remote, *args, **kwargs):
-            res = orig_push(remote, *args, **kwargs)
-            lock = self.wlock()
-            try:
-                tree = resolve_uri_to_tree(remote.url())
-
-                if tree:
-                    self._update_remote_refs(remote, tree)
-
-            finally:
-                lock.release()
-
-            return res
-
-        def _update_remote_refs(self, remote, tree):
-            mb = self.ui.configbool('mozext', 'refs_as_bookmarks',
-                default=False)
-
-            existing_refs = set()
-            incoming_refs = set()
-
-            for ref in self.remoterefs:
-                if ref.startswith('%s/' % tree):
-                    existing_refs.add(ref)
-
-            for branch, nodes in remote.branchmap().items():
-                # Don't store RELBRANCH refs for non-release trees, as they are
-                # meaningless and cruft from yesteryear.
-                if branch.endswith('RELBRANCH') and \
-                    tree not in TREE_ALIASES['releases']:
-                    continue
-
-                ref = '%s/%s' % (tree, branch)
-                incoming_refs.add(ref)
-
-                for node in nodes:
-                    self.remoterefs[ref] = node
-
-                    if mb:
-                        self._bookmarks[ref] = node
-
-            # Prune old refs.
-            for ref in existing_refs - incoming_refs:
-                try:
-                    del self.remoterefs[ref]
-                except KeyError:
-                    pass
-
-                if mb:
-                    try:
-                        del self._bookmarks[ref]
-                    except KeyError:
-                        pass
-
-            self.remoterefs.write()
-
-            if mb:
-                self._bookmarks.write()
-
-        def _revision_milestone(self, rev):
-            """Look up the Gecko milestone of a revision."""
-            fctx = self.filectx('config/milestone.txt', changeid=rev)
-            lines = fctx.data().splitlines()
-            lines = [l for l in lines if not l.startswith('#') and l.strip()]
-
-            if not lines:
-                return None
-
-            return lines[0]
-
-        def _beta_releases(self):
-            """Obtain information for each beta release."""
-            return self._release_versions('beta/')
-
-        def _release_releases(self):
-            return self._release_versions('release/')
-
-        def _release_versions(self, prefix):
-            d = {}
-
-            for key, node in self.remoterefs.items():
-                if not key.startswith(prefix):
-                    continue
-
-                key = key[len(prefix):]
-
-                if not key.startswith('GECKO') or not key.endswith('RELBRANCH'):
-                    continue
-
-                version, date, _relbranch = key.split('_')
-                version = version[5:]
-                after = ''
-                marker = ''
-
-                if 'b' in version:
-                    marker = 'b'
-                    version, after = version.split('b')
-
-                if len(version) > 2:
-                    major, minor = version[0:2], version[2:]
-                else:
-                    major, minor = version
-
-                version = '%s.%s' % (major, minor)
-                if marker:
-                    version += '%s%s' % (marker, after)
-
-                d[version] = (key, node, major, minor, marker or None, after or None)
-
-            return d
-
-        def _earliest_version_ancestors(self, versions):
-            """Take a set of versions and generate earliest version ancestors.
-
-            This function takes the output of _release_versions as an input
-            and calculates the set of revisions corresponding to each version's
-            introduced ancestors. Put another way, it returns a dict of version
-            to revision set where each set is disjoint and presence in a
-            version's set indicates that particular version introduced that
-            revision.
-
-            This computation is computational expensive. Callers are encouraged
-            to cache it.
-            """
-            d = {}
-            seen = set()
-            for version, e in sorted(versions.items()):
-                version_rev = self[e[1]].rev()
-                ancestors = set(self.changelog.findmissingrevs(
-                    common=seen, heads=[version_rev]))
-                d[version] = ancestors
-                seen |= ancestors
-
-            return d
-
-        def reset_bug_database(self):
-            if not self.changetracker:
-                return
-
-            self.changetracker.wipe_bugs()
-            self.sync_bug_database()
-
-        def sync_bug_database(self):
-            if not self.changetracker:
-                return
-
-            for rev in self:
-                ui.progress('changeset', rev, total=len(self))
-                ctx = self[rev]
-                bugs = parse_bugs(ctx.description())
-                if bugs:
-                    self.changetracker.associate_bugs_with_changeset(bugs,
-                        ctx.node())
-
-            ui.progress('changeset', None)
-
-
-    repo.__class__ = remotestrackingrepo
-    headless = ui.configbool('mozext', 'headless')
-    if not ui.config('mozext', 'ircnick') and not headless:
-        raise util.Abort(_('Set "[mozext] ircnick" in your hgrc to your '
-            'Mozilla IRC nickname to enable additional functionality.'))
-
-    if not ui.configbool('mozext', 'noautocritic'):
-        ui.setconfig('hooks', 'commit.critic', critic_hook)
-        ui.setconfig('hooks', 'qrefresh.critic', critic_hook)
-
-    if ui.configbool('mozext', 'reject_pushes_with_repo_names', default=False):
-        ui.setconfig('hooks', 'prepushkey.reject_repo_names',
-            reject_repo_names_hook)
-
-    # Set up a specially named path so reviewboard resolves this repo to
-    # mozilla-central.
-    if not ui.config('paths', 'reviewboard'):
-        uri = resolve_trees_to_uris(['central'])[0][1]
-        ui.setconfig('paths', 'reviewboard', uri)
+    raise Abort(ERROR)
deleted file mode 100644
--- a/flake8/CHANGES.rst
+++ /dev/null
@@ -1,141 +0,0 @@
-CHANGES
-=======
-
-2.0.0 - 2013-02-xx
-------------------
-
-- Pyflakes errors are prefixed by an ``F`` instead of an ``E``
-- McCabe complexity warnings are prefixed by a ``C`` instead of a ``W``
-- Flake8 supports extensions through entry points
-- Due to the above support, we **require** setuptools
-- We publish the `documentation <https://flake8.readthedocs.org/>`_
-- Fixes #13: pep8, pyflakes and mccabe become external dependencies
-- Split run.py into main.py, engine.py and hooks.py for better logic
-- Expose our parser for our users
-- New feature: Install git and hg hooks automagically
-- By relying on pyflakes (0.6.1), we also fixed #45 and #35
-
-
-1.7.0 - 2012-12-21
-------------------
-
-- Fixes part of #35: Exception for no WITHITEM being an attribute of Checker
-  for Python 3.3
-- Support stdin
-- Incorporate @phd's builtins pull request
-- Fix the git hook
-- Update pep8.py to the latest version
-
-
-1.6.2 - 2012-11-25
-------------------
-
-- fixed the NameError: global name 'message' is not defined (#46)
-
-
-1.6.1 - 2012-11-24
-------------------
-
-- fixed the mercurial hook, a change from a previous patch was not properly
-  applied
-- fixed an assumption about warnings/error messages that caused an exception
-  to be thrown when McCabe is used
-
-
-1.6 - 2012-11-16
-----------------
-
-- changed the signatures of the ``check_file`` function in flake8/run.py,
-  ``skip_warning`` in flake8/util.py and the ``check``, ``checkPath``
-  functions in flake8/pyflakes.py.
-- fix ``--exclude`` and ``--ignore`` command flags (#14, #19)
-- fix the git hook that wasn't catching files not already added to the index
-  (#29)
-- pre-emptively includes the addition to pep8 to ignore certain lines.
-  Add ``# nopep8`` to the end of a line to ignore it. (#37)
-- ``check_file`` can now be used without any special prior setup (#21)
-- unpacking exceptions will no longer cause an exception (#20)
-- fixed crash on non-existent file (#38)
-
-
-1.5 - 2012-10-13
-----------------
-
-- fixed the stdin
-- make sure mccabe catches the syntax errors as warnings
-- pep8 upgrade
-- added max_line_length default value
-- added Flake8Command and entry points is setuptools is around
-- using the setuptools console wrapper when available
-
-
-1.4 - 2012-07-12
-----------------
-
-- git_hook: Only check staged changes for compliance
-- use pep8 1.2
-
-
-1.3.1 - 2012-05-19
-------------------
-
-- fixed support for Python 2.5
-
-
-1.3 - 2012-03-12
-----------------
-
-- fixed false W402 warning on exception blocks.
-
-
-1.2 - 2012-02-12
-----------------
-
-- added a git hook
-- now Python 3 compatible
-- mccabe and pyflakes have warning codes like pep8 now
-
-
-1.1 - 2012-02-14
-----------------
-
-- fixed the value returned by --version
-- allow the flake8: header to be more generic
-- fixed the "hg hook raises 'physical lines'" bug
-- allow three argument form of raise
-- now uses setuptools if available, for 'develop' command
-
-
-1.0 - 2011-11-29
-----------------
-
-- Deactivates by default the complexity checker
-- Introduces the complexity option in the HG hook and the command line.
-
-
-0.9 - 2011-11-09
-----------------
-
-- update pep8 version to 0.6.1
-- mccabe check: gracefully handle compile failure
-
-
-0.8 - 2011-02-27
-----------------
-
-- fixed hg hook
-- discard unexisting files on hook check
-
-
-0.7 - 2010-02-18
-----------------
-
-- Fix pep8 initialization when run through Hg
-- Make pep8 short options work when run through the command line
-- Skip duplicates when controlling files via Hg
-
-
-0.6 - 2010-02-15
-----------------
-
-- Fix the McCabe metric on some loops
deleted file mode 100644
--- a/flake8/CONTRIBUTORS.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-Project created by Tarek Ziadé.
-
-Contributors (by order of appearance) :
-
-- Tamás Gulácsi
-- Nicolas Dumazet
-- Stefan Scherfke
-- Chris Adams
-- Ben Bass
-- Ask Solem
-- Steven Kryskalla
-- Gustavo Picon
-- Jannis Leidel
-- Miki Tebeka
-- David Cramer
-- Peter Teichman
-- Ian Cordasco
-- Oleg Broytman
-- Marc Labbé
-- Bruno Miguel Custódio
-- Florent Xicluna
deleted file mode 100644
--- a/flake8/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-== Flake8 License (MIT) ==
-
-Copyright (C) 2011 Tarek Ziade <tarek@ziade.org>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
deleted file mode 100644
--- a/flake8/MANIFEST.in
+++ /dev/null
@@ -1,4 +0,0 @@
-include *.rst
-include CONTRIBUTORS.txt
-include LICENSE
-recursive-include scripts flake8.*
deleted file mode 100644
--- a/flake8/PKG-INFO
+++ /dev/null
@@ -1,229 +0,0 @@
-Metadata-Version: 1.0
-Name: flake8
-Version: 2.0
-Summary: the modular source code checker: pep8, pyflakes and co
-Home-page: http://bitbucket.org/tarek/flake8
-Author: Ian Cordasco
-Author-email: graffatcolmingov@gmail.com
-License: MIT
-Description: ======
-        Flake8
-        ======
-        
-        Flake8 is a wrapper around these tools:
-        
-        - PyFlakes
-        - pep8
-        - Ned Batchelder's McCabe script
-        
-        Flake8 runs all the tools by launching the single ``flake8`` script.
-        It displays the warnings in a per-file, merged output.
-        
-        It also adds a few features:
-        
-        - files that contain this line are skipped::
-        
-            # flake8: noqa
-        
-        - lines that contain a ``# noqa`` comment at the end will not issue warnings.
-        - a Git and a Mercurial hook.
-        - a McCabe complexity checker.
-        - extendable through ``flake8.extension`` entry points.
-        
-        
-        QuickStart
-        ==========
-        
-        ::
-        
-            pip install flake8
-        
-        To run flake8 just invoke it against any directory or Python module::
-        
-            $ flake8 coolproject
-            coolproject/mod.py:97:1: F401 'shutil' imported but unused
-            coolproject/mod.py:625:17: E225 missing whitespace around operato
-            coolproject/mod.py:729:1: F811 redefinition of function 'readlines' from line 723
-            coolproject/mod.py:1028:1: F841 local variable 'errors' is assigned to but never used
-        
-        The outputs of PyFlakes *and* pep8 (and the optional plugins) are merged
-        and returned.
-        
-        flake8 offers an extra option: --max-complexity, which will emit a warning if
-        the McCabe complexity of a function is higher than the value.  By default it's
-        deactivated::
-        
-            $ flake8 --max-complexity 12 coolproject
-            coolproject/mod.py:97:1: F401 'shutil' imported but unused
-            coolproject/mod.py:625:17: E225 missing whitespace around operator
-            coolproject/mod.py:729:1: F811 redefinition of unused 'readlines' from line 723
-            coolproject/mod.py:939:1: C901 'Checker.check_all' is too complex (12)
-            coolproject/mod.py:1028:1: F841 local variable 'errors' is assigned to but never used
-            coolproject/mod.py:1204:1: C901 'selftest' is too complex (14)
-        
-        This feature is quite useful to detect over-complex code.  According to McCabe,
-        anything that goes beyond 10 is too complex.
-        See https://en.wikipedia.org/wiki/Cyclomatic_complexity.
-        
-        
-        .. _links:
-        
-        Links
-        =====
-        
-        * `flake8 documentation <http://flake8.readthedocs.org/en/latest/>`_
-        
-        * `pep8 documentation <http://pep8.readthedocs.org/en/latest/>`_
-        
-        
-        CHANGES
-        =======
-        
-        2.0.0 - 2013-02-xx
-        ------------------
-        
-        - Pyflakes errors are prefixed by an ``F`` instead of an ``E``
-        - McCabe complexity warnings are prefixed by a ``C`` instead of a ``W``
-        - Flake8 supports extensions through entry points
-        - Due to the above support, we **require** setuptools
-        - We publish the `documentation <https://flake8.readthedocs.org/>`_
-        - Fixes #13: pep8, pyflakes and mccabe become external dependencies
-        - Split run.py into main.py, engine.py and hooks.py for better logic
-        - Expose our parser for our users
-        - New feature: Install git and hg hooks automagically
-        - By relying on pyflakes (0.6.1), we also fixed #45 and #35
-        
-        
-        1.7.0 - 2012-12-21
-        ------------------
-        
-        - Fixes part of #35: Exception for no WITHITEM being an attribute of Checker
-          for Python 3.3
-        - Support stdin
-        - Incorporate @phd's builtins pull request
-        - Fix the git hook
-        - Update pep8.py to the latest version
-        
-        
-        1.6.2 - 2012-11-25
-        ------------------
-        
-        - fixed the NameError: global name 'message' is not defined (#46)
-        
-        
-        1.6.1 - 2012-11-24
-        ------------------
-        
-        - fixed the mercurial hook, a change from a previous patch was not properly
-          applied
-        - fixed an assumption about warnings/error messages that caused an exception
-          to be thrown when McCabe is used
-        
-        
-        1.6 - 2012-11-16
-        ----------------
-        
-        - changed the signatures of the ``check_file`` function in flake8/run.py,
-          ``skip_warning`` in flake8/util.py and the ``check``, ``checkPath``
-          functions in flake8/pyflakes.py.
-        - fix ``--exclude`` and ``--ignore`` command flags (#14, #19)
-        - fix the git hook that wasn't catching files not already added to the index
-          (#29)
-        - pre-emptively includes the addition to pep8 to ignore certain lines.
-          Add ``# nopep8`` to the end of a line to ignore it. (#37)
-        - ``check_file`` can now be used without any special prior setup (#21)
-        - unpacking exceptions will no longer cause an exception (#20)
-        - fixed crash on non-existent file (#38)
-        
-        
-        1.5 - 2012-10-13
-        ----------------
-        
-        - fixed the stdin
-        - make sure mccabe catches the syntax errors as warnings
-        - pep8 upgrade
-        - added max_line_length default value
-        - added Flake8Command and entry points is setuptools is around
-        - using the setuptools console wrapper when available
-        
-        
-        1.4 - 2012-07-12
-        ----------------
-        
-        - git_hook: Only check staged changes for compliance
-        - use pep8 1.2
-        
-        
-        1.3.1 - 2012-05-19
-        ------------------
-        
-        - fixed support for Python 2.5
-        
-        
-        1.3 - 2012-03-12
-        ----------------
-        
-        - fixed false W402 warning on exception blocks.
-        
-        
-        1.2 - 2012-02-12
-        ----------------
-        
-        - added a git hook
-        - now Python 3 compatible
-        - mccabe and pyflakes have warning codes like pep8 now
-        
-        
-        1.1 - 2012-02-14
-        ----------------
-        
-        - fixed the value returned by --version
-        - allow the flake8: header to be more generic
-        - fixed the "hg hook raises 'physical lines'" bug
-        - allow three argument form of raise
-        - now uses setuptools if available, for 'develop' command
-        
-        
-        1.0 - 2011-11-29
-        ----------------
-        
-        - Deactivates by default the complexity checker
-        - Introduces the complexity option in the HG hook and the command line.
-        
-        
-        0.9 - 2011-11-09
-        ----------------
-        
-        - update pep8 version to 0.6.1
-        - mccabe check: gracefully handle compile failure
-        
-        
-        0.8 - 2011-02-27
-        ----------------
-        
-        - fixed hg hook
-        - discard unexisting files on hook check
-        
-        
-        0.7 - 2010-02-18
-        ----------------
-        
-        - Fix pep8 initialization when run through Hg
-        - Make pep8 short options work when run through the command line
-        - Skip duplicates when controlling files via Hg
-        
-        
-        0.6 - 2010-02-15
-        ----------------
-        
-        - Fix the McCabe metric on some loops
-        
-Platform: UNKNOWN
-Classifier: Environment :: Console
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: Software Development :: Quality Assurance
deleted file mode 100644
--- a/flake8/README.rst
+++ /dev/null
@@ -1,68 +0,0 @@
-======
-Flake8
-======
-
-Flake8 is a wrapper around these tools:
-
-- PyFlakes
-- pep8
-- Ned Batchelder's McCabe script
-
-Flake8 runs all the tools by launching the single ``flake8`` script.
-It displays the warnings in a per-file, merged output.
-
-It also adds a few features:
-
-- files that contain this line are skipped::
-
-    # flake8: noqa
-
-- lines that contain a ``# noqa`` comment at the end will not issue warnings.
-- a Git and a Mercurial hook.
-- a McCabe complexity checker.
-- extendable through ``flake8.extension`` entry points.
-
-
-QuickStart
-==========
-
-::
-
-    pip install flake8
-
-To run flake8 just invoke it against any directory or Python module::
-
-    $ flake8 coolproject
-    coolproject/mod.py:97:1: F401 'shutil' imported but unused
-    coolproject/mod.py:625:17: E225 missing whitespace around operato
-    coolproject/mod.py:729:1: F811 redefinition of function 'readlines' from line 723
-    coolproject/mod.py:1028:1: F841 local variable 'errors' is assigned to but never used
-
-The outputs of PyFlakes *and* pep8 (and the optional plugins) are merged
-and returned.
-
-flake8 offers an extra option: --max-complexity, which will emit a warning if
-the McCabe complexity of a function is higher than the value.  By default it's
-deactivated::
-
-    $ flake8 --max-complexity 12 coolproject
-    coolproject/mod.py:97:1: F401 'shutil' imported but unused
-    coolproject/mod.py:625:17: E225 missing whitespace around operator
-    coolproject/mod.py:729:1: F811 redefinition of unused 'readlines' from line 723
-    coolproject/mod.py:939:1: C901 'Checker.check_all' is too complex (12)
-    coolproject/mod.py:1028:1: F841 local variable 'errors' is assigned to but never used
-    coolproject/mod.py:1204:1: C901 'selftest' is too complex (14)
-
-This feature is quite useful to detect over-complex code.  According to McCabe,
-anything that goes beyond 10 is too complex.
-See https://en.wikipedia.org/wiki/Cyclomatic_complexity.
-
-
-.. _links:
-
-Links
-=====
-
-* `flake8 documentation <http://flake8.readthedocs.org/en/latest/>`_
-
-* `pep8 documentation <http://pep8.readthedocs.org/en/latest/>`_
deleted file mode 100644
--- a/flake8/flake8.egg-info/PKG-INFO
+++ /dev/null
@@ -1,229 +0,0 @@
-Metadata-Version: 1.0
-Name: flake8
-Version: 2.0
-Summary: the modular source code checker: pep8, pyflakes and co
-Home-page: http://bitbucket.org/tarek/flake8
-Author: Ian Cordasco
-Author-email: graffatcolmingov@gmail.com
-License: MIT
-Description: ======
-        Flake8
-        ======
-        
-        Flake8 is a wrapper around these tools:
-        
-        - PyFlakes
-        - pep8
-        - Ned Batchelder's McCabe script
-        
-        Flake8 runs all the tools by launching the single ``flake8`` script.
-        It displays the warnings in a per-file, merged output.
-        
-        It also adds a few features:
-        
-        - files that contain this line are skipped::
-        
-            # flake8: noqa
-        
-        - lines that contain a ``# noqa`` comment at the end will not issue warnings.
-        - a Git and a Mercurial hook.
-        - a McCabe complexity checker.
-        - extendable through ``flake8.extension`` entry points.
-        
-        
-        QuickStart
-        ==========
-        
-        ::
-        
-            pip install flake8
-        
-        To run flake8 just invoke it against any directory or Python module::
-        
-            $ flake8 coolproject
-            coolproject/mod.py:97:1: F401 'shutil' imported but unused
-            coolproject/mod.py:625:17: E225 missing whitespace around operato
-            coolproject/mod.py:729:1: F811 redefinition of function 'readlines' from line 723
-            coolproject/mod.py:1028:1: F841 local variable 'errors' is assigned to but never used
-        
-        The outputs of PyFlakes *and* pep8 (and the optional plugins) are merged
-        and returned.
-        
-        flake8 offers an extra option: --max-complexity, which will emit a warning if
-        the McCabe complexity of a function is higher than the value.  By default it's
-        deactivated::
-        
-            $ flake8 --max-complexity 12 coolproject
-            coolproject/mod.py:97:1: F401 'shutil' imported but unused
-            coolproject/mod.py:625:17: E225 missing whitespace around operator
-            coolproject/mod.py:729:1: F811 redefinition of unused 'readlines' from line 723
-            coolproject/mod.py:939:1: C901 'Checker.check_all' is too complex (12)
-            coolproject/mod.py:1028:1: F841 local variable 'errors' is assigned to but never used
-            coolproject/mod.py:1204:1: C901 'selftest' is too complex (14)
-        
-        This feature is quite useful to detect over-complex code.  According to McCabe,
-        anything that goes beyond 10 is too complex.
-        See https://en.wikipedia.org/wiki/Cyclomatic_complexity.
-        
-        
-        .. _links:
-        
-        Links
-        =====
-        
-        * `flake8 documentation <http://flake8.readthedocs.org/en/latest/>`_
-        
-        * `pep8 documentation <http://pep8.readthedocs.org/en/latest/>`_
-        
-        
-        CHANGES
-        =======
-        
-        2.0.0 - 2013-02-xx
-        ------------------
-        
-        - Pyflakes errors are prefixed by an ``F`` instead of an ``E``
-        - McCabe complexity warnings are prefixed by a ``C`` instead of a ``W``
-        - Flake8 supports extensions through entry points
-        - Due to the above support, we **require** setuptools
-        - We publish the `documentation <https://flake8.readthedocs.org/>`_
-        - Fixes #13: pep8, pyflakes and mccabe become external dependencies
-        - Split run.py into main.py, engine.py and hooks.py for better logic
-        - Expose our parser for our users
-        - New feature: Install git and hg hooks automagically
-        - By relying on pyflakes (0.6.1), we also fixed #45 and #35
-        
-        
-        1.7.0 - 2012-12-21
-        ------------------
-        
-        - Fixes part of #35: Exception for no WITHITEM being an attribute of Checker
-          for Python 3.3
-        - Support stdin
-        - Incorporate @phd's builtins pull request
-        - Fix the git hook
-        - Update pep8.py to the latest version
-        
-        
-        1.6.2 - 2012-11-25
-        ------------------
-        
-        - fixed the NameError: global name 'message' is not defined (#46)
-        
-        
-        1.6.1 - 2012-11-24
-        ------------------
-        
-        - fixed the mercurial hook, a change from a previous patch was not properly
-          applied
-        - fixed an assumption about warnings/error messages that caused an exception
-          to be thrown when McCabe is used
-        
-        
-        1.6 - 2012-11-16
-        ----------------
-        
-        - changed the signatures of the ``check_file`` function in flake8/run.py,
-          ``skip_warning`` in flake8/util.py and the ``check``, ``checkPath``
-          functions in flake8/pyflakes.py.
-        - fix ``--exclude`` and ``--ignore`` command flags (#14, #19)
-        - fix the git hook that wasn't catching files not already added to the index
-          (#29)
-        - pre-emptively includes the addition to pep8 to ignore certain lines.
-          Add ``# nopep8`` to the end of a line to ignore it. (#37)
-        - ``check_file`` can now be used without any special prior setup (#21)
-        - unpacking exceptions will no longer cause an exception (#20)
-        - fixed crash on non-existent file (#38)
-        
-        
-        1.5 - 2012-10-13
-        ----------------
-        
-        - fixed the stdin
-        - make sure mccabe catches the syntax errors as warnings
-        - pep8 upgrade
-        - added max_line_length default value
-        - added Flake8Command and entry points is setuptools is around
-        - using the setuptools console wrapper when available
-        
-        
-        1.4 - 2012-07-12
-        ----------------
-        
-        - git_hook: Only check staged changes for compliance
-        - use pep8 1.2
-        
-        
-        1.3.1 - 2012-05-19
-        ------------------
-        
-        - fixed support for Python 2.5
-        
-        
-        1.3 - 2012-03-12
-        ----------------
-        
-        - fixed false W402 warning on exception blocks.
-        
-        
-        1.2 - 2012-02-12
-        ----------------
-        
-        - added a git hook
-        - now Python 3 compatible
-        - mccabe and pyflakes have warning codes like pep8 now
-        
-        
-        1.1 - 2012-02-14
-        ----------------
-        
-        - fixed the value returned by --version
-        - allow the flake8: header to be more generic
-        - fixed the "hg hook raises 'physical lines'" bug
-        - allow three argument form of raise
-        - now uses setuptools if available, for 'develop' command
-        
-        
-        1.0 - 2011-11-29
-        ----------------
-        
-        - Deactivates by default the complexity checker
-        - Introduces the complexity option in the HG hook and the command line.
-        
-        
-        0.9 - 2011-11-09
-        ----------------
-        
-        - update pep8 version to 0.6.1
-        - mccabe check: gracefully handle compile failure
-        
-        
-        0.8 - 2011-02-27
-        ----------------
-        
-        - fixed hg hook
-        - discard unexisting files on hook check
-        
-        
-        0.7 - 2010-02-18
-        ----------------
-        
-        - Fix pep8 initialization when run through Hg
-        - Make pep8 short options work when run through the command line
-        - Skip duplicates when controlling files via Hg
-        
-        
-        0.6 - 2010-02-15
-        ----------------
-        
-        - Fix the McCabe metric on some loops
-        
-Platform: UNKNOWN
-Classifier: Environment :: Console
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: Software Development :: Quality Assurance
deleted file mode 100644
--- a/flake8/flake8.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-CHANGES.rst
-CONTRIBUTORS.txt
-LICENSE
-MANIFEST.in
-README.rst
-setup.py
-flake8/__init__.py
-flake8/_pyflakes.py
-flake8/engine.py
-flake8/hooks.py
-flake8/main.py
-flake8/run.py
-flake8/util.py
-flake8.egg-info/PKG-INFO
-flake8.egg-info/SOURCES.txt
-flake8.egg-info/dependency_links.txt
-flake8.egg-info/entry_points.txt
-flake8.egg-info/requires.txt
-flake8.egg-info/top_level.txt
-flake8/tests/__init__.py
-flake8/tests/test_flakes.py
-scripts/flake8.cmd
\ No newline at end of file
deleted file mode 100644
--- a/flake8/flake8.egg-info/dependency_links.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-
deleted file mode 100644
--- a/flake8/flake8.egg-info/entry_points.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-[flake8.extension]
-F = flake8._pyflakes:FlakesChecker
-
-[console_scripts]
-flake8 = flake8.main:main
-
-[distutils.commands]
-flake8 = flake8.main:Flake8Command
-
deleted file mode 100644
--- a/flake8/flake8.egg-info/requires.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-setuptools
-pyflakes >= 0.6.1
-pep8 >= 1.4.3
-mccabe >= 0.2
\ No newline at end of file
deleted file mode 100644
--- a/flake8/flake8.egg-info/top_level.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-flake8
deleted file mode 100644
--- a/flake8/flake8/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-
-__version__ = '2.0'
deleted file mode 100644
--- a/flake8/flake8/_pyflakes.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# -*- coding: utf-8 -*-
-import pyflakes
-import pyflakes.checker
-
-
-def patch_pyflakes():
-    """Add error codes to Pyflakes messages."""
-    codes = dict([line.split()[::-1] for line in (
-        'F401 UnusedImport',
-        'F402 ImportShadowedByLoopVar',
-        'F403 ImportStarUsed',
-        'F404 LateFutureImport',
-        'F810 Redefined',               # XXX Obsolete?
-        'F811 RedefinedWhileUnused',
-        'F812 RedefinedInListComp',
-        'F821 UndefinedName',
-        'F822 UndefinedExport',
-        'F823 UndefinedLocal',
-        'F831 DuplicateArgument',
-        'F841 UnusedVariable',
-    )])
-
-    for name, obj in vars(pyflakes.messages).items():
-        if name[0].isupper() and obj.message:
-            obj.flake8_msg = '%s %s' % (codes.get(name, 'F999'), obj.message)
-patch_pyflakes()
-
-
-class FlakesChecker(pyflakes.checker.Checker):
-    """Subclass the Pyflakes checker to conform with the flake8 API."""
-    name = 'pyflakes'
-    version = pyflakes.__version__
-
-    @classmethod
-    def add_options(cls, parser):
-        parser.add_option('--builtins',
-                          help="define more built-ins, comma separated")
-        parser.config_options.append('builtins')
-
-    @classmethod
-    def parse_options(cls, options):
-        if options.builtins:
-            cls.builtIns = cls.builtIns.union(options.builtins.split(','))
-
-    def run(self):
-        for m in self.messages:
-            yield m.lineno, 0, (m.flake8_msg % m.message_args), m.__class__
deleted file mode 100644
--- a/flake8/flake8/engine.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# -*- coding: utf-8 -*-
-import re
-
-import pep8
-
-from flake8 import __version__
-from flake8.util import OrderedSet
-
-_flake8_noqa = re.compile(r'flake8[:=]\s*noqa', re.I).search
-
-
-def _register_extensions():
-    """Register all the extensions."""
-    extensions = OrderedSet()
-    extensions.add(('pep8', pep8.__version__))
-    parser_hooks = []
-    options_hooks = []
-    try:
-        from pkg_resources import iter_entry_points
-    except ImportError:
-        pass
-    else:
-        for entry in iter_entry_points('flake8.extension'):
-            checker = entry.load()
-            pep8.register_check(checker, codes=[entry.name])
-            extensions.add((checker.name, checker.version))
-            if hasattr(checker, 'add_options'):
-                parser_hooks.append(checker.add_options)
-            if hasattr(checker, 'parse_options'):
-                options_hooks.append(checker.parse_options)
-    return extensions, parser_hooks, options_hooks
-
-
-def get_parser():
-    """This returns an instance of optparse.OptionParser with all the
-    extensions registered and options set. This wraps ``pep8.get_parser``.
-    """
-    (extensions, parser_hooks, options_hooks) = _register_extensions()
-    details = ', '.join(['%s: %s' % ext for ext in extensions])
-    parser = pep8.get_parser('flake8', '%s (%s)' % (__version__, details))
-    for opt in ('--repeat', '--testsuite', '--doctest'):
-        try:
-            parser.remove_option(opt)
-        except ValueError:
-            pass
-    parser.add_option('--exit-zero', action='store_true',
-                      help="exit with code 0 even if there are errors")
-    for parser_hook in parser_hooks:
-        parser_hook(parser)
-    parser.add_option('--install-hook', default=False, action='store_true',
-                      help='Install the appropriate hook for this '
-                      'repository.', dest='install_hook')
-    return parser, options_hooks
-
-
-class StyleGuide(pep8.StyleGuide):
-    # Backward compatibility pep8 <= 1.4.2
-    checker_class = pep8.Checker
-
-    def input_file(self, filename, lines=None, expected=None, line_offset=0):
-        """Run all checks on a Python source file."""
-        if self.options.verbose:
-            print('checking %s' % filename)
-        fchecker = self.checker_class(
-            filename, lines=lines, options=self.options)
-        # Any "# flake8: noqa" line?
-        if any(_flake8_noqa(line) for line in fchecker.lines):
-            return 0
-        return fchecker.check_all(expected=expected, line_offset=line_offset)
-
-
-def get_style_guide(**kwargs):
-    """Parse the options and configure the checker. This returns a sub-class 
-    of ``pep8.StyleGuide``."""
-    kwargs['parser'], options_hooks = get_parser()
-    styleguide = StyleGuide(**kwargs)
-    options = styleguide.options
-    for options_hook in options_hooks:
-        options_hook(options)
-    return styleguide
deleted file mode 100644
--- a/flake8/flake8/hooks.py
+++ /dev/null
@@ -1,156 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import with_statement
-import os
-import sys
-from subprocess import Popen, PIPE
-try:
-    from configparser import ConfigParser
-except ImportError:   # Python 2
-    from ConfigParser import ConfigParser
-
-from flake8.engine import get_parser, get_style_guide
-from flake8.main import DEFAULT_CONFIG
-
-
-def git_hook(complexity=-1, strict=False, ignore=None, lazy=False):
-    """This is the function used by the git hook.
-    
-    :param int complexity: (optional), any value > 0 enables complexity
-        checking with mccabe
-    :param bool strict: (optional), if True, this returns the total number of
-        errors which will cause the hook to fail
-    :param str ignore: (optional), a comma-separated list of errors and
-        warnings to ignore
-    :param bool lazy: (optional), allows for the instances where you don't add
-        the files to the index before running a commit, e.g., git commit -a
-    :returns: total number of errors if strict is True, otherwise 0
-    """
-    gitcmd = "git diff-index --cached --name-only HEAD"
-    if lazy:
-        gitcmd = gitcmd.replace('--cached ', '')
-
-    _, files_modified, _ = run(gitcmd)
-
-    flake8_style = get_style_guide(
-        config_file=DEFAULT_CONFIG, ignore=ignore, max_complexity=complexity)
-    report = flake8_style.check_files(files_modified)
-
-    if strict:
-        return report.total_errors
-
-    return 0
-
-
-def hg_hook(ui, repo, **kwargs):
-    """This is the function executed directly by Mercurial as part of the
-    hook. This is never called directly by the user, so the parameters are
-    undocumented. If you would like to learn more about them, please feel free
-    to read the official Mercurial documentation.
-    """
-    complexity = ui.config('flake8', 'complexity', default=-1)
-    strict = ui.configbool('flake8', 'strict', default=True)
-    config = ui.config('flake8', 'config', default=True)
-    if config is True:
-        config = DEFAULT_CONFIG
-
-    paths = _get_files(repo, **kwargs)
-
-    flake8_style = get_style_guide(
-        config_file=config, max_complexity=complexity)
-    report = flake8_style.check_files(paths)
-
-    if strict:
-        return report.total_errors
-
-    return 0
-
-
-def run(command):
-    p = Popen(command.split(), stdout=PIPE, stderr=PIPE)
-    (stdout, stderr) = p.communicate()
-    return (p.returncode, [line.strip() for line in stdout.splitlines()],
-            [line.strip() for line in stderr.splitlines()])
-
-
-def _get_files(repo, **kwargs):
-    seen = set()
-    for rev in range(repo[kwargs['node']], len(repo)):
-        for file_ in repo[rev].files():
-            file_ = os.path.join(repo.root, file_)
-            if file_ in seen or not os.path.exists(file_):
-                continue
-            seen.add(file_)
-            if file_.endswith('.py'):
-                yield file_
-
-
-def find_vcs():
-    if os.path.isdir('.git'):
-        if not os.path.isdir('.git/hooks'):
-            os.mkdir('.git/hooks')
-        return '.git/hooks/pre-commit'
-    elif os.path.isdir('.hg'):
-        return '.hg/hgrc'
-    return ''
-
-
-git_hook_file = """#!/usr/bin/env python
-import sys
-import os
-from flake8.hooks import git_hook
-
-COMPLEXITY = os.getenv('FLAKE8_COMPLEXITY', 10)
-STRICT = os.getenv('FLAKE8_STRICT', False)
-
-
-if __name__ == '__main__':
-    sys.exit(git_hook(complexity=COMPLEXITY, strict=STRICT))
-"""
-
-
-def _install_hg_hook(path):
-    c = ConfigParser()
-    c.readfp(open(path, 'r'))
-    if not c.has_section('hooks'):
-        c.add_section('hooks')
-
-    if not c.has_option('hooks', 'commit'):
-        c.set('hooks', 'commit', 'python:flake8.hooks.hg_hook')
-
-    if not c.has_option('hooks', 'qrefresh'):
-        c.set('hooks', 'qrefresh', 'python:flake8.hooks.hg_hook')
-
-    if not c.has_section('flake8'):
-        c.add_section('flake8')
-
-    if not c.has_option('flake8', 'complexity'):
-        c.set('flake8', 'complexity', str(os.getenv('FLAKE8_COMPLEXITY', 10)))
-
-    if not c.has_option('flake8', 'strict'):
-        c.set('flake8', 'strict', os.getenv('FLAKE8_STRICT', False))
-
-    c.write(open(path, 'w+'))
-
-
-def install_hook():
-    vcs = find_vcs()
-
-    if not vcs:
-        p = get_parser()
-        sys.stderr.write('Error: could not find either a git or mercurial '
-                         'directory. Please re-run this in a proper '
-                         'repository.')
-        p.print_help()
-        sys.exit(1)
-
-    status = 0
-    if 'git' in vcs:
-        with open(vcs, 'w+') as fd:
-            fd.write(git_hook_file)
-        os.chmod(vcs, 744)
-    elif 'hg' in vcs:
-        _install_hg_hook(vcs)
-    else:
-        status = 1
-
-    sys.exit(status)
deleted file mode 100644
--- a/flake8/flake8/main.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# -*- coding: utf-8 -*-
-import os
-import sys
-
-import setuptools
-
-from flake8.engine import get_style_guide
-
-if sys.platform.startswith('win'):
-    DEFAULT_CONFIG = os.path.expanduser(r'~\.flake8')
-else:
-    DEFAULT_CONFIG = os.path.join(
-        os.getenv('XDG_CONFIG_HOME') or os.path.expanduser('~/.config'),
-        'flake8'
-    )
-
-
-def main():
-    """Parse options and run checks on Python source."""
-    # Prepare
-    flake8_style = get_style_guide(parse_argv=True, config_file=DEFAULT_CONFIG)
-    options = flake8_style.options
-
-    if options.install_hook:
-        from flake8.hooks import install_hook
-        install_hook()
-
-    # Run the checkers
-    report = flake8_style.check_files()
-
-    # Print the final report
-    options = flake8_style.options
-    if options.statistics:
-        report.print_statistics()
-    if options.benchmark:
-        report.print_benchmark()
-    if report.total_errors:
-        if options.count:
-            sys.stderr.write(str(report.total_errors) + '\n')
-        if not options.exit_zero:
-            raise SystemExit(1)
-
-
-def check_file(path, ignore=(), complexity=-1):
-    """Checks a file using pep8 and pyflakes by default and mccabe 
-    optionally.
-
-    :param str path: path to the file to be checked
-    :param tuple ignore: (optional), error and warning codes to be ignored
-    :param int complexity: (optional), enables the mccabe check for values > 0
-    """
-    flake8_style = get_style_guide(
-        config_file=DEFAULT_CONFIG, ignore=ignore, max_complexity=complexity)
-    return flake8_style.input_file(path)
-
-
-def check_code(code, ignore=(), complexity=-1):
-    """Checks code using pep8 and pyflakes by default and mccabe optionally.
-
-    :param str code: code to be checked
-    :param tuple ignore: (optional), error and warning codes to be ignored
-    :param int complexity: (optional), enables the mccabe check for values > 0
-    """
-    flake8_style = get_style_guide(
-        config_file=DEFAULT_CONFIG, ignore=ignore, max_complexity=complexity)
-    return flake8_style.input_file('-', lines=code.splitlines())
-
-
-class Flake8Command(setuptools.Command):
-    """The :class:`Flake8Command` class is used by setuptools to perform
-    checks on registered modules.
-    """
-
-    description = "Run flake8 on modules registered in setuptools"
-    user_options = []
-
-    def initialize_options(self):
-        pass
-
-    def finalize_options(self):
-        pass
-
-    def distribution_files(self):
-        if self.distribution.packages:
-            for package in self.distribution.packages:
-                yield package.replace(".", os.path.sep)
-
-        if self.distribution.py_modules:
-            for filename in self.distribution.py_modules:
-                yield "%s.py" % filename
-
-    def run(self):
-        flake8_style = get_style_guide(config_file=DEFAULT_CONFIG)
-        paths = self.distribution_files()
-        report = flake8_style.check_files(paths)
-        raise SystemExit(report.total_errors > 0)
deleted file mode 100644
--- a/flake8/flake8/run.py
+++ /dev/null
@@ -1,11 +0,0 @@
-
-"""
-Implementation of the command-line I{flake8} tool.
-"""
-from flake8.hooks import git_hook, hg_hook                      # noqa
-from flake8.main import check_code, check_file, Flake8Command   # noqa
-from flake8.main import main
-
-
-if __name__ == '__main__':
-    main()
deleted file mode 100644
--- a/flake8/flake8/tests/__init__.py
+++ /dev/null
@@ -1,1 +0,0 @@
-#
deleted file mode 100644
--- a/flake8/flake8/tests/test_flakes.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# -*- coding: utf-8 -*-
-import sys
-
-from unittest import TestCase
-from pyflakes.api import check
-
-
-class FlakesTestReporter(object):
-    def __init__(self):
-        self.messages = []
-        self.flakes = self.messages.append
-
-    def unexpectedError(self, filename, msg):
-        self.flakes('[unexpectedError] %s: %s' % (filename, msg))
-
-    def syntaxError(self, filename, msg, lineno, offset, text):
-        self.flakes('[syntaxError] %s:%d: %s' % (filename, lineno, msg))
-
-
-code0 = """
-try:
-    pass
-except ValueError, err:
-    print(err)
-"""
-
-code1 = """
-try:
-    pass
-except ValueError as err:
-    print(err)
-"""
-
-code2 = """
-try:
-    pass
-except ValueError:
-    print("err")
-
-try:
-    pass
-except ValueError:
-    print("err")
-"""
-
-code3 = """
-try:
-    pass
-except (ImportError, ValueError):
-    print("err")
-"""
-
-code_from_import_exception = """
-from foo import SomeException
-try:
-    pass
-except SomeException:
-    print("err")
-"""
-
-code_import_exception = """
-import foo.SomeException
-try:
-    pass
-except foo.SomeException:
-    print("err")
-"""
-
-
-class TestFlake(TestCase):
-
-    def test_exception(self):
-        codes = [code1, code2, code3]
-        if sys.version_info < (2, 6):
-            codes[0] = code0
-        elif sys.version_info < (3,):
-            codes.insert(0, code0)
-        for code in codes:
-            reporter = FlakesTestReporter()
-            warnings = check(code, '(stdin)', reporter)
-            self.assertFalse(reporter.messages)
-            self.assertEqual(warnings, 0)
-
-    def test_from_import_exception_in_scope(self):
-        reporter = FlakesTestReporter()
-        warnings = check(code_from_import_exception, '(stdin)', reporter)
-        self.assertFalse(reporter.messages)
-        self.assertEqual(warnings, 0)
-
-    def test_import_exception_in_scope(self):
-        reporter = FlakesTestReporter()
-        warnings = check(code_import_exception, '(stdin)', reporter)
-        self.assertFalse(reporter.messages)
-        self.assertEqual(warnings, 0)
deleted file mode 100644
--- a/flake8/flake8/util.py
+++ /dev/null
@@ -1,37 +0,0 @@
-# -*- coding: utf-8 -*-
-
-try:
-    import ast
-    iter_child_nodes = ast.iter_child_nodes
-except ImportError:   # Python 2.5
-    import _ast as ast
-
-    if 'decorator_list' not in ast.ClassDef._fields:
-        # Patch the missing attribute 'decorator_list'
-        ast.ClassDef.decorator_list = ()
-        ast.FunctionDef.decorator_list = property(lambda s: s.decorators)
-
-    def iter_child_nodes(node):
-        """
-        Yield all direct child nodes of *node*, that is, all fields that
-        are nodes and all items of fields that are lists of nodes.
-        """
-        if not node._fields:
-            return
-        for name in node._fields:
-            field = getattr(node, name, None)
-            if isinstance(field, ast.AST):
-                yield field
-            elif isinstance(field, list):
-                for item in field:
-                    if isinstance(item, ast.AST):
-                        yield item
-
-
-class OrderedSet(list):
-    """List without duplicates."""
-    __slots__ = ()
-
-    def add(self, value):
-        if value not in self:
-            self.append(value)
deleted file mode 100644
--- a/flake8/scripts/flake8.cmd
+++ /dev/null
@@ -1,6 +0,0 @@
-@setlocal enableextensions & python -x %~f0 %* & goto :EOF
-# -*- mode: python -*-
-from flake8.run import main
-
-if __name__ == '__main__':
-    main()
deleted file mode 100644
--- a/flake8/setup.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-[egg_info]
-tag_build = 
-tag_date = 0
-tag_svn_revision = 0
-
deleted file mode 100644
--- a/flake8/setup.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import with_statement
-from setuptools import setup
-
-
-def get_version(fname='flake8/__init__.py'):
-    with open(fname) as f:
-        for line in f:
-            if line.startswith('__version__'):
-                return eval(line.split('=')[-1])
-
-
-def get_long_description():
-    descr = []
-    for fname in ('README.rst', 'CHANGES.rst'):
-        with open(fname) as f:
-            descr.append(f.read())
-    return '\n\n'.join(descr)
-
-
-setup(
-    name="flake8",
-    license="MIT",
-    version=get_version(),
-    description="the modular source code checker: pep8, pyflakes and co",
-    long_description=get_long_description(),
-    author="Tarek Ziade",
-    author_email="tarek@ziade.org",
-    maintainer="Ian Cordasco",
-    maintainer_email="graffatcolmingov@gmail.com",
-    url="http://bitbucket.org/tarek/flake8",
-    packages=["flake8", "flake8.tests"],
-    install_requires=[
-        "setuptools",
-        "pyflakes >= 0.6.1",
-        "pep8 >= 1.4.3",
-        "mccabe >= 0.2",
-    ],
-    entry_points={
-        'distutils.commands': ['flake8 = flake8.main:Flake8Command'],
-        'console_scripts': ['flake8 = flake8.main:main'],
-        'flake8.extension': [
-            'F = flake8._pyflakes:FlakesChecker',
-        ],
-    },
-    classifiers=[
-        "Environment :: Console",
-        "Intended Audience :: Developers",
-        "License :: OSI Approved :: MIT License",
-        "Programming Language :: Python",
-        "Programming Language :: Python :: 2",
-        "Programming Language :: Python :: 3",
-        "Topic :: Software Development :: Libraries :: Python Modules",
-        "Topic :: Software Development :: Quality Assurance",
-    ],
-    tests_require=['nose'],
-    test_suite='nose.collector',
-)
deleted file mode 100644
--- a/mccabe/PKG-INFO
+++ /dev/null
@@ -1,110 +0,0 @@
-Metadata-Version: 1.1
-Name: mccabe
-Version: 0.2.1
-Summary: McCabe checker, plugin for flake8
-Home-page: https://github.com/flintwork/mccabe
-Author: Florent Xicluna
-Author-email: florent.xicluna@gmail.com
-License: Expat license
-Description: McCabe complexity checker
-        =========================
-        
-        Ned's script to check McCabe complexity.
-        
-        This module provides a plugin for ``flake8``, the Python code checker.
-        
-        
-        Installation
-        ------------
-        
-        You can install, upgrade, uninstall ``mccabe`` with these commands::
-        
-          $ pip install mccabe
-          $ pip install --upgrade mccabe
-          $ pip uninstall mccabe
-        
-        
-        Standalone script
-        -----------------
-        
-        The complexity checker can be used directly::
-        
-          $ python -m mccabe --min 5 mccabe.py
-          ("185:1: 'PathGraphingAstVisitor.visitIf'", 5)
-          ("71:1: 'PathGraph.to_dot'", 5)
-          ("245:1: 'McCabeChecker.run'", 5)
-          ("283:1: 'main'", 7)
-          ("203:1: 'PathGraphingAstVisitor.visitTryExcept'", 5)
-          ("257:1: 'get_code_complexity'", 5)
-        
-        
-        Plugin for Flake8
-        -----------------
-        
-        When both ``flake8 2.0`` and ``mccabe`` are installed, the plugin is
-        available in ``flake8``::
-        
-          $ flake8 --version
-          2.0 (pep8: 1.4.2, pyflakes: 0.6.1, mccabe: 0.2)
-        
-        By default the plugin is disabled.  Use the ``--max-complexity`` switch to
-        enable it.  It will emit a warning if the McCabe complexity of a function is
-        higher that the value::
-        
-            $ flake8 --max-complexity 10 coolproject
-            ...
-            coolproject/mod.py:1204:1: C901 'CoolFactory.prepare' is too complex (14)
-        
-        This feature is quite useful to detect over-complex code. According to McCabe,
-        anything that goes beyond 10 is too complex.
-        
-        
-        Links
-        -----
-        
-        * Feedback and ideas: http://mail.python.org/mailman/listinfo/code-quality
-        
-        * Cyclomatic complexity: http://en.wikipedia.org/wiki/Cyclomatic_complexity.
-        
-        * Ned Batchelder's script:
-          http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html
-        
-        
-        Changes
-        -------
-        
-        0.2.1 - 2013-04-03
-        ``````````````````
-        
-        * Do not require ``setuptools`` in setup.py.  It works around an issue
-          with ``pip`` and Python 3.
-        
-        
-        0.2 - 2013-02-22
-        ````````````````
-        
-        * Rename project ``flint-mccabe`` to ``mccabe``.
-        
-        * Provide ``flake8.extension`` setuptools entry point.
-        
-        * Read ``max-complexity`` from the configuration file.
-        
-        * Rename argument ``min_complexity`` to ``threshold``.
-        
-        
-        0.1 - 2013-02-11
-        ````````````````
-        * First release
-        
-Keywords: flake8 mccabe
-Platform: UNKNOWN
-Classifier: Development Status :: 3 - Alpha
-Classifier: Environment :: Console
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: Software Development :: Quality Assurance
deleted file mode 100644
--- a/mccabe/README.rst
+++ /dev/null
@@ -1,89 +0,0 @@
-McCabe complexity checker
-=========================
-
-Ned's script to check McCabe complexity.
-
-This module provides a plugin for ``flake8``, the Python code checker.
-
-
-Installation
-------------
-
-You can install, upgrade, uninstall ``mccabe`` with these commands::
-
-  $ pip install mccabe
-  $ pip install --upgrade mccabe
-  $ pip uninstall mccabe
-
-
-Standalone script
------------------
-
-The complexity checker can be used directly::
-
-  $ python -m mccabe --min 5 mccabe.py
-  ("185:1: 'PathGraphingAstVisitor.visitIf'", 5)
-  ("71:1: 'PathGraph.to_dot'", 5)
-  ("245:1: 'McCabeChecker.run'", 5)
-  ("283:1: 'main'", 7)
-  ("203:1: 'PathGraphingAstVisitor.visitTryExcept'", 5)
-  ("257:1: 'get_code_complexity'", 5)
-
-
-Plugin for Flake8
------------------
-
-When both ``flake8 2.0`` and ``mccabe`` are installed, the plugin is
-available in ``flake8``::
-
-  $ flake8 --version
-  2.0 (pep8: 1.4.2, pyflakes: 0.6.1, mccabe: 0.2)
-
-By default the plugin is disabled.  Use the ``--max-complexity`` switch to
-enable it.  It will emit a warning if the McCabe complexity of a function is
-higher that the value::
-
-    $ flake8 --max-complexity 10 coolproject
-    ...
-    coolproject/mod.py:1204:1: C901 'CoolFactory.prepare' is too complex (14)
-
-This feature is quite useful to detect over-complex code. According to McCabe,
-anything that goes beyond 10 is too complex.
-
-
-Links
------
-
-* Feedback and ideas: http://mail.python.org/mailman/listinfo/code-quality
-
-* Cyclomatic complexity: http://en.wikipedia.org/wiki/Cyclomatic_complexity.
-
-* Ned Batchelder's script:
-  http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html
-
-
-Changes
--------
-
-0.2.1 - 2013-04-03
-``````````````````
-
-* Do not require ``setuptools`` in setup.py.  It works around an issue
-  with ``pip`` and Python 3.
-
-
-0.2 - 2013-02-22
-````````````````
-
-* Rename project ``flint-mccabe`` to ``mccabe``.
-
-* Provide ``flake8.extension`` setuptools entry point.
-
-* Read ``max-complexity`` from the configuration file.
-
-* Rename argument ``min_complexity`` to ``threshold``.
-
-
-0.1 - 2013-02-11
-````````````````
-* First release
deleted file mode 100644
--- a/mccabe/mccabe.egg-info/PKG-INFO
+++ /dev/null
@@ -1,110 +0,0 @@
-Metadata-Version: 1.1
-Name: mccabe
-Version: 0.2.1
-Summary: McCabe checker, plugin for flake8
-Home-page: https://github.com/flintwork/mccabe
-Author: Florent Xicluna
-Author-email: florent.xicluna@gmail.com
-License: Expat license
-Description: McCabe complexity checker
-        =========================
-        
-        Ned's script to check McCabe complexity.
-        
-        This module provides a plugin for ``flake8``, the Python code checker.
-        
-        
-        Installation
-        ------------
-        
-        You can install, upgrade, uninstall ``mccabe`` with these commands::
-        
-          $ pip install mccabe
-          $ pip install --upgrade mccabe
-          $ pip uninstall mccabe
-        
-        
-        Standalone script
-        -----------------
-        
-        The complexity checker can be used directly::
-        
-          $ python -m mccabe --min 5 mccabe.py
-          ("185:1: 'PathGraphingAstVisitor.visitIf'", 5)
-          ("71:1: 'PathGraph.to_dot'", 5)
-          ("245:1: 'McCabeChecker.run'", 5)
-          ("283:1: 'main'", 7)
-          ("203:1: 'PathGraphingAstVisitor.visitTryExcept'", 5)
-          ("257:1: 'get_code_complexity'", 5)
-        
-        
-        Plugin for Flake8
-        -----------------
-        
-        When both ``flake8 2.0`` and ``mccabe`` are installed, the plugin is
-        available in ``flake8``::
-        
-          $ flake8 --version
-          2.0 (pep8: 1.4.2, pyflakes: 0.6.1, mccabe: 0.2)
-        
-        By default the plugin is disabled.  Use the ``--max-complexity`` switch to
-        enable it.  It will emit a warning if the McCabe complexity of a function is
-        higher that the value::
-        
-            $ flake8 --max-complexity 10 coolproject
-            ...
-            coolproject/mod.py:1204:1: C901 'CoolFactory.prepare' is too complex (14)
-        
-        This feature is quite useful to detect over-complex code. According to McCabe,
-        anything that goes beyond 10 is too complex.
-        
-        
-        Links
-        -----
-        
-        * Feedback and ideas: http://mail.python.org/mailman/listinfo/code-quality
-        
-        * Cyclomatic complexity: http://en.wikipedia.org/wiki/Cyclomatic_complexity.
-        
-        * Ned Batchelder's script:
-          http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html
-        
-        
-        Changes
-        -------
-        
-        0.2.1 - 2013-04-03
-        ``````````````````
-        
-        * Do not require ``setuptools`` in setup.py.  It works around an issue
-          with ``pip`` and Python 3.
-        
-        
-        0.2 - 2013-02-22
-        ````````````````
-        
-        * Rename project ``flint-mccabe`` to ``mccabe``.
-        
-        * Provide ``flake8.extension`` setuptools entry point.
-        
-        * Read ``max-complexity`` from the configuration file.
-        
-        * Rename argument ``min_complexity`` to ``threshold``.
-        
-        
-        0.1 - 2013-02-11
-        ````````````````
-        * First release
-        
-Keywords: flake8 mccabe
-Platform: UNKNOWN
-Classifier: Development Status :: 3 - Alpha
-Classifier: Environment :: Console
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: Software Development :: Quality Assurance
deleted file mode 100644
--- a/mccabe/mccabe.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-README.rst
-mccabe.py
-setup.py
-mccabe.egg-info/PKG-INFO
-mccabe.egg-info/SOURCES.txt
-mccabe.egg-info/dependency_links.txt
-mccabe.egg-info/entry_points.txt
-mccabe.egg-info/not-zip-safe
-mccabe.egg-info/top_level.txt
\ No newline at end of file
deleted file mode 100644
--- a/mccabe/mccabe.egg-info/dependency_links.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-
deleted file mode 100644
--- a/mccabe/mccabe.egg-info/entry_points.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-[flake8.extension]
-C90 = mccabe:McCabeChecker
-
deleted file mode 100644
--- a/mccabe/mccabe.egg-info/not-zip-safe
+++ /dev/null
@@ -1,1 +0,0 @@
-
deleted file mode 100644
--- a/mccabe/mccabe.egg-info/top_level.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-mccabe
deleted file mode 100644
--- a/mccabe/mccabe.py
+++ /dev/null
@@ -1,312 +0,0 @@
-""" Meager code path measurement tool.
-    Ned Batchelder
-    http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html
-    MIT License.
-"""
-from __future__ import with_statement
-
-import optparse
-import sys
-from collections import defaultdict
-try:
-    import ast
-    from ast import iter_child_nodes
-except ImportError:   # Python 2.5
-    from flake8.util import ast, iter_child_nodes
-
-__version__ = '0.2.1'
-
-
-class ASTVisitor(object):
-    """Performs a depth-first walk of the AST."""
-
-    def __init__(self):
-        self.node = None
-        self._cache = {}
-
-    def default(self, node, *args):
-        for child in iter_child_nodes(node):
-            self.dispatch(child, *args)
-
-    def dispatch(self, node, *args):
-        self.node = node
-        klass = node.__class__
-        meth = self._cache.get(klass)
-        if meth is None:
-            className = klass.__name__
-            meth = getattr(self.visitor, 'visit' + className, self.default)
-            self._cache[klass] = meth
-        return meth(node, *args)
-
-    def preorder(self, tree, visitor, *args):
-        """Do preorder walk of tree using visitor"""
-        self.visitor = visitor
-        visitor.visit = self.dispatch
-        self.dispatch(tree, *args)  # XXX *args make sense?
-
-
-class PathNode(object):
-    def __init__(self, name, look="circle"):
-        self.name = name
-        self.look = look
-
-    def to_dot(self):
-        print('node [shape=%s,label="%s"] %d;' % (
-            self.look, self.name, self.dot_id()))
-
-    def dot_id(self):
-        return id(self)
-
-
-class PathGraph(object):
-    def __init__(self, name, entity, lineno):
-        self.name = name
-        self.entity = entity
-        self.lineno = lineno
-        self.nodes = defaultdict(list)
-
-    def connect(self, n1, n2):
-        self.nodes[n1].append(n2)
-
-    def to_dot(self):
-        print('subgraph {')
-        for node in self.nodes:
-            node.to_dot()
-        for node, nexts in self.nodes.items():
-            for next in nexts:
-                print('%s -- %s;' % (node.dot_id(), next.dot_id()))
-        print('}')
-
-    def complexity(self):
-        """ Return the McCabe complexity for the graph.
-            V-E+2
-        """
-        num_edges = sum([len(n) for n in self.nodes.values()])
-        num_nodes = len(self.nodes)
-        return num_edges - num_nodes + 2
-
-
-class PathGraphingAstVisitor(ASTVisitor):
-    """ A visitor for a parsed Abstract Syntax Tree which finds executable
-        statements.
-    """
-
-    def __init__(self):
-        super(PathGraphingAstVisitor, self).__init__()
-        self.classname = ""
-        self.graphs = {}
-        self.reset()
-
-    def reset(self):
-        self.graph = None
-        self.tail = None
-
-    def dispatch_list(self, node_list):
-        for node in node_list:
-            self.dispatch(node)
-
-    def visitFunctionDef(self, node):
-
-        if self.classname:
-            entity = '%s%s' % (self.classname, node.name)
-        else:
-            entity = node.name
-
-        name = '%d:1: %r' % (node.lineno, entity)
-
-        if self.graph is not None:
-            # closure
-            pathnode = self.appendPathNode(name)
-            self.tail = pathnode
-            self.dispatch_list(node.body)
-            bottom = PathNode("", look='point')
-            self.graph.connect(self.tail, bottom)
-            self.graph.connect(pathnode, bottom)
-            self.tail = bottom
-        else:
-            self.graph = PathGraph(name, entity, node.lineno)
-            pathnode = PathNode(name)
-            self.tail = pathnode
-            self.dispatch_list(node.body)
-            self.graphs["%s%s" % (self.classname, node.name)] = self.graph
-            self.reset()
-
-    def visitClassDef(self, node):
-        old_classname = self.classname
-        self.classname += node.name + "."
-        self.dispatch_list(node.body)
-        self.classname = old_classname
-
-    def appendPathNode(self, name):
-        if not self.tail:
-            return
-        pathnode = PathNode(name)
-        self.graph.connect(self.tail, pathnode)
-        self.tail = pathnode
-        return pathnode
-
-    def visitSimpleStatement(self, node):
-        if node.lineno is None:
-            lineno = 0
-        else:
-            lineno = node.lineno
-        name = "Stmt %d" % lineno
-        self.appendPathNode(name)
-
-    visitAssert = visitAssign = visitAugAssign = visitDelete = visitPrint = \
-        visitRaise = visitYield = visitImport = visitCall = visitSubscript = \
-        visitPass = visitContinue = visitBreak = visitGlobal = visitReturn = \
-        visitSimpleStatement
-
-    def visitLoop(self, node):
-        name = "Loop %d" % node.lineno
-
-        if self.graph is None:
-            # global loop
-            self.graph = PathGraph(name, name, node.lineno)
-            pathnode = PathNode(name)
-            self.tail = pathnode
-            self.dispatch_list(node.body)
-            self.graphs["%s%s" % (self.classname, name)] = self.graph
-            self.reset()
-        else:
-            pathnode = self.appendPathNode(name)
-            self.tail = pathnode
-            self.dispatch_list(node.body)
-            bottom = PathNode("", look='point')
-            self.graph.connect(self.tail, bottom)
-            self.graph.connect(pathnode, bottom)
-            self.tail = bottom
-
-        # TODO: else clause in node.orelse
-
-    visitFor = visitWhile = visitLoop
-
-    def visitIf(self, node):
-        name = "If %d" % node.lineno
-        pathnode = self.appendPathNode(name)
-        loose_ends = []
-        self.dispatch_list(node.body)
-        loose_ends.append(self.tail)
-        if node.orelse:
-            self.tail = pathnode
-            self.dispatch_list(node.orelse)
-            loose_ends.append(self.tail)
-        else:
-            loose_ends.append(pathnode)
-        if pathnode:
-            bottom = PathNode("", look='point')
-            for le in loose_ends:
-                self.graph.connect(le, bottom)
-            self.tail = bottom
-
-    def visitTryExcept(self, node):
-        name = "TryExcept %d" % node.lineno
-        pathnode = self.appendPathNode(name)
-        loose_ends = []
-        self.dispatch_list(node.body)
-        loose_ends.append(self.tail)
-        for handler in node.handlers:
-            self.tail = pathnode
-            self.dispatch_list(handler.body)
-            loose_ends.append(self.tail)
-        if pathnode:
-            bottom = PathNode("", look='point')
-            for le in loose_ends:
-                self.graph.connect(le, bottom)
-            self.tail = bottom
-
-    def visitWith(self, node):
-        name = "With %d" % node.lineno
-        self.appendPathNode(name)
-        self.dispatch_list(node.body)
-
-
-class McCabeChecker(object):
-    """McCabe cyclomatic complexity checker."""
-    name = 'mccabe'
-    version = __version__
-    _code = 'C901'
-    _error_tmpl = "C901 %r is too complex (%d)"
-    max_complexity = 0
-
-    def __init__(self, tree, filename):
-        self.tree = tree
-
-    @classmethod
-    def add_options(cls, parser):
-        parser.add_option('--max-complexity', default=-1, action='store',
-                          type='int', help="McCabe complexity threshold")
-        parser.config_options.append('max-complexity')
-
-    @classmethod
-    def parse_options(cls, options):
-        cls.max_complexity = options.max_complexity
-
-    def run(self):
-        if self.max_complexity < 0:
-            return
-        visitor = PathGraphingAstVisitor()
-        visitor.preorder(self.tree, visitor)
-        for graph in visitor.graphs.values():
-            if graph.complexity() >= self.max_complexity:
-                text = self._error_tmpl % (graph.entity, graph.complexity())
-                yield graph.lineno, 0, text, type(self)
-
-
-def get_code_complexity(code, threshold=7, filename='stdin'):
-    try:
-        tree = compile(code, filename, "exec", ast.PyCF_ONLY_AST)
-    except SyntaxError:
-        e = sys.exc_info()[1]
-        sys.stderr.write("Unable to parse %s: %s\n" % (filename, e))
-        return 0
-
-    complx = []
-    McCabeChecker.max_complexity = threshold
-    for lineno, offset, text, check in McCabeChecker(tree, filename).run():
-        complx.append('%s:%d:1: %s' % (filename, lineno, text))
-
-    if len(complx) == 0:
-        return 0
-    print('\n'.join(complx))
-    return len(complx)
-
-
-def get_module_complexity(module_path, threshold=7):
-    """Returns the complexity of a module"""
-    with open(module_path, "rU") as mod:
-        code = mod.read()
-    return get_code_complexity(code, threshold, filename=module_path)
-
-
-def main(argv):
-    opar = optparse.OptionParser()
-    opar.add_option("-d", "--dot", dest="dot",
-                    help="output a graphviz dot file", action="store_true")
-    opar.add_option("-m", "--min", dest="threshold",
-                    help="minimum complexity for output", type="int",
-                    default=2)
-
-    options, args = opar.parse_args(argv)
-
-    with open(args[0], "rU") as mod:
-        code = mod.read()
-    tree = compile(code, args[0], "exec", ast.PyCF_ONLY_AST)
-    visitor = PathGraphingAstVisitor()
-    visitor.preorder(tree, visitor)
-
-    if options.dot:
-        print('graph {')
-        for graph in visitor.graphs.values():
-            if graph.complexity() >= options.threshold:
-                graph.to_dot()
-        print('}')
-    else:
-        for graph in visitor.graphs.values():
-            if graph.complexity() >= options.threshold:
-                print(graph.name, graph.complexity())
-
-
-if __name__ == '__main__':
-    main(sys.argv[1:])
deleted file mode 100644
--- a/mccabe/setup.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-[egg_info]
-tag_build = 
-tag_date = 0
-tag_svn_revision = 0
-
deleted file mode 100644
--- a/mccabe/setup.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import with_statement
-from setuptools import setup
-
-
-def get_version(fname='mccabe.py'):
-    with open(fname) as f:
-        for line in f:
-            if line.startswith('__version__'):
-                return eval(line.split('=')[-1])
-
-
-def get_long_description():
-    descr = []
-    for fname in ('README.rst',):
-        with open(fname) as f:
-            descr.append(f.read())
-    return '\n\n'.join(descr)
-
-
-setup(
-    name='mccabe',
-    version=get_version(),
-    description="McCabe checker, plugin for flake8",
-    long_description=get_long_description(),
-    keywords='flake8 mccabe',
-    author='Tarek Ziade',
-    author_email='tarek@ziade.org',
-    maintainer='Florent Xicluna',
-    maintainer_email='florent.xicluna@gmail.com',
-    url='https://github.com/flintwork/mccabe',
-    license='Expat license',
-    py_modules=['mccabe'],
-    zip_safe=False,
-    entry_points={
-        'flake8.extension': [
-            'C90 = mccabe:McCabeChecker',
-        ],
-    },
-    classifiers=[
-        'Development Status :: 3 - Alpha',
-        'Environment :: Console',
-        'Intended Audience :: Developers',
-        'License :: OSI Approved :: MIT License',
-        'Operating System :: OS Independent',
-        'Programming Language :: Python',
-        'Programming Language :: Python :: 2',
-        'Programming Language :: Python :: 3',
-        'Topic :: Software Development :: Libraries :: Python Modules',
-        'Topic :: Software Development :: Quality Assurance',
-    ],
-)
deleted file mode 100644
deleted file mode 100644
--- a/mozautomation/bugzilla.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import unicode_literals
-
-from mozautomation.firefoxprofile import (
-    find_profiles,
-    get_cookies,
-)
-
-def get_cookie_auth(host='bugzilla.mozilla.org'):
-    """Obtain Bugzilla auth cookies from Firefox.
-
-    This returns an iterable of 2-tuples of (login, cookie) sorted by the
-    preferred usage order.
-    """
-
-    profiles = find_profiles(find_times=True)
-
-    auths = []
-    for name, path, is_default, newest_time in profiles:
-        login, auth = None, None
-        for cookie in get_cookies(path, host=host):
-            if cookie['name'] == 'Bugzilla_login':
-                login = cookie['value']
-            elif cookie['name'] == 'Bugzilla_logincookie':
-                auth = cookie['value']
-
-        if login and auth:
-            auths.append((login, auth, is_default, newest_time))
-
-    def cmp(a, b):
-        if a[2]:
-            return -1
-        elif b[2]:
-            return 1
-
-        if a[3] > b[3]:
-            return -1
-        elif a[3] < b[3]:
-            return 1
-        else:
-            return 0
-
-    auths = sorted(auths, cmp=cmp)
-
-    return [(e[0], e[1]) for e in auths]
deleted file mode 100644
--- a/mozautomation/buildbotdata.py
+++ /dev/null
@@ -1,228 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import unicode_literals
-
-import datetime
-import json
-import gzip
-import re
-import time
-import urllib2
-
-from collections import namedtuple
-from io import BytesIO
-
-
-BUILD_DATA_PREFIX = 'http://builddata.pub.build.mozilla.org/buildjson/'
-BUILD_DATA_URL = BUILD_DATA_PREFIX + 'builds-%s.js.gz'
-
-RE_BUILD_LISTING_ENTRY = re.compile(r'''
-    ^<a\shref="(?P<path>[^"]+)">[^<]+<\/a>
-    \s+
-    (?P<date>\d{2}-[^-]+-\d{4}\s\d{2}:\d{2})
-    \s+
-    (?P<size>[\d-]+)
-    $''', re.VERBOSE)
-
-
-BuilderInfo = namedtuple('BuilderInfo', ('category', 'master_id', 'name',
-    'slave_ids'))
-
-
-class BuildInfo(object):
-    """Describes buildbot data for a specific build/job"""
-
-    def __init__(self, o):
-        """Create from a JSON object describing the build."""
-
-        self.id = o['id']
-        self.builder_id = o['builder_id']
-        self.build_number = o['buildnumber']
-        self.master_id = o['master_id']
-        self.slave_id = o['slave_id']
-        self.start_time = o['starttime']
-        self.end_time = o['endtime']
-        self.reason = o['reason']
-        self.request_ids = o['request_ids']
-        self.result = o['result']
-        self.properties = dict(o['properties'])
-
-        self.duration = self.end_time - self.start_time
-
-
-def available_buildbot_dump_files():
-    """Obtain URLs of all buildbot dump files containing raw info for jobs."""
-
-    html = urllib2.urlopen(BUILD_DATA_PREFIX).read()
-
-    for line in html.splitlines():
-        if not line.startswith('<'):
-            continue
-
-        match = RE_BUILD_LISTING_ENTRY.match(line)
-        assert match
-
-        d = match.groupdict()
-
-        if d['path'].endswith('.tmp'):
-            continue
-
-        if d['size'] == '-':
-            continue
-
-        t = datetime.datetime.strptime(d['date'], '%d-%b-%Y %H:%M')
-
-        yield d['path'], t, int(d['size'])
-
-
-class BuildbotDump(object):
-    """Represents information from a buildbot dump file."""
-
-    def __init__(self, load_time=None):
-        """Create a new instance.
-
-        If day is specified as a datetime.date, the data for that day will be
-        loaded into this object.
-        """
-        self._masters = {}
-        self._slaves_by_id = {}
-        self._slaves_by_name = {}
-        self._builders_by_id = {}
-        self._builds_by_id = {}
-
-        # slave index to set of build IDs.
-        self._builds_by_slave_id = {}
-        self._builds_by_slave_name = {}
-
-        if load_time:
-            self.load_time(load_time)
-
-    def load_time(self, t):
-        datestring = time.strftime('%Y-%m-%d', time.gmtime(t))
-        self._load_url(BUILD_DATA_URL % datestring)
-
-    def load_date(self, d):
-        self._load_url(BUILD_DATA_URL % d.isoformat())
-
-    def _load_url(self, url):
-        raw = urllib2.urlopen(url).read()
-
-        if url.endswith('.gz'):
-            raw = BytesIO(raw)
-            raw = gzip.GzipFile(fileobj=raw).read()
-
-        obj = json.loads(raw, encoding='utf-8')
-        self.load_dump(obj)
-
-    def load_dump(self, o):
-        for master_id, master in o['masters'].items():
-            master_id = int(master_id)
-
-            self._masters[master_id] = (master['name'], master['url'])
-
-        for slave_id, name in o['slaves'].items():
-            slave_id = int(slave_id)
-            self._slaves_by_id[slave_id] = name
-            self._slaves_by_name[name] = slave_id
-
-        for builder_id, builder in o['builders'].items():
-            builder_id = int(builder_id)
-            category = builder['category']
-            master_id = builder['master_id']
-            name = builder['name']
-            slave_ids = set(builder['slaves'])
-
-            self._builders_by_id[builder_id] = BuilderInfo(
-                category=category, master_id=master_id, name=name,
-                slave_ids=slave_ids)
-
-        for build in o['builds']:
-            b = BuildInfo(build)
-            self._builds_by_id[b.id] = b
-            slave_name = self._slaves_by_id[b.slave_id]
-
-            self._builds_by_slave_id.setdefault(b.slave_id, set()).add(b.id)
-            self._builds_by_slave_name.setdefault(slave_name, set()).add(b.id)
-
-    @property
-    def slave_names(self):
-        return self._slaves_by_id.values()
-
-    def slave_name(self, slave_id):
-        return self._slaves_by_id[slave_id]
-
-    def slave_groups(self):
-        """Obtain information about groups of related slaves.
-
-        Returns a dictionary mapping the group name to a set of slave names.
-        """
-        groups = {}
-        for name in sorted(self.slave_names):
-            group = '-'.join(name.split('-')[0:-1])
-
-            groups.setdefault(group, set()).add(name)
-
-        return groups
-
-    def slave_efficiency(self, slave_id=None, slave_name=None):
-        """Obtain a summary of activity on a given slave."""
-
-        if slave_id:
-            build_ids = self._builds_by_slave_id.get(slave_id, set())
-        else:
-            build_ids = self._builds_by_slave_name.get(slave_name, set())
-
-        start_times = set()
-        end_times = set()
-        total_duration = 0
-
-        for build_id in build_ids:
-            build = self._builds_by_id[build_id]
-
-            start_times.add(build.start_time)
-            end_times.add(build.end_time)
-            total_duration += build.duration
-
-        if build_ids:
-            earliest = min(start_times)
-            latest = max(end_times)
-            active_total = latest - earliest
-            if active_total:
-                active_percent = float(total_duration) / float(active_total)
-            else:
-                active_percent = 0.0
-        else:
-            active_percent = 0.0
-
-        return (len(build_ids), total_duration, active_percent)
-
-    def jobs_timeline(self):
-        """Obtain a timeline of events for all jobs.
-
-        This is a generator of tuples describing events as they occur over
-        time.
-        """
-
-        events = []
-
-        for build in self._builds_by_id.values():
-            events.append((build.start_time, 'job_start', build))
-            events.append((build.end_time, 'job_end', build))
-
-        return sorted(events)
-
-    def slave_timeline(self, slave_id=None, slave_name=None):
-        """Obtain a timeline of events on a given slave."""
-
-        if slave_id:
-            build_ids = self._builds_by_slave_id.get(slave_id, set())
-        else:
-            build_ids = self._builds_by_slave_name.get(slave_name, set())
-
-        for build_id in sorted(build_ids):
-            build = self._builds_by_id[build_id]
-
-            yield (build.start_time, 'job_start', build)
-            yield (build.end_time, 'job_end', build)
deleted file mode 100644
--- a/mozautomation/buildstatus.py
+++ /dev/null
@@ -1,203 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import unicode_literals
-
-import json
-import urllib2
-
-
-PLATFORMS = dict(
-    ANDROID_4_0_PANDA=('Android 4.0', 10),
-    ANDROID_ARMV6_TEGRA_250=('Android 2.2 Armv6', 10),
-    ANDROID_TEGRA_250=('', 10),
-    ANDROID_TEGRA_250_NOION=('', 10),
-    B2G_EMULATOR_VM=('B2G Emu (VM)', 10),
-    B2G_EMULATOR=('B2G Emu', 10),
-    OSX_10_8=('OS X 10.8', 10),
-    OSX_10_7=('OS X 10.7', 10),
-    OSX_10_6=('OS X 10.6', 10),
-    UBUNTU_HW_1204_64=('Ubuntu64', 10),
-    UBUNTU_HW_1204_32=('Ubuntu32', 10),
-    UBUNTU_VM_1204_64=('Ubuntu64', 10),
-    UBUNTU_VM_1204_32=('Ubuntu32', 10),
-    WINDOWS_XP_32=('WinXP', 10),
-    WINDOWS_7_32=('Win7', 10),
-    WINDOWS_8=('Win8', 10),
-)
-
-PREFIXES = [
-    ('Windows XP 32-bit', 'WINDOWS_XP_32'),
-    ('Windows 7 32-bit', 'WINDOWS_7_32'),
-    ('WINNT 6.2', 'WINDOWS_8'),
-    ('Ubuntu HW 12.04 x64', 'UBUNTU_HW_1204_64'),
-    ('Ubuntu HW 12.04', 'UBUNTU_HW_1204_32'),
-    ('Ubuntu VM 12.04 x64', 'UBUNTU_VM_1204_64'),
-    ('Ubuntu VM 12.04', 'UBUNTU_VM_1204_32'),
-    ('Rev5 MacOSX Mountain Lion 10.8', 'OSX_10_8'),
-    ('Rev4 MacOSX Lion 10.7', 'OSX_10_7'),
-    ('Rev4 MacOSX Snow Leopard 10.6', 'OSX_10_6'),
-    ('Android 4.0 Panda', 'ANDROID_4_0_PANDA'),
-    ('Android Armv6 Tegra 250', 'ANDROID_ARMV6_TEGRA_250'),
-    ('Android Tegra 250', 'ANDROID_TEGRA_250'),
-    ('b2g_emulator_vm', 'B2G_EMULATOR_VM'),
-    ('b2g_emulator', 'B2G_EMULATOR'),
-
-    # This is where it starts to get a little inconsistent.
-    ('Android no-ionmonkey Tegra 250', 'ANDROID_TEGRA_250_NOION'),
-    ('Android no-ionmonkey', 'ANDROID_TEGRA_250_NOION'),
-]
-
-TREES = {'mozilla-central', 'mozilla-inbound'}
-
-JOBS = {
-    'build',
-    'chromez',
-    'crashtest',
-    'crashtest-1',
-    'crashtest-2',
-    'crashtest-3',
-    'crashtest-ipc',
-    'dirtypaint',
-    'dromaeojs',
-    'jetpack',
-    'jsreftest',
-    'jsreftest-1',
-    'jsreftest-2',
-    'jsreftest-3',
-    'hsreftest',
-    'marionette',
-    'marionette-webapi',
-    'mochitest-1',
-    'mochitest-2',
-    'mochitest-3',
-    'mochitest-4',
-    'mochitest-5',
-    'mochitest-6',
-    'mochitest-7',
-    'mochitest-8',
-    'mochitest-9',
-    'mochitest-browser-chrome',
-    'mochitest-gl',
-    'mochitest-metro-chrome',
-    'mochitest-other',
-    'other',
-    'plain-reftest-1',
-    'plain-reftest-2',
-    'plain-reftest-3',
-    'plain-reftest-4',
-    'reftest',
-    'reftest-1',
-    'reftest-2',
-    'reftest-3',
-    'reftest-4',
-    'reftest-5',
-    'reftest-6',
-    'reftest-7',
-    'reftest-8',
-    'reftest-9',
-    'reftest-10',
-    'reftest-ipc',
-    'reftest-no-accel',
-    'remote-tp4m_chochrome',
-    'remote-tp4m_nochrome',
-    'remote-trobocheck2',
-    'remote-trobopan',
-    'remote-troboprovider',
-    'remote-ts',
-    'remote-tsvg',
-    'robocop-1',
-    'robocop-2',
-    'svgr',
-    'talos',
-    'tp5o',
-    'xpcshell',
-}
-
-
-def parse_builder_name(b):
-    """Parse a builder name into metadata."""
-
-    platform = None
-
-    remaining = ''
-
-    for prefix, key in PREFIXES:
-        if b.startswith(prefix):
-            platform = key
-            remaining = b[len(prefix)+1:]
-            break
-
-    tree = None
-    opt_level = None
-    job_type = None
-    props = set(remaining.split())
-    try:
-        props.remove('test')
-    except KeyError:
-        pass
-
-    for t in TREES:
-        if t in props:
-            tree = t
-            props.remove(t)
-            break
-
-    if 'opt' in props:
-        opt_level = 'opt'
-    elif 'debug' in props:
-        opt_level = 'debug'
-    elif 'pgo' in props:
-        opt_level = 'pgo'
-
-    if opt_level:
-        props.remove(opt_level)
-
-    for job in JOBS:
-        if job in props:
-            job_type = job
-            props.remove(job)
-
-
-class JobResult(object):
-    """Represents the result of an individual automation job."""
-
-    def __init__(self, d):
-        self.build_id = d['_id']
-        self.builder_name = d['buildername']
-        self.slave = d['slave']
-        self.result = d['result']
-        self.start_time = int(d['starttime'])
-        self.end_time = int(d['endtime'])
-        self.log = d['log']
-        self.notes = d['notes']
-
-
-class BuildStatusResult(object):
-    def __init__(self, o):
-        self.jobs = []
-        for job in o:
-            self.jobs.append(JobResult(job))
-
-
-class BuildStatusClient(object):
-    """Client to interface with build status API."""
-
-    def __init__(self, base_uri='https://tbpl.mozilla.org/php/'):
-        self._base_uri = base_uri
-        self._opener = urllib2.build_opener()
-
-    def revision_builds(self, repo, changeset):
-        """Obtain the build status for a single changeset in a repository."""
-
-        # The API only accepts 12 digit short form changesets.
-        if len(changeset) > 12:
-            changeset = changeset[0:12]
-
-        request = urllib2.Request('%sgetRevisionBuilds.php?branch=%s&rev=%s' %
-            (self._base_uri, repo, changeset))
-
-        response = self._opener.open(request)
-
-        return BuildStatusResult(json.load(response))
deleted file mode 100644
--- a/mozautomation/changetracker.py
+++ /dev/null
@@ -1,158 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import unicode_literals
-
-import binascii
-import os
-import sqlite3
-
-from .repository import (
-    MercurialRepository,
-    resolve_trees_to_uris,
-)
-
-
-class ChangeTracker(object):
-    """Data store for tracking changes and bugs and repository events."""
-
-    def __init__(self, path):
-        self.path = path
-        self.created = False
-        if not os.path.exists(path):
-            self.created = True
-
-        self._db = sqlite3.connect(path)
-
-        # We don't care about data loss because all data can be reconstructed
-        # relatively easily.
-        self._db.execute('PRAGMA SYNCHRONOUS=OFF')
-        self._db.execute('PRAGMA JOURNAL_MODE=WAL')
-
-        self._create_schema(self._schema_version)
-
-    @property
-    def _schema_version(self):
-        return self._db.execute('PRAGMA user_version').fetchone()[0]
-
-    def _create_schema(self, existing):
-        if existing < 2 and not self.created:
-            raise Exception("Incompatible local database detected. Delete "
-                "database file and try again: %s" % self.path)
-
-        with self._db:
-            self._db.execute('CREATE TABLE IF NOT EXISTS trees ('
-                'id INTEGER PRIMARY KEY AUTOINCREMENT, '
-                'name TEXT, '
-                'url TEXT '
-                ')')
-
-            self._db.execute('CREATE TABLE IF NOT EXISTS pushes ('
-                'push_id INTEGER, '
-                'tree_id INTEGER, '
-                'time INTEGER, '
-                'user TEXT, '
-                'PRIMARY KEY (push_id, tree_id) '
-                ')')
-
-            self._db.execute('CREATE TABLE IF NOT EXISTS changeset_pushes ('
-                'changeset BLOB, '
-                'head_changeset BLOB, '
-                'push_id INTEGER, '
-                'tree_id INTEGER, '
-                'UNIQUE (changeset, tree_id) '
-                ')')
-
-            self._db.execute('CREATE TABLE IF NOT EXISTS bug_changesets ('
-                'bug INTEGER, '
-                'changeset BLOB, '
-                'UNIQUE (bug, changeset) '
-                ')')
-
-            self._db.execute('CREATE INDEX IF NOT EXISTS i_bug_changesets_bug '
-                'ON bug_changesets (bug)')
-
-            self._db.execute('PRAGMA user_version=2')
-
-    def tree_id(self, tree, url=None):
-        with self._db:
-            field = self._db.execute('SELECT id FROM trees WHERE name=? LIMIT 1',
-                [tree]).fetchone()
-
-            if field:
-                return field[0]
-
-            self._db.execute('INSERT INTO trees (name, url) VALUES (?, ?)',
-                [tree, url])
-
-            return self._db.execute('SELECT id FROM trees WHERE name=? LIMIT 1',
-                [tree]).fetchone()[0]
-
-    def load_pushlog(self, tree):
-        tree, url = resolve_trees_to_uris([tree])[0]
-        repo = MercurialRepository(url)
-
-        tree_id = self.tree_id(tree, url)
-
-        last_push_id = self._db.execute('SELECT push_id FROM pushes WHERE '
-            'tree_id=? ORDER BY push_id DESC LIMIT 1', [tree_id]).fetchone()
-
-        last_push_id = last_push_id[0] if last_push_id else -1
-
-        with self._db:
-            for push_id, push in repo.push_info(start_id=last_push_id + 1):
-                self._db.execute('INSERT INTO pushes (push_id, tree_id, time, '
-                'user) VALUES (?, ?, ?, ?)', [push_id, tree_id, push['date'],
-                    push['user']])
-
-                head = buffer(binascii.unhexlify(push['changesets'][-1]))
-
-                params = [(buffer(binascii.unhexlify(c)), head, push_id,
-                    tree_id) for c in push['changesets']]
-                self._db.executemany('INSERT INTO changeset_pushes VALUES '
-                    '(?, ?, ?, ?)', params)
-
-    def pushes_for_changeset(self, changeset):
-        for row in self._db.execute('SELECT trees.name, pushes.push_id, '
-            'pushes.time, pushes.user, changeset_pushes.head_changeset '
-            'FROM trees, pushes, changeset_pushes '
-            'WHERE pushes.push_id = changeset_pushes.push_id AND '
-            'pushes.tree_id = changeset_pushes.tree_id AND '
-            'trees.id = pushes.tree_id AND changeset_pushes.changeset=? '
-            'ORDER BY pushes.time ASC', [buffer(changeset)]):
-            yield row
-
-    def tree_push_heads(self, tree):
-        """Obtain all pushes on a given tree."""
-        for name, pid, t, user, head in self._db.execute(
-            'SELECT trees.name, pushes.push_id, '
-            'pushes.time, pushes.user, changeset_pushes.head_changeset '
-            'FROM trees, pushes, changeset_pushes '
-            'WHERE pushes.push_id = changeset_pushes.push_id AND '
-            'pushes.tree_id = changeset_pushes.tree_id AND '
-            'trees.id = pushes.tree_id AND trees.name=? '
-            'ORDER BY pushes.time ASC', [tree]):
-            yield name, pid, t, user, str(head)
-
-    def associate_bugs_with_changeset(self, bugs, changeset):
-        """Associate a numeric bug number with a changeset.
-
-        This facilitates rapidly looking up changesets associated with
-        bugs.
-        """
-        if len(changeset) != 20:
-            raise ValueError('Expected binary changesets, not hex.')
-
-        with self._db:
-            self._db.executemany('INSERT OR REPLACE INTO bug_changesets '
-                'VALUES (?, ?)', [(bug, buffer(changeset)) for bug in bugs])
-
-    def changesets_with_bug(self, bug):
-        for row in self._db.execute('SELECT changeset FROM bug_changesets WHERE '
-            'bug = ?', [bug]):
-            yield str(row[0])
-
-    def wipe_bugs(self):
-        with self._db:
-            self._db.execute('DELETE FROM bug_changesets')
deleted file mode 100644
--- a/mozautomation/commitparser.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# This module contains utilities for parsing commit messages.
-
-import re
-
-# These regular expressions are not very robust. Specifically, they fail to
-# handle lists well.
-
-BUG_RE = re.compile(
-    r'''# bug followed by any sequence of numbers, or
-        # a standalone sequence of numbers
-         (
-           (?:
-             bug |
-             b= |
-             # a sequence of 5+ numbers preceded by whitespace
-             (?=\b\#?\d{5,}) |
-             # numbers at the very beginning
-             ^(?=\d)
-           )
-           (?:\s*\#?)(\d+)
-         )''', re.I | re.X)
-
-REVIEW_RE = re.compile(r'[ra][=?]+(\w[^ ]+)')
-
-LIST_RE = re.compile(r'[;\.,\+\/\\]')
-
-def parse_bugs(s):
-    bugs = [int(m[1]) for m in BUG_RE.findall(s)]
-    return [bug for bug in bugs if bug < 100000000]
-
-def parse_reviewers(s):
-    for r in REVIEW_RE.findall(s):
-        for part in LIST_RE.split(r):
-            yield part.strip('[](){}')
deleted file mode 100644
--- a/mozautomation/firefoxprofile.py
+++ /dev/null
@@ -1,138 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import unicode_literals
-
-import contextlib
-import os
-import platform
-import shutil
-import sqlite3
-import tempfile
-
-from ConfigParser import RawConfigParser
-
-
-def find_profiles(find_times=False):
-    """Find Firefox profile directories.
-
-    Returns an iterable of profile directories. The first entry is the
-    active/default profile.
-    """
-    base = None
-
-    if platform.system() == 'Darwin':
-        from Carbon import Folder, Folders
-        pathref = Folder.FSFindFolder(Folders.kUserDomain,
-            Folders.kApplicationSupportFolderType,
-            Folders.kDontCreateFolder)
-        path = pathref.FSRefMakePath()
-        base = os.path.join(path, 'Firefox')
-    elif platform.system() == 'Windows':
-        import ctypes
-        SHGetFolderPath = ctypes.windll.shell32.SHGetFolderPathW
-        SHGetFolderPath.argtypes = [ctypes.c_void_p, ctypes.c_int,
-            ctypes.c_void_p, ctypes.c_int32, ctypes.c_wchar_p]
-        path_buf = ctypes.create_unicode_buffer(1024)
-        CSIDL_APPDATA = 26
-        if not SHGetFolderPath(0, CSIDL_APPDATA, 0, 0, path_buf):
-            path = path_buf.value
-            base = os.path.join(path_buf.value, 'Mozilla', 'Firefox')
-    else:
-        base = os.path.expanduser('~/.mozilla/firefox')
-
-    if not base:
-        return []
-
-    ini_path = os.path.join(base, 'profiles.ini')
-    c = RawConfigParser(allow_no_value=True)
-    c.read([ini_path])
-
-    paths = []
-
-    for section in c.sections():
-        if not c.has_option(section, 'Path'):
-            continue
-
-        profile_path = c.get(section, 'Path')
-        is_relative = True
-        if c.has_option(section, 'IsRelative'):
-            is_relative = c.getboolean(section, 'IsRelative')
-
-        if is_relative:
-            profile_path = os.path.join(base, profile_path)
-
-        is_default = False
-        if c.has_option(section, 'Default'):
-            is_default = c.getboolean(section, 'Default')
-
-        name = c.get(section, 'Name')
-
-        newest_time = None
-        if find_times:
-            for f in os.listdir(profile_path):
-                full = os.path.join(profile_path, f)
-                if not os.path.isfile(full):
-                    continue
-
-                mtime = os.path.getmtime(full)
-                if not newest_time or mtime > newest_time:
-                    newest_time = mtime
-
-        paths.append((name, profile_path, is_default, newest_time))
-
-    return paths
-
-
-@contextlib.contextmanager
-def sqlite_safe_open(path):
-    """Helper to open SQLite databases in profiles.
-
-    Firefox locks database files, preventing new connections. So, we need
-    to copy the entire file and delete it when we're done.
-    """
-    tempdir = tempfile.mkdtemp()
-    conn = None
-    try:
-        basename = os.path.basename(path)
-        destpath = os.path.join(tempdir, '%s.copy.sqlite' % basename)
-
-        shutil.copyfile(path, destpath)
-
-        # Many databases use sqlite's WAL feature, which bumps the sqlite
-        # version number. Older clients may refuse to open the db if the
-        # version is too new. Patch the version number to an older version
-        # so we can open it. The version only impacts the journalling, so
-        # this should be relatively safe.
-        with open(destpath, 'r+b') as fh:
-            fh.seek(18, 0)
-            fh.write('\x01\x01')
-
-        conn = sqlite3.connect(destpath)
-        yield conn
-    finally:
-        if conn:
-            conn.close()
-        shutil.rmtree(tempdir)
-
-
-def get_cookies(profile_path, host=None):
-    """Obtain cookies from the profile.
-
-    Returns an iterable of dicts containing the raw entries from the cookies
-    database.
-
-    host can be specified as a unicode string or an iterable of hostnames to
-    limit results to.
-    """
-    with sqlite_safe_open(os.path.join(profile_path, 'cookies.sqlite')) as db:
-        if host:
-            host = host.lstrip('.')
-            result = db.execute('SELECT * FROM moz_cookies WHERE host=? or host=?',
-                (host, '.%s' % host))
-        else:
-            result = db.execute('SELECT * FROM moz_cookies')
-
-        for row in result:
-            yield {col[0]: row[i] for i, col in enumerate(result.description)}
deleted file mode 100644
--- a/mozautomation/releases.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import unicode_literals
-
-import json
-import urllib2
-
-
-class Releases(object):
-    """Holds information about Firefox releases.
-
-    Instances of this class are derived from the Releases API results.
-    """
-    def __init__(self, d):
-        self._nightly_builds_by_type = {}
-        self._release_builds_by_type = {}
-
-        for products in d.get('nightly', []):
-            for product, builds in products.items():
-                by_type = self._nightly_builds_by_type.setdefault(product, {})
-
-                for build in builds:
-                    by_type.setdefault(build['build_type'], []).append(build)
-
-        for products in d.get('releases', []):
-            for product, builds in products.items():
-                by_type = self._release_builds_by_type.setdefault(product, {})
-
-                for build in builds:
-                    by_type.setdefault(build['build_type'], []).append(build)
-
-    def firefox_nightly_releases(self):
-        """All releases for Firefox Nightly."""
-
-        for release in self._nightly_builds_by_type.get('firefox', {})['Nightly']:
-            if 'mozilla-central' in release['repository']:
-                yield release
-
-
-
-class ReleasesClient(object):
-    """Client to the releases API.
-
-    The releases API exposes information about builds on Firefox release
-    channels.
-    """
-    def __init__(self, base_uri='http://releases-api.mozilla.org/', opener=None):
-        self._base_uri = base_uri
-
-        if opener is None:
-            opener = urllib2.build_opener()
-
-        self._opener = opener
-
-    def releases(self):
-        request = urllib2.Request('%sreleases' % self._base_uri, None)
-        response = self._opener.open(request)
-
-        return Releases(json.load(response))
deleted file mode 100644
--- a/mozautomation/repository.py
+++ /dev/null
@@ -1,247 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import unicode_literals
-
-import json
-import urllib2
-
-
-TREE_ALIASES = {
-    'mozilla-central': ('central',),
-    'mc': ('central',),
-    'm-c': ('central',),
-    'mozilla-inbound': ('inbound',),
-    'm-i': ('inbound',),
-    'mi': ('inbound',),
-    'inbound': ('inbound',),
-    'in': ('inbound',),
-    'fx': ('fx-team',),
-    'mozilla-services': ('services',),
-    's-c': ('services',),
-    'sc': ('services',),
-    'bs': ('build',),
-    'b-s': ('build',),
-    'build-system': ('build',),
-    'gfx': ('graphics',),
-    'mozilla-release': ('release',),
-    'mozilla-aurora': ('aurora',),
-    'mozilla-beta': ('beta',),
-    'mozilla-b2g18': ('b2g18',),
-    'b2g-inbound': ('b2ginbound',),
-    'comm-central': ('comm',),
-    'c-c': ('comm',),
-
-    'releases': ('esr17', 'b2g18', 'esr24', 'b2g26', 'release', 'beta', 'aurora', 'central'),
-    'integration': ('inbound', 'fx-team', 'services', 'build', 'b2ginbound'),
-    'twigs': ('alder', 'ash', 'birch', 'cedar', 'cypress', 'date', 'elm',
-        'fig', 'gum', 'holly', 'jamun', 'larch', 'maple', 'oak', 'pine'),
-}
-
-BASE_READ_URI = 'https://hg.mozilla.org/'
-BASE_WRITE_URI = 'ssh://hg.mozilla.org/'
-
-REPOS = {
-    # Release repositories.
-    'central': 'mozilla-central',
-    'aurora': 'releases/mozilla-aurora',
-    'beta': 'releases/mozilla-beta',
-    'release': 'releases/mozilla-release',
-    'esr10': 'releases/mozilla-esr10',
-    'esr17': 'releases/mozilla-esr17',
-    'esr24': 'releases/mozilla-esr24',
-    'b2g18': 'releases/mozilla-b2g18',
-    'b2g26': 'releases/mozilla-b2g26_v1_2',
-
-    # Integration repositories.
-    'b2ginbound': 'integration/b2g-inbound',
-    'build': 'projects/build-system',
-    'fx-team': 'integration/fx-team',
-    'graphics': 'projects/graphics',
-    'inbound': 'integration/mozilla-inbound',
-    'places': 'projects/places',
-    'services': 'services/services-central',
-
-    # Twigs
-    'alder': 'projects/alder',
-    'ash': 'projects/ash',
-    'birch': 'projects/birch',
-    'cedar': 'projects/cedar',
-    'cypress': 'projects/cypress',
-    'date': 'projects/date',
-    'elm': 'projects/elm',
-    'fig': 'projects/fig',
-    'gum': 'projects/gum',
-    'holly': 'projects/holly',
-    'jamun': 'projects/jamun',
-    'larch': 'projects/larch',
-    'maple': 'projects/maple',
-    'oak': 'projects/oak',
-    'pine': 'projects/pine',
-
-    # Misc
-    'try': 'try',
-    'comm': 'comm-central',
-}
-
-OFFICIAL_MAP = {
-    'central': 'mozilla-central',
-    'inbound': 'mozilla-inbound',
-    'services': 'services-central',
-    'release': 'mozilla-release',
-    'aurora': 'mozilla-aurora',
-    'beta': 'mozilla-beta',
-    'build': 'build-system',
-    'esr17': 'mozilla-esr17',
-}
-
-RELEASE_TREES = {
-    'central',
-    'aurora',
-    'beta',
-    'release',
-    'b2g18',
-    'esr17',
-    'esr24',
-    'b2g26',
-}
-
-
-def resolve_trees_to_official(trees):
-    mapped = []
-    for tree in trees:
-        mapped.extend(TREE_ALIASES.get(tree, [tree]))
-    mapped = [OFFICIAL_MAP.get(tree, tree) for tree in mapped]
-
-    return mapped
-
-
-def resolve_trees_to_uris(trees, write_access=False):
-    """Resolve tree names to repositories URIs.
-
-    The caller passes in an iterable of tree names. These can be common names,
-    aliases, or official names.
-
-    A list of 2-tuples is returned. If a repository could be resolved to a URI,
-    the tuple is (common_name, uri). If a repository could not be resolved to a
-    URI, the tuple is (specified_name, None).
-    """
-    mapped = []
-    for tree in trees:
-        mapped.extend(TREE_ALIASES.get(tree, [tree]))
-    repos = [REPOS.get(tree, None) for tree in mapped]
-
-    base = BASE_WRITE_URI if write_access else BASE_READ_URI
-
-    uris = []
-    for i, tree in enumerate(repos):
-        if tree is None:
-            uris.append((trees[i], None))
-        else:
-            uris.append((mapped[i], '%s%s' % (base, tree)))
-
-    return uris
-
-
-def resolve_uri_to_tree(uri):
-    """Try to resolve a URI back to a known tree."""
-
-    for tree, path in REPOS.items():
-        if uri.startswith('%s%s' % (BASE_READ_URI, path)):
-            return tree
-
-        if uri.startswith('%s%s' % (BASE_WRITE_URI, path)):
-            return tree
-
-    return None
-
-
-def tbpl_tree_name(tree):
-    """Obtain the TBPL tree name of a tree.
-
-    Returns None if the tree isn't known.
-    """
-
-    tree = resolve_trees_to_official([tree])[0]
-
-    if not tree:
-        return None
-
-    return '-'.join(s.title() for s in tree.split('-'))
-
-
-def tbpl_url(tree, rev):
-    """Obtain the TBPL url for a push."""
-    tree = tbpl_tree_name(tree)
-
-    if not tree:
-        return None
-
-    return 'https://tbpl.mozilla.org/?tree=%s&rev=%s' % (tree, rev)
-
-
-class PushInfo(object):
-    """Represents an entry from the repository pushlog."""
-
-    def __init__(self, push_id, d):
-        self.push_id = push_id
-        self.date = d['date']
-        self.changesets = []
-
-        for changeset in d['changesets']:
-            entry = changeset
-            entry['tags'] = set(entry['tags']) if entry['tags'] else set()
-            self.changesets.append(entry)
-
-    @property
-    def nodes(self):
-        """All the changesets pushed in this push."""
-        return [c['node'] for c in self.changesets]
-
-    @property
-    def first_node(self):
-        return self.nodes[0]
-
-    @property
-    def last_node(self):
-        return self.nodes[-1]
-
-
-class MercurialRepository(object):
-    """Interface with a Mozilla Mercurial repository."""
-
-    def __init__(self, url):
-        self.url = url
-        self._opener = urllib2.build_opener()
-
-    def push_info_for_changeset(self, changeset):
-        """Obtain the push information for a single changeset.
-
-        Returns a PushInfo on success or None if no push info is available.
-        """
-        request = urllib2.Request('%s/json-pushes?full=1&changeset=%s' % ( self.url,
-            changeset))
-
-        response = self._opener.open(request)
-        o = json.load(response)
-
-        if not o:
-            return None
-
-        push_id = o.keys()[0]
-        return PushInfo(push_id, o[push_id])
-
-    def push_info(self, full=False, start_id=0):
-        """Obtain all pushlog info for a repository."""
-
-        url = '%s/json-pushes?startID=%d' % (self.url, start_id)
-        if full:
-            url += '&full=1'
-        request = urllib2.Request(url)
-
-        response = self._opener.open(request)
-        pushes = json.load(response)
-
-        for push_id in sorted(int(k) for k in pushes):
-            yield push_id, pushes[str(push_id)]
deleted file mode 100644
--- a/mozautomation/selfserve.py
+++ /dev/null
@@ -1,104 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# This file is a client to the self-serve HTTP API.
-
-import json
-import urllib2
-
-
-class Branch(object):
-    def __init__(self, client, name, meta=None):
-        """Create a Branch bound to a client.
-
-        The name is the name/identifier of the branch on the server.
-        meta is metadata about the branch (returned from the branches() call on
-        the main client. It is optional.
-
-        Instances of this class are not meant to be instantiated outside this
-        module.
-        """
-        self._client = client
-        self.name = name
-
-        if meta:
-            self.graph_branches = meta['graph_branches']
-            self.repo = meta['repo']
-            self.repo_type = meta['repo']
-
-    def builds(self):
-        """Returns a list of builds on this branch."""
-        return self._request()
-
-    def rebuild(self, build_id):
-        """Rebuild the build specified by its ID."""
-
-    def cancel_build(self, build_id):
-        """Cancel a build specified by its ID."""
-
-    def build(self, build_id):
-        """Obtain info about a build specified by its ID."""
-        return self._request('build', build_id)
-
-    def builders(self):
-        """Return info on builders building for this branch."""
-        return self._request('builders')
-
-    def builder(self, builder):
-        """Return info on a single bingler."""
-        return self._request('builders', builder)
-
-    def _request(self, *paths):
-        return self._client._request(self.name, *paths)
-
-
-class SelfServeClient(object):
-    def __init__(self, uri, opener=None):
-        self._uri = uri
-
-        if not opener:
-            opener = urllib2.build_opener()
-
-        self._opener = opener
-
-    def branches(self):
-        """Returns all the branches as Branch instances."""
-        for name, meta in self._request('branches').items():
-            yield Branch(self, name, meta)
-
-    def jobs(self):
-        """Returns a list of past self-serve request."""
-        return self._request('jobs')
-
-    def get_job(self, job_id):
-        """Return information about a specific job."""
-        return self._request('jobs', job_id)
-
-    def __getitem__(self, key):
-        """Dictionary like access retrives branches."""
-        return Branch(self, key)
-
-    def _request(self, *paths):
-        uri = self._uri
-        for p in paths:
-            uri += '/%s' % p
-
-        request = urllib2.Request(uri, None,
-            {'Accept': 'application/json'})
-
-        response = self._opener.open(request)
-        return json.load(response)
-
-
-def get_mozilla_self_serve(username, password):
-    uri = 'https://secure.pub.build.mozilla.org/buildapi/self-serve'
-
-    handler = urllib2.HTTPBasicAuthHandler()
-    handler.add_password(realm='Mozilla Contributors - LDAP Authentication',
-        uri=uri, user=username, passwd=password)
-
-    opener = urllib2.build_opener(handler)
-
-    return SelfServeClient(uri, opener)
-
deleted file mode 100644
--- a/mozautomation/treestatus.py
+++ /dev/null
@@ -1,108 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import unicode_literals
-
-import json
-import urllib2
-
-from time import strptime
-
-
-class TreeStatus(object):
-    """Represents the status of an individual tree."""
-
-    APPROVAL_REQUEST = 'approval required'
-    OPEN = 'open'
-    CLOSED = 'closed'
-
-    def __init__(self, d):
-        self.status = None
-        self.motd = None
-        self.tree = None
-        self.reason = None
-
-        for k in d:
-            if k == 'status':
-                self.status = d[k]
-            elif k == 'message_of_the_day':
-                self.motd = d[k]
-            elif k == 'tree':
-                self.tree = d[k]
-            elif k == 'reason':
-                self.reason = d[k]
-            else:
-                raise Exception('Unknown key in Tree Status response: %s' % k)
-
-    @property
-    def open(self):
-        return self.status == self.OPEN
-
-    @property
-    def closed(self):
-        return self.status == self.CLOSED
-
-    @property
-    def approval_required(self):
-        return self.status == self.APPROVAL_REQUIRED
-
-
-class TreeLog(object):
-    """Represents a change in a tree's status."""
-    def __init__(self, d):
-        self.reason = d['reason'] or None
-        self.tags = set(d['tags']) if d['tags'] else set()
-        self.tree = d['tree']
-        self.who = d['who']
-        # FUTURE return a datetime with appropriate timezone info set.
-        self.when = strptime(d['when'], '%Y-%m-%dT%H:%M:%S')
-
-
-class TreeStatusClient(object):
-    """Client to the Mozilla Tree Status API.
-
-    The tree status API controls whether Mozilla's main source repositories are
-    open or closed.
-    """
-
-    def __init__(self, base_uri='https://treestatus.mozilla.org/', opener=None):
-        self._base_uri = base_uri
-
-        if opener is None:
-            opener = urllib2.build_opener()
-
-        self._opener = opener
-
-    def _request(self, path):
-        request = urllib2.Request('%s%s' % (self._base_uri, path), None)
-        response = self._opener.open(request)
-        return json.load(response)
-
-    def all(self):
-        """Obtain the status of all trees.
-
-        Returns a dict of tree names to TreeStatus instances.
-        """
-
-        o = self._request('?format=json')
-        trees = {}
-        for k, v in o.items():
-            trees[k] = TreeStatus(v)
-
-        return trees
-
-    def tree_status(self, tree):
-        """Obtain the status of a single tree.
-
-        Returns a TreeStatus instance.
-        """
-        o = self._request('%s?format=json' % tree)
-        return TreeStatus(o)
-
-    def tree_logs(self, tree):
-        o = self._request('%s/logs?format=json' % tree)
-
-        for d in o['logs']:
-            yield TreeLog(d)
-
deleted file mode 100644
--- a/pep8/CHANGES.txt
+++ /dev/null
@@ -1,460 +0,0 @@
-Changelog
-=========
-
-
-1.4.6 (2013-07-02)
-------------------
-
-* Honor ``# noqa`` for errors E711 and E712. (Issue #180)
-
-* When both a ``tox.ini`` and a ``setup.cfg`` are present in the project
-  directory, merge their contents.  The ``tox.ini`` file takes
-  precedence (same as before). (Issue #182)
-
-* Give priority to ``--select`` over ``--ignore``. (Issue #188)
-
-* Compare full path when excluding a file. (Issue #186)
-
-* Correctly report other E12 errors when E123 is ignored. (Issue #103)
-
-* New option ``--hang-closing`` to switch to the alternative style of
-  closing bracket indentation for hanging indent.  Add error E133 for
-  closing bracket which is missing indentation. (Issue #103)
-
-* Accept both styles of closing bracket indentation for hanging indent.
-  Do not report error E123 in the default configuration. (Issue #103)
-
-* Do not crash when running AST checks and the document contains null bytes.
-  (Issue #184)
-
-* Fix false positive E261/E262 when the file contains a BOM. (Issue #193)
-
-* Fix E701, E702 and E703 not detected sometimes. (Issue #196)
-
-* Fix E122 not detected in some cases. (Issue #201 and #208)
-
-* Fix false positive E121 with multiple brackets. (Issue #203)
-
-
-1.4.5 (2013-03-06)
-------------------
-
-* When no path is specified, do not try to read from stdin.  The feature
-  was added in 1.4.3, but it is not supported on Windows.  Use ``-``
-  filename argument to read from stdin.  This usage is supported
-  since 1.3.4. (Issue #170)
-
-* Do not require ``setuptools`` in setup.py.  It works around an issue
-  with ``pip`` and Python 3. (Issue #172)
-
-* Add ``__pycache__`` to the ignore list.
-
-* Change misleading message for E251. (Issue #171)
-
-* Do not report false E302 when the source file has a coding cookie or a
-  comment on the first line. (Issue #174)
-
-* Reorganize the tests and add tests for the API and for the command line
-  usage and options. (Issues #161 and #162)
-
-* Ignore all checks which are not explicitly selected when ``select`` is
-  passed to the ``StyleGuide`` constructor.
-
-
-1.4.4 (2013-02-24)
-------------------
-
-* Report E227 or E228 instead of E225 for whitespace around bitwise, shift
-  or modulo operators. (Issue #166)
-
-* Change the message for E226 to make clear that it is about arithmetic
-  operators.
-
-* Fix a false positive E128 for continuation line indentation with tabs.
-
-* Fix regression with the ``--diff`` option. (Issue #169)
-
-* Fix the ``TestReport`` class to print the unexpected warnings and
-  errors.
-
-
-1.4.3 (2013-02-22)
-------------------
-
-* Hide the ``--doctest`` and ``--testsuite`` options when installed.
-
-* Fix crash with AST checkers when the syntax is invalid. (Issue #160)
-
-* Read from standard input if no path is specified.
-
-* Initiate a graceful shutdown on ``Control+C``.
-
-* Allow to change the ``checker_class`` for the ``StyleGuide``.
-
-
-1.4.2 (2013-02-10)
-------------------
-
-* Support AST checkers provided by third-party applications.
-
-* Register new checkers with ``register_check(func_or_cls, codes)``.
-
-* Allow to construct a ``StyleGuide`` with a custom parser.
-
-* Accept visual indentation without parenthesis after the ``if``
-  statement. (Issue #151)
-
-* Fix UnboundLocalError when using ``# noqa`` with continued lines.
-  (Issue #158)
-
-* Re-order the lines for the ``StandardReport``.
-
-* Expand tabs when checking E12 continuation lines. (Issue #155)
-
-* Refactor the testing class ``TestReport`` and the specific test
-  functions into a separate test module.
-
-
-1.4.1 (2013-01-18)
-------------------
-
-* Allow sphinx.ext.autodoc syntax for comments. (Issue #110)
-
-* Report E703 instead of E702 for the trailing semicolon. (Issue #117)
-
-* Honor ``# noqa`` in addition to ``# nopep8``. (Issue #149)
-
-* Expose the ``OptionParser`` factory for better extensibility.
-
-
-1.4 (2012-12-22)
-----------------
-
-* Report E226 instead of E225 for optional whitespace around common
-  operators (``*``, ``**``, ``/``, ``+`` and ``-``).  This new error
-  code is ignored in the default configuration because PEP 8 recommends
-  to "use your own judgement". (Issue #96)
-
-* Lines with a ``# nopep8`` at the end will not issue errors on line
-  length E501 or continuation line indentation E12*. (Issue #27)
-
-* Fix AssertionError when the source file contains an invalid line
-  ending ``"\r\r\n"``. (Issue #119)
-
-* Read the ``[pep8]`` section of ``tox.ini`` or ``setup.cfg`` if present.
-  (Issue #93 and #141)
-
-* Add the Sphinx-based documentation, and publish it
-  on http://pep8.readthedocs.org/. (Issue #105)
-
-
-1.3.4 (2012-12-18)
-------------------
-
-* Fix false positive E124 and E128 with comments. (Issue #100)
-
-* Fix error on stdin when running with bpython. (Issue #101)
-
-* Fix false positive E401. (Issue #104)
-
-* Report E231 for nested dictionary in list. (Issue #142)
-
-* Catch E271 at the beginning of the line. (Issue #133)
-
-* Fix false positive E126 for multi-line comments. (Issue #138)
-
-* Fix false positive E221 when operator is preceded by a comma. (Issue #135)
-
-* Fix ``--diff`` failing on one-line hunk. (Issue #137)
-
-* Fix the ``--exclude`` switch for directory paths. (Issue #111)
-
-* Use ``-`` filename to read from standard input. (Issue #128)
-
-
-1.3.3 (2012-06-27)
-------------------
-
-* Fix regression with continuation line checker. (Issue #98)
-
-
-1.3.2 (2012-06-26)
-------------------
-
-* Revert to the previous behaviour for ``--show-pep8``:
-  do not imply ``--first``. (Issue #89)
-
-* Add E902 for IO errors. (Issue #87)
-
-* Fix false positive for E121, and missed E124. (Issue #92)
-
-* Set a sensible default path for config file on Windows. (Issue #95)
-
-* Allow ``verbose`` in the configuration file. (Issue #91)
-
-* Show the enforced ``max-line-length`` in the error message. (Issue #86)
-
-
-1.3.1 (2012-06-18)
-------------------
-
-* Explain which configuration options are expected.  Accept and recommend
-  the options names with hyphen instead of underscore. (Issue #82)
-
-* Do not read the user configuration when used as a module
-  (except if ``config_file=True`` is passed to the ``StyleGuide`` constructor).
-
-* Fix wrong or missing cases for the E12 series.
-
-* Fix cases where E122 was missed. (Issue #81)
-
-
-1.3 (2012-06-15)
-----------------
-
-.. warning::
-   The internal API is backwards incompatible.
-
-* Remove global configuration and refactor the library around
-  a ``StyleGuide`` class; add the ability to configure various
-  reporters. (Issue #35 and #66)
-
-* Read user configuration from ``~/.config/pep8``
-  and local configuration from ``./.pep8``. (Issue #22)
-
-* Fix E502 for backslash embedded in multi-line string. (Issue #68)
-
-* Fix E225 for Python 3 iterable unpacking (PEP 3132). (Issue #72)
-
-* Enable the new checkers from the E12 series in the default
-  configuration.
-
-* Suggest less error-prone alternatives for E712 errors.
-
-* Rewrite checkers to run faster (E22, E251, E27).
-
-* Fixed a crash when parsed code is invalid (too many
-  closing brackets).
-
-* Fix E127 and E128 for continuation line indentation. (Issue #74)
-
-* New option ``--format`` to customize the error format. (Issue #23)
-
-* New option ``--diff`` to check only modified code.  The unified
-  diff is read from STDIN.  Example: ``hg diff | pep8 --diff``
-  (Issue #39)
-
-* Correctly report the count of failures and set the exit code to 1
-  when the ``--doctest`` or the ``--testsuite`` fails.
-
-* Correctly detect the encoding in Python 3. (Issue #69)
-
-* Drop support for Python 2.3, 2.4 and 3.0. (Issue #78)
-
-
-1.2 (2012-06-01)
-----------------
-
-* Add E121 through E128 for continuation line indentation.  These
-  checks are disabled by default.  If you want to force all checks,
-  use switch ``--select=E,W``.  Patch by Sam Vilain. (Issue #64)
-
-* Add E721 for direct type comparisons. (Issue #47)
-
-* Add E711 and E712 for comparisons to singletons. (Issue #46)
-
-* Fix spurious E225 and E701 for function annotations. (Issue #29)
-
-* Add E502 for explicit line join between brackets.
-
-* Fix E901 when printing source with ``--show-source``.
-
-* Report all errors for each checker, instead of reporting only the
-  first occurence for each line.
-
-* Option ``--show-pep8`` implies ``--first``.
-
-
-1.1 (2012-05-24)
-----------------
-
-* Add E901 for syntax errors. (Issues #63 and #30)
-
-* Add E271, E272, E273 and E274 for extraneous whitespace around
-  keywords. (Issue #57)
-
-* Add ``tox.ini`` configuration file for tests. (Issue #61)
-
-* Add ``.travis.yml`` configuration file for continuous integration.
-  (Issue #62)
-
-
-1.0.1 (2012-04-06)
-------------------
-
-* Fix inconsistent version numbers.
-
-
-1.0 (2012-04-04)
-----------------
-
-* Fix W602 ``raise`` to handle multi-char names. (Issue #53)
-
-
-0.7.0 (2012-03-26)
-------------------
-
-* Now ``--first`` prints only the first occurence of each error.
-  The ``--repeat`` flag becomes obsolete because it is the default
-  behaviour. (Issue #6)
-
-* Allow to specify ``--max-line-length``. (Issue #36)
-
-* Make the shebang more flexible. (Issue #26)
-
-* Add testsuite to the bundle. (Issue #25)
-
-* Fixes for Jython. (Issue #49)
-
-* Add PyPI classifiers. (Issue #43)
-
-* Fix the ``--exclude`` option. (Issue #48)
-
-* Fix W602, accept ``raise`` with 3 arguments. (Issue #34)
-
-* Correctly select all tests if ``DEFAULT_IGNORE == ''``.
-
-
-0.6.1 (2010-10-03)
-------------------
-
-* Fix inconsistent version numbers. (Issue #21)
-
-
-0.6.0 (2010-09-19)
-------------------
-
-* Test suite reorganized and enhanced in order to check more failures
-  with fewer test files.  Read the ``run_tests`` docstring for details
-  about the syntax.
-
-* Fix E225: accept ``print >>sys.stderr, "..."`` syntax.
-
-* Fix E501 for lines containing multibyte encoded characters. (Issue #7)
-
-* Fix E221, E222, E223, E224 not detected in some cases. (Issue #16)
-
-* Fix E211 to reject ``v = dic['a'] ['b']``. (Issue #17)
-
-* Exit code is always 1 if any error or warning is found. (Issue #10)
-
-* ``--ignore`` checks are now really ignored, especially in
-  conjunction with ``--count``. (Issue #8)
-
-* Blank lines with spaces yield W293 instead of W291: some developers
-  want to ignore this warning and indent the blank lines to paste their
-  code easily in the Python interpreter.
-
-* Fix E301: do not require a blank line before an indented block. (Issue #14)
-
-* Fix E203 to accept NumPy slice notation ``a[0, :]``. (Issue #13)
-
-* Performance improvements.
-
-* Fix decoding and checking non-UTF8 files in Python 3.
-
-* Fix E225: reject ``True+False`` when running on Python 3.
-
-* Fix an exception when the line starts with an operator.
-
-* Allow a new line before closing ``)``, ``}`` or ``]``. (Issue #5)
-
-
-0.5.0 (2010-02-17)
-------------------
-
-* Changed the ``--count`` switch to print to sys.stderr and set
-  exit code to 1 if any error or warning is found.
-
-* E241 and E242 are removed from the standard checks. If you want to
-  include these checks, use switch ``--select=E,W``. (Issue #4)
-
-* Blank line is not mandatory before the first class method or nested
-  function definition, even if there's a docstring. (Issue #1)
-
-* Add the switch ``--version``.
-
-* Fix decoding errors with Python 3. (Issue #13 [1]_)
-
-* Add ``--select`` option which is mirror of ``--ignore``.
-
-* Add checks E261 and E262 for spaces before inline comments.
-
-* New check W604 warns about deprecated usage of backticks.
-
-* New check W603 warns about the deprecated operator ``<>``.
-
-* Performance improvement, due to rewriting of E225.
-
-* E225 now accepts:
-
-  - no whitespace after unary operator or similar. (Issue #9 [1]_)
-
-  - lambda function with argument unpacking or keyword defaults.
-
-* Reserve "2 blank lines" for module-level logical blocks. (E303)
-
-* Allow multi-line comments. (E302, issue #10 [1]_)
-
-
-0.4.2 (2009-10-22)
-------------------
-
-* Decorators on classes and class methods are OK now.
-
-
-0.4 (2009-10-20)
-----------------
-
-* Support for all versions of Python from 2.3 to 3.1.
-
-* New and greatly expanded self tests.
-
-* Added ``--count`` option to print the total number of errors and warnings.
-
-* Further improvements to the handling of comments and blank lines.
-  (Issue #1 [1]_ and others changes.)
-
-* Check all py files in directory when passed a directory (Issue
-  #2 [1]_). This also prevents an exception when traversing directories
-  with non ``*.py`` files.
-
-* E231 should allow commas to be followed by ``)``. (Issue #3 [1]_)
-
-* Spaces are no longer required around the equals sign for keyword
-  arguments or default parameter values.
-
-
-.. [1] These issues refer to the `previous issue tracker`__.
-.. __:  http://github.com/cburroughs/pep8.py/issues
-
-
-0.3.1 (2009-09-14)
-------------------
-
-* Fixes for comments: do not count them when checking for blank lines between
-  items.
-
-* Added setup.py for pypi upload and easy_installability.
-
-
-0.2 (2007-10-16)
-----------------
-
-* Loads of fixes and improvements.
-
-
-0.1 (2006-10-01)
-----------------
-
-* First release.
deleted file mode 100644
--- a/pep8/MANIFEST.in
+++ /dev/null
@@ -1,9 +0,0 @@
-include *.txt
-include *.rst
-recursive-include docs *
-recursive-include testsuite *
-recursive-exclude docs *.pyc
-recursive-exclude docs *.pyo
-recursive-exclude testsuite *.pyc
-recursive-exclude testsuite *.pyo
-prune docs/_build
deleted file mode 100644
--- a/pep8/PKG-INFO
+++ /dev/null
@@ -1,569 +0,0 @@
-Metadata-Version: 1.1
-Name: pep8
-Version: 1.4.6
-Summary: Python style guide checker
-Home-page: http://pep8.readthedocs.org/
-Author: Johann C. Rocholl
-Author-email: johann@rocholl.net
-License: Expat license
-Description: pep8 - Python style guide checker
-        =================================
-        
-        pep8 is a tool to check your Python code against some of the style
-        conventions in `PEP 8`_.
-        
-        .. _PEP 8: http://www.python.org/dev/peps/pep-0008/
-        
-        
-        Features
-        --------
-        
-        * Plugin architecture: Adding new checks is easy.
-        
-        * Parseable output: Jump to error location in your editor.
-        
-        * Small: Just one Python file, requires only stdlib. You can use just
-          the pep8.py file for this purpose.
-        
-        * Comes with a comprehensive test suite.
-        
-        Installation
-        ------------
-        
-        You can install, upgrade, uninstall pep8.py with these commands::
-        
-          $ pip install pep8
-          $ pip install --upgrade pep8
-          $ pip uninstall pep8
-        
-        There's also a package for Debian/Ubuntu, but it's not always the
-        latest version.
-        
-        Example usage and output
-        ------------------------
-        
-        ::
-        
-          $ pep8 --first optparse.py
-          optparse.py:69:11: E401 multiple imports on one line
-          optparse.py:77:1: E302 expected 2 blank lines, found 1
-          optparse.py:88:5: E301 expected 1 blank line, found 0
-          optparse.py:222:34: W602 deprecated form of raising exception
-          optparse.py:347:31: E211 whitespace before '('
-          optparse.py:357:17: E201 whitespace after '{'
-          optparse.py:472:29: E221 multiple spaces before operator
-          optparse.py:544:21: W601 .has_key() is deprecated, use 'in'
-        
-        You can also make pep8.py show the source code for each error, and
-        even the relevant text from PEP 8::
-        
-          $ pep8 --show-source --show-pep8 testsuite/E40.py
-          testsuite/E40.py:2:10: E401 multiple imports on one line
-          import os, sys
-                   ^
-              Imports should usually be on separate lines.
-        
-              Okay: import os\nimport sys
-              E401: import sys, os
-        
-        
-        Or you can display how often each error was found::
-        
-          $ pep8 --statistics -qq Python-2.5/Lib
-          232     E201 whitespace after '['
-          599     E202 whitespace before ')'
-          631     E203 whitespace before ','
-          842     E211 whitespace before '('
-          2531    E221 multiple spaces before operator
-          4473    E301 expected 1 blank line, found 0
-          4006    E302 expected 2 blank lines, found 1
-          165     E303 too many blank lines (4)
-          325     E401 multiple imports on one line
-          3615    E501 line too long (82 characters)
-          612     W601 .has_key() is deprecated, use 'in'
-          1188    W602 deprecated form of raising exception
-        
-        Links
-        -----
-        
-        .. image:: https://api.travis-ci.org/jcrocholl/pep8.png?branch=master
-           :target: https://travis-ci.org/jcrocholl/pep8
-           :alt: Build status
-        
-        * `Read the documentation <http://pep8.readthedocs.org/>`_
-        
-        * `Fork me on GitHub <http://github.com/jcrocholl/pep8>`_
-        
-        
-        Changelog
-        =========
-        
-        
-        1.4.6 (2013-07-02)
-        ------------------
-        
-        * Honor ``# noqa`` for errors E711 and E712. (Issue #180)
-        
-        * When both a ``tox.ini`` and a ``setup.cfg`` are present in the project
-          directory, merge their contents.  The ``tox.ini`` file takes
-          precedence (same as before). (Issue #182)
-        
-        * Give priority to ``--select`` over ``--ignore``. (Issue #188)
-        
-        * Compare full path when excluding a file. (Issue #186)
-        
-        * Correctly report other E12 errors when E123 is ignored. (Issue #103)
-        
-        * New option ``--hang-closing`` to switch to the alternative style of
-          closing bracket indentation for hanging indent.  Add error E133 for
-          closing bracket which is missing indentation. (Issue #103)
-        
-        * Accept both styles of closing bracket indentation for hanging indent.
-          Do not report error E123 in the default configuration. (Issue #103)
-        
-        * Do not crash when running AST checks and the document contains null bytes.
-          (Issue #184)
-        
-        * Fix false positive E261/E262 when the file contains a BOM. (Issue #193)
-        
-        * Fix E701, E702 and E703 not detected sometimes. (Issue #196)
-        
-        * Fix E122 not detected in some cases. (Issue #201 and #208)
-        
-        * Fix false positive E121 with multiple brackets. (Issue #203)
-        
-        
-        1.4.5 (2013-03-06)
-        ------------------
-        
-        * When no path is specified, do not try to read from stdin.  The feature
-          was added in 1.4.3, but it is not supported on Windows.  Use ``-``
-          filename argument to read from stdin.  This usage is supported
-          since 1.3.4. (Issue #170)
-        
-        * Do not require ``setuptools`` in setup.py.  It works around an issue
-          with ``pip`` and Python 3. (Issue #172)
-        
-        * Add ``__pycache__`` to the ignore list.
-        
-        * Change misleading message for E251. (Issue #171)
-        
-        * Do not report false E302 when the source file has a coding cookie or a
-          comment on the first line. (Issue #174)
-        
-        * Reorganize the tests and add tests for the API and for the command line
-          usage and options. (Issues #161 and #162)
-        
-        * Ignore all checks which are not explicitly selected when ``select`` is
-          passed to the ``StyleGuide`` constructor.
-        
-        
-        1.4.4 (2013-02-24)
-        ------------------
-        
-        * Report E227 or E228 instead of E225 for whitespace around bitwise, shift
-          or modulo operators. (Issue #166)
-        
-        * Change the message for E226 to make clear that it is about arithmetic
-          operators.
-        
-        * Fix a false positive E128 for continuation line indentation with tabs.
-        
-        * Fix regression with the ``--diff`` option. (Issue #169)
-        
-        * Fix the ``TestReport`` class to print the unexpected warnings and
-          errors.
-        
-        
-        1.4.3 (2013-02-22)
-        ------------------
-        
-        * Hide the ``--doctest`` and ``--testsuite`` options when installed.
-        
-        * Fix crash with AST checkers when the syntax is invalid. (Issue #160)
-        
-        * Read from standard input if no path is specified.
-        
-        * Initiate a graceful shutdown on ``Control+C``.
-        
-        * Allow to change the ``checker_class`` for the ``StyleGuide``.
-        
-        
-        1.4.2 (2013-02-10)
-        ------------------
-        
-        * Support AST checkers provided by third-party applications.
-        
-        * Register new checkers with ``register_check(func_or_cls, codes)``.
-        
-        * Allow to construct a ``StyleGuide`` with a custom parser.
-        
-        * Accept visual indentation without parenthesis after the ``if``
-          statement. (Issue #151)
-        
-        * Fix UnboundLocalError when using ``# noqa`` with continued lines.
-          (Issue #158)
-        
-        * Re-order the lines for the ``StandardReport``.
-        
-        * Expand tabs when checking E12 continuation lines. (Issue #155)
-        
-        * Refactor the testing class ``TestReport`` and the specific test
-          functions into a separate test module.
-        
-        
-        1.4.1 (2013-01-18)
-        ------------------
-        
-        * Allow sphinx.ext.autodoc syntax for comments. (Issue #110)
-        
-        * Report E703 instead of E702 for the trailing semicolon. (Issue #117)
-        
-        * Honor ``# noqa`` in addition to ``# nopep8``. (Issue #149)
-        
-        * Expose the ``OptionParser`` factory for better extensibility.
-        
-        
-        1.4 (2012-12-22)
-        ----------------
-        
-        * Report E226 instead of E225 for optional whitespace around common
-          operators (``*``, ``**``, ``/``, ``+`` and ``-``).  This new error
-          code is ignored in the default configuration because PEP 8 recommends
-          to "use your own judgement". (Issue #96)
-        
-        * Lines with a ``# nopep8`` at the end will not issue errors on line
-          length E501 or continuation line indentation E12*. (Issue #27)
-        
-        * Fix AssertionError when the source file contains an invalid line
-          ending ``"\r\r\n"``. (Issue #119)
-        
-        * Read the ``[pep8]`` section of ``tox.ini`` or ``setup.cfg`` if present.
-          (Issue #93 and #141)
-        
-        * Add the Sphinx-based documentation, and publish it
-          on http://pep8.readthedocs.org/. (Issue #105)
-        
-        
-        1.3.4 (2012-12-18)
-        ------------------
-        
-        * Fix false positive E124 and E128 with comments. (Issue #100)
-        
-        * Fix error on stdin when running with bpython. (Issue #101)
-        
-        * Fix false positive E401. (Issue #104)
-        
-        * Report E231 for nested dictionary in list. (Issue #142)
-        
-        * Catch E271 at the beginning of the line. (Issue #133)
-        
-        * Fix false positive E126 for multi-line comments. (Issue #138)
-        
-        * Fix false positive E221 when operator is preceded by a comma. (Issue #135)
-        
-        * Fix ``--diff`` failing on one-line hunk. (Issue #137)
-        
-        * Fix the ``--exclude`` switch for directory paths. (Issue #111)
-        
-        * Use ``-`` filename to read from standard input. (Issue #128)
-        
-        
-        1.3.3 (2012-06-27)
-        ------------------
-        
-        * Fix regression with continuation line checker. (Issue #98)
-        
-        
-        1.3.2 (2012-06-26)
-        ------------------
-        
-        * Revert to the previous behaviour for ``--show-pep8``:
-          do not imply ``--first``. (Issue #89)
-        
-        * Add E902 for IO errors. (Issue #87)
-        
-        * Fix false positive for E121, and missed E124. (Issue #92)
-        
-        * Set a sensible default path for config file on Windows. (Issue #95)
-        
-        * Allow ``verbose`` in the configuration file. (Issue #91)
-        
-        * Show the enforced ``max-line-length`` in the error message. (Issue #86)
-        
-        
-        1.3.1 (2012-06-18)
-        ------------------
-        
-        * Explain which configuration options are expected.  Accept and recommend
-          the options names with hyphen instead of underscore. (Issue #82)
-        
-        * Do not read the user configuration when used as a module
-          (except if ``config_file=True`` is passed to the ``StyleGuide`` constructor).
-        
-        * Fix wrong or missing cases for the E12 series.
-        
-        * Fix cases where E122 was missed. (Issue #81)
-        
-        
-        1.3 (2012-06-15)
-        ----------------
-        
-        .. warning::
-           The internal API is backwards incompatible.
-        
-        * Remove global configuration and refactor the library around
-          a ``StyleGuide`` class; add the ability to configure various
-          reporters. (Issue #35 and #66)
-        
-        * Read user configuration from ``~/.config/pep8``
-          and local configuration from ``./.pep8``. (Issue #22)
-        
-        * Fix E502 for backslash embedded in multi-line string. (Issue #68)
-        
-        * Fix E225 for Python 3 iterable unpacking (PEP 3132). (Issue #72)
-        
-        * Enable the new checkers from the E12 series in the default
-          configuration.
-        
-        * Suggest less error-prone alternatives for E712 errors.
-        
-        * Rewrite checkers to run faster (E22, E251, E27).
-        
-        * Fixed a crash when parsed code is invalid (too many
-          closing brackets).
-        
-        * Fix E127 and E128 for continuation line indentation. (Issue #74)
-        
-        * New option ``--format`` to customize the error format. (Issue #23)
-        
-        * New option ``--diff`` to check only modified code.  The unified
-          diff is read from STDIN.  Example: ``hg diff | pep8 --diff``
-          (Issue #39)
-        
-        * Correctly report the count of failures and set the exit code to 1
-          when the ``--doctest`` or the ``--testsuite`` fails.
-        
-        * Correctly detect the encoding in Python 3. (Issue #69)
-        
-        * Drop support for Python 2.3, 2.4 and 3.0. (Issue #78)
-        
-        
-        1.2 (2012-06-01)
-        ----------------
-        
-        * Add E121 through E128 for continuation line indentation.  These
-          checks are disabled by default.  If you want to force all checks,
-          use switch ``--select=E,W``.  Patch by Sam Vilain. (Issue #64)
-        
-        * Add E721 for direct type comparisons. (Issue #47)
-        
-        * Add E711 and E712 for comparisons to singletons. (Issue #46)
-        
-        * Fix spurious E225 and E701 for function annotations. (Issue #29)
-        
-        * Add E502 for explicit line join between brackets.
-        
-        * Fix E901 when printing source with ``--show-source``.
-        
-        * Report all errors for each checker, instead of reporting only the
-          first occurence for each line.
-        
-        * Option ``--show-pep8`` implies ``--first``.
-        
-        
-        1.1 (2012-05-24)
-        ----------------
-        
-        * Add E901 for syntax errors. (Issues #63 and #30)
-        
-        * Add E271, E272, E273 and E274 for extraneous whitespace around
-          keywords. (Issue #57)
-        
-        * Add ``tox.ini`` configuration file for tests. (Issue #61)
-        
-        * Add ``.travis.yml`` configuration file for continuous integration.
-          (Issue #62)
-        
-        
-        1.0.1 (2012-04-06)
-        ------------------
-        
-        * Fix inconsistent version numbers.
-        
-        
-        1.0 (2012-04-04)
-        ----------------
-        
-        * Fix W602 ``raise`` to handle multi-char names. (Issue #53)
-        
-        
-        0.7.0 (2012-03-26)
-        ------------------
-        
-        * Now ``--first`` prints only the first occurence of each error.
-          The ``--repeat`` flag becomes obsolete because it is the default
-          behaviour. (Issue #6)
-        
-        * Allow to specify ``--max-line-length``. (Issue #36)
-        
-        * Make the shebang more flexible. (Issue #26)
-        
-        * Add testsuite to the bundle. (Issue #25)
-        
-        * Fixes for Jython. (Issue #49)
-        
-        * Add PyPI classifiers. (Issue #43)
-        
-        * Fix the ``--exclude`` option. (Issue #48)
-        
-        * Fix W602, accept ``raise`` with 3 arguments. (Issue #34)
-        
-        * Correctly select all tests if ``DEFAULT_IGNORE == ''``.
-        
-        
-        0.6.1 (2010-10-03)
-        ------------------
-        
-        * Fix inconsistent version numbers. (Issue #21)
-        
-        
-        0.6.0 (2010-09-19)
-        ------------------
-        
-        * Test suite reorganized and enhanced in order to check more failures
-          with fewer test files.  Read the ``run_tests`` docstring for details
-          about the syntax.
-        
-        * Fix E225: accept ``print >>sys.stderr, "..."`` syntax.
-        
-        * Fix E501 for lines containing multibyte encoded characters. (Issue #7)
-        
-        * Fix E221, E222, E223, E224 not detected in some cases. (Issue #16)
-        
-        * Fix E211 to reject ``v = dic['a'] ['b']``. (Issue #17)
-        
-        * Exit code is always 1 if any error or warning is found. (Issue #10)
-        
-        * ``--ignore`` checks are now really ignored, especially in
-          conjunction with ``--count``. (Issue #8)
-        
-        * Blank lines with spaces yield W293 instead of W291: some developers
-          want to ignore this warning and indent the blank lines to paste their
-          code easily in the Python interpreter.
-        
-        * Fix E301: do not require a blank line before an indented block. (Issue #14)
-        
-        * Fix E203 to accept NumPy slice notation ``a[0, :]``. (Issue #13)
-        
-        * Performance improvements.
-        
-        * Fix decoding and checking non-UTF8 files in Python 3.
-        
-        * Fix E225: reject ``True+False`` when running on Python 3.
-        
-        * Fix an exception when the line starts with an operator.
-        
-        * Allow a new line before closing ``)``, ``}`` or ``]``. (Issue #5)
-        
-        
-        0.5.0 (2010-02-17)
-        ------------------
-        
-        * Changed the ``--count`` switch to print to sys.stderr and set
-          exit code to 1 if any error or warning is found.
-        
-        * E241 and E242 are removed from the standard checks. If you want to
-          include these checks, use switch ``--select=E,W``. (Issue #4)
-        
-        * Blank line is not mandatory before the first class method or nested
-          function definition, even if there's a docstring. (Issue #1)
-        
-        * Add the switch ``--version``.
-        
-        * Fix decoding errors with Python 3. (Issue #13 [1]_)
-        
-        * Add ``--select`` option which is mirror of ``--ignore``.
-        
-        * Add checks E261 and E262 for spaces before inline comments.
-        
-        * New check W604 warns about deprecated usage of backticks.
-        
-        * New check W603 warns about the deprecated operator ``<>``.
-        
-        * Performance improvement, due to rewriting of E225.
-        
-        * E225 now accepts:
-        
-          - no whitespace after unary operator or similar. (Issue #9 [1]_)
-        
-          - lambda function with argument unpacking or keyword defaults.
-        
-        * Reserve "2 blank lines" for module-level logical blocks. (E303)
-        
-        * Allow multi-line comments. (E302, issue #10 [1]_)
-        
-        
-        0.4.2 (2009-10-22)
-        ------------------
-        
-        * Decorators on classes and class methods are OK now.
-        
-        
-        0.4 (2009-10-20)
-        ----------------
-        
-        * Support for all versions of Python from 2.3 to 3.1.
-        
-        * New and greatly expanded self tests.
-        
-        * Added ``--count`` option to print the total number of errors and warnings.
-        
-        * Further improvements to the handling of comments and blank lines.
-          (Issue #1 [1]_ and others changes.)
-        
-        * Check all py files in directory when passed a directory (Issue
-          #2 [1]_). This also prevents an exception when traversing directories
-          with non ``*.py`` files.
-        
-        * E231 should allow commas to be followed by ``)``. (Issue #3 [1]_)
-        
-        * Spaces are no longer required around the equals sign for keyword
-          arguments or default parameter values.
-        
-        
-        .. [1] These issues refer to the `previous issue tracker`__.
-        .. __:  http://github.com/cburroughs/pep8.py/issues
-        
-        
-        0.3.1 (2009-09-14)
-        ------------------
-        
-        * Fixes for comments: do not count them when checking for blank lines between
-          items.
-        
-        * Added setup.py for pypi upload and easy_installability.
-        
-        
-        0.2 (2007-10-16)
-        ----------------
-        
-        * Loads of fixes and improvements.
-        
-        
-        0.1 (2006-10-01)
-        ----------------
-        
-        * First release.
-        
-Keywords: pep8
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Environment :: Console
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
deleted file mode 100644
--- a/pep8/README.rst
+++ /dev/null
@@ -1,87 +0,0 @@
-pep8 - Python style guide checker
-=================================
-
-pep8 is a tool to check your Python code against some of the style
-conventions in `PEP 8`_.
-
-.. _PEP 8: http://www.python.org/dev/peps/pep-0008/
-
-
-Features
---------
-
-* Plugin architecture: Adding new checks is easy.
-
-* Parseable output: Jump to error location in your editor.
-
-* Small: Just one Python file, requires only stdlib. You can use just
-  the pep8.py file for this purpose.
-
-* Comes with a comprehensive test suite.
-
-Installation
-------------
-
-You can install, upgrade, uninstall pep8.py with these commands::
-
-  $ pip install pep8
-  $ pip install --upgrade pep8
-  $ pip uninstall pep8
-
-There's also a package for Debian/Ubuntu, but it's not always the
-latest version.
-
-Example usage and output
-------------------------
-
-::
-
-  $ pep8 --first optparse.py
-  optparse.py:69:11: E401 multiple imports on one line
-  optparse.py:77:1: E302 expected 2 blank lines, found 1
-  optparse.py:88:5: E301 expected 1 blank line, found 0
-  optparse.py:222:34: W602 deprecated form of raising exception
-  optparse.py:347:31: E211 whitespace before '('
-  optparse.py:357:17: E201 whitespace after '{'
-  optparse.py:472:29: E221 multiple spaces before operator
-  optparse.py:544:21: W601 .has_key() is deprecated, use 'in'
-
-You can also make pep8.py show the source code for each error, and
-even the relevant text from PEP 8::
-
-  $ pep8 --show-source --show-pep8 testsuite/E40.py
-  testsuite/E40.py:2:10: E401 multiple imports on one line
-  import os, sys
-           ^
-      Imports should usually be on separate lines.
-
-      Okay: import os\nimport sys
-      E401: import sys, os
-
-
-Or you can display how often each error was found::
-
-  $ pep8 --statistics -qq Python-2.5/Lib
-  232     E201 whitespace after '['
-  599     E202 whitespace before ')'
-  631     E203 whitespace before ','
-  842     E211 whitespace before '('
-  2531    E221 multiple spaces before operator
-  4473    E301 expected 1 blank line, found 0
-  4006    E302 expected 2 blank lines, found 1
-  165     E303 too many blank lines (4)
-  325     E401 multiple imports on one line
-  3615    E501 line too long (82 characters)
-  612     W601 .has_key() is deprecated, use 'in'
-  1188    W602 deprecated form of raising exception
-
-Links
------
-
-.. image:: https://api.travis-ci.org/jcrocholl/pep8.png?branch=master
-   :target: https://travis-ci.org/jcrocholl/pep8
-   :alt: Build status
-
-* `Read the documentation <http://pep8.readthedocs.org/>`_
-
-* `Fork me on GitHub <http://github.com/jcrocholl/pep8>`_
deleted file mode 100644
--- a/pep8/docs/Makefile
+++ /dev/null
@@ -1,153 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS    =
-SPHINXBUILD   = sphinx-build
-PAPER         =
-BUILDDIR      = _build
-
-# Internal variables.
-PAPEROPT_a4     = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
-
-help:
-	@echo "Please use \`make <target>' where <target> is one of"
-	@echo "  html       to make standalone HTML files"
-	@echo "  dirhtml    to make HTML files named index.html in directories"
-	@echo "  singlehtml to make a single large HTML file"
-	@echo "  pickle     to make pickle files"
-	@echo "  json       to make JSON files"
-	@echo "  htmlhelp   to make HTML files and a HTML help project"
-	@echo "  qthelp     to make HTML files and a qthelp project"
-	@echo "  devhelp    to make HTML files and a Devhelp project"
-	@echo "  epub       to make an epub"
-	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
-	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
-	@echo "  text       to make text files"
-	@echo "  man        to make manual pages"
-	@echo "  texinfo    to make Texinfo files"
-	@echo "  info       to make Texinfo files and run them through makeinfo"
-	@echo "  gettext    to make PO message catalogs"
-	@echo "  changes    to make an overview of all changed/added/deprecated items"
-	@echo "  linkcheck  to check all external links for integrity"
-	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
-
-clean:
-	-rm -rf $(BUILDDIR)/*
-
-html:
-	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-dirhtml:
-	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-singlehtml:
-	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
-	@echo
-	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-pickle:
-	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
-	@echo
-	@echo "Build finished; now you can process the pickle files."
-
-json:
-	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
-	@echo
-	@echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
-	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
-	@echo
-	@echo "Build finished; now you can run HTML Help Workshop with the" \
-	      ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-qthelp:
-	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
-	@echo
-	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
-	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
-	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pep8.qhcp"
-	@echo "To view the help file:"
-	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pep8.qhc"
-
-devhelp:
-	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
-	@echo
-	@echo "Build finished."
-	@echo "To view the help file:"
-	@echo "# mkdir -p $$HOME/.local/share/devhelp/pep8"
-	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pep8"
-	@echo "# devhelp"
-
-epub:
-	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
-	@echo
-	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-latex:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo
-	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
-	@echo "Run \`make' in that directory to run these through (pdf)latex" \
-	      "(use \`make latexpdf' here to do that automatically)."
-
-latexpdf:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through pdflatex..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-text:
-	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
-	@echo
-	@echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-man:
-	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
-	@echo
-	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-texinfo:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo
-	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
-	@echo "Run \`make' in that directory to run these through makeinfo" \
-	      "(use \`make info' here to do that automatically)."
-
-info:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo "Running Texinfo files through makeinfo..."
-	make -C $(BUILDDIR)/texinfo info
-	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-gettext:
-	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
-	@echo
-	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-changes:
-	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
-	@echo
-	@echo "The overview file is in $(BUILDDIR)/changes."
-
-linkcheck:
-	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
-	@echo
-	@echo "Link check complete; look for any errors in the above output " \
-	      "or in $(BUILDDIR)/linkcheck/output.txt."
-
-doctest:
-	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
-	@echo "Testing of doctests in the sources finished, look at the " \
-	      "results in $(BUILDDIR)/doctest/output.txt."
deleted file mode 100644
--- a/pep8/docs/advanced.rst
+++ /dev/null
@@ -1,77 +0,0 @@
-.. currentmodule:: pep8
-
-==============
-Advanced usage
-==============
-
-
-Automated tests
----------------
-
-You can also execute `pep8` tests from Python code.  For example, this
-can be highly useful for automated testing of coding style conformance
-in your project::
-
-  import unittest
-  import pep8
-
-
-  class TestCodeFormat(unittest.TestCase):
-
-      def test_pep8_conformance(self):
-          """Test that we conform to PEP8."""
-          pep8style = pep8.StyleGuide(quiet=True)
-          result = pep8style.check_files(['file1.py', 'file2.py'])
-          self.assertEqual(result.total_errors, 0,
-                           "Found code style errors (and warnings).")
-
-If you are using `nosetests` for running tests, remove `quiet=True`
-since Nose suppresses stdout.
-
-There's also a shortcut for checking a single file::
-
-  import pep8
-
-  fchecker = pep8.Checker('testsuite/E27.py', show_source=True)
-  file_errors = fchecker.check_all()
-
-  print("Found %s errors (and warnings)" % file_errors)
-
-
-Skip file header
-----------------
-
-Another example is related to the `feature request #143
-<https://github.com/jcrocholl/pep8/issues/143>`_: skip a number of lines
-at the beginning and the end of a file.  This use case is easy to implement
-through a custom wrapper for the PEP 8 library::
-
-  #!python
-  import pep8
-
-  LINES_SLICE = slice(14, -20)
-
-  class PEP8(pep8.StyleGuide):
-      """This subclass of pep8.StyleGuide will skip the first and last lines
-      of each file."""
-
-      def input_file(self, filename, lines=None, expected=None, line_offset=0):
-          if lines is None:
-              assert line_offset == 0
-              line_offset = LINES_SLICE.start or 0
-              lines = pep8.readlines(filename)[LINES_SLICE]
-          return super(PEP8, self).input_file(
-              filename, lines=lines, expected=expected, line_offset=line_offset)
-
-  if __name__ == '__main__':
-      pep8style = PEP8(parse_argv=True, config_file=True)
-      report = pep8style.check_files()
-      if report.total_errors:
-          raise SystemExit(1)
-
-This module declares a lines' window which skips 14 lines at the beginning
-and 20 lines at the end.  If there's no line to skip at the end, it could be
-changed with ``LINES_SLICE = slice(14, None)`` for example.
-
-You can save it in a file and use it with the same options as the
-original ``pep8``.
deleted file mode 100644
--- a/pep8/docs/api.rst
+++ /dev/null
@@ -1,89 +0,0 @@
-========
-pep8 API
-========
-
-.. module:: pep8
-
-The library provides classes which are usable by third party tools.
-
-.. contents::
-   :local:
-
-
-.. _main_classes:
-
-Checker Classes
----------------
-
-The :class:`StyleGuide` class is used to configure a style guide checker
-instance to check multiple files.
-
-The :class:`Checker` class can be used to check a single file.
-
-
-.. autoclass:: StyleGuide(parse_argv=False, config_file=None, parser=None, paths=None, report=None, **kwargs)
-
-   .. automethod:: init_report(reporter=None)
-   .. automethod:: check_files(paths=None)
-   .. automethod:: input_file(filename, lines=None, expected=None, line_offset=0)
-   .. automethod:: input_dir(dirname)
-   .. automethod:: excluded(filename, parent=None)
-   .. automethod:: ignore_code(code)
-   .. automethod:: get_checks(argument_name)
-
-.. autoclass:: Checker(filename=None, lines=None, report=None, **kwargs)
-
-   .. automethod:: readline
-   .. automethod:: readline_check_physical
-   .. automethod:: run_check(check, argument_names)
-   .. automethod:: check_physical(line)
-   .. automethod:: build_tokens_line
-   .. automethod:: check_logical
-   .. automethod:: check_ast
-   .. automethod:: generate_tokens
-   .. automethod:: check_all(expected=None, line_offset=0)
-
-
-.. _report_classes:
-
-Report Classes
---------------
-
-.. autoclass:: BaseReport(options)
-
-   .. automethod:: start
-   .. automethod:: stop
-   .. automethod:: init_file(filename, lines, expected, line_offset)
-   .. automethod:: increment_logical_line
-   .. automethod:: error(line_number, offset, text, check)
-   .. automethod:: get_file_results
-   .. automethod:: get_count(prefix='')
-   .. automethod:: get_statistics(prefix='')
-   .. automethod:: print_statistics(prefix='')
-   .. automethod:: print_benchmark
-
-.. autoclass:: FileReport
-
-.. autoclass:: StandardReport
-
-.. autoclass:: DiffReport
-
-
-Utilities
----------
-
-.. autofunction:: expand_indent(line)
-.. autofunction:: mute_string(text)
-.. autofunction:: read_config(options, args, arglist, parser)
-.. autofunction:: process_options(arglist=None, parse_argv=False, config_file=None)
-.. autofunction:: register_check(func_or_cls, codes=None)
-
-..
-  These ones are used internally, but they don't need advertising
-  .. autofunction:: readlines(filename)
-  .. autofunction:: isidentifier(word)
-  .. autofunction:: stdin_get_value()
-  .. autofunction:: parse_udiff(diff, patterns=None, parent='.')
-  .. autofunction:: filename_match(filename, patterns, default=True)
-  .. autofunction:: get_parser(prog='pep8', version=pep8.__version__)
-  .. autofunction:: init_checks_registry()
deleted file mode 100644
--- a/pep8/docs/conf.py
+++ /dev/null
@@ -1,250 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# pep8 documentation build configuration file, created by
-# sphinx-quickstart on Tue Aug 21 09:47:49 2012.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import sys
-import os
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#sys.path.insert(0, os.path.abspath('.'))
-sys.path.insert(0, os.path.abspath('..'))
-
-# -- General configuration ----------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest',
-              'sphinx.ext.coverage', 'sphinx.ext.viewcode']
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix of source filenames.
-source_suffix = '.rst'
-
-# The encoding of source files.
-#source_encoding = 'utf-8-sig'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'pep8'
-copyright = u'2012-2013, Florent Xicluna'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-
-pep8_version = __import__('pep8').__version__.split('.')
-# The short X.Y version.
-version = '.'.join(pep8_version[:2])
-# The full version, including alpha/beta/rc tags.
-release = '.'.join(pep8_version)
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#today = ''
-# Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = ['_build']
-
-# The reST default role (used for this markup: `text`) to use for
-# all documents.
-#default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-#add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-#show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
-
-
-# -- Options for HTML output --------------------------------------------------
-
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-html_theme = 'default'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further.  For a list of options available for each theme, see the
-# documentation.
-#html_theme_options = {}
-
-# Add any paths that contain custom themes here, relative to this directory.
-#html_theme_path = []
-
-# The name for this set of Sphinx documents.  If None, it defaults to
-# "<project> v<release> documentation".
-#html_title = None
-
-# A shorter title for the navigation bar.  Default is the same as html_title.
-#html_short_title = None
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-#html_logo = None
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-#html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
-
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-#html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-#html_additional_pages = {}
-
-# If false, no module index is generated.
-#html_domain_indices = True
-
-# If false, no index is generated.
-#html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-#html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
-
-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-#html_show_sphinx = True
-
-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#html_show_copyright = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it.  The value of this option must be the
-# base URL from which the finished HTML is served.
-#html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = None
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'pep8doc'
-
-
-# -- Options for LaTeX output -------------------------------------------------
-
-latex_elements = {
-    # The paper size ('letterpaper' or 'a4paper').
-    #'papersize': 'letterpaper',
-
-    # The font size ('10pt', '11pt' or '12pt').
-    #'pointsize': '10pt',
-
-    # Additional stuff for the LaTeX preamble.
-    #'preamble': '',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-#  author, documentclass [howto/manual]).
-latex_documents = [
-    ('index', 'pep8.tex', u'pep8 documentation',
-     u'Florent Xicluna', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-#latex_logo = None
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-#latex_use_parts = False
-
-# If true, show page references after internal links.
-#latex_show_pagerefs = False
-
-# If true, show URL addresses after external links.
-#latex_show_urls = False
-
-# Documents to append as an appendix to all manuals.
-#latex_appendices = []
-
-# If false, no module index is generated.
-#latex_domain_indices = True
-
-
-# -- Options for manual page output -------------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
-    ('index', 'pep8', u'pep8 documentation',
-     [u'Florent Xicluna'], 1)
-]
-
-# If true, show URL addresses after external links.
-#man_show_urls = False
-
-
-# -- Options for Texinfo output -----------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-#  dir menu entry, description, category)
-texinfo_documents = [
-    ('index', 'pep8', u'pep8 documentation', u'Florent Xicluna',
-     'pep8', 'One line description of project.',
-     'Miscellaneous'),
-]
-
-# Documents to append as an appendix to all manuals.
-#texinfo_appendices = []
-
-# If false, no module index is generated.
-#texinfo_domain_indices = True
-
-# How to display URL addresses: 'footnote', 'no', or 'inline'.
-#texinfo_show_urls = 'footnote'
deleted file mode 100644
--- a/pep8/docs/developer.rst
+++ /dev/null
@@ -1,89 +0,0 @@
-.. currentmodule:: pep8
-
-=================
-Developer's notes
-=================
-
-
-Source code
-~~~~~~~~~~~
-
-The source code is currently `available on GitHub`_ under the terms and
-conditions of the :ref:`Expat license <license>`.  Fork away!
-
-* `Source code <https://github.com/jcrocholl/pep8>`_ and
-  `issue tracker <https://github.com/jcrocholl/pep8/issues>`_ on GitHub.
-* `Continuous tests <http://travis-ci.org/jcrocholl/pep8>`_ against Python
-  2.5 through 3.3 and PyPy, on `Travis-CI platform
-  <http://about.travis-ci.org/>`_.
-
-.. _available on GitHub: https://github.com/jcrocholl/pep8
-
-
-Contribute
-~~~~~~~~~~
-
-You can add checks to this program by writing plugins.  Each plugin is
-a simple function that is called for each line of source code, either
-physical or logical.
-
-Physical line:
-
-* Raw line of text from the input file.
-
-Logical line:
-
-* Multi-line statements converted to a single line.
-* Stripped left and right.
-* Contents of strings replaced with ``"xxx"`` of same length.
-* Comments removed.
-
-The check function requests physical or logical lines by the name of
-the first argument::
-
-  def maximum_line_length(physical_line)
-  def extraneous_whitespace(logical_line)
-  def blank_lines(logical_line, blank_lines, indent_level, line_number)
-
-The last example above demonstrates how check plugins can request
-additional information with extra arguments.  All attributes of the
-:class:`Checker` object are available.  Some examples:
-
-* ``lines``: a list of the raw lines from the input file
-* ``tokens``: the tokens that contribute to this logical line
-* ``line_number``: line number in the input file
-* ``blank_lines``: blank lines before this one
-* ``indent_char``: first indentation character in this file (``" "`` or ``"\t"``)
-* ``indent_level``: indentation (with tabs expanded to multiples of 8)
-* ``previous_indent_level``: indentation on previous line
-* ``previous_logical``: previous logical line
-
-The docstring of each check function shall be the relevant part of
-text from `PEP 8`_.  It is printed if the user enables ``--show-pep8``.
-Several docstrings contain examples directly from the `PEP 8`_ document.
-
-::
-
-  Okay: spam(ham[1], {eggs: 2})
-  E201: spam( ham[1], {eggs: 2})
-
-These examples are verified automatically when pep8.py is run with the
-``--doctest`` option.  You can add examples for your own check functions.
-The format is simple: ``"Okay"`` or error/warning code followed by colon
-and space, the rest of the line is example source code.  If you put ``'r'``
-before the docstring, you can use ``\n`` for newline and ``\t`` for tab.
-
-Then be sure to pass the tests::
-
-  $ python pep8.py --testsuite testsuite
-  $ python pep8.py --doctest
-  $ python pep8.py --verbose pep8.py
-
-.. _PEP 8: http://www.python.org/dev/peps/pep-0008/
-
-
-Changes
-~~~~~~~
-
-.. include:: ../CHANGES.txt
-   :start-line: 3
deleted file mode 100644
--- a/pep8/docs/index.rst
+++ /dev/null
@@ -1,69 +0,0 @@
-.. pep8 documentation master file
-
-pep8's documentation
-====================
-
-*Python style guide checker*
-
-pep8 is a tool to check your Python code against some of the style
-conventions in `PEP 8`_.
-
-.. _PEP 8: http://www.python.org/dev/peps/pep-0008/
-
-
-Contents:
-
-.. toctree::
-   :maxdepth: 2
-
-   intro
-   advanced
-   API <api>
-   developer
-
-* Online documentation: http://pep8.readthedocs.org/
-* Source code and issue tracker: https://github.com/jcrocholl/pep8
-
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`search`
-
-
-Credits
-=======
-
-Created by Johann C. Rocholl.
-
-Maintained by Florent Xicluna.
-
-
-.. _license:
-
-License
-=======
-
-The ``pep8`` library is provided under the terms and conditions of the
-Expat license::
-
-  # Permission is hereby granted, free of charge, to any person
-  # obtaining a copy of this software and associated documentation files
-  # (the "Software"), to deal in the Software without restriction,
-  # including without limitation the rights to use, copy, modify, merge,
-  # publish, distribute, sublicense, and/or sell copies of the Software,
-  # and to permit persons to whom the Software is furnished to do so,
-  # subject to the following conditions:
-  #
-  # The above copyright notice and this permission notice shall be
-  # included in all copies or substantial portions of the Software.
-  #
-  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-  # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-  # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-  # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-  # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-  # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-  # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-  # SOFTWARE.
deleted file mode 100644
--- a/pep8/docs/intro.rst
+++ /dev/null
@@ -1,372 +0,0 @@
-.. currentmodule:: pep8
-
-Introduction
-============
-
-pep8 is a tool to check your Python code against some of the style
-conventions in `PEP 8`_.
-
-.. contents::
-   :local:
-
-
-Features
---------
-
-* Plugin architecture: Adding new checks is easy.
-
-* Parseable output: Jump to error location in your editor.
-
-* Small: Just one Python file, requires only stdlib.  You can use just
-  the pep8.py file for this purpose.
-
-* Comes with a comprehensive test suite.
-
-
-Disclaimer
-----------
-
-This utility does not enforce every single rule of PEP 8.  It helps to
-verify that some coding conventions are applied but it does not intend
-to be exhaustive.  Some rules cannot be expressed with a simple algorithm,
-and other rules are only guidelines which you could circumvent when you
-need to.
-
-Always remember this statement from `PEP 8`_:
-
-  *A style guide is about consistency. Consistency with this style guide is
-  important. Consistency within a project is more important. Consistency
-  within one module or function is most important.*
-
-
-Among other things, these features are currently not in the scope of
-the ``pep8`` library:
-
-* **naming conventions**: this kind of feature is supported through plugins.
-  Install `flake8 <https://pypi.python.org/pypi/flake8>`_ and the
-  `pep8-naming extension <https://pypi.python.org/pypi/pep8-naming>`_ to use
-  this feature.
-* **docstring conventions**: they are not in the scope of this library;
-  see the `pep257 project <https://github.com/GreenSteam/pep257>`_.
-* **automatic fixing**: see the section *PEP8 Fixers* in the
-  :ref:`related tools <related-tools>` page.
-
-
-Installation
-------------
-
-You can install, upgrade, uninstall pep8.py with these commands::
-
-  $ pip install pep8
-  $ pip install --upgrade pep8
-  $ pip uninstall pep8
-
-There's also a package for Debian/Ubuntu, but it's not always the
-latest version::
-
-  $ sudo apt-get install pep8
-
-
-Example usage and output
-------------------------
-
-::
-
-  $ pep8 --first optparse.py
-  optparse.py:69:11: E401 multiple imports on one line
-  optparse.py:77:1: E302 expected 2 blank lines, found 1
-  optparse.py:88:5: E301 expected 1 blank line, found 0
-  optparse.py:222:34: W602 deprecated form of raising exception
-  optparse.py:347:31: E211 whitespace before '('
-  optparse.py:357:17: E201 whitespace after '{'
-  optparse.py:472:29: E221 multiple spaces before operator
-  optparse.py:544:21: W601 .has_key() is deprecated, use 'in'
-
-You can also make pep8.py show the source code for each error, and
-even the relevant text from PEP 8::
-
-  $ pep8 --show-source --show-pep8 testsuite/E40.py
-  testsuite/E40.py:2:10: E401 multiple imports on one line
-  import os, sys
-           ^
-      Imports should usually be on separate lines.
-
-      Okay: import os\nimport sys
-      E401: import sys, os
-
-
-Or you can display how often each error was found::
-
-  $ pep8 --statistics -qq Python-2.5/Lib
-  232     E201 whitespace after '['
-  599     E202 whitespace before ')'
-  631     E203 whitespace before ','
-  842     E211 whitespace before '('
-  2531    E221 multiple spaces before operator
-  4473    E301 expected 1 blank line, found 0
-  4006    E302 expected 2 blank lines, found 1
-  165     E303 too many blank lines (4)
-  325     E401 multiple imports on one line
-  3615    E501 line too long (82 characters)
-  612     W601 .has_key() is deprecated, use 'in'
-  1188    W602 deprecated form of raising exception
-
-Quick help is available on the command line::
-
-  $ pep8 -h
-  Usage: pep8 [options] input ...
-
-  Options:
-    --version            show program's version number and exit
-    -h, --help           show this help message and exit
-    -v, --verbose        print status messages, or debug with -vv
-    -q, --quiet          report only file names, or nothing with -qq
-    --first              show first occurrence of each error
-    --exclude=patterns   exclude files or directories which match these comma
-                         separated patterns (default: .svn,CVS,.bzr,.hg,.git)
-    --filename=patterns  when parsing directories, only check filenames matching
-                         these comma separated patterns (default: *.py)
-    --select=errors      select errors and warnings (e.g. E,W6)
-    --ignore=errors      skip errors and warnings (e.g. E4,W)
-    --show-source        show source code for each error
-    --show-pep8          show text of PEP 8 for each error (implies --first)
-    --statistics         count errors and warnings
-    --count              print total number of errors and warnings to standard
-                         error and set exit code to 1 if total is not null
-    --max-line-length=n  set maximum allowed line length (default: 79)
-    --hang-closing       hang closing bracket instead of matching indentation of
-                         opening bracket's line
-    --format=format      set the error format [default|pylint|<custom>]
-    --diff               report only lines changed according to the unified diff
-                         received on STDIN
-
-    Testing Options:
-      --benchmark        measure processing speed
-
-    Configuration:
-      The project options are read from the [pep8] section of the tox.ini
-      file or the setup.cfg file located in any parent folder of the path(s)
-      being processed.  Allowed options are: exclude, filename, select,
-      ignore, max-line-length, hang-closing, count, format, quiet, show-pep8,
-      show-source, statistics, verbose.
-
-      --config=path      user config file location (default: ~/.config/pep8)
-
-
-Configuration
--------------
-
-The behaviour may be configured at two levels.
-
-The user settings are read from the ``~/.config/pep8`` file.
-Example::
-
-  [pep8]
-  ignore = E226,E302,E41
-  max-line-length = 160
-
-At the project level, a ``tox.ini`` file or a ``setup.cfg`` file is read if
-present (``.pep8`` file is also supported, but it is deprecated).  If none of
-these files have a ``[pep8]`` section, no project specific configuration is
-loaded.
-
-If the ``ignore`` option is not in the configuration and not in the arguments,
-only the error codes ``E226`` and ``E241/E242`` are ignored (see below).
-
-
-Error codes
------------
-
-This is the current list of error and warning codes:
-
-+----------+----------------------------------------------------------------------+
-| code     | sample message                                                       |
-+==========+======================================================================+
-| **E1**   | *Indentation*                                                        |
-+----------+----------------------------------------------------------------------+
-| E101     | indentation contains mixed spaces and tabs                           |
-+----------+----------------------------------------------------------------------+
-| E111     | indentation is not a multiple of four                                |
-+----------+----------------------------------------------------------------------+
-| E112     | expected an indented block                                           |
-+----------+----------------------------------------------------------------------+
-| E113     | unexpected indentation                                               |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| E121 (^) | continuation line indentation is not a multiple of four              |
-+----------+----------------------------------------------------------------------+
-| E122 (^) | continuation line missing indentation or outdented                   |
-+----------+----------------------------------------------------------------------+
-| E123 (*) | closing bracket does not match indentation of opening bracket's line |
-+----------+----------------------------------------------------------------------+
-| E124 (^) | closing bracket does not match visual indentation                    |
-+----------+----------------------------------------------------------------------+
-| E125 (^) | continuation line does not distinguish itself from next logical line |
-+----------+----------------------------------------------------------------------+
-| E126 (^) | continuation line over-indented for hanging indent                   |
-+----------+----------------------------------------------------------------------+
-| E127 (^) | continuation line over-indented for visual indent                    |
-+----------+----------------------------------------------------------------------+
-| E128 (^) | continuation line under-indented for visual indent                   |
-+----------+----------------------------------------------------------------------+
-| E133 (*) | closing bracket is missing indentation                               |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| **E2**   | *Whitespace*                                                         |
-+----------+----------------------------------------------------------------------+
-| E201     | whitespace after '('                                                 |
-+----------+----------------------------------------------------------------------+
-| E202     | whitespace before ')'                                                |
-+----------+----------------------------------------------------------------------+
-| E203     | whitespace before ':'                                                |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| E211     | whitespace before '('                                                |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| E221     | multiple spaces before operator                                      |
-+----------+----------------------------------------------------------------------+
-| E222     | multiple spaces after operator                                       |
-+----------+----------------------------------------------------------------------+
-| E223     | tab before operator                                                  |
-+----------+----------------------------------------------------------------------+
-| E224     | tab after operator                                                   |
-+----------+----------------------------------------------------------------------+
-| E225     | missing whitespace around operator                                   |
-+----------+----------------------------------------------------------------------+
-| E226 (*) | missing whitespace around arithmetic operator                        |
-+----------+----------------------------------------------------------------------+
-| E227     | missing whitespace around bitwise or shift operator                  |
-+----------+----------------------------------------------------------------------+
-| E228     | missing whitespace around modulo operator                            |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| E231     | missing whitespace after ','                                         |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| E241 (*) | multiple spaces after ','                                            |
-+----------+----------------------------------------------------------------------+
-| E242 (*) | tab after ','                                                        |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| E251     | unexpected spaces around keyword / parameter equals                  |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| E261     | at least two spaces before inline comment                            |
-+----------+----------------------------------------------------------------------+
-| E262     | inline comment should start with '# '                                |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| E271     | multiple spaces after keyword                                        |
-+----------+----------------------------------------------------------------------+
-| E272     | multiple spaces before keyword                                       |
-+----------+----------------------------------------------------------------------+
-| E273     | tab after keyword                                                    |
-+----------+----------------------------------------------------------------------+
-| E274     | tab before keyword                                                   |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| **E3**   | *Blank line*                                                         |
-+----------+----------------------------------------------------------------------+
-| E301     | expected 1 blank line, found 0                                       |
-+----------+----------------------------------------------------------------------+
-| E302     | expected 2 blank lines, found 0                                      |
-+----------+----------------------------------------------------------------------+
-| E303     | too many blank lines (3)                                             |
-+----------+----------------------------------------------------------------------+
-| E304     | blank lines found after function decorator                           |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| **E4**   | *Import*                                                             |
-+----------+----------------------------------------------------------------------+
-| E401     | multiple imports on one line                                         |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| **E5**   | *Line length*                                                        |
-+----------+----------------------------------------------------------------------+
-| E501 (^) | line too long (82 > 79 characters)                                   |
-+----------+----------------------------------------------------------------------+
-| E502     | the backslash is redundant between brackets                          |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| **E7**   | *Statement*                                                          |
-+----------+----------------------------------------------------------------------+
-| E701     | multiple statements on one line (colon)                              |
-+----------+----------------------------------------------------------------------+
-| E702     | multiple statements on one line (semicolon)                          |
-+----------+----------------------------------------------------------------------+
-| E703     | statement ends with a semicolon                                      |
-+----------+----------------------------------------------------------------------+
-| E711 (^) | comparison to None should be 'if cond is None:'                      |
-+----------+----------------------------------------------------------------------+
-| E712 (^) | comparison to True should be 'if cond is True:' or 'if cond:'        |
-+----------+----------------------------------------------------------------------+
-| E721     | do not compare types, use 'isinstance()'                             |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| **E9**   | *Runtime*                                                            |
-+----------+----------------------------------------------------------------------+
-| E901     | SyntaxError or IndentationError                                      |
-+----------+----------------------------------------------------------------------+
-| E902     | IOError                                                              |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| **W1**   | *Indentation warning*                                                |
-+----------+----------------------------------------------------------------------+
-| W191     | indentation contains tabs                                            |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| **W2**   | *Whitespace warning*                                                 |
-+----------+----------------------------------------------------------------------+
-| W291     | trailing whitespace                                                  |
-+----------+----------------------------------------------------------------------+
-| W292     | no newline at end of file                                            |
-+----------+----------------------------------------------------------------------+
-| W293     | blank line contains whitespace                                       |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| **W3**   | *Blank line warning*                                                 |
-+----------+----------------------------------------------------------------------+
-| W391     | blank line at end of file                                            |
-+----------+----------------------------------------------------------------------+
-+----------+----------------------------------------------------------------------+
-| **W6**   | *Deprecation warning*                                                |
-+----------+----------------------------------------------------------------------+
-| W601     | .has_key() is deprecated, use 'in'                                   |
-+----------+----------------------------------------------------------------------+
-| W602     | deprecated form of raising exception                                 |
-+----------+----------------------------------------------------------------------+
-| W603     | '<>' is deprecated, use '!='                                         |
-+----------+----------------------------------------------------------------------+
-| W604     | backticks are deprecated, use 'repr()'                               |
-+----------+----------------------------------------------------------------------+
-
-**(*)** In the default configuration, the checks **E123**, **E133**, **E226**,
-**E241** and **E242** are ignored because they are not rules unanimously
-accepted, and `PEP 8`_ does not enforce them.  The check **E133** is mutually
-exclusive with check **E123**.  Use switch ``--hang-closing`` to report **E133**
-instead of **E123**.
-
-**(^)** These checks can be disabled at the line level using the ``# noqa``
-special comment.  This possibility should be reserved for special cases.
-
-  *Special cases aren't special enough to break the rules.*
-
-
-Note: most errors can be listed with such one-liner::
-
-  $ python pep8.py --first --select E,W testsuite/ --format '%(code)s: %(text)s'
-
-
-.. _related-tools:
-
-Related tools
--------------
-
-The `flake8 checker <https://flake8.readthedocs.org>`_ is a wrapper around
-``pep8`` and similar tools. It supports plugins.
-
-Other tools which use ``pep8`` are referenced in the Wiki: `list of related tools
-<https://github.com/jcrocholl/pep8/wiki/RelatedTools>`_.
-
-.. _PEP 8: http://www.python.org/dev/peps/pep-0008/
deleted file mode 100644
--- a/pep8/docs/make.bat
+++ /dev/null
@@ -1,190 +0,0 @@
-@ECHO OFF
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
-	set SPHINXBUILD=sphinx-build
-)
-set BUILDDIR=_build
-set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
-set I18NSPHINXOPTS=%SPHINXOPTS% .
-if NOT "%PAPER%" == "" (
-	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
-	set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
-)
-
-if "%1" == "" goto help
-
-if "%1" == "help" (
-	:help
-	echo.Please use `make ^<target^>` where ^<target^> is one of
-	echo.  html       to make standalone HTML files
-	echo.  dirhtml    to make HTML files named index.html in directories
-	echo.  singlehtml to make a single large HTML file
-	echo.  pickle     to make pickle files
-	echo.  json       to make JSON files
-	echo.  htmlhelp   to make HTML files and a HTML help project
-	echo.  qthelp     to make HTML files and a qthelp project
-	echo.  devhelp    to make HTML files and a Devhelp project
-	echo.  epub       to make an epub
-	echo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter
-	echo.  text       to make text files
-	echo.  man        to make manual pages
-	echo.  texinfo    to make Texinfo files
-	echo.  gettext    to make PO message catalogs
-	echo.  changes    to make an overview over all changed/added/deprecated items
-	echo.  linkcheck  to check all external links for integrity
-	echo.  doctest    to run all doctests embedded in the documentation if enabled
-	goto end
-)
-
-if "%1" == "clean" (
-	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
-	del /q /s %BUILDDIR%\*
-	goto end
-)
-
-if "%1" == "html" (
-	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The HTML pages are in %BUILDDIR%/html.
-	goto end
-)
-
-if "%1" == "dirhtml" (
-	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
-	goto end
-)
-
-if "%1" == "singlehtml" (
-	%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
-	goto end
-)
-
-if "%1" == "pickle" (
-	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can process the pickle files.
-	goto end
-)
-
-if "%1" == "json" (
-	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can process the JSON files.
-	goto end
-)
-
-if "%1" == "htmlhelp" (
-	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can run HTML Help Workshop with the ^
-.hhp project file in %BUILDDIR%/htmlhelp.
-	goto end
-)
-
-if "%1" == "qthelp" (
-	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can run "qcollectiongenerator" with the ^
-.qhcp project file in %BUILDDIR%/qthelp, like this:
-	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\pep8.qhcp
-	echo.To view the help file:
-	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\pep8.ghc
-	goto end
-)
-
-if "%1" == "devhelp" (
-	%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished.
-	goto end
-)
-
-if "%1" == "epub" (
-	%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The epub file is in %BUILDDIR%/epub.
-	goto end
-)
-
-if "%1" == "latex" (
-	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
-	goto end
-)
-
-if "%1" == "text" (
-	%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The text files are in %BUILDDIR%/text.
-	goto end
-)
-
-if "%1" == "man" (
-	%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The manual pages are in %BUILDDIR%/man.
-	goto end
-)
-
-if "%1" == "texinfo" (
-	%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
-	goto end
-)
-
-if "%1" == "gettext" (
-	%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
-	goto end
-)
-
-if "%1" == "changes" (
-	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.The overview file is in %BUILDDIR%/changes.
-	goto end
-)
-
-if "%1" == "linkcheck" (
-	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Link check complete; look for any errors in the above output ^
-or in %BUILDDIR%/linkcheck/output.txt.
-	goto end
-)
-
-if "%1" == "doctest" (
-	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Testing of doctests in the sources finished, look at the ^
-results in %BUILDDIR%/doctest/output.txt.
-	goto end
-)
-
-:end
deleted file mode 100644
--- a/pep8/pep8.egg-info/PKG-INFO
+++ /dev/null
@@ -1,569 +0,0 @@
-Metadata-Version: 1.1
-Name: pep8
-Version: 1.4.6
-Summary: Python style guide checker
-Home-page: http://pep8.readthedocs.org/
-Author: Johann C. Rocholl
-Author-email: johann@rocholl.net
-License: Expat license
-Description: pep8 - Python style guide checker
-        =================================
-        
-        pep8 is a tool to check your Python code against some of the style
-        conventions in `PEP 8`_.
-        
-        .. _PEP 8: http://www.python.org/dev/peps/pep-0008/
-        
-        
-        Features
-        --------
-        
-        * Plugin architecture: Adding new checks is easy.
-        
-        * Parseable output: Jump to error location in your editor.
-        
-        * Small: Just one Python file, requires only stdlib. You can use just
-          the pep8.py file for this purpose.
-        
-        * Comes with a comprehensive test suite.
-        
-        Installation
-        ------------
-        
-        You can install, upgrade, uninstall pep8.py with these commands::
-        
-          $ pip install pep8
-          $ pip install --upgrade pep8
-          $ pip uninstall pep8
-        
-        There's also a package for Debian/Ubuntu, but it's not always the
-        latest version.
-        
-        Example usage and output
-        ------------------------
-        
-        ::
-        
-          $ pep8 --first optparse.py
-          optparse.py:69:11: E401 multiple imports on one line
-          optparse.py:77:1: E302 expected 2 blank lines, found 1
-          optparse.py:88:5: E301 expected 1 blank line, found 0
-          optparse.py:222:34: W602 deprecated form of raising exception
-          optparse.py:347:31: E211 whitespace before '('
-          optparse.py:357:17: E201 whitespace after '{'
-          optparse.py:472:29: E221 multiple spaces before operator
-          optparse.py:544:21: W601 .has_key() is deprecated, use 'in'
-        
-        You can also make pep8.py show the source code for each error, and
-        even the relevant text from PEP 8::
-        
-          $ pep8 --show-source --show-pep8 testsuite/E40.py
-          testsuite/E40.py:2:10: E401 multiple imports on one line
-          import os, sys
-                   ^
-              Imports should usually be on separate lines.
-        
-              Okay: import os\nimport sys
-              E401: import sys, os
-        
-        
-        Or you can display how often each error was found::
-        
-          $ pep8 --statistics -qq Python-2.5/Lib
-          232     E201 whitespace after '['
-          599     E202 whitespace before ')'
-          631     E203 whitespace before ','
-          842     E211 whitespace before '('
-          2531    E221 multiple spaces before operator
-          4473    E301 expected 1 blank line, found 0
-          4006    E302 expected 2 blank lines, found 1
-          165     E303 too many blank lines (4)
-          325     E401 multiple imports on one line
-          3615    E501 line too long (82 characters)
-          612     W601 .has_key() is deprecated, use 'in'
-          1188    W602 deprecated form of raising exception
-        
-        Links
-        -----
-        
-        .. image:: https://api.travis-ci.org/jcrocholl/pep8.png?branch=master
-           :target: https://travis-ci.org/jcrocholl/pep8
-           :alt: Build status
-        
-        * `Read the documentation <http://pep8.readthedocs.org/>`_
-        
-        * `Fork me on GitHub <http://github.com/jcrocholl/pep8>`_
-        
-        
-        Changelog
-        =========
-        
-        
-        1.4.6 (2013-07-02)
-        ------------------
-        
-        * Honor ``# noqa`` for errors E711 and E712. (Issue #180)
-        
-        * When both a ``tox.ini`` and a ``setup.cfg`` are present in the project
-          directory, merge their contents.  The ``tox.ini`` file takes
-          precedence (same as before). (Issue #182)
-        
-        * Give priority to ``--select`` over ``--ignore``. (Issue #188)
-        
-        * Compare full path when excluding a file. (Issue #186)
-        
-        * Correctly report other E12 errors when E123 is ignored. (Issue #103)
-        
-        * New option ``--hang-closing`` to switch to the alternative style of
-          closing bracket indentation for hanging indent.  Add error E133 for
-          closing bracket which is missing indentation. (Issue #103)
-        
-        * Accept both styles of closing bracket indentation for hanging indent.
-          Do not report error E123 in the default configuration. (Issue #103)
-        
-        * Do not crash when running AST checks and the document contains null bytes.
-          (Issue #184)
-        
-        * Fix false positive E261/E262 when the file contains a BOM. (Issue #193)
-        
-        * Fix E701, E702 and E703 not detected sometimes. (Issue #196)
-        
-        * Fix E122 not detected in some cases. (Issue #201 and #208)
-        
-        * Fix false positive E121 with multiple brackets. (Issue #203)
-        
-        
-        1.4.5 (2013-03-06)
-        ------------------
-        
-        * When no path is specified, do not try to read from stdin.  The feature
-          was added in 1.4.3, but it is not supported on Windows.  Use ``-``
-          filename argument to read from stdin.  This usage is supported
-          since 1.3.4. (Issue #170)
-        
-        * Do not require ``setuptools`` in setup.py.  It works around an issue
-          with ``pip`` and Python 3. (Issue #172)
-        
-        * Add ``__pycache__`` to the ignore list.
-        
-        * Change misleading message for E251. (Issue #171)
-        
-        * Do not report false E302 when the source file has a coding cookie or a
-          comment on the first line. (Issue #174)
-        
-        * Reorganize the tests and add tests for the API and for the command line
-          usage and options. (Issues #161 and #162)
-        
-        * Ignore all checks which are not explicitly selected when ``select`` is
-          passed to the ``StyleGuide`` constructor.
-        
-        
-        1.4.4 (2013-02-24)
-        ------------------
-        
-        * Report E227 or E228 instead of E225 for whitespace around bitwise, shift
-          or modulo operators. (Issue #166)
-        
-        * Change the message for E226 to make clear that it is about arithmetic
-          operators.
-        
-        * Fix a false positive E128 for continuation line indentation with tabs.
-        
-        * Fix regression with the ``--diff`` option. (Issue #169)
-        
-        * Fix the ``TestReport`` class to print the unexpected warnings and
-          errors.
-        
-        
-        1.4.3 (2013-02-22)
-        ------------------
-        
-        * Hide the ``--doctest`` and ``--testsuite`` options when installed.
-        
-        * Fix crash with AST checkers when the syntax is invalid. (Issue #160)
-        
-        * Read from standard input if no path is specified.
-        
-        * Initiate a graceful shutdown on ``Control+C``.
-        
-        * Allow to change the ``checker_class`` for the ``StyleGuide``.
-        
-        
-        1.4.2 (2013-02-10)
-        ------------------
-        
-        * Support AST checkers provided by third-party applications.
-        
-        * Register new checkers with ``register_check(func_or_cls, codes)``.
-        
-        * Allow to construct a ``StyleGuide`` with a custom parser.
-        
-        * Accept visual indentation without parenthesis after the ``if``
-          statement. (Issue #151)
-        
-        * Fix UnboundLocalError when using ``# noqa`` with continued lines.
-          (Issue #158)
-        
-        * Re-order the lines for the ``StandardReport``.
-        
-        * Expand tabs when checking E12 continuation lines. (Issue #155)
-        
-        * Refactor the testing class ``TestReport`` and the specific test
-          functions into a separate test module.
-        
-        
-        1.4.1 (2013-01-18)
-        ------------------
-        
-        * Allow sphinx.ext.autodoc syntax for comments. (Issue #110)
-        
-        * Report E703 instead of E702 for the trailing semicolon. (Issue #117)
-        
-        * Honor ``# noqa`` in addition to ``# nopep8``. (Issue #149)
-        
-        * Expose the ``OptionParser`` factory for better extensibility.
-        
-        
-        1.4 (2012-12-22)
-        ----------------
-        
-        * Report E226 instead of E225 for optional whitespace around common
-          operators (``*``, ``**``, ``/``, ``+`` and ``-``).  This new error
-          code is ignored in the default configuration because PEP 8 recommends
-          to "use your own judgement". (Issue #96)
-        
-        * Lines with a ``# nopep8`` at the end will not issue errors on line
-          length E501 or continuation line indentation E12*. (Issue #27)
-        
-        * Fix AssertionError when the source file contains an invalid line
-          ending ``"\r\r\n"``. (Issue #119)
-        
-        * Read the ``[pep8]`` section of ``tox.ini`` or ``setup.cfg`` if present.
-          (Issue #93 and #141)
-        
-        * Add the Sphinx-based documentation, and publish it
-          on http://pep8.readthedocs.org/. (Issue #105)
-        
-        
-        1.3.4 (2012-12-18)
-        ------------------
-        
-        * Fix false positive E124 and E128 with comments. (Issue #100)
-        
-        * Fix error on stdin when running with bpython. (Issue #101)
-        
-        * Fix false positive E401. (Issue #104)
-        
-        * Report E231 for nested dictionary in list. (Issue #142)
-        
-        * Catch E271 at the beginning of the line. (Issue #133)
-        
-        * Fix false positive E126 for multi-line comments. (Issue #138)
-        
-        * Fix false positive E221 when operator is preceded by a comma. (Issue #135)
-        
-        * Fix ``--diff`` failing on one-line hunk. (Issue #137)
-        
-        * Fix the ``--exclude`` switch for directory paths. (Issue #111)
-        
-        * Use ``-`` filename to read from standard input. (Issue #128)
-        
-        
-        1.3.3 (2012-06-27)
-        ------------------
-        
-        * Fix regression with continuation line checker. (Issue #98)
-        
-        
-        1.3.2 (2012-06-26)
-        ------------------
-        
-        * Revert to the previous behaviour for ``--show-pep8``:
-          do not imply ``--first``. (Issue #89)
-        
-        * Add E902 for IO errors. (Issue #87)
-        
-        * Fix false positive for E121, and missed E124. (Issue #92)
-        
-        * Set a sensible default path for config file on Windows. (Issue #95)
-        
-        * Allow ``verbose`` in the configuration file. (Issue #91)
-        
-        * Show the enforced ``max-line-length`` in the error message. (Issue #86)
-        
-        
-        1.3.1 (2012-06-18)
-        ------------------
-        
-        * Explain which configuration options are expected.  Accept and recommend
-          the options names with hyphen instead of underscore. (Issue #82)
-        
-        * Do not read the user configuration when used as a module
-          (except if ``config_file=True`` is passed to the ``StyleGuide`` constructor).
-        
-        * Fix wrong or missing cases for the E12 series.
-        
-        * Fix cases where E122 was missed. (Issue #81)
-        
-        
-        1.3 (2012-06-15)
-        ----------------
-        
-        .. warning::
-           The internal API is backwards incompatible.
-        
-        * Remove global configuration and refactor the library around
-          a ``StyleGuide`` class; add the ability to configure various
-          reporters. (Issue #35 and #66)
-        
-        * Read user configuration from ``~/.config/pep8``
-          and local configuration from ``./.pep8``. (Issue #22)
-        
-        * Fix E502 for backslash embedded in multi-line string. (Issue #68)
-        
-        * Fix E225 for Python 3 iterable unpacking (PEP 3132). (Issue #72)
-        
-        * Enable the new checkers from the E12 series in the default
-          configuration.
-        
-        * Suggest less error-prone alternatives for E712 errors.
-        
-        * Rewrite checkers to run faster (E22, E251, E27).
-        
-        * Fixed a crash when parsed code is invalid (too many
-          closing brackets).
-        
-        * Fix E127 and E128 for continuation line indentation. (Issue #74)
-        
-        * New option ``--format`` to customize the error format. (Issue #23)
-        
-        * New option ``--diff`` to check only modified code.  The unified
-          diff is read from STDIN.  Example: ``hg diff | pep8 --diff``
-          (Issue #39)
-        
-        * Correctly report the count of failures and set the exit code to 1
-          when the ``--doctest`` or the ``--testsuite`` fails.
-        
-        * Correctly detect the encoding in Python 3. (Issue #69)
-        
-        * Drop support for Python 2.3, 2.4 and 3.0. (Issue #78)
-        
-        
-        1.2 (2012-06-01)
-        ----------------
-        
-        * Add E121 through E128 for continuation line indentation.  These
-          checks are disabled by default.  If you want to force all checks,
-          use switch ``--select=E,W``.  Patch by Sam Vilain. (Issue #64)
-        
-        * Add E721 for direct type comparisons. (Issue #47)
-        
-        * Add E711 and E712 for comparisons to singletons. (Issue #46)
-        
-        * Fix spurious E225 and E701 for function annotations. (Issue #29)
-        
-        * Add E502 for explicit line join between brackets.
-        
-        * Fix E901 when printing source with ``--show-source``.
-        
-        * Report all errors for each checker, instead of reporting only the
-          first occurence for each line.
-        
-        * Option ``--show-pep8`` implies ``--first``.
-        
-        
-        1.1 (2012-05-24)
-        ----------------
-        
-        * Add E901 for syntax errors. (Issues #63 and #30)
-        
-        * Add E271, E272, E273 and E274 for extraneous whitespace around
-          keywords. (Issue #57)
-        
-        * Add ``tox.ini`` configuration file for tests. (Issue #61)
-        
-        * Add ``.travis.yml`` configuration file for continuous integration.
-          (Issue #62)
-        
-        
-        1.0.1 (2012-04-06)
-        ------------------
-        
-        * Fix inconsistent version numbers.
-        
-        
-        1.0 (2012-04-04)
-        ----------------
-        
-        * Fix W602 ``raise`` to handle multi-char names. (Issue #53)
-        
-        
-        0.7.0 (2012-03-26)
-        ------------------
-        
-        * Now ``--first`` prints only the first occurence of each error.
-          The ``--repeat`` flag becomes obsolete because it is the default
-          behaviour. (Issue #6)
-        
-        * Allow to specify ``--max-line-length``. (Issue #36)
-        
-        * Make the shebang more flexible. (Issue #26)
-        
-        * Add testsuite to the bundle. (Issue #25)
-        
-        * Fixes for Jython. (Issue #49)
-        
-        * Add PyPI classifiers. (Issue #43)
-        
-        * Fix the ``--exclude`` option. (Issue #48)
-        
-        * Fix W602, accept ``raise`` with 3 arguments. (Issue #34)
-        
-        * Correctly select all tests if ``DEFAULT_IGNORE == ''``.
-        
-        
-        0.6.1 (2010-10-03)
-        ------------------
-        
-        * Fix inconsistent version numbers. (Issue #21)
-        
-        
-        0.6.0 (2010-09-19)
-        ------------------
-        
-        * Test suite reorganized and enhanced in order to check more failures
-          with fewer test files.  Read the ``run_tests`` docstring for details
-          about the syntax.
-        
-        * Fix E225: accept ``print >>sys.stderr, "..."`` syntax.
-        
-        * Fix E501 for lines containing multibyte encoded characters. (Issue #7)
-        
-        * Fix E221, E222, E223, E224 not detected in some cases. (Issue #16)
-        
-        * Fix E211 to reject ``v = dic['a'] ['b']``. (Issue #17)
-        
-        * Exit code is always 1 if any error or warning is found. (Issue #10)
-        
-        * ``--ignore`` checks are now really ignored, especially in
-          conjunction with ``--count``. (Issue #8)
-        
-        * Blank lines with spaces yield W293 instead of W291: some developers
-          want to ignore this warning and indent the blank lines to paste their
-          code easily in the Python interpreter.
-        
-        * Fix E301: do not require a blank line before an indented block. (Issue #14)
-        
-        * Fix E203 to accept NumPy slice notation ``a[0, :]``. (Issue #13)
-        
-        * Performance improvements.
-        
-        * Fix decoding and checking non-UTF8 files in Python 3.
-        
-        * Fix E225: reject ``True+False`` when running on Python 3.
-        
-        * Fix an exception when the line starts with an operator.
-        
-        * Allow a new line before closing ``)``, ``}`` or ``]``. (Issue #5)
-        
-        
-        0.5.0 (2010-02-17)
-        ------------------
-        
-        * Changed the ``--count`` switch to print to sys.stderr and set
-          exit code to 1 if any error or warning is found.
-        
-        * E241 and E242 are removed from the standard checks. If you want to
-          include these checks, use switch ``--select=E,W``. (Issue #4)
-        
-        * Blank line is not mandatory before the first class method or nested
-          function definition, even if there's a docstring. (Issue #1)
-        
-        * Add the switch ``--version``.
-        
-        * Fix decoding errors with Python 3. (Issue #13 [1]_)
-        
-        * Add ``--select`` option which is mirror of ``--ignore``.
-        
-        * Add checks E261 and E262 for spaces before inline comments.
-        
-        * New check W604 warns about deprecated usage of backticks.
-        
-        * New check W603 warns about the deprecated operator ``<>``.
-        
-        * Performance improvement, due to rewriting of E225.
-        
-        * E225 now accepts:
-        
-          - no whitespace after unary operator or similar. (Issue #9 [1]_)
-        
-          - lambda function with argument unpacking or keyword defaults.
-        
-        * Reserve "2 blank lines" for module-level logical blocks. (E303)
-        
-        * Allow multi-line comments. (E302, issue #10 [1]_)
-        
-        
-        0.4.2 (2009-10-22)
-        ------------------
-        
-        * Decorators on classes and class methods are OK now.
-        
-        
-        0.4 (2009-10-20)
-        ----------------
-        
-        * Support for all versions of Python from 2.3 to 3.1.
-        
-        * New and greatly expanded self tests.
-        
-        * Added ``--count`` option to print the total number of errors and warnings.
-        
-        * Further improvements to the handling of comments and blank lines.
-          (Issue #1 [1]_ and others changes.)
-        
-        * Check all py files in directory when passed a directory (Issue
-          #2 [1]_). This also prevents an exception when traversing directories
-          with non ``*.py`` files.
-        
-        * E231 should allow commas to be followed by ``)``. (Issue #3 [1]_)
-        
-        * Spaces are no longer required around the equals sign for keyword
-          arguments or default parameter values.
-        
-        
-        .. [1] These issues refer to the `previous issue tracker`__.
-        .. __:  http://github.com/cburroughs/pep8.py/issues
-        
-        
-        0.3.1 (2009-09-14)
-        ------------------
-        
-        * Fixes for comments: do not count them when checking for blank lines between
-          items.
-        
-        * Added setup.py for pypi upload and easy_installability.
-        
-        
-        0.2 (2007-10-16)
-        ----------------
-        
-        * Loads of fixes and improvements.
-        
-        
-        0.1 (2006-10-01)
-        ----------------
-        
-        * First release.
-        
-Keywords: pep8
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Environment :: Console
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
deleted file mode 100644
--- a/pep8/pep8.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-CHANGES.txt
-MANIFEST.in
-README.rst
-pep8.py
-setup.py
-docs/Makefile
-docs/advanced.rst
-docs/api.rst
-docs/conf.py
-docs/developer.rst
-docs/index.rst
-docs/intro.rst
-docs/make.bat
-pep8.egg-info/PKG-INFO
-pep8.egg-info/SOURCES.txt
-pep8.egg-info/dependency_links.txt
-pep8.egg-info/entry_points.txt
-pep8.egg-info/namespace_packages.txt
-pep8.egg-info/not-zip-safe
-pep8.egg-info/top_level.txt
-testsuite/E10.py
-testsuite/E11.py
-testsuite/E12.py
-testsuite/E12not.py
-testsuite/E20.py
-testsuite/E21.py
-testsuite/E22.py
-testsuite/E23.py
-testsuite/E24.py
-testsuite/E25.py
-testsuite/E26.py
-testsuite/E27.py
-testsuite/E30.py
-testsuite/E30not.py
-testsuite/E40.py
-testsuite/E50.py
-testsuite/E70.py
-testsuite/E71.py
-testsuite/E72.py
-testsuite/E90.py
-testsuite/W19.py
-testsuite/W29.py
-testsuite/W39.py
-testsuite/W60.py
-testsuite/__init__.py
-testsuite/latin-1.py
-testsuite/noqa.py
-testsuite/python3.py
-testsuite/support.py
-testsuite/test_all.py
-testsuite/test_api.py
-testsuite/test_shell.py
-testsuite/utf-8-bom.py
-testsuite/utf-8.py
\ No newline at end of file
deleted file mode 100644
--- a/pep8/pep8.egg-info/dependency_links.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-
deleted file mode 100644
--- a/pep8/pep8.egg-info/entry_points.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-[console_scripts]
-pep8 = pep8:_main
-
deleted file mode 100644
--- a/pep8/pep8.egg-info/namespace_packages.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-
deleted file mode 100644
--- a/pep8/pep8.egg-info/not-zip-safe
+++ /dev/null
@@ -1,1 +0,0 @@
-
deleted file mode 100644
--- a/pep8/pep8.egg-info/top_level.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-pep8
deleted file mode 100755
--- a/pep8/pep8.py
+++ /dev/null
@@ -1,1876 +0,0 @@
-#!/usr/bin/env python
-# pep8.py - Check Python source code formatting, according to PEP 8
-# Copyright (C) 2006-2009 Johann C. Rocholl <johann@rocholl.net>
-# Copyright (C) 2009-2013 Florent Xicluna <florent.xicluna@gmail.com>
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation files
-# (the "Software"), to deal in the Software without restriction,
-# including without limitation the rights to use, copy, modify, merge,
-# publish, distribute, sublicense, and/or sell copies of the Software,
-# and to permit persons to whom the Software is furnished to do so,
-# subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-r"""
-Check Python source code formatting, according to PEP 8:
-http://www.python.org/dev/peps/pep-0008/
-
-For usage and a list of options, try this:
-$ python pep8.py -h
-
-This program and its regression test suite live here:
-http://github.com/jcrocholl/pep8
-
-Groups of errors and warnings:
-E errors
-W warnings
-100 indentation
-200 whitespace
-300 blank lines
-400 imports
-500 line length
-600 deprecation
-700 statements
-900 syntax error
-"""
-__version__ = '1.4.6'
-
-import os
-import sys
-import re
-import time
-import inspect
-import keyword
-import tokenize
-from optparse import OptionParser
-from fnmatch import fnmatch
-try:
-    from configparser import RawConfigParser
-    from io import TextIOWrapper
-except ImportError:
-    from ConfigParser import RawConfigParser
-
-DEFAULT_EXCLUDE = '.svn,CVS,.bzr,.hg,.git,__pycache__'
-DEFAULT_IGNORE = 'E123,E226,E24'
-if sys.platform == 'win32':
-    DEFAULT_CONFIG = os.path.expanduser(r'~\.pep8')
-else:
-    DEFAULT_CONFIG = os.path.join(os.getenv('XDG_CONFIG_HOME') or
-                                  os.path.expanduser('~/.config'), 'pep8')
-PROJECT_CONFIG = ('setup.cfg', 'tox.ini', '.pep8')
-TESTSUITE_PATH = os.path.join(os.path.dirname(__file__), 'testsuite')
-MAX_LINE_LENGTH = 79
-REPORT_FORMAT = {
-    'default': '%(path)s:%(row)d:%(col)d: %(code)s %(text)s',
-    'pylint': '%(path)s:%(row)d: [%(code)s] %(text)s',
-}
-
-PyCF_ONLY_AST = 1024
-SINGLETONS = frozenset(['False', 'None', 'True'])
-KEYWORDS = frozenset(keyword.kwlist + ['print']) - SINGLETONS
-UNARY_OPERATORS = frozenset(['>>', '**', '*', '+', '-'])
-ARITHMETIC_OP = frozenset(['**', '*', '/', '//', '+', '-'])
-WS_OPTIONAL_OPERATORS = ARITHMETIC_OP.union(['^', '&', '|', '<<', '>>', '%'])
-WS_NEEDED_OPERATORS = frozenset([
-    '**=', '*=', '/=', '//=', '+=', '-=', '!=', '<>', '<', '>',
-    '%=', '^=', '&=', '|=', '==', '<=', '>=', '<<=', '>>=', '='])
-WHITESPACE = frozenset(' \t')
-SKIP_TOKENS = frozenset([tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE,
-                         tokenize.INDENT, tokenize.DEDENT])
-BENCHMARK_KEYS = ['directories', 'files', 'logical lines', 'physical lines']
-
-INDENT_REGEX = re.compile(r'([ \t]*)')
-RAISE_COMMA_REGEX = re.compile(r'raise\s+\w+\s*,')
-RERAISE_COMMA_REGEX = re.compile(r'raise\s+\w+\s*,\s*\w+\s*,\s*\w+')
-ERRORCODE_REGEX = re.compile(r'\b[A-Z]\d{3}\b')
-DOCSTRING_REGEX = re.compile(r'u?r?["\']')
-EXTRANEOUS_WHITESPACE_REGEX = re.compile(r'[[({] | []}),;:]')
-WHITESPACE_AFTER_COMMA_REGEX = re.compile(r'[,;:]\s*(?:  |\t)')
-COMPARE_SINGLETON_REGEX = re.compile(r'([=!]=)\s*(None|False|True)')
-COMPARE_TYPE_REGEX = re.compile(r'(?:[=!]=|is(?:\s+not)?)\s*type(?:s.\w+Type'
-                                r'|\s*\(\s*([^)]*[^ )])\s*\))')
-KEYWORD_REGEX = re.compile(r'(\s*)\b(?:%s)\b(\s*)' % r'|'.join(KEYWORDS))
-OPERATOR_REGEX = re.compile(r'(?:[^,\s])(\s*)(?:[-+*/|!<=>%&^]+)(\s*)')
-LAMBDA_REGEX = re.compile(r'\blambda\b')
-HUNK_REGEX = re.compile(r'^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@.*$')
-
-# Work around Python < 2.6 behaviour, which does not generate NL after
-# a comment which is on a line by itself.
-COMMENT_WITH_NL = tokenize.generate_tokens(['#\n'].pop).send(None)[1] == '#\n'
-
-
-##############################################################################
-# Plugins (check functions) for physical lines
-##############################################################################
-
-
-def tabs_or_spaces(physical_line, indent_char):
-    r"""
-    Never mix tabs and spaces.
-
-    The most popular way of indenting Python is with spaces only.  The
-    second-most popular way is with tabs only.  Code indented with a mixture
-    of tabs and spaces should be converted to using spaces exclusively.  When
-    invoking the Python command line interpreter with the -t option, it issues
-    warnings about code that illegally mixes tabs and spaces.  When using -tt
-    these warnings become errors.  These options are highly recommended!
-
-    Okay: if a == 0:\n        a = 1\n        b = 1
-    E101: if a == 0:\n        a = 1\n\tb = 1
-    """
-    indent = INDENT_REGEX.match(physical_line).group(1)
-    for offset, char in enumerate(indent):
-        if char != indent_char:
-            return offset, "E101 indentation contains mixed spaces and tabs"
-
-
-def tabs_obsolete(physical_line):
-    r"""
-    For new projects, spaces-only are strongly recommended over tabs.  Most
-    editors have features that make this easy to do.
-
-    Okay: if True:\n    return
-    W191: if True:\n\treturn
-    """
-    indent = INDENT_REGEX.match(physical_line).group(1)
-    if '\t' in indent:
-        return indent.index('\t'), "W191 indentation contains tabs"
-
-
-def trailing_whitespace(physical_line):
-    r"""
-    JCR: Trailing whitespace is superfluous.
-    FBM: Except when it occurs as part of a blank line (i.e. the line is
-         nothing but whitespace). According to Python docs[1] a line with only
-         whitespace is considered a blank line, and is to be ignored. However,
-         matching a blank line to its indentation level avoids mistakenly
-         terminating a multi-line statement (e.g. class declaration) when
-         pasting code into the standard Python interpreter.
-
-         [1] http://docs.python.org/reference/lexical_analysis.html#blank-lines
-
-    The warning returned varies on whether the line itself is blank, for easier
-    filtering for those who want to indent their blank lines.
-
-    Okay: spam(1)\n#
-    W291: spam(1) \n#
-    W293: class Foo(object):\n    \n    bang = 12
-    """
-    physical_line = physical_line.rstrip('\n')    # chr(10), newline
-    physical_line = physical_line.rstrip('\r')    # chr(13), carriage return
-    physical_line = physical_line.rstrip('\x0c')  # chr(12), form feed, ^L
-    stripped = physical_line.rstrip(' \t\v')
-    if physical_line != stripped:
-        if stripped:
-            return len(stripped), "W291 trailing whitespace"
-        else:
-            return 0, "W293 blank line contains whitespace"
-
-
-def trailing_blank_lines(physical_line, lines, line_number):
-    r"""
-    JCR: Trailing blank lines are superfluous.
-
-    Okay: spam(1)
-    W391: spam(1)\n
-    """
-    if not physical_line.rstrip() and line_number == len(lines):
-        return 0, "W391 blank line at end of file"
-
-
-def missing_newline(physical_line):
-    """
-    JCR: The last line should have a newline.
-
-    Reports warning W292.
-    """
-    if physical_line.rstrip() == physical_line:
-        return len(physical_line), "W292 no newline at end of file"
-
-
-def maximum_line_length(physical_line, max_line_length):
-    """
-    Limit all lines to a maximum of 79 characters.
-
-    There are still many devices around that are limited to 80 character
-    lines; plus, limiting windows to 80 characters makes it possible to have
-    several windows side-by-side.  The default wrapping on such devices looks
-    ugly.  Therefore, please limit all lines to a maximum of 79 characters.
-    For flowing long blocks of text (docstrings or comments), limiting the
-    length to 72 characters is recommended.
-
-    Reports error E501.
-    """
-    line = physical_line.rstrip()
-    length = len(line)
-    if length > max_line_length and not noqa(line):
-        if hasattr(line, 'decode'):   # Python 2
-            # The line could contain multi-byte characters
-            try:
-                length = len(line.decode('utf-8'))
-            except UnicodeError:
-                pass
-        if length > max_line_length:
-            return (max_line_length, "E501 line too long "
-                    "(%d > %d characters)" % (length, max_line_length))
-
-
-##############################################################################
-# Plugins (check functions) for logical lines
-##############################################################################
-
-
-def blank_lines(logical_line, blank_lines, indent_level, line_number,
-                previous_logical, previous_indent_level):
-    r"""
-    Separate top-level function and class definitions with two blank lines.
-
-    Method definitions inside a class are separated by a single blank line.
-
-    Extra blank lines may be used (sparingly) to separate groups of related
-    functions.  Blank lines may be omitted between a bunch of related
-    one-liners (e.g. a set of dummy implementations).
-
-    Use blank lines in functions, sparingly, to indicate logical sections.
-
-    Okay: def a():\n    pass\n\n\ndef b():\n    pass
-    Okay: def a():\n    pass\n\n\n# Foo\n# Bar\n\ndef b():\n    pass
-
-    E301: class Foo:\n    b = 0\n    def bar():\n        pass
-    E302: def a():\n    pass\n\ndef b(n):\n    pass
-    E303: def a():\n    pass\n\n\n\ndef b(n):\n    pass
-    E303: def a():\n\n\n\n    pass
-    E304: @decorator\n\ndef a():\n    pass
-    """
-    if line_number < 3 and not previous_logical:
-        return  # Don't expect blank lines before the first line
-    if previous_logical.startswith('@'):
-        if blank_lines:
-            yield 0, "E304 blank lines found after function decorator"
-    elif blank_lines > 2 or (indent_level and blank_lines == 2):
-        yield 0, "E303 too many blank lines (%d)" % blank_lines
-    elif logical_line.startswith(('def ', 'class ', '@')):
-        if indent_level:
-            if not (blank_lines or previous_indent_level < indent_level or
-                    DOCSTRING_REGEX.match(previous_logical)):
-                yield 0, "E301 expected 1 blank line, found 0"
-        elif blank_lines != 2:
-            yield 0, "E302 expected 2 blank lines, found %d" % blank_lines
-
-
-def extraneous_whitespace(logical_line):
-    """
-    Avoid extraneous whitespace in the following situations:
-
-    - Immediately inside parentheses, brackets or braces.
-
-    - Immediately before a comma, semicolon, or colon.
-
-    Okay: spam(ham[1], {eggs: 2})
-    E201: spam( ham[1], {eggs: 2})
-    E201: spam(ham[ 1], {eggs: 2})
-    E201: spam(ham[1], { eggs: 2})
-    E202: spam(ham[1], {eggs: 2} )
-    E202: spam(ham[1 ], {eggs: 2})
-    E202: spam(ham[1], {eggs: 2 })
-
-    E203: if x == 4: print x, y; x, y = y , x
-    E203: if x == 4: print x, y ; x, y = y, x
-    E203: if x == 4 : print x, y; x, y = y, x
-    """
-    line = logical_line
-    for match in EXTRANEOUS_WHITESPACE_REGEX.finditer(line):
-        text = match.group()
-        char = text.strip()
-        found = match.start()
-        if text == char + ' ':
-            # assert char in '([{'
-            yield found + 1, "E201 whitespace after '%s'" % char
-        elif line[found - 1] != ',':
-            code = ('E202' if char in '}])' else 'E203')  # if char in ',;:'
-            yield found, "%s whitespace before '%s'" % (code, char)
-
-
-def whitespace_around_keywords(logical_line):
-    r"""
-    Avoid extraneous whitespace around keywords.
-
-    Okay: True and False
-    E271: True and  False
-    E272: True  and False
-    E273: True and\tFalse
-    E274: True\tand False
-    """
-    for match in KEYWORD_REGEX.finditer(logical_line):
-        before, after = match.groups()
-
-        if '\t' in before:
-            yield match.start(1), "E274 tab before keyword"
-        elif len(before) > 1:
-            yield match.start(1), "E272 multiple spaces before keyword"
-
-        if '\t' in after:
-            yield match.start(2), "E273 tab after keyword"
-        elif len(after) > 1:
-            yield match.start(2), "E271 multiple spaces after keyword"
-
-
-def missing_whitespace(logical_line):
-    """
-    JCR: Each comma, semicolon or colon should be followed by whitespace.
-
-    Okay: [a, b]
-    Okay: (3,)
-    Okay: a[1:4]
-    Okay: a[:4]
-    Okay: a[1:]
-    Okay: a[1:4:2]
-    E231: ['a','b']
-    E231: foo(bar,baz)
-    E231: [{'a':'b'}]
-    """
-    line = logical_line
-    for index in range(len(line) - 1):
-        char = line[index]
-        if char in ',;:' and line[index + 1] not in WHITESPACE:
-            before = line[:index]
-            if char == ':' and before.count('[') > before.count(']') and \
-                    before.rfind('{') < before.rfind('['):
-                continue  # Slice syntax, no space required
-            if char == ',' and line[index + 1] == ')':
-                continue  # Allow tuple with only one element: (3,)
-            yield index, "E231 missing whitespace after '%s'" % char
-
-
-def indentation(logical_line, previous_logical, indent_char,
-                indent_level, previous_indent_level):
-    r"""
-    Use 4 spaces per indentation level.
-
-    For really old code that you don't want to mess up, you can continue to
-    use 8-space tabs.
-
-    Okay: a = 1
-    Okay: if a == 0:\n    a = 1
-    E111:   a = 1
-
-    Okay: for item in items:\n    pass
-    E112: for item in items:\npass
-
-    Okay: a = 1\nb = 2
-    E113: a = 1\n    b = 2
-    """
-    if indent_char == ' ' and indent_level % 4:
-        yield 0, "E111 indentation is not a multiple of four"
-    indent_expect = previous_logical.endswith(':')
-    if indent_expect and indent_level <= previous_indent_level:
-        yield 0, "E112 expected an indented block"
-    if indent_level > previous_indent_level and not indent_expect:
-        yield 0, "E113 unexpected indentation"
-
-
-def continued_indentation(logical_line, tokens, indent_level, hang_closing,
-                          noqa, verbose):
-    r"""
-    Continuation lines should align wrapped elements either vertically using
-    Python's implicit line joining inside parentheses, brackets and braces, or
-    using a hanging indent.
-
-    When using a hanging indent the following considerations should be applied:
-
-    - there should be no arguments on the first line, and
-
-    - further indentation should be used to clearly distinguish itself as a
-      continuation line.
-
-    Okay: a = (\n)
-    E123: a = (\n    )
-
-    Okay: a = (\n    42)
-    E121: a = (\n   42)
-    E122: a = (\n42)
-    E123: a = (\n    42\n    )
-    E124: a = (24,\n     42\n)
-    E125: if (a or\n    b):\n    pass
-    E126: a = (\n        42)
-    E127: a = (24,\n      42)
-    E128: a = (24,\n    42)
-    """
-    first_row = tokens[0][2][0]
-    nrows = 1 + tokens[-1][2][0] - first_row
-    if noqa or nrows == 1:
-        return
-
-    # indent_next tells us whether the next block is indented; assuming
-    # that it is indented by 4 spaces, then we should not allow 4-space
-    # indents on the final continuation line; in turn, some other
-    # indents are allowed to have an extra 4 spaces.
-    indent_next = logical_line.endswith(':')
-
-    row = depth = 0
-    # remember how many brackets were opened on each line
-    parens = [0] * nrows
-    # relative indents of physical lines
-    rel_indent = [0] * nrows
-    # visual indents
-    indent_chances = {}
-    last_indent = tokens[0][2]
-    indent = [last_indent[1]]
-    if verbose >= 3:
-        print(">>> " + tokens[0][4].rstrip())
-
-    for token_type, text, start, end, line in tokens:
-
-        newline = row < start[0] - first_row
-        if newline:
-            row = start[0] - first_row
-            newline = (not last_token_multiline and
-                       token_type not in (tokenize.NL, tokenize.NEWLINE))
-
-        if newline:
-            # this is the beginning of a continuation line.
-            last_indent = start
-            if verbose >= 3:
-                print("... " + line.rstrip())
-
-            # record the initial indent.
-            rel_indent[row] = expand_indent(line) - indent_level
-
-            if depth:
-                # a bracket expression in a continuation line.
-                # find the line that it was opened on
-                for open_row in range(row - 1, -1, -1):
-                    if parens[open_row]:
-                        break
-            else:
-                # an unbracketed continuation line (ie, backslash)
-                open_row = 0
-            hang = rel_indent[row] - rel_indent[open_row]
-            close_bracket = (token_type == tokenize.OP and text in ']})')
-            visual_indent = (not close_bracket and hang > 0 and
-                             indent_chances.get(start[1]))
-
-            if close_bracket and indent[depth]:
-                # closing bracket for visual indent
-                if start[1] != indent[depth]:
-                    yield (start, "E124 closing bracket does not match "
-                           "visual indentation")
-            elif close_bracket and not hang:
-                # closing bracket matches indentation of opening bracket's line
-                if hang_closing:
-                    yield start, "E133 closing bracket is missing indentation"
-            elif visual_indent is True:
-                # visual indent is verified
-                if not indent[depth]:
-                    indent[depth] = start[1]
-            elif visual_indent in (text, str):
-                # ignore token lined up with matching one from a previous line
-                pass
-            elif indent[depth] and start[1] < indent[depth]:
-                # visual indent is broken
-                yield (start, "E128 continuation line "
-                       "under-indented for visual indent")
-            elif hang == 4 or (indent_next and rel_indent[row] == 8):
-                # hanging indent is verified
-                if close_bracket and not hang_closing:
-                    yield (start, "E123 closing bracket does not match "
-                           "indentation of opening bracket's line")
-            else:
-                # indent is broken
-                if hang <= 0:
-                    error = "E122", "missing indentation or outdented"
-                elif indent[depth]:
-                    error = "E127", "over-indented for visual indent"
-                elif hang % 4:
-                    error = "E121", "indentation is not a multiple of four"
-                else:
-                    error = "E126", "over-indented for hanging indent"
-                yield start, "%s continuation line %s" % error
-
-        # look for visual indenting
-        if (parens[row] and token_type not in (tokenize.NL, tokenize.COMMENT)
-                and not indent[depth]):
-            indent[depth] = start[1]
-            indent_chances[start[1]] = True
-            if verbose >= 4:
-                print("bracket depth %s indent to %s" % (depth, start[1]))
-        # deal with implicit string concatenation
-        elif (token_type in (tokenize.STRING, tokenize.COMMENT) or
-              text in ('u', 'ur', 'b', 'br')):
-            indent_chances[start[1]] = str
-        # special case for the "if" statement because len("if (") == 4
-        elif not indent_chances and not row and not depth and text == 'if':
-            indent_chances[end[1] + 1] = True
-
-        # keep track of bracket depth
-        if token_type == tokenize.OP:
-            if text in '([{':
-                depth += 1
-                indent.append(0)
-                parens[row] += 1
-                if verbose >= 4:
-                    print("bracket depth %s seen, col %s, visual min = %s" %
-                          (depth, start[1], indent[depth]))
-            elif text in ')]}' and depth > 0:
-                # parent indents should not be more than this one
-                prev_indent = indent.pop() or last_indent[1]
-                for d in range(depth):
-                    if indent[d] > prev_indent:
-                        indent[d] = 0
-                for ind in list(indent_chances):
-                    if ind >= prev_indent:
-                        del indent_chances[ind]
-                depth -= 1
-                if depth:
-                    indent_chances[indent[depth]] = True
-                for idx in range(row, -1, -1):
-                    if parens[idx]:
-                        parens[idx] -= 1
-                        rel_indent[row] = rel_indent[idx]
-                        break
-            assert len(indent) == depth + 1
-            if start[1] not in indent_chances:
-                # allow to line up tokens
-                indent_chances[start[1]] = text
-
-        last_token_multiline = (start[0] != end[0])
-
-    if indent_next and expand_indent(line) == indent_level + 4:
-        yield (last_indent, "E125 continuation line does not distinguish "
-               "itself from next logical line")
-
-
-def whitespace_before_parameters(logical_line, tokens):
-    """
-    Avoid extraneous whitespace in the following situations:
-
-    - Immediately before the open parenthesis that starts the argument
-      list of a function call.
-
-    - Immediately before the open parenthesis that starts an indexing or
-      slicing.
-
-    Okay: spam(1)
-    E211: spam (1)
-
-    Okay: dict['key'] = list[index]
-    E211: dict ['key'] = list[index]
-    E211: dict['key'] = list [index]
-    """
-    prev_type, prev_text, __, prev_end, __ = tokens[0]
-    for index in range(1, len(tokens)):
-        token_type, text, start, end, __ = tokens[index]
-        if (token_type == tokenize.OP and
-            text in '([' and
-            start != prev_end and
-            (prev_type == tokenize.NAME or prev_text in '}])') and
-            # Syntax "class A (B):" is allowed, but avoid it
-            (index < 2 or tokens[index - 2][1] != 'class') and
-                # Allow "return (a.foo for a in range(5))"
-                not keyword.iskeyword(prev_text)):
-            yield prev_end, "E211 whitespace before '%s'" % text
-        prev_type = token_type
-        prev_text = text
-        prev_end = end
-
-
-def whitespace_around_operator(logical_line):
-    r"""
-    Avoid extraneous whitespace in the following situations:
-
-    - More than one space around an assignment (or other) operator to
-      align it with another.
-
-    Okay: a = 12 + 3
-    E221: a = 4  + 5
-    E222: a = 4 +  5
-    E223: a = 4\t+ 5
-    E224: a = 4 +\t5
-    """
-    for match in OPERATOR_REGEX.finditer(logical_line):
-        before, after = match.groups()
-
-        if '\t' in before:
-            yield match.start(1), "E223 tab before operator"
-        elif len(before) > 1:
-            yield match.start(1), "E221 multiple spaces before operator"
-
-        if '\t' in after:
-            yield match.start(2), "E224 tab after operator"
-        elif len(after) > 1:
-            yield match.start(2), "E222 multiple spaces after operator"
-
-
-def missing_whitespace_around_operator(logical_line, tokens):
-    r"""
-    - Always surround these binary operators with a single space on
-      either side: assignment (=), augmented assignment (+=, -= etc.),
-      comparisons (==, <, >, !=, <>, <=, >=, in, not in, is, is not),
-      Booleans (and, or, not).
-
-    - Use spaces around arithmetic operators.
-
-    Okay: i = i + 1
-    Okay: submitted += 1
-    Okay: x = x * 2 - 1
-    Okay: hypot2 = x * x + y * y
-    Okay: c = (a + b) * (a - b)
-    Okay: foo(bar, key='word', *args, **kwargs)
-    Okay: alpha[:-i]
-
-    E225: i=i+1
-    E225: submitted +=1
-    E225: x = x /2 - 1
-    E225: z = x **y
-    E226: c = (a+b) * (a-b)
-    E226: hypot2 = x*x + y*y
-    E227: c = a|b
-    E228: msg = fmt%(errno, errmsg)
-    """
-    parens = 0
-    need_space = False
-    prev_type = tokenize.OP
-    prev_text = prev_end = None
-    for token_type, text, start, end, line in tokens:
-        if token_type in (tokenize.NL, tokenize.NEWLINE, tokenize.ERRORTOKEN):
-            # ERRORTOKEN is triggered by backticks in Python 3
-            continue
-        if text in ('(', 'lambda'):
-            parens += 1
-        elif text == ')':
-            parens -= 1
-        if need_space:
-            if start != prev_end:
-                # Found a (probably) needed space
-                if need_space is not True and not need_space[1]:
-                    yield (need_space[0],
-                           "E225 missing whitespace around operator")
-                need_space = False
-            elif text == '>' and prev_text in ('<', '-'):
-                # Tolerate the "<>" operator, even if running Python 3
-                # Deal with Python 3's annotated return value "->"
-                pass
-            else:
-                if need_space is True or need_space[1]:
-                    # A needed trailing space was not found
-                    yield prev_end, "E225 missing whitespace around operator"
-                else:
-                    code, optype = 'E226', 'arithmetic'
-                    if prev_text == '%':
-                        code, optype = 'E228', 'modulo'
-                    elif prev_text not in ARITHMETIC_OP:
-                        code, optype = 'E227', 'bitwise or shift'
-                    yield (need_space[0], "%s missing whitespace "
-                           "around %s operator" % (code, optype))
-                need_space = False
-        elif token_type == tokenize.OP and prev_end is not None:
-            if text == '=' and parens:
-                # Allow keyword args or defaults: foo(bar=None).
-                pass
-            elif text in WS_NEEDED_OPERATORS:
-                need_space = True
-            elif text in UNARY_OPERATORS:
-                # Check if the operator is being used as a binary operator
-                # Allow unary operators: -123, -x, +1.
-                # Allow argument unpacking: foo(*args, **kwargs).
-                if prev_type == tokenize.OP:
-                    binary_usage = (prev_text in '}])')
-                elif prev_type == tokenize.NAME:
-                    binary_usage = (prev_text not in KEYWORDS)
-                else:
-                    binary_usage = (prev_type not in SKIP_TOKENS)
-
-                if binary_usage:
-                    need_space = None
-            elif text in WS_OPTIONAL_OPERATORS:
-                need_space = None
-
-            if need_space is None:
-                # Surrounding space is optional, but ensure that
-                # trailing space matches opening space
-                need_space = (prev_end, start != prev_end)
-            elif need_space and start == prev_end:
-                # A needed opening space was not found
-                yield prev_end, "E225 missing whitespace around operator"
-                need_space = False
-        prev_type = token_type
-        prev_text = text
-        prev_end = end
-
-
-def whitespace_around_comma(logical_line):
-    r"""
-    Avoid extraneous whitespace in the following situations:
-
-    - More than one space around an assignment (or other) operator to
-      align it with another.
-
-    Note: these checks are disabled by default
-
-    Okay: a = (1, 2)
-    E241: a = (1,  2)
-    E242: a = (1,\t2)
-    """
-    line = logical_line
-    for m in WHITESPACE_AFTER_COMMA_REGEX.finditer(line):
-        found = m.start() + 1
-        if '\t' in m.group():
-            yield found, "E242 tab after '%s'" % m.group()[0]
-        else:
-            yield found, "E241 multiple spaces after '%s'" % m.group()[0]
-
-
-def whitespace_around_named_parameter_equals(logical_line, tokens):
-    """
-    Don't use spaces around the '=' sign when used to indicate a
-    keyword argument or a default parameter value.
-
-    Okay: def complex(real, imag=0.0):
-    Okay: return magic(r=real, i=imag)
-    Okay: boolean(a == b)
-    Okay: boolean(a != b)
-    Okay: boolean(a <= b)
-    Okay: boolean(a >= b)
-
-    E251: def complex(real, imag = 0.0):
-    E251: return magic(r = real, i = imag)
-    """
-    parens = 0
-    no_space = False
-    prev_end = None
-    message = "E251 unexpected spaces around keyword / parameter equals"
-    for token_type, text, start, end, line in tokens:
-        if no_space:
-            no_space = False
-            if start != prev_end:
-                yield (prev_end, message)
-        elif token_type == tokenize.OP:
-            if text == '(':
-                parens += 1
-            elif text == ')':
-                parens -= 1
-            elif parens and text == '=':
-                no_space = True
-                if start != prev_end:
-                    yield (prev_end, message)
-        prev_end = end
-
-
-def whitespace_before_inline_comment(logical_line, tokens):
-    """
-    Separate inline comments by at least two spaces.
-
-    An inline comment is a comment on the same line as a statement.  Inline
-    comments should be separated by at least two spaces from the statement.
-    They should start with a # and a single space.
-
-    Okay: x = x + 1  # Increment x
-    Okay: x = x + 1    # Increment x
-    E261: x = x + 1 # Increment x
-    E262: x = x + 1  #Increment x
-    E262: x = x + 1  #  Increment x
-    """
-    prev_end = (0, 0)
-    for token_type, text, start, end, line in tokens:
-        if token_type == tokenize.COMMENT:
-            if not line[:start[1]].strip():
-                continue
-            if prev_end[0] == start[0] and start[1] < prev_end[1] + 2:
-                yield (prev_end,
-                       "E261 at least two spaces before inline comment")
-            symbol, sp, comment = text.partition(' ')
-            if symbol not in ('#', '#:') or comment[:1].isspace():
-                yield start, "E262 inline comment should start with '# '"
-        elif token_type != tokenize.NL:
-            prev_end = end
-
-
-def imports_on_separate_lines(logical_line):
-    r"""
-    Imports should usually be on separate lines.
-
-    Okay: import os\nimport sys
-    E401: import sys, os
-
-    Okay: from subprocess import Popen, PIPE
-    Okay: from myclas import MyClass
-    Okay: from foo.bar.yourclass import YourClass
-    Okay: import myclass
-    Okay: import foo.bar.yourclass
-    """
-    line = logical_line
-    if line.startswith('import '):
-        found = line.find(',')
-        if -1 < found and ';' not in line[:found]:
-            yield found, "E401 multiple imports on one line"
-
-
-def compound_statements(logical_line):
-    r"""
-    Compound statements (multiple statements on the same line) are
-    generally discouraged.
-
-    While sometimes it's okay to put an if/for/while with a small body
-    on the same line, never do this for multi-clause statements. Also
-    avoid folding such long lines!
-
-    Okay: if foo == 'blah':\n    do_blah_thing()
-    Okay: do_one()
-    Okay: do_two()
-    Okay: do_three()
-
-    E701: if foo == 'blah': do_blah_thing()
-    E701: for x in lst: total += x
-    E701: while t < 10: t = delay()
-    E701: if foo == 'blah': do_blah_thing()
-    E701: else: do_non_blah_thing()
-    E701: try: something()
-    E701: finally: cleanup()
-    E701: if foo == 'blah': one(); two(); three()
-
-    E702: do_one(); do_two(); do_three()
-    E703: do_four();  # useless semicolon
-    """
-    line = logical_line
-    last_char = len(line) - 1
-    found = line.find(':')
-    while -1 < found < last_char:
-        before = line[:found]
-        if (before.count('{') <= before.count('}') and  # {'a': 1} (dict)
-            before.count('[') <= before.count(']') and  # [1:2] (slice)
-            before.count('(') <= before.count(')') and  # (Python 3 annotation)
-                not LAMBDA_REGEX.search(before)):       # lambda x: x
-            yield found, "E701 multiple statements on one line (colon)"
-        found = line.find(':', found + 1)
-    found = line.find(';')
-    while -1 < found:
-        if found < last_char:
-            yield found, "E702 multiple statements on one line (semicolon)"
-        else:
-            yield found, "E703 statement ends with a semicolon"
-        found = line.find(';', found + 1)
-
-
-def explicit_line_join(logical_line, tokens):
-    r"""
-    Avoid explicit line join between brackets.
-
-    The preferred way of wrapping long lines is by using Python's implied line
-    continuation inside parentheses, brackets and braces.  Long lines can be
-    broken over multiple lines by wrapping expressions in parentheses.  These
-    should be used in preference to using a backslash for line continuation.
-
-    E502: aaa = [123, \\n       123]
-    E502: aaa = ("bbb " \\n       "ccc")
-
-    Okay: aaa = [123,\n       123]
-    Okay: aaa = ("bbb "\n       "ccc")
-    Okay: aaa = "bbb " \\n    "ccc"
-    """
-    prev_start = prev_end = parens = 0
-    for token_type, text, start, end, line in tokens:
-        if start[0] != prev_start and parens and backslash:
-            yield backslash, "E502 the backslash is redundant between brackets"
-        if end[0] != prev_end:
-            if line.rstrip('\r\n').endswith('\\'):
-                backslash = (end[0], len(line.splitlines()[-1]) - 1)
-            else:
-                backslash = None
-            prev_start = prev_end = end[0]
-        else:
-            prev_start = start[0]
-        if token_type == tokenize.OP:
-            if text in '([{':
-                parens += 1
-            elif text in ')]}':
-                parens -= 1
-
-
-def comparison_to_singleton(logical_line, noqa):
-    """
-    Comparisons to singletons like None should always be done
-    with "is" or "is not", never the equality operators.
-
-    Okay: if arg is not None:
-    E711: if arg != None:
-    E712: if arg == True:
-
-    Also, beware of writing if x when you really mean if x is not None --
-    e.g. when testing whether a variable or argument that defaults to None was
-    set to some other value.  The other value might have a type (such as a
-    container) that could be false in a boolean context!
-    """
-    match = not noqa and COMPARE_SINGLETON_REGEX.search(logical_line)
-    if match:
-        same = (match.group(1) == '==')
-        singleton = match.group(2)
-        msg = "'if cond is %s:'" % (('' if same else 'not ') + singleton)
-        if singleton in ('None',):
-            code = 'E711'
-        else:
-            code = 'E712'
-            nonzero = ((singleton == 'True' and same) or
-                       (singleton == 'False' and not same))
-            msg += " or 'if %scond:'" % ('' if nonzero else 'not ')
-        yield match.start(1), ("%s comparison to %s should be %s" %
-                               (code, singleton, msg))
-
-
-def comparison_type(logical_line):
-    """
-    Object type comparisons should always use isinstance() instead of
-    comparing types directly.
-
-    Okay: if isinstance(obj, int):
-    E721: if type(obj) is type(1):
-
-    When checking if an object is a string, keep in mind that it might be a
-    unicode string too! In Python 2.3, str and unicode have a common base
-    class, basestring, so you can do:
-
-    Okay: if isinstance(obj, basestring):
-    Okay: if type(a1) is type(b1):
-    """
-    match = COMPARE_TYPE_REGEX.search(logical_line)
-    if match:
-        inst = match.group(1)
-        if inst and isidentifier(inst) and inst not in SINGLETONS:
-            return  # Allow comparison for types which are not obvious
-        yield match.start(), "E721 do not compare types, use 'isinstance()'"
-
-
-def python_3000_has_key(logical_line):
-    r"""
-    The {}.has_key() method is removed in the Python 3.
-    Use the 'in' operation instead.
-
-    Okay: if "alph" in d:\n    print d["alph"]
-    W601: assert d.has_key('alph')
-    """
-    pos = logical_line.find('.has_key(')
-    if pos > -1:
-        yield pos, "W601 .has_key() is deprecated, use 'in'"
-
-
-def python_3000_raise_comma(logical_line):
-    """
-    When raising an exception, use "raise ValueError('message')"
-    instead of the older form "raise ValueError, 'message'".
-
-    The paren-using form is preferred because when the exception arguments
-    are long or include string formatting, you don't need to use line
-    continuation characters thanks to the containing parentheses.  The older
-    form is removed in Python 3.
-
-    Okay: raise DummyError("Message")
-    W602: raise DummyError, "Message"
-    """
-    match = RAISE_COMMA_REGEX.match(logical_line)
-    if match and not RERAISE_COMMA_REGEX.match(logical_line):
-        yield match.end() - 1, "W602 deprecated form of raising exception"
-
-
-def python_3000_not_equal(logical_line):
-    """
-    != can also be written <>, but this is an obsolete usage kept for
-    backwards compatibility only. New code should always use !=.
-    The older syntax is removed in Python 3.
-
-    Okay: if a != 'no':
-    W603: if a <> 'no':
-    """
-    pos = logical_line.find('<>')
-    if pos > -1:
-        yield pos, "W603 '<>' is deprecated, use '!='"
-
-
-def python_3000_backticks(logical_line):
-    """
-    Backticks are removed in Python 3.
-    Use repr() instead.
-
-    Okay: val = repr(1 + 2)
-    W604: val = `1 + 2`
-    """
-    pos = logical_line.find('`')
-    if pos > -1:
-        yield pos, "W604 backticks are deprecated, use 'repr()'"
-
-
-##############################################################################
-# Helper functions
-##############################################################################
-
-
-if '' == ''.encode():
-    # Python 2: implicit encoding.
-    def readlines(filename):
-        f = open(filename)
-        try:
-            return f.readlines()
-        finally:
-            f.close()
-    isidentifier = re.compile(r'[a-zA-Z_]\w*').match
-    stdin_get_value = sys.stdin.read
-else:
-    # Python 3
-    def readlines(filename):
-        f = open(filename, 'rb')
-        try:
-            coding, lines = tokenize.detect_encoding(f.readline)
-            f = TextIOWrapper(f, coding, line_buffering=True)
-            return [l.decode(coding) for l in lines] + f.readlines()
-        except (LookupError, SyntaxError, UnicodeError):
-            f.close()
-            # Fall back if files are improperly declared
-            f = open(filename, encoding='latin-1')
-            return f.readlines()
-        finally:
-            f.close()
-    isidentifier = str.isidentifier
-
-    def stdin_get_value():
-        return TextIOWrapper(sys.stdin.buffer, errors='ignore').read()
-readlines.__doc__ = "    Read the source code."
-noqa = re.compile(r'# no(?:qa|pep8)\b', re.I).search
-
-
-def expand_indent(line):
-    r"""
-    Return the amount of indentation.
-    Tabs are expanded to the next multiple of 8.
-
-    >>> expand_indent('    ')
-    4
-    >>> expand_indent('\t')
-    8
-    >>> expand_indent('    \t')
-    8
-    >>> expand_indent('       \t')
-    8
-    >>> expand_indent('        \t')
-    16
-    """
-    if '\t' not in line:
-        return len(line) - len(line.lstrip())
-    result = 0
-    for char in line:
-        if char == '\t':
-            result = result // 8 * 8 + 8
-        elif char == ' ':
-            result += 1
-        else:
-            break
-    return result
-
-
-def mute_string(text):
-    """
-    Replace contents with 'xxx' to prevent syntax matching.
-
-    >>> mute_string('"abc"')
-    '"xxx"'
-    >>> mute_string("'''abc'''")
-    "'''xxx'''"
-    >>> mute_string("r'abc'")
-    "r'xxx'"
-    """
-    # String modifiers (e.g. u or r)
-    start = text.index(text[-1]) + 1
-    end = len(text) - 1
-    # Triple quotes
-    if text[-3:] in ('"""', "'''"):
-        start += 2
-        end -= 2
-    return text[:start] + 'x' * (end - start) + text[end:]
-
-
-def parse_udiff(diff, patterns=None, parent='.'):
-    """Return a dictionary of matching lines."""
-    # For each file of the diff, the entry key is the filename,
-    # and the value is a set of row numbers to consider.
-    rv = {}
-    path = nrows = None
-    for line in diff.splitlines():
-        if nrows:
-            if line[:1] != '-':
-                nrows -= 1
-            continue