summaryrefslogtreecommitdiff
path: root/tools/read-version
diff options
context:
space:
mode:
Diffstat (limited to 'tools/read-version')
-rwxr-xr-xtools/read-version49
1 files changed, 47 insertions, 2 deletions
diff --git a/tools/read-version b/tools/read-version
index 06fd61a8..92e9fc96 100755
--- a/tools/read-version
+++ b/tools/read-version
@@ -45,14 +45,58 @@ def which(program):
return None
+def is_gitdir(path):
+ # Return boolean indicating if path is a git tree.
+ git_meta = os.path.join(path, '.git')
+ if os.path.isdir(git_meta):
+ return True
+ if os.path.exists(git_meta):
+ # in a git worktree, .git is a file with 'gitdir: x'
+ with open(git_meta, "rb") as fp:
+ if b'gitdir:' in fp.read():
+ return True
+ return False
+
+
use_long = '--long' in sys.argv or os.environ.get('CI_RV_LONG')
use_tags = '--tags' in sys.argv or os.environ.get('CI_RV_TAGS')
output_json = '--json' in sys.argv
src_version = ci_version.version_string()
version_long = None
-version = src_version
-version_long = None
+
+# If we're performing CI for a new release branch (which our tooling creates
+# with an "upstream/" prefix), then we don't want to enforce strict version
+# matching because we know it will fail.
+is_release_branch_ci = (
+ os.environ.get("TRAVIS_PULL_REQUEST_BRANCH", "").startswith("upstream/")
+)
+if is_gitdir(_tdir) and which("git") and not is_release_branch_ci:
+ flags = []
+ if use_tags:
+ flags = ['--tags']
+ cmd = ['git', 'describe', '--abbrev=8', '--match=[0-9]*'] + flags
+
+ try:
+ version = tiny_p(cmd).strip()
+ except RuntimeError:
+ version = None
+
+ if version is None or not version.startswith(src_version):
+ sys.stderr.write("git describe version (%s) differs from "
+ "cloudinit.version (%s)\n" % (version, src_version))
+ sys.stderr.write(
+ "Please get the latest upstream tags.\n"
+ "As an example, this can be done with the following:\n"
+ "$ git remote add upstream https://git.launchpad.net/cloud-init\n"
+ "$ git fetch upstream --tags\n"
+ )
+ sys.exit(1)
+
+ version_long = tiny_p(cmd + ["--long"]).strip()
+else:
+ version = src_version
+ version_long = None
# version is X.Y.Z[+xxx.gHASH]
# version_long is None or X.Y.Z-xxx-gHASH
@@ -75,6 +119,7 @@ data = {
'extra': extra,
'commit': commit,
'distance': distance,
+ 'is_release_branch_ci': is_release_branch_ci,
}
if output_json: