From 19b2ef9764bdb201670d185e417cb93ed9282fd4 Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@lothar.com>
Date: Tue, 19 Mar 2013 15:26:21 -0700
Subject: [PATCH] Remove darcs from setup.py, remove darcsver egg. Closes
 #1908.

Also remove lingering traces of darcs from MANIFEST.in,
.darcs-boringfile, setup.cfg, and unit tests.
---
 .darcs-boringfile                             |  83 --------
 MANIFEST.in                                   |   3 +-
 darcsver-1.7.2.egg/EGG-INFO/PKG-INFO          | 121 -----------
 darcsver-1.7.2.egg/EGG-INFO/SOURCES.txt       |  16 --
 .../EGG-INFO/dependency_links.txt             |   1 -
 darcsver-1.7.2.egg/EGG-INFO/entry_points.txt  |  10 -
 darcsver-1.7.2.egg/EGG-INFO/not-zip-safe      |   1 -
 darcsver-1.7.2.egg/EGG-INFO/top_level.txt     |   2 -
 darcsver-1.7.2.egg/darcsver/__init__.py       |   8 -
 darcsver-1.7.2.egg/darcsver/_version.py       |  17 --
 darcsver-1.7.2.egg/darcsver/darcsvermodule.py | 200 ------------------
 .../darcsver/setuptools_command.py            | 126 -----------
 darcsver-1.7.2.egg/scripts/__init__.py        |   0
 darcsver-1.7.2.egg/scripts/darcsverscript.py  |  46 ----
 .../share/doc/python-darcsver/README.txt      |  95 ---------
 setup.cfg                                     |   9 +-
 setup.py                                      |  67 ++----
 src/allmydata/test/test_runner.py             |   2 +-
 18 files changed, 24 insertions(+), 783 deletions(-)
 delete mode 100644 .darcs-boringfile
 delete mode 100644 darcsver-1.7.2.egg/EGG-INFO/PKG-INFO
 delete mode 100644 darcsver-1.7.2.egg/EGG-INFO/SOURCES.txt
 delete mode 100644 darcsver-1.7.2.egg/EGG-INFO/dependency_links.txt
 delete mode 100644 darcsver-1.7.2.egg/EGG-INFO/entry_points.txt
 delete mode 100644 darcsver-1.7.2.egg/EGG-INFO/not-zip-safe
 delete mode 100644 darcsver-1.7.2.egg/EGG-INFO/top_level.txt
 delete mode 100644 darcsver-1.7.2.egg/darcsver/__init__.py
 delete mode 100644 darcsver-1.7.2.egg/darcsver/_version.py
 delete mode 100644 darcsver-1.7.2.egg/darcsver/darcsvermodule.py
 delete mode 100644 darcsver-1.7.2.egg/darcsver/setuptools_command.py
 delete mode 100644 darcsver-1.7.2.egg/scripts/__init__.py
 delete mode 100644 darcsver-1.7.2.egg/scripts/darcsverscript.py
 delete mode 100644 darcsver-1.7.2.egg/share/doc/python-darcsver/README.txt

diff --git a/.darcs-boringfile b/.darcs-boringfile
deleted file mode 100644
index e26aa6dd..00000000
--- a/.darcs-boringfile
+++ /dev/null
@@ -1,83 +0,0 @@
-# Boring file regexps:
-\.hi$
-\.o$
-\.o\.cmd$
-# *.ko files aren't boring by default because they might
-# be Korean translations rather than kernel modules.
-# \.ko$
-\.ko\.cmd$
-\.mod\.c$
-(^|/)\.tmp_versions($|/)
-(^|/)CVS($|/)
-(^|/)RCS($|/)
-~$
-#(^|/)\.[^/]
-(^|/)_darcs($|/)
-\.bak$
-\.BAK$
-\.orig$
-(^|/)vssver\.scc$
-\.swp$
-(^|/)MT($|/)
-(^|/)\{arch\}($|/)
-(^|/).arch-ids($|/)
-(^|/),
-\.class$
-\.prof$
-(^|/)\.DS_Store$
-(^|/)BitKeeper($|/)
-(^|/)ChangeSet($|/)
-(^|/)\.svn($|/)
-(^|/)\.git($|/)
-\.py[co]$
-\#
-\.cvsignore$
-(^|/)Thumbs\.db$
-(^|/)autom4te\.cache($|/)
-
-^_trial_temp.*($|/)
-^\.buildbot($|/)
-^MANIFEST$
-^dist($|/)
-^debian($|/)
-
-^build($|/)
-^build-stamp$
-^python-build-stamp-2.[4567]$
-^\.coverage$
-^coverage-html($|/)
-^twisted/plugins/dropin\.cache$
-^\.coverage\.el$
-^_test_memory($|/)
-
-# _version.py is generated at build time, and never checked in
-^src/allmydata/_version\.py$
-# _appname.py is generated at build time, and never checked in
-^src/allmydata/_appname\.py$
-
-# bin/tahoe scripts (not including tahoe-script.template) are generated files
-^bin/tahoe$
-^bin/tahoe\.pyscript$
-^bin/tahoe-script\.py$
-
-# this file is maintained by the buildbot
-^\.buildbot-sourcedata$
-
-# automatically-built dependencies (using the 'build-deps' target) go here
-^support
-
-# creating a tahoe egg puts files here
-allmydata_tahoe.egg-info$
-^Twisted-.*\.egg/
-
-# zipped .eggs are boring, contents of .egg directories are not
-^.*\.egg$
-
-^\.checked-deps$
-^\.built$
-
-^misc/dependencies/build($|/)
-^misc/dependencies/temp($|/)
-
-^tahoe-deps($|/)
-^tahoe-deps\.tar\.gz$
diff --git a/MANIFEST.in b/MANIFEST.in
index 407b6814..da07b99c 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,12 +1,11 @@
 include COPYING.GPL COPYING.TGPPL.rst CREDITS Makefile NEWS.rst Tahoe.home
