release_helper.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import os
  2. import toml
  3. REPO_PATH = "../.."
  4. PACKAGE_PATH = REPO_PATH + "/package"
  5. LINUX_PACKAGE_PATH = REPO_PATH + "/port/linux/package/pikascript/pikascript-lib"
  6. PACKAGE_RELEASE_PATH = REPO_PATH + "/packages.toml"
  7. WORK_DIR = os.getcwd()
  8. class VersoinType:
  9. MAJOR = 1
  10. MINOR = 2
  11. PATCH = 3
  12. class VersionInfo:
  13. version: str
  14. commit: str
  15. vmajor: int
  16. vminor: int
  17. vpatch: int
  18. def __init__(self, version_discription: str):
  19. # v1.0.0
  20. try:
  21. self.version = version_discription.split(" ")[0]
  22. self.commit = version_discription.split(" ")[1]
  23. self.vmajor = int(self.version.split(".")[0][1:])
  24. self.vminor = int(self.version.split(".")[1])
  25. self.vpatch = int(self.version.split(".")[2])
  26. except:
  27. raise ValueError("Invalid version discription")
  28. class PackageRelease:
  29. name: str
  30. versions: list[VersionInfo]
  31. def __init__(self, pkg_dict: dict, name: str):
  32. self.name = name
  33. self.versions = []
  34. for package in pkg_dict:
  35. if package['name'] == name:
  36. for version_dicription in package['releases']:
  37. try:
  38. self.versions.append(VersionInfo(version_dicription))
  39. except:
  40. continue
  41. def latestVersion(self):
  42. # find the latest version
  43. latest_version = self.versions[0]
  44. for version in self.versions:
  45. if version.vmajor > latest_version.vmajor:
  46. latest_version = version
  47. elif version.vmajor == latest_version.vmajor:
  48. if version.vminor > latest_version.vminor:
  49. latest_version = version
  50. elif version.vminor == latest_version.vminor:
  51. if version.vpatch > latest_version.vpatch:
  52. latest_version = version
  53. return latest_version
  54. class PackageReleaseList:
  55. pkg_dict: dict
  56. packages: list[PackageRelease]
  57. def __init__(self, file_path):
  58. # read releases.toml
  59. with open(file_path, "r") as f:
  60. self.pkg_dict = toml.load(f)
  61. self.packages = []
  62. for package in self.pkg_dict['packages']:
  63. self.packages.append(PackageRelease(
  64. self.pkg_dict['packages'], package['name']))
  65. def latestCommit(self, package_name: str):
  66. # find the package
  67. for package in self.packages:
  68. if package.name == package_name:
  69. # find the latest version
  70. latest_version = package.versions[0]
  71. for version in package.versions:
  72. if version.vmajor > latest_version.vmajor:
  73. latest_version = version
  74. elif version.vmajor == latest_version.vmajor:
  75. if version.vminor > latest_version.vminor:
  76. latest_version = version
  77. elif version.vminor == latest_version.vminor:
  78. if version.vpatch > latest_version.vpatch:
  79. latest_version = version
  80. return latest_version.commit
  81. def versionRelease(self, package_name: str, version_type: VersoinType, commit: str):
  82. # find the package
  83. for package in self.packages:
  84. if package.name == package_name:
  85. # find the latest version
  86. latest_version = package.versions[0]
  87. for version in package.versions:
  88. if version.vmajor > latest_version.vmajor:
  89. latest_version = version
  90. elif version.vmajor == latest_version.vmajor:
  91. if version.vminor > latest_version.vminor:
  92. latest_version = version
  93. elif version.vminor == latest_version.vminor:
  94. if version.vpatch > latest_version.vpatch:
  95. latest_version = version
  96. # release new version
  97. if version_type == VersoinType.MAJOR:
  98. latest_version.vmajor += 1
  99. latest_version.vminor = 0
  100. latest_version.vpatch = 0
  101. elif version_type == VersoinType.MINOR:
  102. latest_version.vminor += 1
  103. latest_version.vpatch = 0
  104. elif version_type == VersoinType.PATCH:
  105. latest_version.vpatch += 1
  106. # solve version overflow
  107. if latest_version.vpatch > 9:
  108. latest_version.vpatch = 0
  109. latest_version.vminor += 1
  110. if latest_version.vminor > 9:
  111. latest_version.vminor = 0
  112. latest_version.vmajor += 1
  113. new_version_str = f"v{latest_version.vmajor}.{latest_version.vminor}.{latest_version.vpatch}"
  114. # add new version to the package
  115. for package in self.pkg_dict['packages']:
  116. if package['name'] == package_name:
  117. package['releases'].append(
  118. f"{new_version_str} {commit}")
  119. return new_version_str
  120. def dump(self, file_path):
  121. with open(file_path, "w") as f:
  122. # dump with formating
  123. toml.dump(self.pkg_dict, f)
  124. def findPackage(self, pkg_name:str):
  125. for package in self.packages:
  126. if package.name == pkg_name:
  127. return package
  128. return None