root / devflow / versioning.py @ 595d480a
History | View | Annotate | Download (14.3 kB)
1 | 55775645 | Vangelis Koukis | #!/usr/bin/env python
|
---|---|---|---|
2 | 55775645 | Vangelis Koukis | #
|
3 | 8df4ab84 | Vangelis Koukis | # Copyright (C) 2012, 2013 GRNET S.A. All rights reserved.
|
4 | 55775645 | Vangelis Koukis | #
|
5 | 55775645 | Vangelis Koukis | # Redistribution and use in source and binary forms, with or
|
6 | 55775645 | Vangelis Koukis | # without modification, are permitted provided that the following
|
7 | 55775645 | Vangelis Koukis | # conditions are met:
|
8 | 55775645 | Vangelis Koukis | #
|
9 | 55775645 | Vangelis Koukis | # 1. Redistributions of source code must retain the above
|
10 | 55775645 | Vangelis Koukis | # copyright notice, this list of conditions and the following
|
11 | 55775645 | Vangelis Koukis | # disclaimer.
|
12 | 55775645 | Vangelis Koukis | #
|
13 | 55775645 | Vangelis Koukis | # 2. Redistributions in binary form must reproduce the above
|
14 | 55775645 | Vangelis Koukis | # copyright notice, this list of conditions and the following
|
15 | 55775645 | Vangelis Koukis | # disclaimer in the documentation and/or other materials
|
16 | 55775645 | Vangelis Koukis | # provided with the distribution.
|
17 | 55775645 | Vangelis Koukis | #
|
18 | 55775645 | Vangelis Koukis | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
19 | 55775645 | Vangelis Koukis | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
20 | 55775645 | Vangelis Koukis | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
21 | 55775645 | Vangelis Koukis | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
22 | 55775645 | Vangelis Koukis | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23 | 55775645 | Vangelis Koukis | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24 | 55775645 | Vangelis Koukis | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
25 | 55775645 | Vangelis Koukis | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
26 | 55775645 | Vangelis Koukis | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
27 | 55775645 | Vangelis Koukis | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
28 | 55775645 | Vangelis Koukis | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
29 | 55775645 | Vangelis Koukis | # POSSIBILITY OF SUCH DAMAGE.
|
30 | 55775645 | Vangelis Koukis | #
|
31 | 55775645 | Vangelis Koukis | # The views and conclusions contained in the software and
|
32 | 55775645 | Vangelis Koukis | # documentation are those of the authors and should not be
|
33 | 55775645 | Vangelis Koukis | # interpreted as representing official policies, either expressed
|
34 | 55775645 | Vangelis Koukis | # or implied, of GRNET S.A.
|
35 | 55775645 | Vangelis Koukis | |
36 | 4a45f70c | Christos Stavrakakis | """Helper functions for automatic version computation.
|
37 | 4a45f70c | Christos Stavrakakis |
|
38 | 4a45f70c | Christos Stavrakakis | This module contains helper functions for extracting information
|
39 | 4a45f70c | Christos Stavrakakis | from a Git repository, and computing the python and debian version
|
40 | 4a45f70c | Christos Stavrakakis | of the repository code.
|
41 | 4a45f70c | Christos Stavrakakis |
|
42 | 4a45f70c | Christos Stavrakakis | """
|
43 | 55775645 | Vangelis Koukis | |
44 | 55775645 | Vangelis Koukis | import os |
45 | 55775645 | Vangelis Koukis | import re |
46 | 55775645 | Vangelis Koukis | import sys |
47 | 55775645 | Vangelis Koukis | |
48 | 871bd65d | Chris Stavrakakis | from distutils import log # pylint: disable=E0611 |
49 | 55775645 | Vangelis Koukis | |
50 | 1b3aeefd | Christos Stavrakakis | from devflow import BRANCH_TYPES, BASE_VERSION_FILE, VERSION_RE |
51 | 9fe1ecd8 | Christos Stavrakakis | from devflow import utils |
52 | 55775645 | Vangelis Koukis | |
53 | 55775645 | Vangelis Koukis | |
54 | 595d480a | Christos Stavrakakis | DEFAULT_VERSION_FILE = """
|
55 | 595d480a | Christos Stavrakakis | __version__ = "%(DEVFLOW_VERSION)s"
|
56 | 3a137edf | Christos Stavrakakis | __version_vcs_info__ = {
|
57 | 3a137edf | Christos Stavrakakis | 'branch': '%(DEVFLOW_BRANCH)s',
|
58 | 3a137edf | Christos Stavrakakis | 'revid': '%(DEVFLOW_REVISION_ID)s',
|
59 | 3a137edf | Christos Stavrakakis | 'revno': %(DEVFLOW_REVISION_NUMBER)s}
|
60 | 3a137edf | Christos Stavrakakis | __version_user_email__ = "%(DEVFLOW_USER_EMAIL)s"
|
61 | 3a137edf | Christos Stavrakakis | __version_user_name__ = "%(DEVFLOW_USER_NAME)s"
|
62 | 3a137edf | Christos Stavrakakis | """
|
63 | 3a137edf | Christos Stavrakakis | |
64 | 3a137edf | Christos Stavrakakis | |
65 | 4a45f70c | Christos Stavrakakis | def get_base_version(vcs_info): |
66 | 55775645 | Vangelis Koukis | """Determine the base version from a file in the repository"""
|
67 | 55775645 | Vangelis Koukis | |
68 | 55775645 | Vangelis Koukis | f = open(os.path.join(vcs_info.toplevel, BASE_VERSION_FILE))
|
69 | 55775645 | Vangelis Koukis | lines = [l.strip() for l in f.readlines()] |
70 | 4a45f70c | Christos Stavrakakis | lines = [l for l in lines if not l.startswith("#")] |
71 | 4a45f70c | Christos Stavrakakis | if len(lines) != 1: |
72 | 55775645 | Vangelis Koukis | raise ValueError("File '%s' should contain a single non-comment line.") |
73 | fe584cc4 | Christos Stavrakakis | f.close() |
74 | 4a45f70c | Christos Stavrakakis | return lines[0] |
75 | 55775645 | Vangelis Koukis | |
76 | 55775645 | Vangelis Koukis | |
77 | 55775645 | Vangelis Koukis | def python_version(base_version, vcs_info, mode): |
78 | 55775645 | Vangelis Koukis | """Generate a Python distribution version following devtools conventions.
|
79 | 55775645 | Vangelis Koukis |
|
80 | 55775645 | Vangelis Koukis | This helper generates a Python distribution version from a repository
|
81 | 55775645 | Vangelis Koukis | commit, following devtools conventions. The input data are:
|
82 | 55775645 | Vangelis Koukis | * base_version: a base version number, presumably stored in text file
|
83 | 55775645 | Vangelis Koukis | inside the repository, e.g., /version
|
84 | 55775645 | Vangelis Koukis | * vcs_info: vcs information: current branch name and revision no
|
85 | 55775645 | Vangelis Koukis | * mode: "snapshot", or "release"
|
86 | 55775645 | Vangelis Koukis |
|
87 | 55775645 | Vangelis Koukis | This helper assumes a git branching model following:
|
88 | 55775645 | Vangelis Koukis | http://nvie.com/posts/a-successful-git-branching-model/
|
89 | 55775645 | Vangelis Koukis |
|
90 | 55775645 | Vangelis Koukis | with 'master', 'develop', 'release-X', 'hotfix-X' and 'feature-X' branches.
|
91 | 55775645 | Vangelis Koukis |
|
92 | 55775645 | Vangelis Koukis | General rules:
|
93 | 55775645 | Vangelis Koukis | a) any repository commit can get as a Python version
|
94 | 55775645 | Vangelis Koukis | b) a version is generated either in 'release' or in 'snapshot' mode
|
95 | 55775645 | Vangelis Koukis | c) the choice of mode depends on the branch, see following table.
|
96 | 55775645 | Vangelis Koukis |
|
97 | 55775645 | Vangelis Koukis | A python version is of the form A_NNN,
|
98 | 55775645 | Vangelis Koukis | where A: X.Y.Z{,next,rcW} and NNN: a revision number for the commit,
|
99 | 55775645 | Vangelis Koukis | as returned by vcs_info().
|
100 | 55775645 | Vangelis Koukis |
|
101 | 55775645 | Vangelis Koukis | For every combination of branch and mode, releases are numbered as follows:
|
102 | 55775645 | Vangelis Koukis |
|
103 | 55775645 | Vangelis Koukis | BRANCH: / MODE: snapshot release
|
104 | 55775645 | Vangelis Koukis | -------- ------------------------------
|
105 | 55775645 | Vangelis Koukis | feature 0.14next_150 N/A
|
106 | 55775645 | Vangelis Koukis | develop 0.14next_151 N/A
|
107 | 55775645 | Vangelis Koukis | release 0.14rc2_249 0.14rc2
|
108 | 55775645 | Vangelis Koukis | master N/A 0.14
|
109 | 55775645 | Vangelis Koukis | hotfix 0.14.1rc6_121 0.14.1rc6
|
110 | 55775645 | Vangelis Koukis | N/A 0.14.1
|
111 | 55775645 | Vangelis Koukis |
|
112 | 55775645 | Vangelis Koukis | The suffix 'next' in a version name is used to denote the upcoming version,
|
113 | 55775645 | Vangelis Koukis | the one being under development in the develop and release branches.
|
114 | 55775645 | Vangelis Koukis | Version '0.14next' is the version following 0.14, and only lives on the
|
115 | 55775645 | Vangelis Koukis | develop and feature branches.
|
116 | 55775645 | Vangelis Koukis |
|
117 | 55775645 | Vangelis Koukis | The suffix 'rc' is used to denote release candidates. 'rc' versions live
|
118 | 55775645 | Vangelis Koukis | only in release and hotfix branches.
|
119 | 55775645 | Vangelis Koukis |
|
120 | 55775645 | Vangelis Koukis | Suffixes 'next' and 'rc' have been chosen to ensure proper ordering
|
121 | 55775645 | Vangelis Koukis | according to setuptools rules:
|
122 | 55775645 | Vangelis Koukis |
|
123 | 55775645 | Vangelis Koukis | http://www.python.org/dev/peps/pep-0386/#setuptools
|
124 | 55775645 | Vangelis Koukis |
|
125 | 55775645 | Vangelis Koukis | Every branch uses a value for A so that all releases are ordered based
|
126 | 55775645 | Vangelis Koukis | on the branch they came from, so:
|
127 | 55775645 | Vangelis Koukis |
|
128 | 55775645 | Vangelis Koukis | So
|
129 | 55775645 | Vangelis Koukis | 0.13next < 0.14rcW < 0.14 < 0.14next < 0.14.1
|
130 | 55775645 | Vangelis Koukis |
|
131 | 55775645 | Vangelis Koukis | and
|
132 | 55775645 | Vangelis Koukis |
|
133 | 55775645 | Vangelis Koukis | >>> V("0.14next") > V("0.14")
|
134 | 55775645 | Vangelis Koukis | True
|
135 | 55775645 | Vangelis Koukis | >>> V("0.14next") > V("0.14rc7")
|
136 | 55775645 | Vangelis Koukis | True
|
137 | 55775645 | Vangelis Koukis | >>> V("0.14next") > V("0.14.1")
|
138 | 55775645 | Vangelis Koukis | False
|
139 | 55775645 | Vangelis Koukis | >>> V("0.14rc6") > V("0.14")
|
140 | 55775645 | Vangelis Koukis | False
|
141 | 55775645 | Vangelis Koukis | >>> V("0.14.2rc6") > V("0.14.1")
|
142 | 55775645 | Vangelis Koukis | True
|
143 | 55775645 | Vangelis Koukis |
|
144 | 55775645 | Vangelis Koukis | The value for _NNN is chosen based of the revision number of the specific
|
145 | 55775645 | Vangelis Koukis | commit. It is used to ensure ascending ordering of consecutive releases
|
146 | 55775645 | Vangelis Koukis | from the same branch. Every version of the form A_NNN comes *before*
|
147 | 55775645 | Vangelis Koukis | than A: All snapshots are ordered so they come before the corresponding
|
148 | 55775645 | Vangelis Koukis | release.
|
149 | 55775645 | Vangelis Koukis |
|
150 | 55775645 | Vangelis Koukis | So
|
151 | 55775645 | Vangelis Koukis | 0.14next_* < 0.14
|
152 | 55775645 | Vangelis Koukis | 0.14.1_* < 0.14.1
|
153 | 55775645 | Vangelis Koukis | etc
|
154 | 55775645 | Vangelis Koukis |
|
155 | 55775645 | Vangelis Koukis | and
|
156 | 55775645 | Vangelis Koukis |
|
157 | 55775645 | Vangelis Koukis | >>> V("0.14next_150") < V("0.14next")
|
158 | 55775645 | Vangelis Koukis | True
|
159 | 55775645 | Vangelis Koukis | >>> V("0.14.1next_150") < V("0.14.1next")
|
160 | 55775645 | Vangelis Koukis | True
|
161 | 55775645 | Vangelis Koukis | >>> V("0.14.1_149") < V("0.14.1")
|
162 | 55775645 | Vangelis Koukis | True
|
163 | 55775645 | Vangelis Koukis | >>> V("0.14.1_149") < V("0.14.1_150")
|
164 | 55775645 | Vangelis Koukis | True
|
165 | 55775645 | Vangelis Koukis |
|
166 | 55775645 | Vangelis Koukis | Combining both of the above, we get
|
167 | 55775645 | Vangelis Koukis | 0.13next_* < 0.13next < 0.14rcW_* < 0.14rcW < 0.14_* < 0.14
|
168 | 55775645 | Vangelis Koukis | < 0.14next_* < 0.14next < 0.14.1_* < 0.14.1
|
169 | 55775645 | Vangelis Koukis |
|
170 | 55775645 | Vangelis Koukis | and
|
171 | 55775645 | Vangelis Koukis |
|
172 | 55775645 | Vangelis Koukis | >>> V("0.13next_102") < V("0.13next")
|
173 | 55775645 | Vangelis Koukis | True
|
174 | 55775645 | Vangelis Koukis | >>> V("0.13next") < V("0.14rc5_120")
|
175 | 55775645 | Vangelis Koukis | True
|
176 | 55775645 | Vangelis Koukis | >>> V("0.14rc3_120") < V("0.14rc3")
|
177 | 55775645 | Vangelis Koukis | True
|
178 | 55775645 | Vangelis Koukis | >>> V("0.14rc3") < V("0.14_1")
|
179 | 55775645 | Vangelis Koukis | True
|
180 | 55775645 | Vangelis Koukis | >>> V("0.14_120") < V("0.14")
|
181 | 55775645 | Vangelis Koukis | True
|
182 | 55775645 | Vangelis Koukis | >>> V("0.14") < V("0.14next_20")
|
183 | 55775645 | Vangelis Koukis | True
|
184 | 55775645 | Vangelis Koukis | >>> V("0.14next_20") < V("0.14next")
|
185 | 55775645 | Vangelis Koukis | True
|
186 | 55775645 | Vangelis Koukis |
|
187 | 55775645 | Vangelis Koukis | Note: one of the tests above fails because of constraints in the way
|
188 | 55775645 | Vangelis Koukis | setuptools parses version numbers. It does not affect us because the
|
189 | 55775645 | Vangelis Koukis | specific version format that triggers the problem is not contained in the
|
190 | 55775645 | Vangelis Koukis | table showing allowed branch / mode combinations, above.
|
191 | 55775645 | Vangelis Koukis |
|
192 | 55775645 | Vangelis Koukis |
|
193 | 55775645 | Vangelis Koukis | """
|
194 | 55775645 | Vangelis Koukis | |
195 | 55775645 | Vangelis Koukis | branch = vcs_info.branch |
196 | 55775645 | Vangelis Koukis | |
197 | 4f36685f | Christos Stavrakakis | brnorm = utils.normalize_branch_name(branch) |
198 | 4f36685f | Christos Stavrakakis | btypestr = utils.get_branch_type(branch) |
199 | 55775645 | Vangelis Koukis | |
200 | 55775645 | Vangelis Koukis | try:
|
201 | 55775645 | Vangelis Koukis | btype = BRANCH_TYPES[btypestr] |
202 | 55775645 | Vangelis Koukis | except KeyError: |
203 | 55775645 | Vangelis Koukis | allowed_branches = ", ".join(x for x in BRANCH_TYPES.keys()) |
204 | 55775645 | Vangelis Koukis | raise ValueError("Malformed branch name '%s', cannot classify as one " |
205 | 55775645 | Vangelis Koukis | "of %s" % (btypestr, allowed_branches))
|
206 | 55775645 | Vangelis Koukis | |
207 | 55775645 | Vangelis Koukis | if btype.versioned:
|
208 | 55775645 | Vangelis Koukis | try:
|
209 | 55775645 | Vangelis Koukis | bverstr = brnorm.split("-")[1] |
210 | 55775645 | Vangelis Koukis | except IndexError: |
211 | 55775645 | Vangelis Koukis | # No version
|
212 | 55775645 | Vangelis Koukis | raise ValueError("Branch name '%s' should contain version" % |
213 | 55775645 | Vangelis Koukis | branch) |
214 | 55775645 | Vangelis Koukis | |
215 | 55775645 | Vangelis Koukis | # Check that version is well-formed
|
216 | 55775645 | Vangelis Koukis | if not re.match(VERSION_RE, bverstr): |
217 | 55775645 | Vangelis Koukis | raise ValueError("Malformed version '%s' in branch name '%s'" % |
218 | 55775645 | Vangelis Koukis | (bverstr, branch)) |
219 | 55775645 | Vangelis Koukis | |
220 | 55775645 | Vangelis Koukis | m = re.match(btype.allowed_version_re, base_version) |
221 | 55775645 | Vangelis Koukis | if not m or (btype.versioned and m.groupdict()["bverstr"] != bverstr): |
222 | 55775645 | Vangelis Koukis | raise ValueError("Base version '%s' unsuitable for branch name '%s'" % |
223 | 55775645 | Vangelis Koukis | (base_version, branch)) |
224 | 55775645 | Vangelis Koukis | |
225 | 55775645 | Vangelis Koukis | if mode not in ["snapshot", "release"]: |
226 | 55775645 | Vangelis Koukis | raise ValueError("Specified mode '%s' should be one of 'snapshot' or " |
227 | 55775645 | Vangelis Koukis | "'release'" % mode)
|
228 | 55775645 | Vangelis Koukis | snap = (mode == "snapshot")
|
229 | 55775645 | Vangelis Koukis | |
230 | 595d480a | Christos Stavrakakis | if (snap and not btype.builds_snapshot) or\ |
231 | 595d480a | Christos Stavrakakis | (not snap and not btype.builds_release): # nopep8 |
232 | 445f53a7 | Christos Stavrakakis | raise ValueError("Invalid mode '%s' in branch type '%s'" % |
233 | 445f53a7 | Christos Stavrakakis | (mode, btypestr)) |
234 | 55775645 | Vangelis Koukis | |
235 | 55775645 | Vangelis Koukis | if snap:
|
236 | 55775645 | Vangelis Koukis | v = "%s_%d_%s" % (base_version, vcs_info.revno, vcs_info.revid)
|
237 | 55775645 | Vangelis Koukis | else:
|
238 | 55775645 | Vangelis Koukis | v = base_version |
239 | 55775645 | Vangelis Koukis | return v
|
240 | 55775645 | Vangelis Koukis | |
241 | 55775645 | Vangelis Koukis | |
242 | 55775645 | Vangelis Koukis | def debian_version_from_python_version(pyver): |
243 | 55775645 | Vangelis Koukis | """Generate a debian package version from a Python version.
|
244 | 55775645 | Vangelis Koukis |
|
245 | 55775645 | Vangelis Koukis | This helper generates a Debian package version from a Python version,
|
246 | 55775645 | Vangelis Koukis | following devtools conventions.
|
247 | 55775645 | Vangelis Koukis |
|
248 | 55775645 | Vangelis Koukis | Debian sorts version strings differently compared to setuptools:
|
249 | 55775645 | Vangelis Koukis | http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version
|
250 | 55775645 | Vangelis Koukis |
|
251 | 55775645 | Vangelis Koukis | Initial tests:
|
252 | 55775645 | Vangelis Koukis |
|
253 | 55775645 | Vangelis Koukis | >>> debian_version("3") < debian_version("6")
|
254 | 55775645 | Vangelis Koukis | True
|
255 | 55775645 | Vangelis Koukis | >>> debian_version("3") < debian_version("2")
|
256 | 55775645 | Vangelis Koukis | False
|
257 | 55775645 | Vangelis Koukis | >>> debian_version("1") == debian_version("1")
|
258 | 55775645 | Vangelis Koukis | True
|
259 | 55775645 | Vangelis Koukis | >>> debian_version("1") != debian_version("1")
|
260 | 55775645 | Vangelis Koukis | False
|
261 | 55775645 | Vangelis Koukis | >>> debian_version("1") >= debian_version("1")
|
262 | 55775645 | Vangelis Koukis | True
|
263 | 55775645 | Vangelis Koukis | >>> debian_version("1") <= debian_version("1")
|
264 | 55775645 | Vangelis Koukis | True
|
265 | 55775645 | Vangelis Koukis |
|
266 | 55775645 | Vangelis Koukis | This helper defines a 1-1 mapping between Python and Debian versions,
|
267 | 55775645 | Vangelis Koukis | with the same ordering.
|
268 | 55775645 | Vangelis Koukis |
|
269 | 55775645 | Vangelis Koukis | Debian versions are ordered in the same way as Python versions:
|
270 | 55775645 | Vangelis Koukis |
|
271 | 55775645 | Vangelis Koukis | >>> D("0.14next") > D("0.14")
|
272 | 55775645 | Vangelis Koukis | True
|
273 | 55775645 | Vangelis Koukis | >>> D("0.14next") > D("0.14rc7")
|
274 | 55775645 | Vangelis Koukis | True
|
275 | 55775645 | Vangelis Koukis | >>> D("0.14next") > D("0.14.1")
|
276 | 55775645 | Vangelis Koukis | False
|
277 | 55775645 | Vangelis Koukis | >>> D("0.14rc6") > D("0.14")
|
278 | 55775645 | Vangelis Koukis | False
|
279 | 55775645 | Vangelis Koukis | >>> D("0.14.2rc6") > D("0.14.1")
|
280 | 55775645 | Vangelis Koukis | True
|
281 | 55775645 | Vangelis Koukis |
|
282 | 55775645 | Vangelis Koukis | and
|
283 | 55775645 | Vangelis Koukis |
|
284 | 55775645 | Vangelis Koukis | >>> D("0.14next_150") < D("0.14next")
|
285 | 55775645 | Vangelis Koukis | True
|
286 | 55775645 | Vangelis Koukis | >>> D("0.14.1next_150") < D("0.14.1next")
|
287 | 55775645 | Vangelis Koukis | True
|
288 | 55775645 | Vangelis Koukis | >>> D("0.14.1_149") < D("0.14.1")
|
289 | 55775645 | Vangelis Koukis | True
|
290 | 55775645 | Vangelis Koukis | >>> D("0.14.1_149") < D("0.14.1_150")
|
291 | 55775645 | Vangelis Koukis | True
|
292 | 55775645 | Vangelis Koukis |
|
293 | 55775645 | Vangelis Koukis | and
|
294 | 55775645 | Vangelis Koukis |
|
295 | 55775645 | Vangelis Koukis | >>> D("0.13next_102") < D("0.13next")
|
296 | 55775645 | Vangelis Koukis | True
|
297 | 55775645 | Vangelis Koukis | >>> D("0.13next") < D("0.14rc5_120")
|
298 | 55775645 | Vangelis Koukis | True
|
299 | 55775645 | Vangelis Koukis | >>> D("0.14rc3_120") < D("0.14rc3")
|
300 | 55775645 | Vangelis Koukis | True
|
301 | 55775645 | Vangelis Koukis | >>> D("0.14rc3") < D("0.14_1")
|
302 | 55775645 | Vangelis Koukis | True
|
303 | 55775645 | Vangelis Koukis | >>> D("0.14_120") < D("0.14")
|
304 | 55775645 | Vangelis Koukis | True
|
305 | 55775645 | Vangelis Koukis | >>> D("0.14") < D("0.14next_20")
|
306 | 55775645 | Vangelis Koukis | True
|
307 | 55775645 | Vangelis Koukis | >>> D("0.14next_20") < D("0.14next")
|
308 | 55775645 | Vangelis Koukis | True
|
309 | 55775645 | Vangelis Koukis |
|
310 | 55775645 | Vangelis Koukis | """
|
311 | 9fe1ecd8 | Christos Stavrakakis | version = pyver.replace("_", "~").replace("rc", "~rc") |
312 | 42868817 | Christos Stavrakakis | codename = utils.get_distribution_codename() |
313 | 36860fc2 | Christos Stavrakakis | minor = str(get_revision(version, codename))
|
314 | 42868817 | Christos Stavrakakis | return version + "-" + minor + "~" + codename |
315 | 9fe1ecd8 | Christos Stavrakakis | |
316 | 9fe1ecd8 | Christos Stavrakakis | |
317 | 36860fc2 | Christos Stavrakakis | def get_revision(version, codename): |
318 | 9fe1ecd8 | Christos Stavrakakis | """Find revision for a debian version"""
|
319 | 84a40792 | Christos Stavrakakis | version_tag = utils.version_to_tag(version) |
320 | 9fe1ecd8 | Christos Stavrakakis | repo = utils.get_repository() |
321 | 9fe1ecd8 | Christos Stavrakakis | minor = 1
|
322 | 9fe1ecd8 | Christos Stavrakakis | while True: |
323 | 36860fc2 | Christos Stavrakakis | tag = "debian/" + version_tag + "-" + str(minor) + codename |
324 | 9fe1ecd8 | Christos Stavrakakis | if tag in repo.tags: |
325 | 9fe1ecd8 | Christos Stavrakakis | minor += 1
|
326 | 9fe1ecd8 | Christos Stavrakakis | else:
|
327 | 9fe1ecd8 | Christos Stavrakakis | return minor
|
328 | 55775645 | Vangelis Koukis | |
329 | 55775645 | Vangelis Koukis | |
330 | 866bb9c1 | Christos Stavrakakis | def get_python_version(): |
331 | 9fe1ecd8 | Christos Stavrakakis | v = utils.get_vcs_info() |
332 | 4a45f70c | Christos Stavrakakis | b = get_base_version(v) |
333 | c181882a | Christos Stavrakakis | mode = utils.get_build_mode() |
334 | 866bb9c1 | Christos Stavrakakis | return python_version(b, v, mode)
|
335 | 866bb9c1 | Christos Stavrakakis | |
336 | 866bb9c1 | Christos Stavrakakis | |
337 | 55775645 | Vangelis Koukis | def debian_version(base_version, vcs_info, mode): |
338 | 55775645 | Vangelis Koukis | p = python_version(base_version, vcs_info, mode) |
339 | 55775645 | Vangelis Koukis | return debian_version_from_python_version(p)
|
340 | 55775645 | Vangelis Koukis | |
341 | 55775645 | Vangelis Koukis | |
342 | 866bb9c1 | Christos Stavrakakis | def get_debian_version(): |
343 | 9fe1ecd8 | Christos Stavrakakis | v = utils.get_vcs_info() |
344 | 4a45f70c | Christos Stavrakakis | b = get_base_version(v) |
345 | c181882a | Christos Stavrakakis | mode = utils.get_build_mode() |
346 | 866bb9c1 | Christos Stavrakakis | return debian_version(b, v, mode)
|
347 | 866bb9c1 | Christos Stavrakakis | |
348 | 866bb9c1 | Christos Stavrakakis | |
349 | bec4bf12 | Christos Stavrakakis | def update_version(): |
350 | 4a45f70c | Christos Stavrakakis | """Generate or replace version files
|
351 | 4a45f70c | Christos Stavrakakis |
|
352 | 4a45f70c | Christos Stavrakakis | Helper function for generating/replacing version files containing version
|
353 | bec4bf12 | Christos Stavrakakis | information.
|
354 | 55775645 | Vangelis Koukis |
|
355 | 55775645 | Vangelis Koukis | """
|
356 | 55775645 | Vangelis Koukis | |
357 | 9fe1ecd8 | Christos Stavrakakis | v = utils.get_vcs_info() |
358 | ffcbf2bb | Christos Stavrakakis | toplevel = v.toplevel |
359 | c400246b | Christos Stavrakakis | |
360 | ffcbf2bb | Christos Stavrakakis | config = utils.get_config() |
361 | 55775645 | Vangelis Koukis | if not v: |
362 | 55775645 | Vangelis Koukis | # Return early if not in development environment
|
363 | bec4bf12 | Christos Stavrakakis | raise RuntimeError("Can not compute version outside of a git" |
364 | bec4bf12 | Christos Stavrakakis | " repository.")
|
365 | 4a45f70c | Christos Stavrakakis | b = get_base_version(v) |
366 | c181882a | Christos Stavrakakis | mode = utils.get_build_mode() |
367 | 55775645 | Vangelis Koukis | version = python_version(b, v, mode) |
368 | 595d480a | Christos Stavrakakis | debian_version_ = debian_version_from_python_version(version) |
369 | 3a137edf | Christos Stavrakakis | env = {"DEVFLOW_VERSION": version,
|
370 | 595d480a | Christos Stavrakakis | "DEVFLOW_DEBIAN_VERSION": debian_version_,
|
371 | 3a137edf | Christos Stavrakakis | "DEVFLOW_BRANCH": v.branch,
|
372 | 3a137edf | Christos Stavrakakis | "DEVFLOW_REVISION_ID": v.revid,
|
373 | 3a137edf | Christos Stavrakakis | "DEVFLOW_REVISION_NUMBER": v.revno,
|
374 | 3a137edf | Christos Stavrakakis | "DEVFLOW_USER_EMAIL": v.email,
|
375 | 3a137edf | Christos Stavrakakis | "DEVFLOW_USER_NAME": v.name}
|
376 | 55775645 | Vangelis Koukis | |
377 | 445f53a7 | Christos Stavrakakis | for _pkg_name, pkg_info in config['packages'].items(): |
378 | 3a137edf | Christos Stavrakakis | version_filename = pkg_info.get('version_file')
|
379 | 3a137edf | Christos Stavrakakis | if not version_filename: |
380 | 3a137edf | Christos Stavrakakis | continue
|
381 | 3a137edf | Christos Stavrakakis | version_template = pkg_info.get('version_template')
|
382 | 3a137edf | Christos Stavrakakis | if version_template:
|
383 | 3a137edf | Christos Stavrakakis | vtemplate_file = os.path.join(toplevel, version_template) |
384 | 3a137edf | Christos Stavrakakis | try:
|
385 | 3a137edf | Christos Stavrakakis | with file(vtemplate_file) as f: |
386 | 3a137edf | Christos Stavrakakis | content = f.read(-1) % env
|
387 | 3a137edf | Christos Stavrakakis | except IOError as e: |
388 | 3a137edf | Christos Stavrakakis | if e.errno == 2: |
389 | 3a137edf | Christos Stavrakakis | raise RuntimeError("devflow.conf contains '%s' as a" |
390 | 3a137edf | Christos Stavrakakis | " version template file, but file does"
|
391 | 3a137edf | Christos Stavrakakis | " not exists!" % vtemplate_file)
|
392 | 3a137edf | Christos Stavrakakis | else:
|
393 | 3a137edf | Christos Stavrakakis | raise
|
394 | 3a137edf | Christos Stavrakakis | else:
|
395 | 3a137edf | Christos Stavrakakis | content = DEFAULT_VERSION_FILE % env |
396 | 3a137edf | Christos Stavrakakis | with file(os.path.join(toplevel, version_filename), 'w+') as f: |
397 | 97b86f46 | Christos Stavrakakis | log.info("Updating version file '%s'" % version_filename)
|
398 | 3a137edf | Christos Stavrakakis | f.write(content) |
399 | 55775645 | Vangelis Koukis | |
400 | 55775645 | Vangelis Koukis | |
401 | 7c1589db | Christos Stavrakakis | def bump_version_main(): |
402 | 7c1589db | Christos Stavrakakis | try:
|
403 | 7c1589db | Christos Stavrakakis | version = sys.argv[1]
|
404 | 7c1589db | Christos Stavrakakis | bump_version(version) |
405 | 7c1589db | Christos Stavrakakis | except IndexError: |
406 | 7c1589db | Christos Stavrakakis | sys.stdout.write("Give me a version %s!\n")
|
407 | 7c1589db | Christos Stavrakakis | sys.stdout.write("usage: %s version\n" % sys.argv[0]) |
408 | 7c1589db | Christos Stavrakakis | |
409 | 7c1589db | Christos Stavrakakis | |
410 | 7c1589db | Christos Stavrakakis | def bump_version(new_version): |
411 | 7c1589db | Christos Stavrakakis | """Set new base version to base version file and commit"""
|
412 | 9fe1ecd8 | Christos Stavrakakis | v = utils.get_vcs_info() |
413 | c181882a | Christos Stavrakakis | mode = utils.get_build_mode() |
414 | 7c1589db | Christos Stavrakakis | |
415 | 7c1589db | Christos Stavrakakis | # Check that new base version is valid
|
416 | 7c1589db | Christos Stavrakakis | python_version(new_version, v, mode) |
417 | 7c1589db | Christos Stavrakakis | |
418 | 9fe1ecd8 | Christos Stavrakakis | repo = utils.get_repository() |
419 | 7c1589db | Christos Stavrakakis | toplevel = repo.working_dir |
420 | 7c1589db | Christos Stavrakakis | |
421 | 4a45f70c | Christos Stavrakakis | old_version = get_base_version(v) |
422 | 7c1589db | Christos Stavrakakis | sys.stdout.write("Current base version is '%s'\n" % old_version)
|
423 | 7c1589db | Christos Stavrakakis | |
424 | ffcbf2bb | Christos Stavrakakis | version_file = os.path.join(toplevel, "version")
|
425 | 7c1589db | Christos Stavrakakis | sys.stdout.write("Updating version file %s from version '%s' to '%s'\n"
|
426 | 7c1589db | Christos Stavrakakis | % (version_file, old_version, new_version)) |
427 | 7c1589db | Christos Stavrakakis | |
428 | 7c1589db | Christos Stavrakakis | f = open(version_file, 'rw+') |
429 | 7c1589db | Christos Stavrakakis | lines = f.readlines() |
430 | 7c1589db | Christos Stavrakakis | for i in range(0, len(lines)): |
431 | 7c1589db | Christos Stavrakakis | if not lines[i].startswith("#"): |
432 | 445f53a7 | Christos Stavrakakis | lines[i] = lines[i].replace(old_version, new_version) |
433 | 7c1589db | Christos Stavrakakis | f.seek(0)
|
434 | a1a26749 | Christos Stavrakakis | f.truncate(0)
|
435 | 7c1589db | Christos Stavrakakis | f.writelines(lines) |
436 | 7c1589db | Christos Stavrakakis | f.close() |
437 | 7c1589db | Christos Stavrakakis | |
438 | 7c1589db | Christos Stavrakakis | repo.git.add(version_file) |
439 | e87745ef | Christos Stavrakakis | repo.git.commit(m="Bump version to %s" % new_version)
|
440 | 7c1589db | Christos Stavrakakis | sys.stdout.write("Update version file and commited\n")
|
441 | 7c1589db | Christos Stavrakakis | |
442 | 7c1589db | Christos Stavrakakis | |
443 | 866bb9c1 | Christos Stavrakakis | def main(): |
444 | 9fe1ecd8 | Christos Stavrakakis | v = utils.get_vcs_info() |
445 | 4a45f70c | Christos Stavrakakis | b = get_base_version(v) |
446 | c181882a | Christos Stavrakakis | mode = utils.get_build_mode() |
447 | 55775645 | Vangelis Koukis | |
448 | 55775645 | Vangelis Koukis | try:
|
449 | 55775645 | Vangelis Koukis | arg = sys.argv[1]
|
450 | 55775645 | Vangelis Koukis | assert arg == "python" or arg == "debian" |
451 | 55775645 | Vangelis Koukis | except IndexError: |
452 | 55775645 | Vangelis Koukis | raise ValueError("A single argument, 'python' or 'debian is required") |
453 | 55775645 | Vangelis Koukis | |
454 | 55775645 | Vangelis Koukis | if arg == "python": |
455 | 55775645 | Vangelis Koukis | print python_version(b, v, mode)
|
456 | 55775645 | Vangelis Koukis | elif arg == "debian": |
457 | 55775645 | Vangelis Koukis | print debian_version(b, v, mode)
|
458 | 866bb9c1 | Christos Stavrakakis | |
459 | 866bb9c1 | Christos Stavrakakis | if __name__ == "__main__": |
460 | 866bb9c1 | Christos Stavrakakis | sys.exit(main()) |