void print_statistics(void * ps_tree) { /* Statistics data */ unsigned int num_files = 0, max_file_len = 0, total_file_len = 0; unsigned int total_revisions = 0, max_revisions_for_file = 0; unsigned int total_branches = 0, max_branches_for_file = 0; unsigned int total_branches_sym = 0, max_branches_sym_for_file = 0; /* Other vars */ struct hash_entry *he; printf("Statistics:\n"); fflush(stdout); /* Gather file statistics */ reset_hash_iterator(file_hash); while ((he=next_hash_entry(file_hash))) { int len = strlen(he->he_key); CvsFile *file = (CvsFile *)he->he_obj; num_files++; max_file_len = MAX(max_file_len, len); total_file_len += len; count_hash(file->revisions, &total_revisions, &max_revisions_for_file); count_hash(file->branches, &total_branches, &max_branches_for_file); count_hash(file->branches_sym, &total_branches_sym, &max_branches_sym_for_file); } /* Print file statistics */ printf("Num files: %d\nMax filename len: %d, Average filename len: %.2f\n", num_files, max_file_len, (float)total_file_len/num_files); printf("Max revisions for file: %d, Average revisions for file: %.2f\n", max_revisions_for_file, (float)total_revisions/num_files); printf("Max branches for file: %d, Average branches for file: %.2f\n", max_branches_for_file, (float)total_branches/num_files); printf("Max branches_sym for file: %d, Average branches_sym for file: %.2f\n", max_branches_sym_for_file, (float)total_branches_sym/num_files); /* Gather patchset statistics */ twalk(ps_tree, stat_ps_tree_node); /* Print patchset statistics */ printf("Num patchsets: %d\n", num_patch_sets); printf("Max PS members in PS: %d\nAverage PS members in PS: %.2f\n", max_ps_member_in_ps, (float)num_ps_member/num_patch_sets); printf("Num authors: %d, Max author len: %d, Avg. author len: %.2f\n", num_authors, max_author_len, (float)total_author_len/num_authors); printf("Max desc len: %d, Avg. desc len: %.2f\n", max_descr_len, (float)total_descr_len/num_patch_sets); }
static void count_hash(struct hash_table *hash, unsigned int *total, unsigned int *max_val) { int counter = 0; reset_hash_iterator(hash); while (next_hash_entry(hash)) counter++; *total += counter; *max_val= MAX(*max_val, counter); }
void write_cache(time_t cache_date) { struct hash_entry * file_iter; ps_counter = 0; if ((cache_fp = cache_open("w")) == NULL) { debug(DEBUG_SYSERROR, "can't open cvsps.cache for write"); return; } fprintf(cache_fp, "cache version: %d\n", cache_version); fprintf(cache_fp, "cache date: %d\n", (int)cache_date); reset_hash_iterator(file_hash); while ((file_iter = next_hash_entry(file_hash))) { CvsFile * file = (CvsFile*)file_iter->he_obj; struct hash_entry * rev_iter; fprintf(cache_fp, "file: %s\n", file->filename); reset_hash_iterator(file->branches); while ((rev_iter = next_hash_entry(file->branches))) { char * rev = (char *)rev_iter->he_key; char * tag = (char *)rev_iter->he_obj; fprintf(cache_fp, "%s: %s\n", rev, tag); } fprintf(cache_fp, "\n"); reset_hash_iterator(file->symbols); while ((rev_iter = next_hash_entry(file->symbols))) { char * tag = (char *)rev_iter->he_key; CvsFileRevision * rev = (CvsFileRevision*)rev_iter->he_obj; if (rev->present) fprintf(cache_fp, "%s: %s\n", tag, rev->rev); } fprintf(cache_fp, "\n"); reset_hash_iterator(file->revisions); while ((rev_iter = next_hash_entry(file->revisions))) { CvsFileRevision * rev = (CvsFileRevision*)rev_iter->he_obj; if (rev->present) fprintf(cache_fp, "%s %s\n", rev->rev, rev->branch); } fprintf(cache_fp, "\n"); } fprintf(cache_fp, "\n"); walk_all_patch_sets(write_patch_set_to_cache); fclose(cache_fp); cache_fp = NULL; }