155 lines
7.6 KiB
Python
155 lines
7.6 KiB
Python
"""
|
|
Main module.
|
|
This module provides the CLI interface for the coverage utility script.
|
|
"""
|
|
|
|
import sys
|
|
import argparse
|
|
|
|
from .extraction import extract_coverage, compare_coverage, run_coverage, set_verbose
|
|
from .github_api import generate_comment, post_comment, set_github_output
|
|
from .workflow import process_coverage_workflow
|
|
from .util import log
|
|
|
|
def setup_verbose_mode(args):
|
|
"""
|
|
Set up verbose mode based on command line arguments.
|
|
|
|
Args:
|
|
args: Parsed command line arguments
|
|
"""
|
|
if getattr(args, 'verbose', False):
|
|
set_verbose(True)
|
|
log("Verbose mode enabled")
|
|
|
|
def main():
|
|
# Create parent parser with common arguments
|
|
parent_parser = argparse.ArgumentParser(add_help=False)
|
|
parent_parser.add_argument('-v', '--verbose', action='store_true', help='Enable verbose output')
|
|
|
|
# Create main parser that inherits common arguments
|
|
parser = argparse.ArgumentParser(description='Coverage utility script for GitHub Actions workflows', parents=[parent_parser])
|
|
subparsers = parser.add_subparsers(dest='command', help='Command to run')
|
|
|
|
# extract-coverage command - used directly in workflow
|
|
extract_parser = subparsers.add_parser('extract-coverage', help='Extract coverage percentage from a file', parents=[parent_parser])
|
|
extract_parser.add_argument('file_path', help='Path to the coverage report file')
|
|
extract_parser.add_argument('--type', choices=['extension', 'webview'], default='extension',
|
|
help='Type of coverage report')
|
|
extract_parser.add_argument('--github-output', action='store_true', help='Output in GitHub Actions format')
|
|
|
|
# compare-coverage command - used by process-workflow
|
|
compare_parser = subparsers.add_parser('compare-coverage', help='Compare coverage percentages', parents=[parent_parser])
|
|
compare_parser.add_argument('base_cov', help='Base branch coverage percentage')
|
|
compare_parser.add_argument('pr_cov', help='PR branch coverage percentage')
|
|
compare_parser.add_argument('--output-prefix', default='', help='Prefix for GitHub Actions output variables')
|
|
compare_parser.add_argument('--github-output', action='store_true', help='Output in GitHub Actions format')
|
|
|
|
# generate-comment command - used by process-workflow
|
|
comment_parser = subparsers.add_parser('generate-comment', help='Generate PR comment with coverage comparison', parents=[parent_parser])
|
|
comment_parser.add_argument('base_ext_cov', help='Base branch extension coverage')
|
|
comment_parser.add_argument('pr_ext_cov', help='PR branch extension coverage')
|
|
comment_parser.add_argument('ext_decreased', help='Whether extension coverage decreased (true/false)')
|
|
comment_parser.add_argument('ext_diff', help='Extension coverage difference')
|
|
comment_parser.add_argument('base_web_cov', help='Base branch webview coverage')
|
|
comment_parser.add_argument('pr_web_cov', help='PR branch webview coverage')
|
|
comment_parser.add_argument('web_decreased', help='Whether webview coverage decreased (true/false)')
|
|
comment_parser.add_argument('web_diff', help='Webview coverage difference')
|
|
|
|
# post-comment command - used by process-workflow
|
|
post_parser = subparsers.add_parser('post-comment', help='Post a comment to a GitHub PR', parents=[parent_parser])
|
|
post_parser.add_argument('comment_path', help='Path to the file containing the comment text')
|
|
post_parser.add_argument('pr_number', help='PR number')
|
|
post_parser.add_argument('repo', help='Repository in the format "owner/repo"')
|
|
post_parser.add_argument('--token', help='GitHub token')
|
|
|
|
# run-coverage command - used by process-workflow
|
|
run_parser = subparsers.add_parser('run-coverage', help='Run a coverage command and extract the coverage percentage', parents=[parent_parser])
|
|
run_parser.add_argument('coverage_cmd', help='Command to run')
|
|
run_parser.add_argument('output_file', help='File to save the output to')
|
|
run_parser.add_argument('--type', choices=['extension', 'webview'], default='extension',
|
|
help='Type of coverage report')
|
|
run_parser.add_argument('--github-output', action='store_true', help='Output in GitHub Actions format')
|
|
|
|
# process-workflow command - used directly in workflow
|
|
workflow_parser = subparsers.add_parser('process-workflow', help='Process the entire coverage workflow', parents=[parent_parser])
|
|
workflow_parser.add_argument('--base-branch', required=True, help='Base branch name')
|
|
workflow_parser.add_argument('--pr-number', help='PR number')
|
|
workflow_parser.add_argument('--repo', help='Repository in the format "owner/repo"')
|
|
workflow_parser.add_argument('--token', help='GitHub token')
|
|
|
|
# set-github-output command - used by process-workflow
|
|
output_parser = subparsers.add_parser('set-github-output', help='Set GitHub Actions output variable', parents=[parent_parser])
|
|
output_parser.add_argument('name', help='Output variable name')
|
|
output_parser.add_argument('value', help='Output variable value')
|
|
|
|
args = parser.parse_args()
|
|
|
|
# Set up verbose mode
|
|
setup_verbose_mode(args)
|
|
|
|
if args.command == 'extract-coverage':
|
|
log(f"Extracting coverage from file: {args.file_path} (type: {args.type})")
|
|
coverage_pct = extract_coverage(args.file_path, args.type)
|
|
if args.github_output:
|
|
set_github_output(f"{args.type}_coverage", coverage_pct)
|
|
else:
|
|
log(f"Coverage: {coverage_pct}%")
|
|
|
|
elif args.command == 'compare-coverage':
|
|
log(f"Comparing coverage: base={args.base_cov}%, PR={args.pr_cov}%")
|
|
decreased, diff = compare_coverage(args.base_cov, args.pr_cov)
|
|
if args.github_output:
|
|
prefix = args.output_prefix
|
|
set_github_output(f"{prefix}decreased", str(decreased).lower())
|
|
set_github_output(f"{prefix}diff", diff)
|
|
log(f"Coverage difference: {diff}%")
|
|
log(f"Coverage decreased: {decreased}")
|
|
else:
|
|
log(f"decreased={str(decreased).lower()}")
|
|
log(f"diff={diff}")
|
|
|
|
elif args.command == 'generate-comment':
|
|
log("Generating coverage comparison comment")
|
|
comment = generate_comment(
|
|
args.base_ext_cov, args.pr_ext_cov, args.ext_decreased, args.ext_diff,
|
|
args.base_web_cov, args.pr_web_cov, args.web_decreased, args.web_diff
|
|
)
|
|
# Output the comment to stdout
|
|
log(comment)
|
|
|
|
elif args.command == 'post-comment':
|
|
log(f"Posting comment from {args.comment_path} to PR #{args.pr_number} in {args.repo}")
|
|
post_comment(args.comment_path, args.pr_number, args.repo, args.token)
|
|
|
|
elif args.command == 'run-coverage':
|
|
log(f"Running coverage command: {args.coverage_cmd}")
|
|
log(f"Output file: {args.output_file}")
|
|
log(f"Coverage type: {args.type}")
|
|
coverage_pct = run_coverage(args.coverage_cmd, args.output_file, args.type)
|
|
if args.github_output:
|
|
set_github_output(f"{args.type}_coverage", coverage_pct)
|
|
else:
|
|
log(f"Coverage: {coverage_pct}%")
|
|
|
|
elif args.command == 'process-workflow':
|
|
log("Processing coverage workflow")
|
|
log(f"Base branch: {args.base_branch}")
|
|
if args.pr_number:
|
|
log(f"PR number: {args.pr_number}")
|
|
if args.repo:
|
|
log(f"Repository: {args.repo}")
|
|
process_coverage_workflow(args)
|
|
|
|
elif args.command == 'set-github-output':
|
|
log(f"Setting GitHub output: {args.name}={args.value}")
|
|
set_github_output(args.name, args.value)
|
|
|
|
else:
|
|
log("No command specified")
|
|
parser.print_help()
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|