8000 Merge branch 'polyglot' · drinkingjava/python-versioneer@6c7f25d · GitHub
[go: up one dir, main page]

Skip to content

Commit 6c7f25d

Browse files
committed
Merge branch 'polyglot'
Closes python-versioneer#26.
2 parents 8fef024 + 44887e0 commit 6c7f25d

16 files changed

+262
-246
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ this tool is format-agnostic) can come from a variety of places:
3838
* ask the VCS tool itself, e.g. "git describe" (for checkouts), which knows
3939
about recent "tags" and an absolute revision-id
4040
* the name of the directory into which the tarball was unpacked
41-
* an expanded VCS variable ($Id$, etc)
41+
* an expanded VCS keyword ($Id$, etc)
4242
* a `_version.py` created by some earlier build step
4343

4444
For released software, the version identifier is closely related to a VCS
@@ -78,6 +78,8 @@ contain enough information to get the proper version.
7878

7979
First, decide on values for the following configuration variables:
8080

81+
* `VCS`: the version control system you use. Currently accepts "git".
82+
8183
* `versionfile_source`:
8284

8385
A project-relative pathname into which the generated version strings should
@@ -122,6 +124,7 @@ To versioneer-enable your project:
122124
configuration values you decided earlier:
123125

124126
import versioneer
127+
versioneer.VCS = 'git'
125128
versioneer.versionfile_source = 'src/myproject/_version.py'
126129
versioneer.versionfile_build = 'myproject/_version.py'
127130
versioneer.tag_prefix = '' # tags are like 1.2.0

developers.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
## To add support for a new VCS
3+
4+
So, you want to extend Versioneer to support your favorite version control system? Great! Here's what to do:
5+
6+
* 1: `mkdir src/NEW-VCS/`
7+
* 2: create work-alikes for everything in `src/git/`
8+
* 3: add NEW-VCS to the loop in setup.py `generate_versioneer()`
9+
* 4: add clauses for NEW-VCS to `src/get_versions.py`, for both the from-keywords and from-vcs sections
10+
* 5: add `test/test_NEWVCS.py`, copying the general style of `test_git.py` but using NEWVCS instead of git.
11+
* 6: add a line to .travis.yml to execute your `test_NEWVCS.py` upon checkins
12+
13+
Then file a pull request!

setup.py

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,28 @@ def readme(s):
2323
return s.replace("@README@", get("README.md"))
2424

2525
def generate_versioneer():
26-
vcs = "git"
27-
if vcs not in ("git",):
28-
raise ValueError("Unhandled revision-control system '%s'" % vcs)
2926
out = []
3027
out.append(readme(ver(get("src/header.py"))))
31-
out.append('VCS = "%s"\n' % vcs)
32-
out.append("\n\n")
33-
for line in open("src/%s/long-version.py" % vcs, "r").readlines():
34-
if line.startswith("#### START"):
35-
out.append("LONG_VERSION_PY = '''\n")
36-
elif line.startswith("#### SUBPROCESS_HELPER"):
37-
out.append(unquote(get("src/subprocess_helper.py")))
38-
elif line.startswith("#### MIDDLE"):
39-
out.append(unquote(get("src/%s/middle.py" % vcs)))
40-
elif line.startswith("#### PARENTDIR"):
41-
out.append(unquote(get("src/parentdir.py")))
42-
elif line.startswith("#### END"):
43-
out.append("'''\n")
44-
else:
45-
out.append(ver(line))
4628
out.append(get("src/subprocess_helper.py"))
47-
out.append(get("src/%s/middle.py" % vcs))
48-
out.append(get("src/parentdir.py"))
49-
out.append(get("src/%s/install.py" % vcs))
50-
out.append(ver(get("src/trailer.py")))
29+
30+
for VCS in ["git"]:
31+
out.append("LONG_VERSION_PY['%s'] = '''\n" % VCS)
32+
out.append(ver(get("src/%s/long_header.py" % VCS)))
33+
out.append(unquote(get("src/subprocess_helper.py")))
34+
out.append(unquote(get("src/from_parentdir.py")))
35+
out.append(unquote(get("src/%s/from_keywords.py" % VCS)))
36+
out.append(unquote(get("src/%s/from_vcs.py" % VCS)))
37+
out.append(unquote(get("src/%s/long_get_versions.py" % VCS)))
38+
out.append("'''\n")
39+
out.append(get("src/%s/from_keywords.py" % VCS))
40+
out.append(get("src/%s/from_vcs.py" % VCS))
41+
out.append(get("src/%s/install.py" % VCS))
42+
43+
out.append(get("src/from_parentdir.py"))
44+
out.append(ver(get("src/from_file.py")))
45+
out.append(ver(get("src/get_versions.py")))
46+
out.append(ver(get("src/cmdclass.py")))
47+
5148
return ("".join(out)).encode("utf-8")
5249

