oe-git-archive 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #!/usr/bin/env python3
  2. #
  3. # Helper script for committing data to git and pushing upstream
  4. #
  5. # Copyright (c) 2017, Intel Corporation.
  6. #
  7. # SPDX-License-Identifier: GPL-2.0-only
  8. #
  9. import argparse
  10. import logging
  11. import os
  12. import re
  13. import sys
  14. # Import oe and bitbake libs
  15. scripts_path = os.path.dirname(os.path.realpath(__file__))
  16. sys.path.append(os.path.join(scripts_path, 'lib'))
  17. import scriptpath
  18. scriptpath.add_bitbake_lib_path()
  19. scriptpath.add_oe_lib_path()
  20. from oeqa.utils.git import GitRepo, GitError
  21. from oeqa.utils.metadata import metadata_from_bb
  22. import oeqa.utils.gitarchive as gitarchive
  23. # Setup logging
  24. logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
  25. log = logging.getLogger()
  26. def parse_args(argv):
  27. """Parse command line arguments"""
  28. parser = argparse.ArgumentParser(
  29. description="Commit data to git and push upstream",
  30. formatter_class=argparse.ArgumentDefaultsHelpFormatter)
  31. parser.add_argument('--debug', '-D', action='store_true',
  32. help="Verbose logging")
  33. parser.add_argument('--git-dir', '-g', required=True,
  34. help="Local git directory to use")
  35. parser.add_argument('--no-create', action='store_true',
  36. help="If GIT_DIR is not a valid Git repository, do not "
  37. "try to create one")
  38. parser.add_argument('--bare', action='store_true',
  39. help="Initialize a bare repository when creating a "
  40. "new one")
  41. parser.add_argument('--push', '-p', nargs='?', default=False, const=True,
  42. help="Push to remote")
  43. parser.add_argument('--branch-name', '-b',
  44. default='{hostname}/{branch}/{machine}',
  45. help="Git branch name (pattern) to use")
  46. parser.add_argument('--no-tag', action='store_true',
  47. help="Do not create Git tag")
  48. parser.add_argument('--tag-name', '-t',
  49. default='{hostname}/{branch}/{machine}/{commit_count}-g{commit}/{tag_number}',
  50. help="Tag name (pattern) to use")
  51. parser.add_argument('--commit-msg-subject',
  52. default='Results of {branch}:{commit} on {hostname}',
  53. help="Subject line (pattern) to use in the commit message")
  54. parser.add_argument('--commit-msg-body',
  55. default='branch: {branch}\ncommit: {commit}\nhostname: {hostname}',
  56. help="Commit message body (pattern)")
  57. parser.add_argument('--tag-msg-subject',
  58. default='Test run #{tag_number} of {branch}:{commit} on {hostname}',
  59. help="Subject line (pattern) of the tag message")
  60. parser.add_argument('--tag-msg-body',
  61. default='',
  62. help="Tag message body (pattern)")
  63. parser.add_argument('--exclude', action='append', default=[],
  64. help="Glob to exclude files from the commit. Relative "
  65. "to DATA_DIR. May be specified multiple times")
  66. parser.add_argument('--notes', nargs=2, action='append', default=[],
  67. metavar=('GIT_REF', 'FILE'),
  68. help="Add a file as a note under refs/notes/GIT_REF. "
  69. "{branch_name} in GIT_REF will be expanded to the "
  70. "actual target branch name (specified by "
  71. "--branch-name). This option may be specified "
  72. "multiple times.")
  73. parser.add_argument('data_dir', metavar='DATA_DIR',
  74. help="Data to commit")
  75. return parser.parse_args(argv)
  76. def get_nested(d, list_of_keys):
  77. try:
  78. for k in list_of_keys:
  79. d = d[k]
  80. return d
  81. except KeyError:
  82. return ""
  83. def main(argv=None):
  84. args = parse_args(argv)
  85. if args.debug:
  86. log.setLevel(logging.DEBUG)
  87. try:
  88. # Get keywords to be used in tag and branch names and messages
  89. metadata = metadata_from_bb()
  90. keywords = {'hostname': get_nested(metadata, ['hostname']),
  91. 'branch': get_nested(metadata, ['layers', 'meta', 'branch']),
  92. 'commit': get_nested(metadata, ['layers', 'meta', 'commit']),
  93. 'commit_count': get_nested(metadata, ['layers', 'meta', 'commit_count']),
  94. 'machine': get_nested(metadata, ['config', 'MACHINE'])}
  95. gitarchive.gitarchive(args.data_dir, args.git_dir, args.no_create, args.bare,
  96. args.commit_msg_subject.strip(), args.commit_msg_body, args.branch_name,
  97. args.no_tag, args.tag_name, args.tag_msg_subject, args.tag_msg_body,
  98. args.exclude, args.notes, args.push, keywords, log)
  99. except gitarchive.ArchiveError as err:
  100. log.error(str(err))
  101. return 1
  102. return 0
  103. if __name__ == "__main__":
  104. sys.exit(main())