| 3939 | enum { COVERAGE_FILE_CAP = 500 }; |
| 3940 | |
| 3941 | static void add_coverage_report(yyjson_mut_doc *doc, yyjson_mut_val *root, cbm_store_t *store, |
| 3942 | const char *project) { |
| 3943 | cbm_coverage_row_t *rows = NULL; |
| 3944 | int count = 0; |
| 3945 | (void)cbm_store_coverage_get(store, project, &rows, &count); |
| 3946 | |
| 3947 | yyjson_mut_val *pp_files = yyjson_mut_arr(doc); |
| 3948 | yyjson_mut_val *sk_files = yyjson_mut_arr(doc); |
| 3949 | yyjson_mut_val *ni_dirs = yyjson_mut_arr(doc); |
| 3950 | yyjson_mut_val *ni_files = yyjson_mut_arr(doc); |
| 3951 | int pp_n = 0; |
| 3952 | int sk_n = 0; |
| 3953 | int ni_dir_n = 0; |
| 3954 | int ni_file_n = 0; |
| 3955 | for (int i = 0; i < count; i++) { |
| 3956 | const char *kind = rows[i].kind ? rows[i].kind : ""; |
| 3957 | if (strcmp(kind, "parse_partial") == 0) { |
| 3958 | if (pp_n < COVERAGE_FILE_CAP) { |
| 3959 | yyjson_mut_val *fe = yyjson_mut_obj(doc); |
| 3960 | yyjson_mut_obj_add_strcpy(doc, fe, "path", rows[i].rel_path); |
| 3961 | yyjson_mut_obj_add_strcpy(doc, fe, "error_ranges", |
| 3962 | rows[i].detail ? rows[i].detail : ""); |
| 3963 | yyjson_mut_arr_add_val(pp_files, fe); |
| 3964 | } |
| 3965 | pp_n++; |
| 3966 | } else if (strcmp(kind, "not_indexed_dir") == 0) { |
| 3967 | if (ni_dir_n < COVERAGE_FILE_CAP) { |
| 3968 | yyjson_mut_arr_add_strcpy(doc, ni_dirs, rows[i].rel_path); |
| 3969 | } |
| 3970 | ni_dir_n++; |
| 3971 | } else if (strcmp(kind, "not_indexed_file") == 0) { |
| 3972 | if (ni_file_n < COVERAGE_FILE_CAP) { |
| 3973 | yyjson_mut_val *fe = yyjson_mut_obj(doc); |
| 3974 | yyjson_mut_obj_add_strcpy(doc, fe, "path", rows[i].rel_path); |
| 3975 | yyjson_mut_obj_add_strcpy(doc, fe, "reason", rows[i].detail ? rows[i].detail : ""); |
| 3976 | yyjson_mut_arr_add_val(ni_files, fe); |
| 3977 | } |
| 3978 | ni_file_n++; |
| 3979 | } else { |
| 3980 | if (sk_n < COVERAGE_FILE_CAP) { |
| 3981 | yyjson_mut_val *fe = yyjson_mut_obj(doc); |
| 3982 | yyjson_mut_obj_add_strcpy(doc, fe, "path", rows[i].rel_path); |
| 3983 | yyjson_mut_obj_add_strcpy(doc, fe, "reason", rows[i].detail ? rows[i].detail : ""); |
| 3984 | yyjson_mut_obj_add_strcpy(doc, fe, "phase", rows[i].kind ? rows[i].kind : ""); |
| 3985 | yyjson_mut_arr_add_val(sk_files, fe); |
| 3986 | } |
| 3987 | sk_n++; |
| 3988 | } |
| 3989 | } |
| 3990 | cbm_store_free_coverage(rows, count); |
| 3991 | |
| 3992 | yyjson_mut_val *pp = yyjson_mut_obj(doc); |
| 3993 | yyjson_mut_obj_add_val(doc, pp, "files", pp_files); |
| 3994 | yyjson_mut_obj_add_int(doc, pp, "count", pp_n); |
| 3995 | yyjson_mut_obj_add_bool(doc, pp, "truncated", pp_n > COVERAGE_FILE_CAP); |
| 3996 | yyjson_mut_obj_add_val(doc, root, "parse_partial", pp); |
| 3997 | |
| 3998 | yyjson_mut_val *sk = yyjson_mut_obj(doc); |
no test coverage detected