__main__.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. """
  2. Main module.
  3. This module provides the CLI interface for the coverage utility script.
  4. """
  5. import sys
  6. import argparse
  7. from .extraction import extract_coverage, compare_coverage, run_coverage, set_verbose
  8. from .github_api import generate_comment, post_comment, set_github_output
  9. from .workflow import process_coverage_workflow
  10. from .util import log
  11. def setup_verbose_mode(args):
  12. """
  13. Set up verbose mode based on command line arguments.
  14. Args:
  15. args: Parsed command line arguments
  16. """
  17. if getattr(args, 'verbose', False):
  18. set_verbose(True)
  19. log("Verbose mode enabled")
  20. def main():
  21. # Create parent parser with common arguments
  22. parent_parser = argparse.ArgumentParser(add_help=False)
  23. parent_parser.add_argument('-v', '--verbose', action='store_true', help='Enable verbose output')
  24. # Create main parser that inherits common arguments
  25. parser = argparse.ArgumentParser(description='Coverage utility script for GitHub Actions workflows', parents=[parent_parser])
  26. subparsers = parser.add_subparsers(dest='command', help='Command to run')
  27. # extract-coverage command - used directly in workflow
  28. extract_parser = subparsers.add_parser('extract-coverage', help='Extract coverage percentage from a file', parents=[parent_parser])
  29. extract_parser.add_argument('file_path', help='Path to the coverage report file')
  30. extract_parser.add_argument('--type', choices=['extension', 'webview'], default='extension',
  31. help='Type of coverage report')
  32. extract_parser.add_argument('--github-output', action='store_true', help='Output in GitHub Actions format')
  33. # compare-coverage command - used by process-workflow
  34. compare_parser = subparsers.add_parser('compare-coverage', help='Compare coverage percentages', parents=[parent_parser])
  35. compare_parser.add_argument('base_cov', help='Base branch coverage percentage')
  36. compare_parser.add_argument('pr_cov', help='PR branch coverage percentage')
  37. compare_parser.add_argument('--output-prefix', default='', help='Prefix for GitHub Actions output variables')
  38. compare_parser.add_argument('--github-output', action='store_true', help='Output in GitHub Actions format')
  39. # generate-comment command - used by process-workflow
  40. comment_parser = subparsers.add_parser('generate-comment', help='Generate PR comment with coverage comparison', parents=[parent_parser])
  41. comment_parser.add_argument('base_ext_cov', help='Base branch extension coverage')
  42. comment_parser.add_argument('pr_ext_cov', help='PR branch extension coverage')
  43. comment_parser.add_argument('ext_decreased', help='Whether extension coverage decreased (true/false)')
  44. comment_parser.add_argument('ext_diff', help='Extension coverage difference')
  45. comment_parser.add_argument('base_web_cov', help='Base branch webview coverage')
  46. comment_parser.add_argument('pr_web_cov', help='PR branch webview coverage')
  47. comment_parser.add_argument('web_decreased', help='Whether webview coverage decreased (true/false)')
  48. comment_parser.add_argument('web_diff', help='Webview coverage difference')
  49. # post-comment command - used by process-workflow
  50. post_parser = subparsers.add_parser('post-comment', help='Post a comment to a GitHub PR', parents=[parent_parser])
  51. post_parser.add_argument('comment_path', help='Path to the file containing the comment text')
  52. post_parser.add_argument('pr_number', help='PR number')
  53. post_parser.add_argument('repo', help='Repository in the format "owner/repo"')
  54. post_parser.add_argument('--token', help='GitHub token')
  55. # run-coverage command - used by process-workflow
  56. run_parser = subparsers.add_parser('run-coverage', help='Run a coverage command and extract the coverage percentage', parents=[parent_parser])
  57. run_parser.add_argument('coverage_cmd', help='Command to run')
  58. run_parser.add_argument('output_file', help='File to save the output to')
  59. run_parser.add_argument('--type', choices=['extension', 'webview'], default='extension',
  60. help='Type of coverage report')
  61. run_parser.add_argument('--github-output', action='store_true', help='Output in GitHub Actions format')
  62. # process-workflow command - used directly in workflow
  63. workflow_parser = subparsers.add_parser('process-workflow', help='Process the entire coverage workflow', parents=[parent_parser])
  64. workflow_parser.add_argument('--base-branch', required=True, help='Base branch name')
  65. workflow_parser.add_argument('--pr-number', help='PR number')
  66. workflow_parser.add_argument('--repo', help='Repository in the format "owner/repo"')
  67. workflow_parser.add_argument('--token', help='GitHub token')
  68. # set-github-output command - used by process-workflow
  69. output_parser = subparsers.add_parser('set-github-output', help='Set GitHub Actions output variable', parents=[parent_parser])
  70. output_parser.add_argument('name', help='Output variable name')
  71. output_parser.add_argument('value', help='Output variable value')
  72. args = parser.parse_args()
  73. # Set up verbose mode
  74. setup_verbose_mode(args)
  75. if args.command == 'extract-coverage':
  76. log(f"Extracting coverage from file: {args.file_path} (type: {args.type})")
  77. coverage_pct = extract_coverage(args.file_path, args.type)
  78. if args.github_output:
  79. set_github_output(f"{args.type}_coverage", coverage_pct)
  80. else:
  81. log(f"Coverage: {coverage_pct}%")
  82. elif args.command == 'compare-coverage':
  83. log(f"Comparing coverage: base={args.base_cov}%, PR={args.pr_cov}%")
  84. decreased, diff = compare_coverage(args.base_cov, args.pr_cov)
  85. if args.github_output:
  86. prefix = args.output_prefix
  87. set_github_output(f"{prefix}decreased", str(decreased).lower())
  88. set_github_output(f"{prefix}diff", diff)
  89. log(f"Coverage difference: {diff}%")
  90. log(f"Coverage decreased: {decreased}")
  91. else:
  92. log(f"decreased={str(decreased).lower()}")
  93. log(f"diff={diff}")
  94. elif args.command == 'generate-comment':
  95. log("Generating coverage comparison comment")
  96. comment = generate_comment(
  97. args.base_ext_cov, args.pr_ext_cov, args.ext_decreased, args.ext_diff,
  98. args.base_web_cov, args.pr_web_cov, args.web_decreased, args.web_diff
  99. )
  100. # Output the comment to stdout
  101. log(comment)
  102. elif args.command == 'post-comment':
  103. log(f"Posting comment from {args.comment_path} to PR #{args.pr_number} in {args.repo}")
  104. post_comment(args.comment_path, args.pr_number, args.repo, args.token)
  105. elif args.command == 'run-coverage':
  106. log(f"Running coverage command: {args.coverage_cmd}")
  107. log(f"Output file: {args.output_file}")
  108. log(f"Coverage type: {args.type}")
  109. coverage_pct = run_coverage(args.coverage_cmd, args.output_file, args.type)
  110. if args.github_output:
  111. set_github_output(f"{args.type}_coverage", coverage_pct)
  112. else:
  113. log(f"Coverage: {coverage_pct}%")
  114. elif args.command == 'process-workflow':
  115. log("Processing coverage workflow")
  116. log(f"Base branch: {args.base_branch}")
  117. if args.pr_number:
  118. log(f"PR number: {args.pr_number}")
  119. if args.repo:
  120. log(f"Repository: {args.repo}")
  121. process_coverage_workflow(args)
  122. elif args.command == 'set-github-output':
  123. log(f"Setting GitHub output: {args.name}={args.value}")
  124. set_github_output(args.name, args.value)
  125. else:
  126. log("No command specified")
  127. parser.print_help()
  128. sys.exit(1)
  129. if __name__ == "__main__":
  130. main()