mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-03-10 14:34:05 +00:00
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.
This commit is contained in:
parent
9e449db50b
commit
19b2ef9764
@ -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$
|
|
@ -1,12 +1,11 @@
|
|||||||
include COPYING.GPL COPYING.TGPPL.rst CREDITS Makefile NEWS.rst Tahoe.home
|
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
|
include bin/tahoe-script.template
|
||||||
recursive-include src *.xhtml *.js *.png *.css
|
recursive-include src *.xhtml *.js *.png *.css
|
||||||
recursive-include twisted *.py
|
recursive-include twisted *.py
|
||||||
graft docs
|
graft docs
|
||||||
graft misc
|
graft misc
|
||||||
graft static
|
graft static
|
||||||
graft darcsver-1.7.2.egg
|
|
||||||
|
|
||||||
graft setuptools-0.6c16dev4.egg
|
graft setuptools-0.6c16dev4.egg
|
||||||
global-exclude *~ *.pyc
|
global-exclude *~ *.pyc
|
||||||
|
@ -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
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||||||
|
|
@ -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
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
|
|
@ -1,2 +0,0 @@
|
|||||||
darcsver
|
|
||||||
scripts
|
|
@ -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
|
|
@ -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)
|
|
@ -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)
|
|
@ -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
|
|
@ -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)
|
|
@ -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.
|
|
@ -14,12 +14,13 @@ zip_ok=False
|
|||||||
# PyPI.
|
# PyPI.
|
||||||
|
|
||||||
# https://tahoe-lafs.org/source/tahoe-lafs/deps/tahoe-deps.tar.gz contains a
|
# 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
|
# bundle of these dependencies (as Python source distributions or "sdists").
|
||||||
# it you want to avoid the build-time download (say, if you're on an airplane,
|
# So it you want to avoid the build-time download (say, if you're on an
|
||||||
# or a desert island), just grab a copy and unpack it in your tahoe darcs tree.
|
# 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
|
# 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.
|
# dependencies in the tahoe-deps/ directory.
|
||||||
|
|
||||||
find_links=misc/dependencies tahoe-deps ../tahoe-deps
|
find_links=misc/dependencies tahoe-deps ../tahoe-deps
|
||||||
|
51
setup.py
51
setup.py
@ -72,8 +72,6 @@ __requires__ = install_requires[:]
|
|||||||
|
|
||||||
egg = os.path.realpath(glob.glob('setuptools-*.egg')[0])
|
egg = os.path.realpath(glob.glob('setuptools-*.egg')[0])
|
||||||
sys.path.insert(0, egg)
|
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
|
import setuptools; setuptools.bootstrap_install_from = egg
|
||||||
|
|
||||||
from setuptools import setup
|
from setuptools import setup
|
||||||
@ -120,20 +118,6 @@ trove_classifiers=[
|
|||||||
|
|
||||||
setup_requires = []
|
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
|
# 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
|
# 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
|
# zope.interface used at build time satisfy Nevow's requirements. If not
|
||||||
@ -256,15 +240,6 @@ class MakeExecutable(Command):
|
|||||||
raise
|
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 = '''
|
GIT_VERSION_BODY = '''
|
||||||
# This _version.py is generated from git metadata by the tahoe setup.py.
|
# 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"
|
normalized_version += ".dev0"
|
||||||
return {"version": version, "normalized": normalized_version, "full": full}
|
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):
|
class UpdateVersion(Command):
|
||||||
description = "update _version.py from revision-control metadata"
|
description = "update _version.py from revision-control metadata"
|
||||||
@ -353,30 +333,18 @@ class UpdateVersion(Command):
|
|||||||
def finalize_options(self):
|
def finalize_options(self):
|
||||||
pass
|
pass
|
||||||
def run(self):
|
def run(self):
|
||||||
target = self.distribution.versionfiles[0]
|
if os.path.isdir(os.path.join(basedir, ".git")):
|
||||||
if os.path.isdir(os.path.join(basedir, "_darcs")):
|
verstr = self.try_from_git()
|
||||||
verstr = self.try_from_darcs(target)
|
|
||||||
elif os.path.isdir(os.path.join(basedir, ".git")):
|
|
||||||
verstr = self.try_from_git(target)
|
|
||||||
else:
|
else:
|
||||||
print("no version-control data found, leaving _version.py alone")
|
print("no version-control data found, leaving _version.py alone")
|
||||||
return
|
return
|
||||||
if verstr:
|
if verstr:
|
||||||
self.distribution.metadata.version = verstr
|
self.distribution.metadata.version = verstr
|
||||||
|
|
||||||
def try_from_darcs(self, target):
|
def try_from_git(self):
|
||||||
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):
|
|
||||||
versions = versions_from_git("allmydata-tahoe-", verbose=True)
|
versions = versions_from_git("allmydata-tahoe-", verbose=True)
|
||||||
if versions:
|
if versions:
|
||||||
for fn in self.distribution.versionfiles:
|
fn = 'src/allmydata/_version.py'
|
||||||
f = open(fn, "wb")
|
f = open(fn, "wb")
|
||||||
f.write(GIT_VERSION_BODY %
|
f.write(GIT_VERSION_BODY %
|
||||||
{ "pkgname": self.distribution.get_name(),
|
{ "pkgname": self.distribution.get_name(),
|
||||||
@ -479,6 +447,5 @@ setup(name=APPNAME,
|
|||||||
setup_requires=setup_requires,
|
setup_requires=setup_requires,
|
||||||
entry_points = { 'console_scripts': [ 'tahoe = allmydata.scripts.runner:run' ] },
|
entry_points = { 'console_scripts': [ 'tahoe = allmydata.scripts.runner:run' ] },
|
||||||
zip_safe=False, # We prefer unzipped for easier access.
|
zip_safe=False, # We prefer unzipped for easier access.
|
||||||
versionfiles=['src/allmydata/_version.py',],
|
|
||||||
**setup_args
|
**setup_args
|
||||||
)
|
)
|
||||||
|
@ -154,7 +154,7 @@ class BinTahoe(common_util.SignalMixin, unittest.TestCase, RunBinTahoeMixin):
|
|||||||
|
|
||||||
self.failIfEqual(required_verstr, "unknown",
|
self.failIfEqual(required_verstr, "unknown",
|
||||||
"We don't know our version, because this distribution didn't come "
|
"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))))
|
srcdir = os.path.dirname(os.path.dirname(os.path.normcase(os.path.realpath(srcfile))))
|
||||||
info = repr((res, allmydata.__appname__, required_verstr, srcdir))
|
info = repr((res, allmydata.__appname__, required_verstr, srcdir))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user