set_versions.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #!/usr/bin/env python3
  2. #
  3. # Add version information to poky.yaml based upon current git branch/tags
  4. #
  5. # Copyright Linux Foundation
  6. # Author: Richard Purdie <richard.purdie@linuxfoundation.org>
  7. #
  8. # SPDX-License-Identifier: MIT
  9. #
  10. import subprocess
  11. import collections
  12. import sys
  13. import os
  14. import itertools
  15. ourversion = None
  16. if len(sys.argv) == 2:
  17. ourversion = sys.argv[1]
  18. ourversion = None
  19. if len(sys.argv) == 2:
  20. ourversion = sys.argv[1]
  21. activereleases = ["honister", "hardknott", "dunfell"]
  22. #devbranch = "langdale"
  23. devbranch = "kirkstone"
  24. ltsseries = ["kirkstone", "dunfell"]
  25. release_series = collections.OrderedDict()
  26. #release_series["langdale"] = "4.1"
  27. release_series["kirkstone"] = "4.0"
  28. release_series["honister"] = "3.4"
  29. release_series["hardknott"] = "3.3"
  30. release_series["gatesgarth"] = "3.2"
  31. release_series["dunfell"] = "3.1"
  32. release_series["zeus"] = "3.0"
  33. release_series["warrior"] = "2.7"
  34. release_series["thud"] = "2.6"
  35. release_series["sumo"] = "2.5"
  36. release_series["rocko"] = "2.4"
  37. release_series["pyro"] = "2.3"
  38. release_series["morty"] = "2.2"
  39. release_series["krogoth"] = "2.1"
  40. release_series["jethro"] = "2.0"
  41. release_series["jethro-pre"] = "1.9"
  42. release_series["fido"] = "1.8"
  43. release_series["dizzy"] = "1.7"
  44. release_series["daisy"] = "1.6"
  45. release_series["dora"] = "1.5"
  46. release_series["dylan"] = "1.4"
  47. release_series["danny"] = "1.3"
  48. release_series["denzil"] = "1.2"
  49. release_series["edison"] = "1.1"
  50. release_series["bernard"] = "1.0"
  51. release_series["laverne"] = "0.9"
  52. # "langdale" : "2.2",
  53. bitbake_mapping = {
  54. "kirkstone" : "2.0",
  55. "honister" : "1.52",
  56. "hardknott" : "1.50",
  57. "gatesgarth" : "1.48",
  58. "dunfell" : "1.46",
  59. }
  60. # 3.4 onwards doesn't have poky version
  61. # Early 3.4 release docs do reference it though
  62. poky_mapping = {
  63. "3.4" : "26.0",
  64. "3.3" : "25.0",
  65. "3.2" : "24.0",
  66. "3.1" : "23.0",
  67. }
  68. ourseries = None
  69. ourbranch = None
  70. bitbakeversion = None
  71. docconfver = None
  72. # Test tags exist and inform the user to fetch if not
  73. try:
  74. subprocess.run(["git", "show", "yocto-3.4.2"], capture_output=True, check=True)
  75. except subprocess.CalledProcessError:
  76. sys.exit("Please run 'git fetch --tags' before building the documentation")
  77. # Try and figure out what we are
  78. tags = subprocess.run(["git", "tag", "--points-at", "HEAD"], capture_output=True, text=True).stdout
  79. for t in tags.split():
  80. if t.startswith("yocto-"):
  81. ourversion = t[6:]
  82. if ourversion:
  83. # We're a tagged release
  84. components = ourversion.split(".")
  85. baseversion = components[0] + "." + components[1]
  86. docconfver = ourversion
  87. for i in release_series:
  88. if release_series[i] == baseversion:
  89. ourseries = i
  90. ourbranch = i
  91. if i in bitbake_mapping:
  92. bitbakeversion = bitbake_mapping[i]
  93. else:
  94. # We're floating on a branch
  95. branch = subprocess.run(["git", "branch", "--show-current"], capture_output=True, text=True).stdout.strip()
  96. ourbranch = branch
  97. if branch != "master" and branch not in release_series:
  98. # We're not on a known release branch so we have to guess. Compare the numbers of commits
  99. # from each release branch and assume the smallest number of commits is the one we're based off
  100. possible_branch = None
  101. branch_count = 0
  102. for b in itertools.chain(release_series.keys(), ["master"]):
  103. result = subprocess.run(["git", "log", "--format=oneline", "HEAD..origin/" + b], capture_output=True, text=True)
  104. if result.returncode == 0:
  105. count = result.stdout.count('\n')
  106. if not possible_branch or count < branch_count:
  107. print("Branch %s has count %s" % (b, count))
  108. possible_branch = b
  109. branch_count = count
  110. if possible_branch:
  111. branch = possible_branch
  112. else:
  113. branch = "master"
  114. print("Nearest release branch estimated to be %s" % branch)
  115. if branch == "master":
  116. ourseries = devbranch
  117. docconfver = "dev"
  118. bitbakeversion = ""
  119. elif branch in release_series:
  120. ourseries = branch
  121. if branch in bitbake_mapping:
  122. bitbakeversion = bitbake_mapping[branch]
  123. else:
  124. sys.exit("Unknown series for branch %s" % branch)
  125. previoustags = subprocess.run(["git", "tag", "--merged", "HEAD"], capture_output=True, text=True).stdout
  126. previoustags = [t[6:] for t in previoustags.split() if t.startswith("yocto-" + release_series[ourseries])]
  127. futuretags = subprocess.run(["git", "tag", "--merged", ourbranch], capture_output=True, text=True).stdout
  128. futuretags = [t[6:] for t in futuretags.split() if t.startswith("yocto-" + release_series[ourseries])]
  129. # Append .999 against the last known version
  130. if len(previoustags) != len(futuretags):
  131. ourversion = previoustags[-1] + ".999"
  132. else:
  133. ourversion = release_series[ourseries] + ".999"
  134. if not docconfver:
  135. docconfver = ourversion
  136. series = [k for k in release_series]
  137. previousseries = series[series.index(ourseries)+1:] or [""]
  138. lastlts = [k for k in previousseries if k in ltsseries] or "dunfell"
  139. print("Version calculated to be %s" % ourversion)
  140. print("Release series calculated to be %s" % ourseries)
  141. replacements = {
  142. "DISTRO" : ourversion,
  143. "DISTRO_NAME_NO_CAP" : ourseries,
  144. "DISTRO_NAME" : ourseries.capitalize(),
  145. "DISTRO_NAME_NO_CAP_MINUS_ONE" : previousseries[0],
  146. "DISTRO_NAME_NO_CAP_LTS" : lastlts[0],
  147. "YOCTO_DOC_VERSION" : ourversion,
  148. "DISTRO_REL_TAG" : "yocto-" + ourversion,
  149. "DOCCONF_VERSION" : docconfver,
  150. "BITBAKE_SERIES" : bitbakeversion,
  151. }
  152. if release_series[ourseries] in poky_mapping:
  153. pokyversion = poky_mapping[release_series[ourseries]]
  154. if ourversion != release_series[ourseries]:
  155. pokyversion = pokyversion + "." + ourversion.rsplit(".", 1)[1]
  156. else:
  157. pokyversion = pokyversion + ".0"
  158. replacements["POKYVERSION"] = pokyversion
  159. if os.path.exists("poky.yaml.in"):
  160. with open("poky.yaml.in", "r") as r, open("poky.yaml", "w") as w:
  161. lines = r.readlines()
  162. for line in lines:
  163. data = line.split(":")
  164. k = data[0].strip()
  165. if k in replacements:
  166. w.write("%s : \"%s\"\n" % (k, replacements[k]))
  167. else:
  168. w.write(line)
  169. print("poky.yaml generated from poky.yaml.in")
  170. # In the switcher list of versions we display:
  171. # - latest dev
  172. # - latest stable release
  173. # - latest LTS
  174. # - latest for each releases listed as active
  175. # - latest doc version in current series
  176. # - current doc version
  177. # (with duplicates removed)
  178. if ourseries not in activereleases:
  179. activereleases.append(ourseries)
  180. versions = []
  181. with open("sphinx-static/switchers.js.in", "r") as r, open("sphinx-static/switchers.js", "w") as w:
  182. lines = r.readlines()
  183. for line in lines:
  184. if "VERSIONS_PLACEHOLDER" in line:
  185. w.write(" 'dev': { 'title': 'dev (%s)', 'obsolete': false,},\n" % release_series[devbranch])
  186. for branch in activereleases:
  187. if branch == devbranch:
  188. continue
  189. branch_versions = subprocess.run('git tag --list yocto-%s*' % (release_series[branch]), shell=True, capture_output=True, text=True).stdout.split()
  190. branch_versions = sorted([v.replace("yocto-" + release_series[branch] + ".", "").replace("yocto-" + release_series[branch], "0") for v in branch_versions], key=int)
  191. if not branch_versions:
  192. continue
  193. version = release_series[branch]
  194. if branch_versions[-1] != "0":
  195. version = version + "." + branch_versions[-1]
  196. versions.append(version)
  197. w.write(" '%s': {'title': '%s', 'obsolete': %s,},\n" % (version, version, str(branch == ourseries).lower()))
  198. if ourversion not in versions and ourseries != devbranch:
  199. w.write(" '%s': {'title': '%s', 'obsolete': true,},\n" % (ourversion, ourversion))
  200. else:
  201. w.write(line)
  202. print("switchers.js generated from switchers.js.in")