| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #!/usr/bin/env python3
- #
- # Copyright (C) 2019 Intel Corporation. All rights reserved.
- # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- #
- import re
- import shlex
- import subprocess
- import sys
- def fetch_version_from_code():
- """
- search the semantic version definition in build-scripts/config_common.cmake
- """
- major, minor, patch = "", "", ""
- with open("core/version.h", encoding="utf-8") as f:
- for line in f:
- if "WAMR_VERSION" not in line:
- continue
- major_match = re.search(r"WAMR_VERSION_MAJOR (\d+)", line)
- if major_match is not None:
- major = major_match.groups()[0]
- continue
- minor_match = re.search(r"WAMR_VERSION_MINOR (\d+)", line)
- if minor_match is not None:
- minor = minor_match.groups()[0]
- continue
- patch_match = re.search(r"WAMR_VERSION_PATCH (\d+)", line)
- if patch_match is not None:
- patch = patch_match.groups()[0]
- if len(major) == 0 or len(minor) == 0 or len(patch) == 0:
- raise Exception(
- "can't find the semantic version definition likes WAMR_VERSION_*"
- )
- return f"WAMR-{major}.{minor}.{patch}"
- def fetch_latest_git_tag():
- list_tag_cmd = (
- 'git tag --list WAMR-*.*.* --sort=committerdate --format="%(refname:short)"'
- )
- p = subprocess.run(shlex.split(list_tag_cmd), capture_output=True, check=True)
- all_tags = p.stdout.decode().strip()
- latest_tag = all_tags.split("\n")[-1]
- return latest_tag
- def match_version_pattern(v):
- pattern = r"WAMR-\d+\.\d+\.\d+"
- m = re.match(pattern, v)
- return m is not None
- def split_version_string(v):
- """
- return the semantic version as an integer list
- """
- pattern = r"WAMR-(\d+)\.(\d+)\.(\d+)"
- m = re.match(pattern, v)
- return [int(x) for x in m.groups()]
- def compare_version_string(v1, v2):
- """
- return value:
- - 1. if v1 > v2
- - -1. if v1 < v2
- - 0. if v1 == v2
- """
- if not match_version_pattern(v1):
- raise Exception(f"{v1} doesn't match the version pattern")
- if not match_version_pattern(v2):
- raise Exception(f"{v2} doesn't match the version pattern")
- v1_sem_ver = split_version_string(v1)
- v2_sem_ver = split_version_string(v2)
- return 0 if v1_sem_ver == v2_sem_ver else (1 if v1_sem_ver > v2_sem_ver else -1)
- def is_major_or_minor_changed(v1, v2):
- """
- return true if change either major of v2 or minor of v2
- return false or else
- """
- if not match_version_pattern(v1):
- raise Exception(f"{v1} doesn't match the version pattern")
- if not match_version_pattern(v2):
- raise Exception(f"{v2} doesn't match the version pattern")
- v1_major, v1_minor, _ = split_version_string(v1)
- v2_major, v2_minor, _ = split_version_string(v2)
- return v2_major != v1_major or v2_minor != v1_minor
- def next_version():
- definition = fetch_version_from_code()
- tag = fetch_latest_git_tag()
- new_version = ""
- minor_changed = False
- if compare_version_string(definition, tag) == 1:
- new_version = definition.split("-")[-1]
- if is_major_or_minor_changed(tag, definition):
- minor_changed = True
- return new_version, "major_minor_change" if minor_changed else "patch_change"
- if __name__ == "__main__":
- print(f"{next_version()[0]},{next_version()[1]}")
- sys.exit(0)
|