-include relnotes.txt .darcs-boringfile
+include relnotes.txt
 include bin/tahoe-script.template
 recursive-include src *.xhtml *.js *.png *.css
 recursive-include twisted *.py
 graft docs
 graft misc
 graft static
-graft darcsver-1.7.2.egg
 
 graft setuptools-0.6c16dev4.egg
 global-exclude *~ *.pyc
diff --git a/darcsver-1.7.2.egg/EGG-INFO/PKG-INFO b/darcsver-1.7.2.egg/EGG-INFO/PKG-INFO
deleted file mode 100644
index b59e3084..00000000
--- a/darcsver-1.7.2.egg/EGG-INFO/PKG-INFO
+++ /dev/null
@@ -1,121 +0,0 @@
-Metadata-Version: 1.0
-Name: darcsver
-Version: 1.7.2
-Summary: generate a version number from darcs history
-Home-page: http://tahoe-lafs.org/trac/darcsver
-Author: Zooko O'Whielacronx
-Author-email: zooko@zooko.com
-License: BSD
-Description: darcsver - generate version numbers from darcs revision control history
-        =======================================================================
-        
-        What Does It Do
-        ---------------
-        
-        Create files containing version numbers, based upon the latest darcs
-        release tag.
-        
-        If your source tree is coming from darcs (i.e. it is in a darcs
-        repository), this tool will determine the most recent release tag,
-        count the patches that have been applied since then, and compute a
-        version number to be written into _version.py (and optionally other
-        version files). This version number will be available by doing:
-        
-        from your_package_name import __version__
-        
-        Source trees that do not come from darcs (e.g. release tarballs, nightly
-        tarballs) and are not within a darcs repository should instead, come with a
-        _version.py that was generated before the tarball was produced. In this case,
-        this tool will quietly exit without modifying the existing _version.py .
-        
-        'release tags' are tags in the source repository that match the following
-        regexp:
-        
-        ^your_package_name-(\d+)(\.(\d+)(\.(\d+))?)?((a|b|c|rc)(\d+))?
-        
-        
-        Installation
-        ------------
-        
-        With easy_install:
-        
-        easy_install darcsver
-        
-        Alternative manual installation:
-        
-        tar -zxvf darcsver-X.Y.Z.tar.gz
-        cd darcsver-X.Y.Z
-        python setup.py install
-        
-        Where X.Y.Z is a version number.
-        
-        Alternative to make a specific package use darcsver without installing
-        darcsver into the system:
-        
-        Put "setup_requires=['darcsver']" in the call to setup() in the
-        package's setup.py file.
-        
-        
-        Usage
-        -----
-        
-        There are two ways to use this: the command-line tool and the
-        setuptools plugin.
-        
-        To use the command-line tool, execute it as:
-        
-        darcsver $PACKAGE_NAME $PATH_TO_VERSION_PY
-        
-        
-        To use the setuptools plugin (which enables you to write "./setup.py
-        darcsver" and which cleverly figures out where the _version.py file
-        ought to go), you must first package your python module with
-        `setup.py` and use setuptools.
-        
-        The former is well documented in the distutils manual:
-        
-        http://docs.python.org/dist/dist.html
-        
-        To use setuptools instead of distutils, just edit `setup.py` and
-        change
-        
-        from distutils.core import setup
-        
-        to
-        
-        from setuptools import setup
-        
-        
-        References
-        ----------
-        
-        How to distribute Python modules with Distutils:
-        
-        http://docs.python.org/dist/dist.html
-        
-        
-        Setuptools complete manual:
-        
-        http://peak.telecommunity.com/DevCenter/setuptools
-        
-        
-        Thanks to Yannick Gingras for providing the prototype for this
-        README.txt.
-        
-Keywords: distutils setuptools plugin setup darcs
-Platform: UNKNOWN
-Classifier: Framework :: Setuptools Plugin
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: License :: OSI Approved :: BSD License
-Classifier: License :: DFSG approved
-Classifier: Intended Audience :: Developers
-Classifier: Operating System :: OS Independent
-Classifier: Natural Language :: English
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.4
-Classifier: Programming Language :: Python :: 2.5
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Topic :: Utilities
-Classifier: Topic :: Software Development :: Libraries
diff --git a/darcsver-1.7.2.egg/EGG-INFO/SOURCES.txt b/darcsver-1.7.2.egg/EGG-INFO/SOURCES.txt
deleted file mode 100644
index 7ae9be9a..00000000
--- a/darcsver-1.7.2.egg/EGG-INFO/SOURCES.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-README.txt
-setup.py
-darcsver/__init__.py
-darcsver/_version.py
-darcsver/darcsvermodule.py
-darcsver/setuptools_command.py
-darcsver.egg-info/PKG-INFO
-darcsver.egg-info/SOURCES.txt
-darcsver.egg-info/dependency_links.txt
-darcsver.egg-info/entry_points.txt
-darcsver.egg-info/not-zip-safe
-darcsver.egg-info/top_level.txt
-darcsver/test/__init__.py
-darcsver/test/test_darcsver.py
-scripts/__init__.py
-scripts/darcsverscript.py
\ No newline at end of file
diff --git a/darcsver-1.7.2.egg/EGG-INFO/dependency_links.txt b/darcsver-1.7.2.egg/EGG-INFO/dependency_links.txt
deleted file mode 100644
index 8b137891..00000000
--- a/darcsver-1.7.2.egg/EGG-INFO/dependency_links.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/darcsver-1.7.2.egg/EGG-INFO/entry_points.txt b/darcsver-1.7.2.egg/EGG-INFO/entry_points.txt
deleted file mode 100644
index 569b4e41..00000000
--- a/darcsver-1.7.2.egg/EGG-INFO/entry_points.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-[distutils.setup_keywords]
-versionbodies = darcsver.setuptools_command:validate_versionbodies
-versionfiles = darcsver.setuptools_command:validate_versionfiles
-
-[console_scripts]
-darcsver = scripts.darcsverscript:main
-
-[distutils.commands]
-darcsver = darcsver.setuptools_command:DarcsVer
-
diff --git a/darcsver-1.7.2.egg/EGG-INFO/not-zip-safe b/darcsver-1.7.2.egg/EGG-INFO/not-zip-safe
deleted file mode 100644
index 8b137891..00000000
--- a/darcsver-1.7.2.egg/EGG-INFO/not-zip-safe
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/darcsver-1.7.2.egg/EGG-INFO/top_level.txt b/darcsver-1.7.2.egg/EGG-INFO/top_level.txt
deleted file mode 100644
index 4eebf095..00000000
--- a/darcsver-1.7.2.egg/EGG-INFO/top_level.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-darcsver
-scripts
diff --git a/darcsver-1.7.2.egg/darcsver/__init__.py b/darcsver-1.7.2.egg/darcsver/__init__.py
deleted file mode 100644
index 3421c135..00000000
--- a/darcsver-1.7.2.egg/darcsver/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-__version__ = "unknown"
-try:
-    from _version import __version__
-except ImportError:
-    # We're running in a tree that hasn't run darcsver, and didn't come with a
-    # _version.py, so we don't know what our version is. This should not happen
-    # very often.
-    pass
diff --git a/darcsver-1.7.2.egg/darcsver/_version.py b/darcsver-1.7.2.egg/darcsver/_version.py
deleted file mode 100644
index fa9c1060..00000000
--- a/darcsver-1.7.2.egg/darcsver/_version.py
+++ /dev/null
@@ -1,17 +0,0 @@
-
-# This is the version of this tree, as created by setup.py darcsver from the darcs patch
-# information: the main version number is taken from the most recent release
-# tag. If some patches have been added since the last release, this will have a
-# -NN "build number" suffix, or else a -rNN "revision number" suffix. Please see
-# pyutil.version_class for a description of what the different fields mean.
-
-__pkgname__ = "darcsver"
-verstr = "1.7.2"
-try:
-    from pyutil.version_class import Version as pyutil_Version
-    __version__ = pyutil_Version(verstr)
-except (ImportError, ValueError):
-    # Maybe there is no pyutil installed, or this may be an older version of
-    # pyutil.version_class which does not support SVN-alike revision numbers.
-    from distutils.version import LooseVersion as distutils_Version
-    __version__ = distutils_Version(verstr)
diff --git a/darcsver-1.7.2.egg/darcsver/darcsvermodule.py b/darcsver-1.7.2.egg/darcsver/darcsvermodule.py
deleted file mode 100644
index aabd1c9e..00000000
--- a/darcsver-1.7.2.egg/darcsver/darcsvermodule.py
+++ /dev/null
@@ -1,200 +0,0 @@
-import os, string, sys, re
-import xml.dom.minidom
-import subprocess
-PIPE=subprocess.PIPE
-from distutils import log
-
-def all(iterable):
-    for thing in iterable:
-        if not thing:
-            return False
-    return True
-
-OUR_VERSION_BASE_RE_STR="(\d+)(\.(\d+)(\.(\d+))?)?((a|b|c)(\d+))?(\.dev(\d+))?"
-try:
-    # If we can import pyutil.version_class then use its regex.
-    from pyutil import version_class
-    VERSION_BASE_RE_STR = version_class.VERSION_BASE_RE_STR
-except (ImportError, AttributeError):
-    # Else (perhaps a bootstrapping problem),then we'll use this
-    # regex, which was copied from the pyutil source code on
-    # 2010-09-02.
-    VERSION_BASE_RE_STR=OUR_VERSION_BASE_RE_STR
-
-def get_text(nodelist):
-    rc = ""
-    for node in nodelist:
-        if node.nodeType == node.TEXT_NODE:
-            rc = rc + node.data
-    return rc
-
-VERSION_BODY = '''
-# This is the version of this tree, as created by %(versiontool)s from the darcs patch
-# information: the main version number is taken from the most recent release
-# tag. If some patches have been added since the last release, this will have a
-# -NN "build number" suffix, or else a -rNN "revision number" suffix. Please see
-# pyutil.version_class for a description of what the different fields mean.
-
-__pkgname__ = "%(pkgname)s"
-verstr = "%(pkgversion)s"
-try:
-    from pyutil.version_class import Version as pyutil_Version
-    __version__ = pyutil_Version(verstr)
-except (ImportError, ValueError):
-    # Maybe there is no pyutil installed.
-    from distutils.version import LooseVersion as distutils_Version
-    __version__ = distutils_Version(verstr)
-'''
-
-def write_version_py(verstr, outfname, EXE_NAME, version_body, pkgname):
-    f = open(outfname, "wb+")
-    f.write(version_body % {
-            'versiontool': EXE_NAME,
-            'pkgversion': verstr,
-            'pkgname': pkgname,
-            })
-    f.close()
-
-def read_version_py(infname):
-    try:
-        verstrline = open(infname, "rt").read()
-    except EnvironmentError:
-        return None
-    else:
-        VSRE = r"^verstr = ['\"]([^'\"]*)['\"]"
-        mo = re.search(VSRE, verstrline, re.M)
-        if mo:
-            return mo.group(1)
-
-def update(pkgname, verfilename, revision_number=False, loud=False, abort_if_snapshot=False, EXE_NAME="darcsver", version_body=VERSION_BODY):
-    """
-    @param revision_number If true, count the total number of patches in all
-    history.  If false, count the total number of patches since the most recent
-    release tag.
-
-    Returns a tuple of (exit code, new version string).
-    """
-    if isinstance(verfilename, basestring):
-        verfilenames = [verfilename]
-    else:
-        verfilenames = verfilename
-        assert all([isinstance(vfn, basestring) for vfn in verfilenames]), [vfn for vfn in verfilenames if not isinstance(vfn, basestring)]
-    if isinstance(version_body, basestring):
-        verbodies = [version_body]
-    else:
-        verbodies = version_body
-    rc = -1
-
-    # First we try "darcs query repo" because if that fails then we
-    # won't try "darcs changes" at all, because "darcs changes" emits
-    # an ugly error message when run in not-a-repo.
-    try:
-        p = subprocess.Popen(["darcs", 'query', 'repo'], stdout=PIPE, stderr=PIPE, universal_newlines=True)
-    except OSError, ose:
-        if ose.errno == 2 and '~' in os.environ['PATH']:
-            expanded_path = os.environ['PATH'].replace('~', os.path.expanduser('~'))
-            msg = ("WARNING: 'darcs' was not found. However '~' was found in your PATH. \n"
-                   "Please note that bugs in python cause it to fail to traverse '~' in \n"
-                   "the user's PATH.  Please fix your path, e.g. \nPATH=%s" )
-            log.warn(msg % (expanded_path,))
-        pass
-    else:
-        (output, errput) = p.communicate()
-        rc = p.returncode
-
-    if rc == 0:
-        cmd = ["changes", "--xml-output"]
-        if not revision_number:
-            cmd.append("--from-tag=^%s" % (pkgname,))
-        try:
-            p = subprocess.Popen(["darcs"] + cmd, stdout=PIPE, stderr=PIPE, universal_newlines=True)
-        except OSError:
-            pass
-        else:
-            (output, errput) = p.communicate()
-            rc = p.returncode
-            if rc != 0 and errput:
-                log.info("%s: darcs wrote to stderr: '%s'" % (EXE_NAME, errput,))
-                errput = None
-    else:
-        if all([os.path.exists(vfn) for vfn in verfilenames]):
-            log.info("%s: using extant version file %s" % (EXE_NAME, verfilenames))
-            return (0, read_version_py(verfilenames[0]))
-        else:
-            log.warn("%s: didn't find version tags with darcs, and %s don't exist." % (EXE_NAME, verfilenames))
-        return (rc, None)
-
-    # Filter out bad chars that can cause the XML parser to give up in despair.
-    # (Thanks to lelit of the tailor project and ndurner and warner for this hack.)
-    allbadchars = "".join([chr(i) for i in range(0x0a) + [0x0b, 0x0c] + range(0x0e, 0x20) + range(0x7f,0x100)])
-    tt = string.maketrans(allbadchars, "-"*len(allbadchars))
-    output = output.translate(tt)
-    regexstr = "^TAG %s-(%s)$" % (pkgname, VERSION_BASE_RE_STR)
-    last_tag = None
-
-    # strip off trailing warning messages that darcs 2.3.1 writes to stdout
-    endi = output.find("</changelog>")+len("</changelog>")
-    if endi != -1:
-        output = output[:endi]
-    try:
-        doc = xml.dom.minidom.parseString(output)
-    except xml.parsers.expat.ExpatError:
-        # Okay maybe this is an error message instead of an XML output.
-        pass
-    else:
-        changelog = doc.getElementsByTagName("changelog")[0]
-        patches = changelog.getElementsByTagName("patch")
-        version_re = re.compile(regexstr)
-        count_since_last_patch = 0
-        if abort_if_snapshot:
-            for patch in patches:
-                name = get_text(patch.getElementsByTagName("name")[0].childNodes)
-                m = version_re.match(name)
-                if m:
-                    last_tag = m.group(1)
-                    last_tag = last_tag.encode("utf-8")
-                    break
-                else:
-                    sys.exit(0) # because abort_if_snapshot
-        else:
-            for patch in patches:
-                name = get_text(patch.getElementsByTagName("name")[0].childNodes)
-                m = version_re.match(name)
-                if m:
-                    last_tag = m.group(1)
-                    last_tag = last_tag.encode("utf-8")
-                    break
-                else:
-                    count_since_last_patch += 1
-
-    if not last_tag:
-        if errput:
-            log.info("%s: darcs wrote to stderr: '%s'" % (EXE_NAME, errput,))
-            errput = None
-        assert all([isinstance(vfn, basestring) for vfn in verfilenames]), [vfn for vfn in verfilenames if not isinstance(vfn, basestring)]
-        if all([os.path.exists(vfn) for vfn in verfilenames]):
-            log.warn("%s: I'm unable to find a tag in the darcs history matching \"%s\", so I'm leaving %s alone." % (EXE_NAME, regexstr, verfilenames,))
-            return (0, read_version_py(verfilenames[0]))
-        else:
-            log.warn("%s: I'm unable to find a tag in the darcs history matching \"%s\", and %s don't exist." % (EXE_NAME, regexstr, verfilenames,))
-            return (-1, None)
-
-    if revision_number:
-        if count_since_last_patch:
-            # this is an interim version
-            verstr = "%s-r%d" % (last_tag, len(patches))
-        else:
-            # this is a release
-            verstr = last_tag
-    else:
-        if count_since_last_patch:
-            # this is an interim version
-            verstr = "%s-%d" % (last_tag, count_since_last_patch)
-        else:
-            # this is a release
-            verstr = last_tag
-
-    for verfn, verbod in zip(verfilenames, verbodies):
-        write_version_py(verstr, verfn, EXE_NAME, verbod, pkgname)
-        log.info("%s: wrote '%s' into %s" % (EXE_NAME, verstr, verfn,))
-    return (0, verstr)
diff --git a/darcsver-1.7.2.egg/darcsver/setuptools_command.py b/darcsver-1.7.2.egg/darcsver/setuptools_command.py
deleted file mode 100644
index 466a0ab4..00000000
--- a/darcsver-1.7.2.egg/darcsver/setuptools_command.py
+++ /dev/null
@@ -1,126 +0,0 @@
-import os
-
-import setuptools
-
-from darcsver import darcsvermodule
-
-from distutils.errors import DistutilsSetupError
-
-def validate_string_or_iter_of_strings(dist, attr, value):
-    # value is required to be a string or else a list of strings
-    if isinstance(value, basestring):
-        return
-    try:
-        for thing in value:
-            if not isinstance(thing, basestring):
-                raise DistutilsSetupError("%r is required to be a string or an iterable of strings (got %r)" % (attr, value))
-    except TypeError:
-        raise DistutilsSetupError("%r is required to be a string or an iterable of strings (got %r)" % (attr, value))
-
-def validate_versionfiles(dist, attr, value):
-    return validate_string_or_iter_of_strings(dist, attr, value)
-
-def validate_versionbodies(dist, attr, value):
-    return validate_string_or_iter_of_strings(dist, attr, value)
-
-def all(iterator):
-    for thing in iterator:
-        if not thing:
-            return False
-    return True
-
-PYTHON_VERSION_BODY='''
-# This is the version of this tree, as created by %(versiontool)s from the darcs patch
-# information: the main version number is taken from the most recent release
-# tag. If some patches have been added since the last release, this will have a
-# -NN "build number" suffix, or else a -rNN "revision number" suffix. Please see
-# pyutil.version_class for a description of what the different fields mean.
-
-__pkgname__ = "%(pkgname)s"
-verstr = "%(pkgversion)s"
-try:
-    from pyutil.version_class import Version as pyutil_Version
-    __version__ = pyutil_Version(verstr)
-except (ImportError, ValueError):
-    # Maybe there is no pyutil installed, or this may be an older version of
-    # pyutil.version_class which does not support SVN-alike revision numbers.
-    from distutils.version import LooseVersion as distutils_Version
-    __version__ = distutils_Version(verstr)
-'''
-
-class DarcsVer(setuptools.Command):
-    description = "generate a version number from darcs history"
-    user_options = [
-        ('project-name', None, "name of the project as it appears in the project's release tags (default's the to the distribution name)"),
-        ('filename', None, "path to file into which the version number should be written (defaults to the package directory's _version.py)"),
-        ('count-all-patches', None, "If true, count the total number of patches in all history.  If false, count the total number of patches since the most recent release tag."),
-        ('abort-if-snapshot', None, "If true, the if the current version is a snapshot (not a release tag), then immediately exit the process with exit code 0."),
-        ]
-
-    def initialize_options(self):
-        self.project_name = None
-        self.filename = None
-        self.count_all_patches = None
-        self.abort_if_snapshot = None
-
-    def finalize_options(self):
-        if self.project_name is None:
-            self.project_name = self.distribution.get_name()
-
-        # If the user passed --filename on the cmdline, override
-        # the setup.py's versionfiles argument.
-        if self.filename is not None:
-            if not isinstance(self.filename, basestring):
-                 raise TypeError("filename is required to be a string, not %s, filename: %s" % (type(self.filename), self.filename))
-            self.distribution.versionfiles = [self.filename]
-
-        if self.abort_if_snapshot is None:
-            self.abort_if_snapshot=False
-
-    def run(self):
-        if self.distribution.versionfiles is None:
-            toppackage = ''
-            # If there is a package with the same name as the project name and
-            # there is a directory by that name then use that.
-            packagedir = None
-            if self.distribution.packages and self.project_name in self.distribution.packages:
-                toppackage = self.project_name
-                srcdir = ''
-                if self.distribution.package_dir:
-                    srcdir = self.distribution.package_dir.get(toppackage)
-                    if not srcdir is None:
-                        srcdir = self.distribution.package_dir.get('', '')
-                packagedir = os.path.join(srcdir, toppackage)
-
-            if packagedir is None or not os.path.isdir(packagedir):
-                # Else, if there is a singly-rooted tree of packages, use the
-                # root of that.
-                if self.distribution.packages:
-                    for package in self.distribution.packages:
-                        if not toppackage:
-                            toppackage = package
-                        else:
-                            if toppackage.startswith(package+"."):
-                                toppackage = package
-                            else:
-                                if not package.startswith(toppackage+"."):
-                                    # Not singly-rooted
-                                    toppackage = ''
-                                    break
-
-                srcdir = ''
-                if self.distribution.package_dir:
-                    srcdir = self.distribution.package_dir.get(toppackage)
-                    if srcdir is None:
-                        srcdir = self.distribution.package_dir.get('', '')
-                packagedir = os.path.join(srcdir, toppackage)
-
-            self.distribution.versionfiles = [os.path.join(packagedir, '_version.py')]
-
-        if self.distribution.versionbodies is None:
-            self.distribution.versionbodies = [PYTHON_VERSION_BODY]
-
-        assert all([isinstance(vfn, basestring) for vfn in self.distribution.versionfiles]), self.distribution.versionfiles
-        (rc, verstr) = darcsvermodule.update(self.project_name, self.distribution.versionfiles, self.count_all_patches, abort_if_snapshot=self.abort_if_snapshot, EXE_NAME="setup.py darcsver", version_body=self.distribution.versionbodies)
-        if rc == 0:
-            self.distribution.metadata.version = verstr
diff --git a/darcsver-1.7.2.egg/scripts/__init__.py b/darcsver-1.7.2.egg/scripts/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/darcsver-1.7.2.egg/scripts/darcsverscript.py b/darcsver-1.7.2.egg/scripts/darcsverscript.py
deleted file mode 100644
index 7c54f534..00000000
--- a/darcsver-1.7.2.egg/scripts/darcsverscript.py
+++ /dev/null
@@ -1,46 +0,0 @@
-#! /usr/bin/env python
-
-from optparse import OptionParser
-import os, sys
-
-from darcsver import darcsvermodule, __version__
-
-try:
-    EXE_NAME=os.path.basename(sys.argv[0])
-except:
-    EXE_NAME="darcsver"
-
-def main():
-    parser = OptionParser(usage="Usage: %prog [options] [pkgname [verfilename]]",
-                          version="%prog " + str(__version__),
-                          prog=EXE_NAME)
-    parser.add_option("-q", "--quiet", default=False, action="store_true",
-                      help="Be quiet, do the job without any output.")
-    parser.add_option("--count-all-patches", "--revision-number", default=False,
-                      action="store_true", dest="count_all_patches",
-                      help="By default %s counts the number of patches since the "
-                           "most recent release tag. With this option, it counts "
-                           "all the patches in the repository." % EXE_NAME)
-
-    options, args = parser.parse_args()
-
-    if args:
-        pkgname = args.pop(0)
-    else:
-        pkgname = os.path.basename(os.getcwd())
-        if not options.quiet:
-            print "%s: You didn't pass a pkg-name on the command-line, so I'm going to take the name of the current working directory: \"%s\"" % (EXE_NAME, pkgname,)
-
-    if args:
-        verfilename = args.pop(0)
-    else:
-        verfilename = os.path.join(pkgname, "_version.py")
-        if not options.quiet:
-            print "%s: You didn't pass a verfilename on the command-line, so I'm going to build one from the name of the package: \"%s\"" % (EXE_NAME, verfilename,)
-
-    (rc, newverstr) = darcsvermodule.update(pkgname=pkgname, verfilename=verfilename, revision_number=options.count_all_patches, quiet=options.quiet, EXE_NAME=EXE_NAME)
-    return rc
-
-if __name__ == "__main__":
-    rc = main()
-    sys.exit(rc)
diff --git a/darcsver-1.7.2.egg/share/doc/python-darcsver/README.txt b/darcsver-1.7.2.egg/share/doc/python-darcsver/README.txt
deleted file mode 100644
index 8f0ffa76..00000000
--- a/darcsver-1.7.2.egg/share/doc/python-darcsver/README.txt
+++ /dev/null
@@ -1,95 +0,0 @@
-darcsver - generate version numbers from darcs revision control history
-=======================================================================
-
-What Does It Do
----------------
-
-Create files containing version numbers, based upon the latest darcs
-release tag.
-
-If your source tree is coming from darcs (i.e. it is in a darcs
-repository), this tool will determine the most recent release tag,
-count the patches that have been applied since then, and compute a
-version number to be written into _version.py (and optionally other
-version files). This version number will be available by doing:
-
- from your_package_name import __version__
-
-Source trees that do not come from darcs (e.g. release tarballs, nightly
-tarballs) and are not within a darcs repository should instead, come with a
-_version.py that was generated before the tarball was produced. In this case,
-this tool will quietly exit without modifying the existing _version.py .
-
-'release tags' are tags in the source repository that match the following
-regexp:
-
- ^your_package_name-(\d+)(\.(\d+)(\.(\d+))?)?((a|b|c|rc)(\d+))?
-
-
-Installation
-------------
-
-With easy_install:
-
-  easy_install darcsver
-
-Alternative manual installation:
-
-  tar -zxvf darcsver-X.Y.Z.tar.gz
-  cd darcsver-X.Y.Z
-  python setup.py install
-
-Where X.Y.Z is a version number.
-
-Alternative to make a specific package use darcsver without installing
-darcsver into the system:
-
-  Put "setup_requires=['darcsver']" in the call to setup() in the
-  package's setup.py file.
-
-
-Usage
------
-
-There are two ways to use this: the command-line tool and the
-setuptools plugin.
-
-To use the command-line tool, execute it as:
-
-darcsver $PACKAGE_NAME $PATH_TO_VERSION_PY
-
-
-To use the setuptools plugin (which enables you to write "./setup.py
-darcsver" and which cleverly figures out where the _version.py file
-ought to go), you must first package your python module with
-`setup.py` and use setuptools.
-
-The former is well documented in the distutils manual:
-
-  http://docs.python.org/dist/dist.html
-
-To use setuptools instead of distutils, just edit `setup.py` and
-change
-
-  from distutils.core import setup
-
-to
-
-  from setuptools import setup
-
-
-References
-----------
-
-How to distribute Python modules with Distutils:
-
-  http://docs.python.org/dist/dist.html
-
-
-Setuptools complete manual:
-
-  http://peak.telecommunity.com/DevCenter/setuptools
-
-
-Thanks to Yannick Gingras for providing the prototype for this
-README.txt.
diff --git a/setup.cfg b/setup.cfg
index 0d682035..bf392cfb 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -14,12 +14,13 @@ zip_ok=False
 # PyPI.
 
 # https://tahoe-lafs.org/source/tahoe-lafs/deps/tahoe-deps.tar.gz contains a
