checkout_project_ref.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #!/usr/bin/env python
  2. # internal use only
  3. # called by CI jobs when it uses a project related to IDF
  4. import os
  5. import json
  6. import argparse
  7. import subprocess
  8. import re
  9. IDF_GIT_DESCRIBE_PATTERN = re.compile(r"^v(\d)\.(\d)")
  10. def target_branch_candidates(proj_name):
  11. """
  12. :return: a list of target branch candidates, from highest priority to lowest priority.
  13. """
  14. candidates = [
  15. # branch name (or tag name) of current IDF
  16. os.getenv("CI_COMMIT_REF_NAME"),
  17. # CI_MERGE_REQUEST_TARGET_BRANCH_NAME
  18. os.getenv("CI_MERGE_REQUEST_TARGET_BRANCH_NAME"),
  19. ]
  20. # revision defined in bot message
  21. customized_project_revisions = os.getenv("BOT_CUSTOMIZED_REVISION")
  22. if customized_project_revisions:
  23. customized_project_revisions = json.loads(customized_project_revisions)
  24. try:
  25. ref_to_use = customized_project_revisions[proj_name.lower()]
  26. # highest priority, insert to head of list
  27. candidates.insert(0, ref_to_use)
  28. except (KeyError, TypeError):
  29. pass
  30. # branch name read from IDF
  31. try:
  32. git_describe = subprocess.check_output(["git", "describe", "HEAD"])
  33. match = IDF_GIT_DESCRIBE_PATTERN.search(git_describe.decode())
  34. if match:
  35. major_revision = match.group(1)
  36. minor_revision = match.group(2)
  37. # release branch
  38. candidates.append("release/v{}.{}".format(major_revision, minor_revision))
  39. # branch to match all major branches, like v3.x or v3
  40. candidates.append("release/v{}.x".format(major_revision))
  41. candidates.append("release/v{}".format(major_revision))
  42. except subprocess.CalledProcessError:
  43. # this should not happen as IDF should have describe message
  44. pass
  45. return [c for c in candidates if c] # filter out null value
  46. if __name__ == "__main__":
  47. parser = argparse.ArgumentParser()
  48. parser.add_argument("project",
  49. help="the name of project")
  50. parser.add_argument("project_relative_path",
  51. help="relative path of project to IDF repository directory")
  52. args = parser.parse_args()
  53. candidate_branches = target_branch_candidates(args.project)
  54. # change to project dir for checkout
  55. os.chdir(args.project_relative_path)
  56. for candidate in candidate_branches:
  57. try:
  58. subprocess.check_call(["git", "checkout", "-f", candidate], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # not print the stdout nor stderr
  59. print("CI using ref {} for project {}".format(candidate, args.project))
  60. break
  61. except subprocess.CalledProcessError:
  62. pass
  63. else:
  64. print("using default branch")