2 * Copyright 2001, 2002, 2003 David Mansfield and Cobite, Inc.
3 * See COPYING file for license information
9 #include <cbtcommon/hash.h>
11 #include "cvsps_types.h"
14 static unsigned int num_patch_sets
= 0;
15 static unsigned int num_ps_member
= 0, max_ps_member_in_ps
= 0;
16 static unsigned int num_authors
= 0, max_author_len
= 0, total_author_len
= 0;
17 static unsigned int max_descr_len
= 0, total_descr_len
= 0;
18 struct hash_table
*author_hash
;
20 static void count_hash(struct hash_table
*hash
, unsigned int *total
,
21 unsigned int *max_val
)
24 struct hash_entry
*fh
;
26 reset_hash_iterator(hash
);
27 while ((fh
= next_hash_entry(hash
)))
31 *max_val
= MAX(*max_val
, counter
);
34 static void stat_ps_tree_node(const void * nodep
, const VISIT which
, const int depth
)
38 struct list_head
* next
;
42 /* Make sure we have it if we do statistics */
44 author_hash
= create_hash_table(1023);
50 ps
= *(PatchSet
**)nodep
;
55 /* Author statistics */
56 if (put_hash_object_ex(author_hash
, ps
->author
, ps
->author
, HT_NO_KEYCOPY
, NULL
, &old
) >= 0 && !old
)
58 int len
= strlen(ps
->author
);
60 max_author_len
= MAX(max_author_len
, len
);
61 total_author_len
+= len
;
64 /* Log message statistics */
65 desc_len
= strlen(ps
->descr
);
66 max_descr_len
= MAX(max_descr_len
, desc_len
);
67 total_descr_len
+= desc_len
;
69 /* PatchSet member statistics */
71 next
= ps
->members
.next
;
72 while (next
!= &ps
->members
)
78 num_ps_member
+= counter
;
79 max_ps_member_in_ps
= MAX(max_ps_member_in_ps
, counter
);
87 void print_statistics(void * ps_tree
)
90 unsigned int num_files
= 0, max_file_len
= 0, total_file_len
= 0;
91 unsigned int total_revisions
= 0, max_revisions_for_file
= 0;
92 unsigned int total_branches
= 0, max_branches_for_file
= 0;
93 unsigned int total_branches_sym
= 0, max_branches_sym_for_file
= 0;
96 struct hash_entry
*he
;
98 printf("Statistics:\n");
101 /* Gather file statistics */
102 reset_hash_iterator(file_hash
);
103 while ((he
=next_hash_entry(file_hash
)))
105 int len
= strlen(he
->he_key
);
106 CvsFile
*file
= (CvsFile
*)he
->he_obj
;
109 max_file_len
= MAX(max_file_len
, len
);
110 total_file_len
+= len
;
112 count_hash(file
->revisions
, &total_revisions
, &max_revisions_for_file
);
113 count_hash(file
->branches
, &total_branches
, &max_branches_for_file
);
114 count_hash(file
->branches_sym
, &total_branches_sym
,
115 &max_branches_sym_for_file
);
118 /* Print file statistics */
119 printf("Num files: %d\nMax filename len: %d, Average filename len: %.2f\n",
120 num_files
, max_file_len
, (float)total_file_len
/num_files
);
122 printf("Max revisions for file: %d, Average revisions for file: %.2f\n",
123 max_revisions_for_file
, (float)total_revisions
/num_files
);
124 printf("Max branches for file: %d, Average branches for file: %.2f\n",
125 max_branches_for_file
, (float)total_branches
/num_files
);
126 printf("Max branches_sym for file: %d, Average branches_sym for file: %.2f\n",
127 max_branches_sym_for_file
, (float)total_branches_sym
/num_files
);
129 /* Gather patchset statistics */
130 twalk(ps_tree
, stat_ps_tree_node
);
132 /* Print patchset statistics */
133 printf("Num patchsets: %d\n", num_patch_sets
);
134 printf("Max PS members in PS: %d\nAverage PS members in PS: %.2f\n",
135 max_ps_member_in_ps
, (float)num_ps_member
/num_patch_sets
);
136 printf("Num authors: %d, Max author len: %d, Avg. author len: %.2f\n",
137 num_authors
, max_author_len
, (float)total_author_len
/num_authors
);
138 printf("Max desc len: %d, Avg. desc len: %.2f\n",
139 max_descr_len
, (float)total_descr_len
/num_patch_sets
);