-# bundle of these dependencies (as Python source distributions or "sdists"). So
-# it you want to avoid the build-time download (say, if you're on an airplane,
-# or a desert island), just grab a copy and unpack it in your tahoe darcs tree.
+# bundle of these dependencies (as Python source distributions or "sdists").
+# So it you want to avoid the build-time download (say, if you're on an
+# airplane, or a desert island), just grab a copy and unpack it in your tahoe
+# source tree.
 
 # Alternatively, if you're building from a release/nightly tarball instead of
-# a darcs tree, the 'sumo' tarball variant will include all of these
+# a git tree, the 'sumo' tarball variant will include all of these
 # dependencies in the tahoe-deps/ directory.
 
 find_links=misc/dependencies tahoe-deps ../tahoe-deps
diff --git a/setup.py b/setup.py
index 35017770..e78f2a48 100644
--- a/setup.py
+++ b/setup.py
@@ -72,8 +72,6 @@ __requires__ = install_requires[:]
 
 egg = os.path.realpath(glob.glob('setuptools-*.egg')[0])
 sys.path.insert(0, egg)
-egg = os.path.realpath(glob.glob('darcsver-*.egg')[0])
-sys.path.insert(0, egg)
 import setuptools; setuptools.bootstrap_install_from = egg
 
 from setuptools import setup