5350

src/trailer.py renamed to src/cmdclass.py

Lines changed: 14 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,4 @@
11

2-
SHORT_VERSION_PY = """
3-
# This file was generated by 'versioneer.py' (@VERSIONEER-VERSION@) from
4-
# revision-control system data, or from the parent directory name of an
5-
# unpacked source archive. Distribution tarballs contain a pre-generated copy
6-
# of this file.
7-
8-
version_version = '%(version)s'
9-
version_full = '%(full)s'
10-
def get_versions(default={}, verbose=False):
11-
return {'version': version_version, 'full': version_full}
12-
13-
"""
14-
15-
DEFAULT = {"version": "unknown", "full": "unknown"}
16-
17-
def versions_from_file(filename):
18-
versions = {}
19-
try:
20-
f = open(filename)
21-
except EnvironmentError:
22-
return versions
23-
for line in f.readlines():
24-
mo = re.match("version_version = '([^']+)'", line)
25-
if mo:
26-
versions["version"] = mo.group(1)
27-
mo = re.match("version_full = '([^']+)'", line)
28-
if mo:
29-
versions["full"] = mo.group(1)
30-
f.close()
31-
return versions
32-
33-
def write_to_version_file(filename, versions):
34-
f = open(filename, "w")
35-
f.write(SHORT_VERSION_PY % versions)
36-
f.close()
37-
print("set %s to '%s'" % (filename, versions["version"]))
38-
39-
def get_root():
40-
try:
41-
return os.path.dirname(os.path.abspath(__file__))
42-
except NameError:
43-
return os.path.dirname(os.path.abspath(sys.argv[0]))
44-
45-
def get_versions(default=DEFAULT, verbose=False):
46-
# returns dict with two keys: 'version' and 'full'
47-
assert versionfile_source is not None, "please set versioneer.versionfile_source"
48-
assert tag_prefix is not None, "please set versioneer.tag_prefix"
49-
assert parentdir_prefix is not None, "please set versioneer.parentdir_prefix"
50-
# I am in versioneer.py, which must live at the top of the source tree,
51-
# which we use to compute the root directory. py2exe/bbfreeze/non-CPython
52-
# don't have __file__, in which case we fall back to sys.argv[0] (which
53-
# ought to be the setup.py script). We prefer __file__ since that's more
54-
# robust in cases where setup.py was invoked in some weird way (e.g. pip)
55-
root = get_root()
56-
versionfile_abs = os.path.join(root, versionfile_source)
57-
58-
# extract version from first of _version.py, 'git describe', parentdir.
59-
# This is meant to work for developers using a source checkout, for users
60-
# of a tarball created by 'setup.py sdist', and for users of a
61-
# tarball/zipball created by 'git archive' or github's download-from-tag
62-
# feature.
63-
64-
variables = get_expanded_variables(versionfile_abs)
65-
if variables:
66-
ver = versions_from_expanded_variables(variables, tag_prefix)
67-
if ver:
68-
if verbose: print("got version from expanded variable %s" % ver)
69-
return ver
70-
71-
ver = versions_from_file(versionfile_abs)
72-
if ver:
73-
if verbose: print("got version from file %s %s" % (versionfile_abs,ver))
74-
return ver
75-
76-
ver = versions_from_vcs(tag_prefix, root, verbose)
77-
if ver:
78-
if verbose: print("got version from git %s" % ver)
79-
return ver
80-
81-
ver = versions_from_parentdir(parentdir_prefix, root, verbose)
82-
if ver:
83-
if verbose: print("got version from parentdir %s" % ver)
84-
return ver
85-
86-
if verbose: print("got version from default %s" % ver)
87-
return default
88-
89-
def get_version(verbose=False):
90-
return get_versions(verbose=verbose)["version"]
91-
922
class cmd_version(Command):
933
description = "report generated version string"
944
user_options = []
@@ -130,11 +40,13 @@ def run(self):
13040
_build_exe.run(self)
13141
os.unlink(target_versionfile)
13242
f = open(versionfile_source, "w")
133-
f.write(LONG_VERSION_PY % {"DOLLAR": "$",
134-
"TAG_PREFIX": tag_prefix,
135-
"PARENTDIR_PREFIX": parentdir_prefix,
136-
"VERSIONFILE_SOURCE": versionfile_source,
137-
})
43+
assert VCS is not None, "please set versioneer.VCS"
44+
LONG = LONG_VERSION_PY[VCS]
45+
f.write(LONG % {"DOLLAR": "$",
46+
"TAG_PREFIX": tag_prefix,
47+
"PARENTDIR_PREFIX": parentdir_prefix,
48+
"VERSIONFILE_SOURCE": versionfile_source,
49+
})
13850
f.close()
13951

