Skip to content

Commit

Permalink
FIX: Changed order of version retrieval
Browse files Browse the repository at this point in the history
Version retrieval in _version.py now preferes version_from_parentdir
over version_from_vcs since we could have a virtualenv inside our project
directory. This should be safer.
  • Loading branch information
Florian Wilhelm authored and Florian Wilhelm committed Mar 4, 2015
1 parent 67d9d24 commit ff509ce
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 19 deletions.
28 changes: 20 additions & 8 deletions pyscaffold/_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,15 @@
git_refnames = "$Format:%d$"
git_full = "$Format:%H$"

package = "pyscaffold"
# general settings
tag_prefix = 'v' # tags are like v1.2.0
package = "pyscaffold"
namespace = []
root_pkg = namespace[0] if namespace else package
if namespace:
pkg_path = os.path.join(*namespace[-1].split('.') + [package])
else:
pkg_path = package


class ShellCommand(object):
Expand Down Expand Up @@ -139,15 +146,15 @@ def version_from_keywords(keywords, tag_prefix, verbose=False):
# "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))
print("discarding '{}', no digits".format(",".join(refs-tags)))
if verbose:
print("likely tags: %s" % ",".join(sorted(tags)))
print("likely tags: {}".format(",".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):]
if verbose:
print("picking %s" % r)
print("picking {}".format(r))
return {"version": r,
"full": keywords["full"].strip()}
else:
Expand All @@ -163,8 +170,8 @@ def version_from_parentdir(parentdir_prefix, root, verbose=False):
dirname = os.path.basename(root)
if not dirname.startswith(parentdir_prefix):
if verbose:
print("guessing rootdir is '%s', but '%s' doesn't start with "
"prefix '%s'" % (root, dirname, parentdir_prefix))
print("guessing rootdir is '{}', but '{}' doesn't start with "
"prefix '{}'".format(root, dirname, parentdir_prefix))
return None
version = dirname[len(parentdir_prefix):].split('-')[0]
return {"version": version, "full": ""}
Expand All @@ -190,13 +197,18 @@ def get_versions(verbose=False):
vcs_kwds = {"refnames": git_refnames, "full": git_full}
parentdir = package + '-'
root = __location__
# pkg_path is the relative path from the top of the source
# tree (where the .git directory might live) to this file.
# Invert this to find the root of our package.
for _ in pkg_path.split(os.sep):
root = os.path.dirname(root)

# different version retrieval methods as (method, args, comment)
ver_retrieval = [
(version_from_keywords, (vcs_kwds, tag_prefix, verbose),
'expanded keywords'),
(version_from_vcs, (tag_prefix, root, verbose), 'git'),
(version_from_parentdir, (parentdir, root, verbose), 'parentdir')
(version_from_parentdir, (parentdir, root, verbose), 'parentdir'),
(version_from_vcs, (tag_prefix, root, verbose), 'git')
]
for method, args, comment in ver_retrieval:
ver = method(*args)
Expand Down
28 changes: 20 additions & 8 deletions pyscaffold/data/_version.template
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,15 @@ __location__ = os.path.join(os.getcwd(), os.path.dirname(
git_refnames = "$Format:%d$"
git_full = "$Format:%H$"

package = "{package}"
# general settings
tag_prefix = 'v' # tags are like v1.2.0
package = "${package}"
namespace = []
root_pkg = namespace[0] if namespace else package
if namespace:
pkg_path = os.path.join(*namespace[-1].split('.') + [package])
else:
pkg_path = package


class ShellCommand(object):
Expand Down Expand Up @@ -139,15 +146,15 @@ def version_from_keywords(keywords, tag_prefix, verbose=False):
# "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))
print("discarding '{}', no digits".format(",".join(refs-tags)))
if verbose:
print("likely tags: %s" % ",".join(sorted(tags)))
print("likely tags: {}".format(",".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):]
if verbose:
print("picking %s" % r)
print("picking {}".format(r))
return {"version": r,
"full": keywords["full"].strip()}
else:
Expand All @@ -163,8 +170,8 @@ def version_from_parentdir(parentdir_prefix, root, verbose=False):
dirname = os.path.basename(root)
if not dirname.startswith(parentdir_prefix):
if verbose:
print("guessing rootdir is '%s', but '%s' doesn't start with "
"prefix '%s'" % (root, dirname, parentdir_prefix))
print("guessing rootdir is '{}', but '{}' doesn't start with "
"prefix '{}'".format(root, dirname, parentdir_prefix))
return None
version = dirname[len(parentdir_prefix):].split('-')[0]
return {"version": version, "full": ""}
Expand All @@ -190,13 +197,18 @@ def get_versions(verbose=False):
vcs_kwds = {"refnames": git_refnames, "full": git_full}
parentdir = package + '-'
root = __location__
# pkg_path is the relative path from the top of the source
# tree (where the .git directory might live) to this file.
# Invert this to find the root of our package.
for _ in pkg_path.split(os.sep):
root = os.path.dirname(root)

# different version retrieval methods as (method, args, comment)
ver_retrieval = [
(version_from_keywords, (vcs_kwds, tag_prefix, verbose),
'expanded keywords'),
(version_from_vcs, (tag_prefix, root, verbose), 'git'),
(version_from_parentdir, (parentdir, root, verbose), 'parentdir')
(version_from_parentdir, (parentdir, root, verbose), 'parentdir'),
(version_from_vcs, (tag_prefix, root, verbose), 'git')
]
for method, args, comment in ver_retrieval:
ver = method(*args)
Expand Down
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
inspect.getfile(inspect.currentframe())))

# general settings
pyscaffold_version = "2.0"
package = "pyscaffold"
namespace = []
root_pkg = namespace[0] if namespace else package
Expand Down
12 changes: 10 additions & 2 deletions tests/test_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,12 +135,20 @@ def installed_demoapp(dist=None, path=None, demoapp='demoapp'):


def check_version(output, exp_version, dirty=False):
version = output.split(' ')[1]
# for some setuptools version a directory with + is generated, sometimes _
if dirty:
ver, local = output.split(' ')[1].split('+')
if '+' in version:
ver, local = version.split('+')
else:
ver, local = version.split('_')
assert local.endswith('dirty')
assert ver == exp_version
else:
ver = output.split(' ')[1].split('+')
if '+' in version:
ver = version.split('+')
else:
ver = version.split('_')
if len(ver) > 1:
assert not ver[1].endswith('dirty')
assert ver[0] == exp_version
Expand Down

0 comments on commit ff509ce

Please sign in to comment.