summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--versioneer.py73
1 files changed, 43 insertions, 30 deletions
diff --git a/versioneer.py b/versioneer.py
index 57d99419..34e48073 100644
--- a/versioneer.py
+++ b/versioneer.py
@@ -74,8 +74,8 @@ To use it:
version=versioneer.get_version(),
cmdclass=versioneer.get_cmdclass(),
4: run 'setup.py update_files', which will create _version.py, and will
- append the following to your __init__.py:
- from _version import __version__
+ modify your __init__.py to define __version__ (by calling a function
+ from _version.py)
5: modify your MANIFEST.in to include versioneer.py
6: add both versioneer.py and the generated _version.py to your VCS
"""
@@ -144,7 +144,8 @@ def get_expanded_variables(versionfile_source):
# used from _version.py.
variables = {}
try:
- for line in open(versionfile_source,"r").readlines():
+ f = open(versionfile_source,"r")
+ for line in f.readlines():
if line.strip().startswith("git_refnames ="):
mo = re.search(r'=\s*"(.*)"', line)
if mo:
@@ -153,6 +154,7 @@ def get_expanded_variables(versionfile_source):
mo = re.search(r'=\s*"(.*)"', line)
if mo:
variables["full"] = mo.group(1)
+ f.close()
except EnvironmentError:
pass
return variables
@@ -164,20 +166,24 @@ def versions_from_expanded_variables(variables, tag_prefix, verbose=False):
print("variables are unexpanded, not using")
return {} # unexpanded, so not in an unpacked git-archive tarball
refs = set([r.strip() for r in refnames.strip("()").split(",")])
- for ref in list(refs):
- if not re.search(r'\d', ref):
- if verbose:
- print("discarding '%%s', no digits" %% ref)
- refs.discard(ref)
- # Assume all version tags have a digit. git's %%d expansion
- # behaves like git log --decorate=short and strips out the
- # refs/heads/ and refs/tags/ prefixes that would let us
- # distinguish between branches and tags. By ignoring refnames
- # without digits, we filter out many common branch names like
- # "release" and "stabilization", as well as "HEAD" and "master".
+ # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of
+ # just "foo-1.0". If we see a "tag: " prefix, prefer those.
+ TAG = "tag: "
+ tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)])
+ if not tags:
+ # Either we're using git < 1.8.3, or there really are no tags. We use
+ # a heuristic: assume all version tags have a digit. The old git %%d
+ # expansion behaves like git log --decorate=short and strips out the
+ # refs/heads/ and refs/tags/ prefixes that would let us distinguish
+ # between branches and tags. By ignoring refnames without digits, we
+ # filter out many common branch names like "release" and
+ # "stabilization", as well as "HEAD" and "master".
+ tags = set([r for r in refs if re.search(r'\d', r)])
+ if verbose:
+ print("discarding '%%s', no digits" %% ",".join(refs-tags))
if verbose:
- print("remaining refs: %%s" %% ",".join(sorted(refs)))
- for ref in sorted(refs):
+ print("likely tags: %%s" %% ",".join(sorted(tags)))
+ for ref in sorted(tags):
# sorting will prefer e.g. "2.0" over "2.0rc1"
if ref.startswith(tag_prefix):
r = ref[len(tag_prefix):]
@@ -328,7 +334,8 @@ def get_expanded_variables(versionfile_source):
# used from _version.py.
variables = {}
try:
- for line in open(versionfile_source,"r").readlines():
+ f = open(versionfile_source,"r")
+ for line in f.readlines():
if line.strip().startswith("git_refnames ="):
mo = re.search(r'=\s*"(.*)"', line)
if mo:
@@ -337,6 +344,7 @@ def get_expanded_variables(versionfile_source):
mo = re.search(r'=\s*"(.*)"', line)
if mo:
variables["full"] = mo.group(1)
+ f.close()
except EnvironmentError:
pass
return variables
@@ -348,20 +356,24 @@ def versions_from_expanded_variables(variables, tag_prefix, verbose=False):
print("variables are unexpanded, not using")
return {} # unexpanded, so not in an unpacked git-archive tarball
refs = set([r.strip() for r in refnames.strip("()").split(",")])
- for ref in list(refs):
- if not re.search(r'\d', ref):
- if verbose:
- print("discarding '%s', no digits" % ref)
- refs.discard(ref)
- # Assume all version tags have a digit. git's %d expansion
- # behaves like git log --decorate=short and strips out the
- # refs/heads/ and refs/tags/ prefixes that would let us
- # distinguish between branches and tags. By ignoring refnames
- # without digits, we filter out many common branch names like
- # "release" and "stabilization", as well as "HEAD" and "master".
+ # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of
+ # just "foo-1.0". If we see a "tag: " prefix, prefer those.
+ TAG = "tag: "
+ tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)])
+ if not tags:
+ # Either we're using git < 1.8.3, or there really are no tags. We use
+ # a heuristic: assume all version tags have a digit. The old git %d
+ # expansion behaves like git log --decorate=short and strips out the
+ # refs/heads/ and refs/tags/ prefixes that would let us distinguish
+ # between branches and tags. By ignoring refnames without digits, we
+ # filter out many common branch names like "release" and
+ # "stabilization", as well as "HEAD" and "master".
+ tags = set([r for r in refs if re.search(r'\d', r)])
+ if verbose:
+ print("discarding '%s', no digits" % ",".join(refs-tags))
if verbose:
- print("remaining refs: %s" % ",".join(sorted(refs)))
- for ref in sorted(refs):
+ print("likely tags: %s" % ",".join(sorted(tags)))
+ for ref in sorted(tags):
# sorting will prefer e.g. "2.0" over "2.0rc1"
if ref.startswith(tag_prefix):
r = ref[len(tag_prefix):]
@@ -513,6 +525,7 @@ def versions_from_file(filename):
mo = re.match("version_full = '([^']+)'", line)
if mo:
versions["full"] = mo.group(1)
+ f.close()
return versions
def write_to_version_file(filename, versions):