14052
class cmd_sdist(_sdist):
@@ -173,11 +85,13 @@ def finalize_options(self):
17385
def run(self):
17486
print(" creating %s" % versionfile_source)
17587
f = open(versionfile_source, "w")
176-
f.write(LONG_VERSION_PY % {"DOLLAR": "$",
177-
"TAG_PREFIX": tag_prefix,
178-
"PARENTDIR_PREFIX": parentdir_prefix,
179-
"VERSIONFILE_SOURCE": versionfile_source,
180-
})
88+
assert VCS is not None, "please set versioneer.VCS"
89+
LONG = LONG_VERSION_PY[VCS]
90+
f.write(LONG % {"DOLLAR": "$",
91+
"TAG_PREFIX": tag_prefix,
92+
"PARENTDIR_PREFIX": parentdir_prefix,
93+
"VERSIONFILE_SOURCE": versionfile_source,
94+
})
18195
f.close()
18296

18397
ipy = os.path.join(os.path.dirname(versionfile_source), "__init__.py")

src/from_file.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
2+
SHORT_VERSION_PY = """
3+
# This file was generated by 'versioneer.py' (@VERSIONEER-VERSION@) from
4+
# revision-control system data, or from the parent directory name of an
5+
# unpacked source archive. Distribution tarballs contain a pre-generated copy
6+
# of this file.
7+
8+
version_version = '%(version)s'
9+
version_full = '%(full)s'
10+
def get_versions(default={}, verbose=False):
11+
return {'version': version_version, 'full': version_full}
12+
13+
"""
14+
15+
DEFAULT = {"version": "unknown", "full": "unknown"}
16+
17+
def versions_from_file(filename):
18+
versions = {}
19+
try:
20+
f = open(filename)
21+
except EnvironmentError:
22+
return versions
23+
for line in f.readlines():
24+
mo = re.match("version_version = '([^']+)'", line)
25+
if mo:
26+
versions["version"] = mo.group(1)
27+
mo = re.match("version_full = '([^']+)'", line)
28+
if mo:
29+
versions["full"] = mo.group(1)
30+
10000 f.close()
31+
return versions
32+
33+
def write_to_version_file(filename, versions):
34+
f = open(filename, "w")
35+
f.write(SHORT_VERSION_PY % versions)
36+
f.close()
37+
print("set %s to '%s'" % (filename, versions["version"]))
38+
File renamed without changes.

src/get_versions.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
2+
def get_root():
3+
try:
4+
return os.path.dirname(os.path.abspath(__file__))
5+
except NameError:
6+
return os.path.dirname(os.path.abspath(sys.argv[0]))
7+
8+
def get_versions(default=DEFAULT, verbose=False):
9+
# returns dict with two keys: 'version' and 'full'
10+
assert versionfile_source is not None, "please set versioneer.versionfile_source"
11+
assert tag_prefix is not None, "please set versioneer.tag_prefix"
12+
assert parentdir_prefix is not None, "please set versioneer.parentdir_prefix"
13+
assert VCS is not None, "please set versioneer.VCS"
14+
15+
# I am in versioneer.py, which must live at the top of the source tree,
16+
# which we use to compute the root directory. py2exe/bbfreeze/non-CPython
17+
# don't have __file__, in which case we fall back to sys.argv[0] (which
18+
# ought to be the setup.py script). We prefer __file__ since that's more
19+
# robust in cases where setup.py was invoked in some weird way (e.g. pip)
20+
root = get_root()
21+
versionfile_abs = os.path.join(root, versionfile_source)
22+
23+
# extract version from first of _version.py, 'git describe', parentdir.
24+
# This is meant to work for developers using a source checkout, for users
25+
# of a tarball created by 'setup.py sdist', and for users of a
26+
# tarball/zipball created by 'git archive' or github's download-from-tag
27+
# feature.
28+
29+
if VCS == "git":
30+
ver = git_versions_from_keywords(git_get_keywords(versionfile_abs),
31+
tag_prefix)
32+
else:
33+
ver = None
34+
if ver:
35+
if verbose: print("got version from expanded keyword %s" % ver)
36+
return ver
37+
38+
ver = versions_from_file(versionfile_abs)
39+
if ver:
40+
if verbose: print("got version from file %s %s" % (versionfile_abs,ver))
41+
return ver
42+
43+
if VCS == "git":
44+
ver = git_versions_from_vcs(tag_prefix, root, verbose)
45+
else:
46+
ver = None
47+
if ver:
48+
if verbose: print("got version from git %s" % ver)
49+
return ver
50+
51+
ver = versions_from_parentdir(parentdir_prefix, root, verbose)
52+
if ver:
53+
if verbose: print("got version from parentdir %s" % ver)
54+
return ver
55+
56+
if verbose: print("got version from default %s" % ver)
57+
return default
58+
59+
def get_version(verbose=False):
60+
return get_versions(verbose=verbose)["version"]

0 commit comments

Comments
 (0)
0