+++ /dev/null
-Metadata-Version: 1.0
-Name: darcsver
-Version: 1.5.1
-Summary: generate a version number from darcs history
-Home-page: http://allmydata.org/trac/darcsver
-Author: Zooko O'Whielacronx
-Author-email: zooko@zooko.com
-License: BSD
-Description: UNKNOWN
-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 :: Microsoft
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: Unix
-Classifier: Operating System :: POSIX :: Linux
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: Microsoft :: Windows :: Windows NT/2000
-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: Topic :: Utilities
-Classifier: Topic :: Software Development :: Libraries
+++ /dev/null
-README.txt
-TODO
-setup.cfg
-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
-scripts/__init__.py
-scripts/darcsverscript.py
\ No newline at end of file
+++ /dev/null
-[console_scripts]
-darcsver = scripts.darcsverscript:main
-
-[distutils.commands]
-darcsver = darcsver.setuptools_command:DarcsVer
-
+++ /dev/null
-darcsver
-scripts
+++ /dev/null
-__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
+++ /dev/null
-
-# 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.
-
-verstr = "1.5.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)
+++ /dev/null
-import os, string, sys, re
-import xml.dom.minidom
-import xml.parsers.expat
-from subprocess import Popen, PIPE
-from distutils import log
-
-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:
- # Else (perhaps a bootstrapping problem),then we'll use this
- # regex, which was copied from the pyutil source code on
- # 2007-10-30.
- VERSION_BASE_RE_STR="(\d+)(\.(\d+)(\.(\d+))?)?((a|b|c)(\d+))?"
-
-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 %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.
-
-verstr = "%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)
-'''
-
-def write_version_py(verstr, outfname, EXE_NAME):
- f = open(outfname, "wt+")
- f.write(VERSION_BODY % (EXE_NAME, verstr,))
- 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"):
- """
- @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).
- """
- rc = -1
- cmd = ["changes", "--xml-output"]
- if not revision_number:
- cmd.append("--from-tag=^%s" % (pkgname,))
-
- errput = None
- try:
- p = Popen(["darcs"] + cmd, 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:
- try:
- p = Popen(["realdarcs.exe"] + cmd, 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: 'realdarcs.exe' 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:
- if errput:
- log.info("%s: darcs wrote to stderr: '%s'" % (EXE_NAME, errput,))
- if os.path.exists(verfilename):
- log.info("%s: Failure from attempt to find version tags with 'darcs changes', and %s already exists, so leaving it alone." % (EXE_NAME, verfilename,))
- return (0, read_version_py(verfilename))
- else:
- log.warn("%s: Failure from attempt to find version tags with 'darcs changes', and %s doesn't exist." % (EXE_NAME, verfilename))
- 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)
-
- # strip off trailing warning messages that darcs 2.3.1 writes to stdout
- endi = output.find("</changelog>")+len("</changelog>")
- output = output[:endi]
- try:
- doc = xml.dom.minidom.parseString(output)
- except xml.parsers.expat.ExpatError, le:
- le.args = tuple(le.args + (output,))
- raise
-
- changelog = doc.getElementsByTagName("changelog")[0]
- patches = changelog.getElementsByTagName("patch")
- regexstr = "^TAG %s-(%s)" % (pkgname, VERSION_BASE_RE_STR,)
- version_re = re.compile(regexstr)
- last_tag = None
- 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,))
- if os.path.exists(verfilename):
- 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, verfilename,))
- return (0, read_version_py(verfilename))
- else:
- log.warn("%s: I'm unable to find a tag in the darcs history matching \"%s\", and %s doesn't exist." % (EXE_NAME, regexstr, verfilename,))
- return (0, 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
-
- write_version_py(verstr, verfilename, EXE_NAME)
- log.info("%s: wrote '%s' into %s" % (EXE_NAME, verstr, verfilename,))
- return (0, verstr)
+++ /dev/null
-import os
-
-import setuptools
-
-from darcsver import darcsvermodule
-
-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)"),
- ('version-file', 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.version_file = 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 self.version_file 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.version_file = os.path.join(packagedir, '_version.py')
-
- if self.abort_if_snapshot is None:
- self.abort_if_snapshot=False
-
- def run(self):
- (rc, verstr) = darcsvermodule.update(self.project_name, self.version_file, self.count_all_patches, abort_if_snapshot=self.abort_if_snapshot, EXE_NAME="setup.py darcsver")
- self.distribution.metadata.version = verstr
+++ /dev/null
-#! /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)
+++ /dev/null
-
-What Does It Do
----------------
-
-Create _version.py, 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 . 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)(\d+)?)?\w*$
-
-
-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.
--- /dev/null
+Metadata-Version: 1.0
+Name: darcsver
+Version: 1.5.1
+Summary: generate a version number from darcs history
+Home-page: http://allmydata.org/trac/darcsver
+Author: Zooko O'Whielacronx
+Author-email: zooko@zooko.com
+License: BSD
+Description: UNKNOWN
+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 :: Microsoft
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: Unix
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Operating System :: POSIX
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: Microsoft :: Windows :: Windows NT/2000
+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: Topic :: Utilities
+Classifier: Topic :: Software Development :: Libraries
--- /dev/null
+README.txt
+TODO
+setup.cfg
+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
+scripts/__init__.py
+scripts/darcsverscript.py
\ No newline at end of file
--- /dev/null
+[console_scripts]
+darcsver = scripts.darcsverscript:main
+
+[distutils.commands]
+darcsver = darcsver.setuptools_command:DarcsVer
+
--- /dev/null
+darcsver
+scripts
--- /dev/null
+__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
--- /dev/null
+
+# 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.
+
+verstr = "1.5.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)
--- /dev/null
+import os, string, sys, re
+import xml.dom.minidom
+import xml.parsers.expat
+from subprocess import Popen, PIPE
+from distutils import log
+
+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:
+ # Else (perhaps a bootstrapping problem),then we'll use this
+ # regex, which was copied from the pyutil source code on
+ # 2007-10-30.
+ VERSION_BASE_RE_STR="(\d+)(\.(\d+)(\.(\d+))?)?((a|b|c)(\d+))?"
+
+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 %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.
+
+verstr = "%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)
+'''
+
+def write_version_py(verstr, outfname, EXE_NAME):
+ f = open(outfname, "wt+")
+ f.write(VERSION_BODY % (EXE_NAME, verstr,))
+ 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"):
+ """
+ @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).
+ """
+ rc = -1
+ cmd = ["changes", "--xml-output"]
+ if not revision_number:
+ cmd.append("--from-tag=^%s" % (pkgname,))
+
+ errput = None
+ try:
+ p = Popen(["darcs"] + cmd, 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:
+ try:
+ p = Popen(["realdarcs.exe"] + cmd, 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: 'realdarcs.exe' 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:
+ if errput:
+ log.info("%s: darcs wrote to stderr: '%s'" % (EXE_NAME, errput,))
+ if os.path.exists(verfilename):
+ log.info("%s: Failure from attempt to find version tags with 'darcs changes', and %s already exists, so leaving it alone." % (EXE_NAME, verfilename,))
+ return (0, read_version_py(verfilename))
+ else:
+ log.warn("%s: Failure from attempt to find version tags with 'darcs changes', and %s doesn't exist." % (EXE_NAME, verfilename))
+ 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)
+
+ # strip off trailing warning messages that darcs 2.3.1 writes to stdout
+ endi = output.find("</changelog>")+len("</changelog>")
+ output = output[:endi]
+ try:
+ doc = xml.dom.minidom.parseString(output)
+ except xml.parsers.expat.ExpatError, le:
+ le.args = tuple(le.args + (output,))
+ raise
+
+ changelog = doc.getElementsByTagName("changelog")[0]
+ patches = changelog.getElementsByTagName("patch")
+ regexstr = "^TAG %s-(%s)" % (pkgname, VERSION_BASE_RE_STR,)
+ version_re = re.compile(regexstr)
+ last_tag = None
+ 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,))
+ if os.path.exists(verfilename):
+ 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, verfilename,))
+ return (0, read_version_py(verfilename))
+ else:
+ log.warn("%s: I'm unable to find a tag in the darcs history matching \"%s\", and %s doesn't exist." % (EXE_NAME, regexstr, verfilename,))
+ return (0, 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
+
+ write_version_py(verstr, verfilename, EXE_NAME)
+ log.info("%s: wrote '%s' into %s" % (EXE_NAME, verstr, verfilename,))
+ return (0, verstr)
--- /dev/null
+import os
+
+import setuptools
+
+from darcsver import darcsvermodule
+
+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)"),
+ ('version-file', 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.version_file = 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 self.version_file 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.version_file = os.path.join(packagedir, '_version.py')
+
+ if self.abort_if_snapshot is None:
+ self.abort_if_snapshot=False
+
+ def run(self):
+ (rc, verstr) = darcsvermodule.update(self.project_name, self.version_file, self.count_all_patches, abort_if_snapshot=self.abort_if_snapshot, EXE_NAME="setup.py darcsver")
+ self.distribution.metadata.version = verstr
--- /dev/null
+#! /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)
--- /dev/null
+
+What Does It Do
+---------------
+
+Create _version.py, 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 . 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)(\d+)?)?\w*$
+
+
+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.