conan-recipe-version.yml 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. name: Get Conan Recipe Version
  2. on:
  3. workflow_call:
  4. inputs:
  5. project_name:
  6. required: true
  7. type: string
  8. outputs:
  9. recipe_id_full:
  10. description: "The full Conan recipe id: <name>/<version>@<user>/<channel>"
  11. value: ${{ jobs.get-conan-broadcast-data.outputs.recipe_id_full }}
  12. recipe_id_latest:
  13. description: "The full Conan recipe aliased (latest) id: <name>/(latest)@<user>/<channel>"
  14. value: ${{ jobs.get-conan-broadcast-data.outputs.recipe_id_latest }}
  15. recipe_semver_full:
  16. description: "The full semver <Major>.<Minor>.<Patch>-<PreReleaseTag>+<BuildMetaData>"
  17. value: ${{ jobs.get-conan-broadcast-data.outputs.semver_full }}
  18. recipe_user:
  19. description: "The conan user"
  20. value: ${{ jobs.get-conan-broadcast-data.outputs.user }}
  21. recipe_channel:
  22. description: "The conan channel"
  23. value: ${{ jobs.get-conan-broadcast-data.outputs.channel }}
  24. jobs:
  25. get-semver:
  26. runs-on: ubuntu-latest
  27. outputs:
  28. recipe_id_full: ${{ steps.get-conan-broadcast-data.outputs.recipe_id_full }}
  29. recipe_id_latest: ${{ steps.get-conan-broadcast-data.outputs.recipe_id_latest }}
  30. semver_full: ${{ steps.get-conan-broadcast-data.outputs.semver_full }}
  31. user: ${{ steps.get-conan-broadcast-data.outputs.user }}
  32. channel: ${{ steps.get-conan-broadcast-data.outputs.channel }}
  33. steps:
  34. - name: Checkout repo
  35. uses: actions/checkout@v3
  36. with:
  37. ref: ${{ github.head_ref }}
  38. fetch-depth: 0
  39. - name: Setup Python and pip
  40. uses: actions/setup-python@v4
  41. with:
  42. python-version: "3.10.x"
  43. cache: 'pip'
  44. cache-dependency-path: .github/workflows/requirements-conan-package.txt
  45. - name: Install Python requirements and Create default Conan profile
  46. run: pip install -r .github/workflows/requirements-conan-package.txt
  47. - id: get-conan-broadcast-data
  48. name: Get Conan broadcast data
  49. run: |
  50. from conans import tools
  51. from conans.errors import ConanException
  52. from git import Repo
  53. repo = Repo('.')
  54. user = "${{ github.repository_owner }}"
  55. project_name = "${{ inputs.project_name }}"
  56. event_name = "${{ github.event_name }}"
  57. issue_number = "${{ github.event.issue.number }}"
  58. is_tag = "${{ github.ref_type }}" == "tag"
  59. # FIXME: for when we push a tag (such as an release)
  60. if is_tag:
  61. branch_version = tools.Version("2.3.5")
  62. else:
  63. try:
  64. branch_version = tools.Version(repo.active_branch.name)
  65. channel = "stable"
  66. except ConanException:
  67. branch_version = tools.Version('0.0.0')
  68. if repo.active_branch.name == f"{branch_version.major}.{branch_version.minor}":
  69. channel = 'stable'
  70. elif repo.active_branch.name == "main" or repo.active_branch.name == "master":
  71. channel = 'testing'
  72. else:
  73. channel = repo.active_branch.name.split("_")[0].replace("-", "_").lower()
  74. if event_name == "pull_request":
  75. channel = f"pr_{issue_number}"
  76. # %% Get the actual version
  77. latest_branch_version = tools.Version("0.0.0")
  78. latest_branch_tag = None
  79. for tag in repo.git.tag(merged = True).splitlines():
  80. try:
  81. version = tools.Version(tag)
  82. except ConanException:
  83. continue
  84. if version > latest_branch_version:
  85. latest_branch_version = version
  86. if version.prerelease is "":
  87. latest_branch_tag = repo.tag(tag)
  88. # %% Get the actual version
  89. no_commits = 0
  90. for commit in repo.iter_commits("HEAD"):
  91. if commit == latest_branch_tag.commit:
  92. break
  93. no_commits += 1
  94. if no_commits == 0:
  95. # This is a release
  96. actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{latest_branch_version.patch}"
  97. if channel == "stable":
  98. user = "_"
  99. channel = "_"
  100. else:
  101. if event_name == "pull_request":
  102. actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{latest_branch_version.patch}-{latest_branch_version.prerelease.lower()}+pr_{issue_number}_{no_commits}"
  103. else:
  104. if latest_branch_version.prerelease == "":
  105. actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{latest_branch_version.patch}-alpha+{no_commits}"
  106. else:
  107. actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{latest_branch_version.patch}-{latest_branch_version.prerelease.lower()}+{no_commits}"
  108. # %% print to output
  109. print(f"::set-output name=name::{project_name}")
  110. print(f"::set-output name=version::{actual_version}")
  111. print(f"::set-output name=user::{user}")
  112. print(f"::set-output name=channel::{channel}")
  113. print(f"::set-output name=recipe_id_full::{project_name}/{actual_version}@{user}/{channel}")
  114. print(f"::set-output name=recipe_id_latest::{project_name}/latest@{user}/{channel}")
  115. print(f"::set-output name=semver_full::{actual_version}")
  116. print("::group::Conan Recipe Information")
  117. print(f"name = {project_name}")
  118. print(f"version = {actual_version}")
  119. print(f"user = {user}")
  120. print(f"channel = {channel}")
  121. print(f"recipe_id_full = {project_name}/{actual_version}@{user}/{channel}")
  122. print(f"recipe_id_latest = {project_name}/latest@{user}/{channel}")
  123. print(f"semver_full = {actual_version}")
  124. print("::endgroup::")
  125. shell: python