@@ -120,20 +118,6 @@ trove_classifiers=[
 
 setup_requires = []
 
-# The darcsver command from the darcsver plugin is needed to initialize the
-# distribution's .version attribute correctly. (It does this either by
-# examining darcs history, or if that fails by reading the
-# src/allmydata/_version.py file). darcsver will also write a new version
-# stamp in src/allmydata/_version.py, with a version number derived from
-# darcs history. Note that the setup.cfg file has an "[aliases]" section
-# which enumerates commands that you might run and specifies that it will run
-# darcsver before each one. If you add different commands (or if I forgot
-# some that are already in use), you may need to add it to setup.cfg and
-# configure it to run darcsver before your command, if you want the version
-# number to be correct when that command runs.
-# http://pypi.python.org/pypi/darcsver
-setup_requires.append('darcsver >= 1.7.2')
-
 # Nevow imports itself when building, which causes Twisted and zope.interface
 # to be imported. We need to make sure that the versions of Twisted and
 # zope.interface used at build time satisfy Nevow's requirements. If not
@@ -256,15 +240,6 @@ class MakeExecutable(Command):
                 raise
 
 
-DARCS_VERSION_BODY = '''
-# This _version.py is generated from darcs metadata by the tahoe setup.py
-# and the "darcsver" package.
-
-__pkgname__ = "%(pkgname)s"
-verstr = "%(pkgversion)s"
-__version__ = verstr
-'''
-
 GIT_VERSION_BODY = '''
 # This _version.py is generated from git metadata by the tahoe setup.py.
 
@@ -343,6 +318,11 @@ def versions_from_git(tag_prefix, verbose=False):
         normalized_version += ".dev0"
     return {"version": version, "normalized": normalized_version, "full": full}
 
+# setup.cfg has an [aliases] section which runs "update_version" before many
+# commands (like "build" and "sdist") that need to know our package version
+# ahead of time. If you add different commands (or if we forgot some), you
+# may need to add it to setup.cfg and configure it to run update_version
+# before your command.
 
 class UpdateVersion(Command):
     description = "update _version.py from revision-control metadata"
@@ -353,38 +333,26 @@ class UpdateVersion(Command):
     def finalize_options(self):
         pass
     def run(self):
-        target = self.distribution.versionfiles[0]
-        if os.path.isdir(os.path.join(basedir, "_darcs")):
-            verstr = self.try_from_darcs(target)
-        elif os.path.isdir(os.path.join(basedir, ".git")):
-            verstr = self.try_from_git(target)
+        if os.path.isdir(os.path.join(basedir, ".git")):
+            verstr = self.try_from_git()
         else:
             print("no version-control data found, leaving _version.py alone")
             return
         if verstr:
             self.distribution.metadata.version = verstr
 
-    def try_from_darcs(self, target):
-        from darcsver.darcsvermodule import update
-        (rc, verstr) = update(pkgname=self.distribution.get_name(),
-                              verfilename=self.distribution.versionfiles,
-                              revision_number=True,
-                              version_body=DARCS_VERSION_BODY)
-        if rc == 0:
-            return verstr
-
-    def try_from_git(self, target):
+    def try_from_git(self):
         versions = versions_from_git("allmydata-tahoe-", verbose=True)
         if versions:
-            for fn in self.distribution.versionfiles:
-                f = open(fn, "wb")
-                f.write(GIT_VERSION_BODY %
-                        { "pkgname": self.distribution.get_name(),
-                          "version": versions["version"],
-                          "normalized": versions["normalized"],
-                          "full": versions["full"] })
-                f.close()
-                print("git-version: wrote '%s' into '%s'" % (versions["version"], fn))
+            fn = 'src/allmydata/_version.py'
+            f = open(fn, "wb")
+            f.write(GIT_VERSION_BODY %
+                    { "pkgname": self.distribution.get_name(),
+                      "version": versions["version"],
+                      "normalized": versions["normalized"],
+                      "full": versions["full"] })
+            f.close()
+            print("git-version: wrote '%s' into '%s'" % (versions["version"], fn))
         return versions.get("normalized", None)
 
 
@@ -479,6 +447,5 @@ setup(name=APPNAME,
       setup_requires=setup_requires,
       entry_points = { 'console_scripts': [ 'tahoe = allmydata.scripts.runner:run' ] },
       zip_safe=False, # We prefer unzipped for easier access.
-      versionfiles=['src/allmydata/_version.py',],
       **setup_args
       )
diff --git a/src/allmydata/test/test_runner.py b/src/allmydata/test/test_runner.py
index 59624626..a7be1357 100644
--- a/src/allmydata/test/test_runner.py
+++ b/src/allmydata/test/test_runner.py
@@ -154,7 +154,7 @@ class BinTahoe(common_util.SignalMixin, unittest.TestCase, RunBinTahoeMixin):
 
             self.failIfEqual(required_verstr, "unknown",
                              "We don't know our version, because this distribution didn't come "
-                             "with a _version.py and 'setup.py darcsver' hasn't been run.")
+                             "with a _version.py and 'setup.py update_version' hasn't been run.")
 
             srcdir = os.path.dirname(os.path.dirname(os.path.normcase(os.path.realpath(srcfile))))
             info = repr((res, allmydata.__appname__, required_verstr, srcdir))
-- 
2.45.2