From 0fbc8a575f713a25c3905499c06e3554d3b4a683 Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 29 Apr 2020 21:51:01 -0700 Subject: [PATCH 1/9] Add --service-name and --service-job-name --- cpp_coveralls/__init__.py | 6 ++++-- cpp_coveralls/coverage.py | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/cpp_coveralls/__init__.py b/cpp_coveralls/__init__.py index c3d0e4e..96358c3 100644 --- a/cpp_coveralls/__init__.py +++ b/cpp_coveralls/__init__.py @@ -73,7 +73,8 @@ def run(): # use environment COVERALLS_REPO_TOKEN as a fallback args.repo_token = os.environ.get('COVERALLS_REPO_TOKEN') - args.service_name = yml.get('service_name', 'travis-ci') + if args.service_name is None: + args.service_name = yml.get('service_name', 'travis-ci') if not args.gcov_options: args.gcov_options = yml.get('gcov_options', '') @@ -86,7 +87,8 @@ def run(): args.include.extend(yml.get('include', [])) args.exclude_lines_pattern.extend(yml.get('exclude_lines_pattern', [])) - args.service_job_id = os.environ.get('TRAVIS_JOB_ID', '') + if args.service_job_id is None: + args.service_job_id = os.environ.get('TRAVIS_JOB_ID', '') if args.repo_token == '' and args.service_job_id == '': raise ValueError("\nno coveralls.io token specified and no travis job id found\n" diff --git a/cpp_coveralls/coverage.py b/cpp_coveralls/coverage.py index 4f2c6e3..ca7e2c6 100644 --- a/cpp_coveralls/coverage.py +++ b/cpp_coveralls/coverage.py @@ -86,6 +86,8 @@ def create_args(params): help='skip ssl certificate verification when ' 'communicating with the coveralls server', action='store_true', default=False) + parser.add_argument('--service-name', type=str, default=None) + parser.add_argument('--service-job-id', type=str, default=None) return parser.parse_args(params) From aa7485340c18ff35b79c03764d0265f1d848b376 Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 29 Apr 2020 22:14:34 -0700 Subject: [PATCH 2/9] Add --parallel and coveralls actions --- cpp_coveralls/__init__.py | 10 +++++++++- cpp_coveralls/coverage.py | 10 ++++++---- cpp_coveralls/report.py | 17 +++++++++++++++-- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/cpp_coveralls/__init__.py b/cpp_coveralls/__init__.py index 96358c3..c925fc7 100644 --- a/cpp_coveralls/__init__.py +++ b/cpp_coveralls/__init__.py @@ -90,6 +90,9 @@ def run(): if args.service_job_id is None: args.service_job_id = os.environ.get('TRAVIS_JOB_ID', '') + if not args.parallel: + args.parallel = os.getenv('COVERALLS_PARALLEL', False) + if args.repo_token == '' and args.service_job_id == '': raise ValueError("\nno coveralls.io token specified and no travis job id found\n" "see --help for examples on how to specify a token\n") @@ -105,4 +108,9 @@ def run(): args.dump.write(json.dumps(cov_report)) return 0 - return report.post_report(cov_report, args) + if args.action == 'report': + return report.post_report(cov_report, args) + elif args.action == 'finsh-report': + return report.finish_report(args) + else: + raise ValueError("Not supported action") \ No newline at end of file diff --git a/cpp_coveralls/coverage.py b/cpp_coveralls/coverage.py index ca7e2c6..5f9c7c8 100644 --- a/cpp_coveralls/coverage.py +++ b/cpp_coveralls/coverage.py @@ -86,8 +86,10 @@ def create_args(params): help='skip ssl certificate verification when ' 'communicating with the coveralls server', action='store_true', default=False) - parser.add_argument('--service-name', type=str, default=None) - parser.add_argument('--service-job-id', type=str, default=None) + parser.add_argument('--service-name', type=str, default=None, help="CI service name") + parser.add_argument('--service-job-id', type=str, default=None, help="CI job ID") + parser.add_argument('--parallel', action='store_true', help="Send a few reports and merge") + parser.add_argument('action', type=str, default='report', choices=['report', 'finish-report'], help="If the --parallel reports were used, the reports has to be finalized with a 'finish-report' action") return parser.parse_args(params) @@ -384,8 +386,8 @@ def collect(args): report['service_name'] = args.service_name report['service_job_id'] = args.service_job_id - if os.getenv('COVERALLS_PARALLEL', False): - report['parallel'] = 'true' + if args.parallel: + report['parallel'] = args.parallel args.exclude_lines_pattern.extend([ r'\bLCOV_EXCL_LINE\b', diff --git a/cpp_coveralls/report.py b/cpp_coveralls/report.py index 4ffb669..b47f489 100644 --- a/cpp_coveralls/report.py +++ b/cpp_coveralls/report.py @@ -5,11 +5,12 @@ import json import os -URL = os.getenv('COVERALLS_ENDPOINT', 'https://coveralls.io') + "/api/v1/jobs" +ENDPOINT = os.getenv('COVERALLS_ENDPOINT', 'https://coveralls.io') def post_report(coverage, args): """Post coverage report to coveralls.io.""" - response = requests.post(URL, files={'json_file': json.dumps(coverage)}, + api_endpoint = f'{ENDPOINT}/api/v1/jobs' + response = requests.post(api_endpoint, files={'json_file': json.dumps(coverage)}, verify=(not args.skip_ssl_verify)) try: result = response.json() @@ -22,3 +23,15 @@ def post_report(coverage, args): if 'error' in result: return result['error'] return 0 + +def finish_report(args): + """Finish a parallel reporting: https://docs.coveralls.io/parallel-build-webhook""" + api_endpoint = f'{ENDPOINT}/webhook?repo_token={args.repo_token}' + data = {'payload':{'build_num': args.service_job_id,'status':'done'}} + response = requests.post(api_endpoint, data=data, + verify=(not args.skip_ssl_verify)) + + if response.status_code != 200: + return response.json()['error'] + else: + return 0 \ No newline at end of file From c85b161ed97570676314f7c4cb1918951dc6f21b Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 29 Apr 2020 22:24:43 -0700 Subject: [PATCH 3/9] Increment version --- cpp_coveralls/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp_coveralls/__init__.py b/cpp_coveralls/__init__.py index c925fc7..d4964ab 100644 --- a/cpp_coveralls/__init__.py +++ b/cpp_coveralls/__init__.py @@ -2,7 +2,7 @@ from __future__ import print_function __author__ = 'Lei Xu ' -__version__ = '0.4.2' +__version__ = '0.4.3' __classifiers__ = [ 'Development Status :: 3 - Alpha', From 9d0cac846fddec040f73d04ea5d5af586cd87acd Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 29 Apr 2020 22:27:55 -0700 Subject: [PATCH 4/9] =?UTF-8?q?Add=20nargs=3D=3F?= --- cpp_coveralls/coverage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp_coveralls/coverage.py b/cpp_coveralls/coverage.py index 5f9c7c8..f1b14d8 100644 --- a/cpp_coveralls/coverage.py +++ b/cpp_coveralls/coverage.py @@ -89,7 +89,7 @@ def create_args(params): parser.add_argument('--service-name', type=str, default=None, help="CI service name") parser.add_argument('--service-job-id', type=str, default=None, help="CI job ID") parser.add_argument('--parallel', action='store_true', help="Send a few reports and merge") - parser.add_argument('action', type=str, default='report', choices=['report', 'finish-report'], help="If the --parallel reports were used, the reports has to be finalized with a 'finish-report' action") + parser.add_argument('action', type=str, default='report', nargs='?', choices=['report', 'finish-report'], help="If the --parallel reports were used, the reports has to be finalized with a 'finish-report' action") return parser.parse_args(params) From 67efcabea1691ce5aa812d93a41747926e557fac Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 29 Apr 2020 22:32:59 -0700 Subject: [PATCH 5/9] Error reporting fixes --- cpp_coveralls/__init__.py | 2 +- cpp_coveralls/report.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp_coveralls/__init__.py b/cpp_coveralls/__init__.py index d4964ab..d567cb1 100644 --- a/cpp_coveralls/__init__.py +++ b/cpp_coveralls/__init__.py @@ -110,7 +110,7 @@ def run(): if args.action == 'report': return report.post_report(cov_report, args) - elif args.action == 'finsh-report': + elif args.action == 'finish-report': return report.finish_report(args) else: raise ValueError("Not supported action") \ No newline at end of file diff --git a/cpp_coveralls/report.py b/cpp_coveralls/report.py index b47f489..3a7762f 100644 --- a/cpp_coveralls/report.py +++ b/cpp_coveralls/report.py @@ -32,6 +32,6 @@ def finish_report(args): verify=(not args.skip_ssl_verify)) if response.status_code != 200: - return response.json()['error'] + return response.reason else: return 0 \ No newline at end of file From 9ec2e29646f4ae357dcfd7f6fd2e07d2a38adcb6 Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 29 Apr 2020 22:55:11 -0700 Subject: [PATCH 6/9] Add --service-number --- cpp_coveralls/__init__.py | 21 ++++++++++----------- cpp_coveralls/coverage.py | 10 +++++++--- cpp_coveralls/report.py | 2 +- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/cpp_coveralls/__init__.py b/cpp_coveralls/__init__.py index d567cb1..2527160 100644 --- a/cpp_coveralls/__init__.py +++ b/cpp_coveralls/__init__.py @@ -97,18 +97,17 @@ def run(): raise ValueError("\nno coveralls.io token specified and no travis job id found\n" "see --help for examples on how to specify a token\n") - if not args.no_gcov: - coverage.run_gcov(args) - cov_report = coverage.collect(args) - if args.verbose: - print(cov_report) - if args.dryrun: - return 0 - if args.dump: - args.dump.write(json.dumps(cov_report)) - return 0 - if args.action == 'report': + if not args.no_gcov: + coverage.run_gcov(args) + cov_report = coverage.collect(args) + if args.verbose: + print(cov_report) + if args.dryrun: + return 0 + if args.dump: + args.dump.write(json.dumps(cov_report)) + return 0 return report.post_report(cov_report, args) elif args.action == 'finish-report': return report.finish_report(args) diff --git a/cpp_coveralls/coverage.py b/cpp_coveralls/coverage.py index f1b14d8..a4685e3 100644 --- a/cpp_coveralls/coverage.py +++ b/cpp_coveralls/coverage.py @@ -86,10 +86,11 @@ def create_args(params): help='skip ssl certificate verification when ' 'communicating with the coveralls server', action='store_true', default=False) - parser.add_argument('--service-name', type=str, default=None, help="CI service name") - parser.add_argument('--service-job-id', type=str, default=None, help="CI job ID") + parser.add_argument('--service-name', type=str, default=None, help="The CI service or other environment in which the test suite was run. This can be anything, but certain services have special features (travis-ci, travis-pro, or coveralls-ruby).") + parser.add_argument('--service-job-id', type=str, default=None, help="A unique identifier of the job on the service specified by service_name.") + parser.add_argument('--service-number', type=str, default=None, help="The build number. Will default to chronological numbering from builds on repo.") parser.add_argument('--parallel', action='store_true', help="Send a few reports and merge") - parser.add_argument('action', type=str, default='report', nargs='?', choices=['report', 'finish-report'], help="If the --parallel reports were used, the reports has to be finalized with a 'finish-report' action") + parser.add_argument('action', type=str, default='report', nargs='?', choices=['report', 'finish-report'], help="If the --parallel reports were used, the reports has to be finalized with a 'finish-report' action.") return parser.parse_args(params) @@ -386,6 +387,9 @@ def collect(args): report['service_name'] = args.service_name report['service_job_id'] = args.service_job_id + if args.service_number: + report['service_number'] = args.service_number + if args.parallel: report['parallel'] = args.parallel diff --git a/cpp_coveralls/report.py b/cpp_coveralls/report.py index 3a7762f..1bf9b7d 100644 --- a/cpp_coveralls/report.py +++ b/cpp_coveralls/report.py @@ -32,6 +32,6 @@ def finish_report(args): verify=(not args.skip_ssl_verify)) if response.status_code != 200: - return response.reason + return response.status_code, response.reason, data else: return 0 \ No newline at end of file From 448b141652789b76128b455f077ae854be69a404 Mon Sep 17 00:00:00 2001 From: Dennis Date: Thu, 30 Apr 2020 14:41:05 -0700 Subject: [PATCH 7/9] Upddate /webhook call --- cpp_coveralls/report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp_coveralls/report.py b/cpp_coveralls/report.py index 1bf9b7d..482c942 100644 --- a/cpp_coveralls/report.py +++ b/cpp_coveralls/report.py @@ -27,7 +27,7 @@ def post_report(coverage, args): def finish_report(args): """Finish a parallel reporting: https://docs.coveralls.io/parallel-build-webhook""" api_endpoint = f'{ENDPOINT}/webhook?repo_token={args.repo_token}' - data = {'payload':{'build_num': args.service_job_id,'status':'done'}} + data = {'payload[build_num]': args.service_number, 'payload[status]':'done'} response = requests.post(api_endpoint, data=data, verify=(not args.skip_ssl_verify)) From 370508870920fb660a8df8bbe2a85866104cba6f Mon Sep 17 00:00:00 2001 From: Dennis Vashchuk Date: Mon, 25 Jan 2021 15:07:33 -0800 Subject: [PATCH 8/9] Use service_build_number --- cpp_coveralls/coverage.py | 6 +++--- cpp_coveralls/report.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cpp_coveralls/coverage.py b/cpp_coveralls/coverage.py index a4685e3..df79e93 100644 --- a/cpp_coveralls/coverage.py +++ b/cpp_coveralls/coverage.py @@ -88,7 +88,7 @@ def create_args(params): action='store_true', default=False) parser.add_argument('--service-name', type=str, default=None, help="The CI service or other environment in which the test suite was run. This can be anything, but certain services have special features (travis-ci, travis-pro, or coveralls-ruby).") parser.add_argument('--service-job-id', type=str, default=None, help="A unique identifier of the job on the service specified by service_name.") - parser.add_argument('--service-number', type=str, default=None, help="The build number. Will default to chronological numbering from builds on repo.") + parser.add_argument('--service-build-number', type=str, default=None, help="The build number. Will default to chronological numbering from builds on repo.") parser.add_argument('--parallel', action='store_true', help="Send a few reports and merge") parser.add_argument('action', type=str, default='report', nargs='?', choices=['report', 'finish-report'], help="If the --parallel reports were used, the reports has to be finalized with a 'finish-report' action.") @@ -387,8 +387,8 @@ def collect(args): report['service_name'] = args.service_name report['service_job_id'] = args.service_job_id - if args.service_number: - report['service_number'] = args.service_number + if args.service_build_number: + report['service_number'] = args.service_build_number if args.parallel: report['parallel'] = args.parallel diff --git a/cpp_coveralls/report.py b/cpp_coveralls/report.py index 482c942..e75f36e 100644 --- a/cpp_coveralls/report.py +++ b/cpp_coveralls/report.py @@ -27,7 +27,7 @@ def post_report(coverage, args): def finish_report(args): """Finish a parallel reporting: https://docs.coveralls.io/parallel-build-webhook""" api_endpoint = f'{ENDPOINT}/webhook?repo_token={args.repo_token}' - data = {'payload[build_num]': args.service_number, 'payload[status]':'done'} + data = {'payload[build_num]': args.service_build_number, 'payload[status]':'done'} response = requests.post(api_endpoint, data=data, verify=(not args.skip_ssl_verify)) From 7ac19e715f7fdda39cc6bbe3a4782ac0c7c5ad4d Mon Sep 17 00:00:00 2001 From: Oded Katz <88981719+katzoded@users.noreply.github.com> Date: Thu, 9 Nov 2023 08:41:57 -0800 Subject: [PATCH 9/9] SDWAN-516 | accuracy of coverage (#1) * add verbosity for gcov commands * fix parsing gcov and converting into array --- cpp_coveralls/coverage.py | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/cpp_coveralls/coverage.py b/cpp_coveralls/coverage.py index df79e93..e6d5a7c 100644 --- a/cpp_coveralls/coverage.py +++ b/cpp_coveralls/coverage.py @@ -230,16 +230,18 @@ def run_gcov(args): gcov_files.append(files) if re.search(r".*\.c.*", basename): path = os.path.abspath(os.path.join(root, basename + '.o')) - subprocess.call( - 'cd "%s" && %s %s%s "%s"' % ( - gcov_root, args.gcov, args.gcov_options, local_gcov_options, path), - shell=True) + cmd = 'cd "%s" && %s %s%s "%s"' % (gcov_root, args.gcov, args.gcov_options, local_gcov_options, path) + if args.verbose: + print(cmd) + + subprocess.call(cmd, shell=True) else: path = os.path.abspath(os.path.join(root, basename)) - subprocess.call( - 'cd "%s" && %s %s%s "%s"' % ( - gcov_root, args.gcov, args.gcov_options, local_gcov_options, filepath), - shell=True) + cmd = 'cd "%s" && %s %s%s "%s"' % (gcov_root, args.gcov, args.gcov_options, local_gcov_options, filepath) + if args.verbose: + print(cmd) + + subprocess.call(cmd, shell=True) # If gcov was run in the build root move the resulting gcov # file to the same directory as the .o file. if custom_gcov_root: @@ -281,23 +283,32 @@ def parse_gcov_file(args, fobj, filename): sys.stderr.write("Warning: %s:%d: LCOV_EXCL_STOP is the " "correct keyword\n" % (filename, line_num)) ignoring = False - if cov_num == '-': + + line_num -= 1 + while len(coverage) <= line_num: coverage.append(None) + + if cov_num == '-': + if coverage[line_num] is None: + coverage[line_num] = None elif cov_num == '#####': # Avoid false positives. if ( ignoring or any([re.search(pattern, text) for pattern in args.exclude_lines_pattern]) ): - coverage.append(None) + if coverage[line_num] is None: + coverage[line_num] = None else: - coverage.append(0) + if coverage[line_num] is None: + coverage[line_num] = 0 elif cov_num == '=====': # This is indicitive of a gcov output parse # error. - coverage.append(0) + if coverage[line_num] is None: + coverage[line_num] = 0 else: - coverage.append(int(cov_num.rstrip('*'))) + coverage[line_num] = int(cov_num.rstrip('*')) return coverage