From: Zooko O'Whielacronx Date: Fri, 21 Jan 2011 05:28:38 +0000 (-0800) Subject: setup: upgrade bundled version of darcsver from 1.7.1 to 1.7.2 to support the new... X-Git-Tag: allmydata-tahoe-1.8.2b1~24 X-Git-Url: https://git.rkrishnan.org/pf?a=commitdiff_plain;h=0264959b9ae25d29b8e559348e1e0fac01653972;p=tahoe-lafs%2Ftahoe-lafs.git setup: upgrade bundled version of darcsver from 1.7.1 to 1.7.2 to support the new bbfreeze feature (by, strangely, having darcsver write out unix newlines regardless of what the underlying platform prefers) --- diff --git a/darcsver-1.7.1.egg/EGG-INFO/PKG-INFO b/darcsver-1.7.1.egg/EGG-INFO/PKG-INFO deleted file mode 100644 index 5823eb46..00000000 --- a/darcsver-1.7.1.egg/EGG-INFO/PKG-INFO +++ /dev/null @@ -1,121 +0,0 @@ -Metadata-Version: 1.0 -Name: darcsver -Version: 1.7.1 -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.1.egg/EGG-INFO/SOURCES.txt b/darcsver-1.7.1.egg/EGG-INFO/SOURCES.txt deleted file mode 100644 index 38380a44..00000000 --- a/darcsver-1.7.1.egg/EGG-INFO/SOURCES.txt +++ /dev/null @@ -1,17 +0,0 @@ -README.txt -TODO -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.1.egg/EGG-INFO/dependency_links.txt b/darcsver-1.7.1.egg/EGG-INFO/dependency_links.txt deleted file mode 100644 index 8b137891..00000000 --- a/darcsver-1.7.1.egg/EGG-INFO/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/darcsver-1.7.1.egg/EGG-INFO/entry_points.txt b/darcsver-1.7.1.egg/EGG-INFO/entry_points.txt deleted file mode 100644 index 569b4e41..00000000 --- a/darcsver-1.7.1.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.1.egg/EGG-INFO/not-zip-safe b/darcsver-1.7.1.egg/EGG-INFO/not-zip-safe deleted file mode 100644 index 8b137891..00000000 --- a/darcsver-1.7.1.egg/EGG-INFO/not-zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/darcsver-1.7.1.egg/EGG-INFO/top_level.txt b/darcsver-1.7.1.egg/EGG-INFO/top_level.txt deleted file mode 100644 index 4eebf095..00000000 --- a/darcsver-1.7.1.egg/EGG-INFO/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -darcsver -scripts diff --git a/darcsver-1.7.1.egg/darcsver/__init__.py b/darcsver-1.7.1.egg/darcsver/__init__.py deleted file mode 100644 index 3421c135..00000000 --- a/darcsver-1.7.1.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.1.egg/darcsver/_version.py b/darcsver-1.7.1.egg/darcsver/_version.py deleted file mode 100644 index 24c0e0cc..00000000 --- a/darcsver-1.7.1.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.1" -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.1.egg/darcsver/darcsvermodule.py b/darcsver-1.7.1.egg/darcsver/darcsvermodule.py deleted file mode 100644 index 8f00205b..00000000 --- a/darcsver-1.7.1.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, "wt+") - 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("")+len("") - 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.1.egg/darcsver/setuptools_command.py b/darcsver-1.7.1.egg/darcsver/setuptools_command.py deleted file mode 100644 index 466a0ab4..00000000 --- a/darcsver-1.7.1.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.1.egg/scripts/__init__.py b/darcsver-1.7.1.egg/scripts/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/darcsver-1.7.1.egg/scripts/darcsverscript.py b/darcsver-1.7.1.egg/scripts/darcsverscript.py deleted file mode 100644 index 7c54f534..00000000 --- a/darcsver-1.7.1.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.1.egg/share/doc/python-darcsver/README.txt b/darcsver-1.7.1.egg/share/doc/python-darcsver/README.txt deleted file mode 100644 index 8f0ffa76..00000000 --- a/darcsver-1.7.1.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/darcsver-1.7.2.egg/EGG-INFO/PKG-INFO b/darcsver-1.7.2.egg/EGG-INFO/PKG-INFO new file mode 100644 index 00000000..b59e3084 --- /dev/null +++ b/darcsver-1.7.2.egg/EGG-INFO/PKG-INFO @@ -0,0 +1,121 @@ +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 new file mode 100644 index 00000000..7ae9be9a --- /dev/null +++ b/darcsver-1.7.2.egg/EGG-INFO/SOURCES.txt @@ -0,0 +1,16 @@ +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 new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/darcsver-1.7.2.egg/EGG-INFO/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/darcsver-1.7.2.egg/EGG-INFO/entry_points.txt b/darcsver-1.7.2.egg/EGG-INFO/entry_points.txt new file mode 100644 index 00000000..569b4e41 --- /dev/null +++ b/darcsver-1.7.2.egg/EGG-INFO/entry_points.txt @@ -0,0 +1,10 @@ +[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 new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/darcsver-1.7.2.egg/EGG-INFO/not-zip-safe @@ -0,0 +1 @@ + diff --git a/darcsver-1.7.2.egg/EGG-INFO/top_level.txt b/darcsver-1.7.2.egg/EGG-INFO/top_level.txt new file mode 100644 index 00000000..4eebf095 --- /dev/null +++ b/darcsver-1.7.2.egg/EGG-INFO/top_level.txt @@ -0,0 +1,2 @@ +darcsver +scripts diff --git a/darcsver-1.7.2.egg/darcsver/__init__.py b/darcsver-1.7.2.egg/darcsver/__init__.py new file mode 100644 index 00000000..3421c135 --- /dev/null +++ b/darcsver-1.7.2.egg/darcsver/__init__.py @@ -0,0 +1,8 @@ +__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 new file mode 100644 index 00000000..fa9c1060 --- /dev/null +++ b/darcsver-1.7.2.egg/darcsver/_version.py @@ -0,0 +1,17 @@ + +# 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 new file mode 100644 index 00000000..aabd1c9e --- /dev/null +++ b/darcsver-1.7.2.egg/darcsver/darcsvermodule.py @@ -0,0 +1,200 @@ +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("")+len("") + 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 new file mode 100644 index 00000000..466a0ab4 --- /dev/null +++ b/darcsver-1.7.2.egg/darcsver/setuptools_command.py @@ -0,0 +1,126 @@ +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 new file mode 100644 index 00000000..e69de29b diff --git a/darcsver-1.7.2.egg/scripts/darcsverscript.py b/darcsver-1.7.2.egg/scripts/darcsverscript.py new file mode 100644 index 00000000..7c54f534 --- /dev/null +++ b/darcsver-1.7.2.egg/scripts/darcsverscript.py @@ -0,0 +1,46 @@ +#! /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 new file mode 100644 index 00000000..8f0ffa76 --- /dev/null +++ b/darcsver-1.7.2.egg/share/doc/python-darcsver/README.txt @@ -0,0 +1,95 @@ +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.