From: Jean-Philippe Orsini Date: Mon, 23 May 2011 21:10:10 +0000 (+0000) Subject: added generation of package graph X-Git-Tag: v1.3.0~163 X-Git-Url: http://git.wpitchoune.net/gitweb/?p=ppastats.git;a=commitdiff_plain;h=486c6a0380edcdedbed9b3d27427f5a5c6b8ae45 added generation of package graph --- diff --git a/src/chart.c b/src/chart.c index f11feb8..132bd35 100644 --- a/src/chart.c +++ b/src/chart.c @@ -23,6 +23,7 @@ #include #include "chart.h" +#include "ppastats.h" #define HTML_TEMPLATE \ "\n\ @@ -35,7 +36,7 @@ function drawChart() {\n\ var data = new google.visualization.DataTable();\n\ data.addColumn('string', 'Date');\n\ - data.addColumn('number', 'Daily Download');\n\ + data.addColumn('number', 'Daily Download');\n\ data.addRows(%s);\n\ data.sort(0);\n\ var chart = new google.visualization.LineChart\ @@ -59,7 +60,7 @@ char *tm_to_str(struct tm *date) date->tm_year+1900, date->tm_mon+1, date->tm_mday); - + return str; } @@ -75,6 +76,9 @@ generate_chart(const char *path, char *str_date; json_object *arr, *item; + if (debug) + fprintf(stderr, "Generates %s\n", path); + if (!totals) { fprintf(stderr, "ERROR: no totals\n"); return ; @@ -89,7 +93,7 @@ generate_chart(const char *path, arr = json_object_new_array(); cur = totals; - while(*cur) { + while (*cur) { total = *cur; str_date = tm_to_str(&(total->date)); @@ -103,7 +107,7 @@ generate_chart(const char *path, json_object_array_add(arr, item); free(str_date); - + cur++; } diff --git a/src/html.c b/src/html.c index aa4c6f1..314b9a0 100644 --- a/src/html.c +++ b/src/html.c @@ -21,184 +21,46 @@ #include "chart.h" #include "html.h" -#include "list.h" #include "lp_ws.h" #include "ppastats.h" -#include - #include #include -#define HTML_TEMPLATE \ -"\n\ - \n\ - \n\ - \n\ - \n\ -\n\ - \n\ -
\n\ - \n\ -\n" - -static json_object * -get_count_array(json_object *data, const char *date) -{ - int n, i; - json_object *o, *o_date; - const char *date2; - - n = json_object_array_length(data); - for (i = 0; i < n; i++) { - o = json_object_array_get_idx(data, i); - o_date = json_object_array_get_idx(o, 0); - date2 = json_object_get_string(o_date); - - if (!strcmp(date2, date)) - return o; - } - - return NULL; -} - -static json_object *count_array_new(json_object *data, const char *d, int n) -{ - json_object *result = json_object_new_array(); - int i; - - json_object_array_add(result, json_object_new_string(d)); - - for (i = 0; i < n; i++) - json_object_array_add(result, json_object_new_int(0)); - - json_object_array_add(data, result); - - return result; -} - -static char * -build_package_display_name(struct binary_package_publishing_history *b) +static char *get_path(const char *dir, const char *file) { - char *str = malloc(strlen(b->binary_package_name)+ - 1+ - strlen(b->binary_package_version)+ - 1); + char *path = malloc(strlen(dir)+1+ + strlen(file)+ + strlen(".html")+ + 1); - sprintf(str, "%s-%s", - b->binary_package_name, b->binary_package_version); + strcpy(path, dir); + strcat(path, "/"); + strcat(path, file); + strcat(path, ".html"); - return str; + return path; } -static char * -build_addcolums_str(struct binary_package_publishing_history **list) +static void +packages_to_html(struct package_stats **packages, + const char *dir) { - struct binary_package_publishing_history **cur = list; - struct binary_package_publishing_history *b; - char *str, *tmpstr; - char *dname; - - str = malloc(1); - *str = '\0'; - const char *pattern = "%s data.addColumn('number', '%s');\n"; + struct package_stats **cur; + struct package_stats *p; + char *path; + cur = packages; while (*cur) { - b = *cur; - dname = build_package_display_name(b); - - tmpstr = malloc(strlen(str)+strlen(pattern)+strlen(dname)+1); - sprintf(tmpstr, pattern, str, dname); - - free(str); - free(dname); + p = *cur; - str = tmpstr; + path = get_path(dir, p->name); + generate_chart(path, p->name, p->name, + p->daily_download_totals); + free(path); cur++; } - - return str; -} - -static char * -build_data_str(struct binary_package_publishing_history **list) -{ - int n, i; - json_object *data; - char *str; - - n = list_length((void **)list); - - data = json_object_new_array(); - for (i = 0; i < n; i++) { - struct binary_package_publishing_history *binary; - const struct distro_arch_series *dist; - struct daily_download_total **totals; - struct daily_download_total **t_cur; - - binary = list[i]; - dist = get_distro_arch_series(binary->distro_arch_series_link); - - totals = get_daily_download_totals(binary->self_link); - - t_cur = totals; - while (*t_cur) { - char *d = malloc(10+1); - json_object *data2; - - sprintf(d, "%d-%02d-%02d", - (*t_cur)->date.tm_year+1900, - (*t_cur)->date.tm_mon+1, - (*t_cur)->date.tm_mday); - - data2 = get_count_array(data, d); - - if (!data2) - data2 = count_array_new(data, d, n); - - json_object_array_put_idx - (data2, - i+1, json_object_new_int((*t_cur)->count)); - - free(d); - t_cur++; - } - - daily_download_total_list_free(totals); - } - - str = strdup(json_object_to_json_string(data)); - - json_object_put(data); - - return str; -} - -static char *get_path(const char *dir, const char *file) -{ - char *path = malloc(strlen(dir)+1+strlen(file)+1); - - strcpy(path, dir); - strcat(path, "/"); - strcat(path, file); - - return path; } void @@ -207,44 +69,18 @@ ppa_to_html(const char *owner, const char *package_status, const char *output_dir) { - struct binary_package_publishing_history **list; - char *archive_url, *addcolumns_str, *data_str, *path; - FILE *f; + char *path; struct ppa_stats *ppastats; struct daily_download_total **totals; ppastats = create_ppa_stats(owner, ppa, package_status); totals = ppastats->daily_download_totals; - path = get_path(output_dir, "ppa.html"); + path = get_path(output_dir, "ppa"); generate_chart(path, "PPA Statistics", ppa, totals); free(path); - archive_url = get_archive_url(owner, ppa); - list = get_binary_package_publishing_history_list(archive_url, - package_status); - free(archive_url); - - if (!list) { - fprintf(stderr, "ERROR: Failed to retrieve PPA information\n"); - exit(EXIT_FAILURE); - } - - addcolumns_str = build_addcolums_str(list); - data_str = build_data_str(list); - - path = get_path(output_dir, "index.html"); - f = fopen(path, "w"); - if (f) { - fprintf(f, HTML_TEMPLATE, addcolumns_str, data_str); - fclose(f); - } else { - fprintf(stderr, "ERROR: failed to write %s\n", path); - } - free(path); + packages_to_html(ppastats->packages, output_dir); - free(addcolumns_str); - free(data_str); - binary_package_publishing_history_list_free(list); ppa_stats_free(ppastats); } diff --git a/src/ppastats.c b/src/ppastats.c index 70f6c6f..3a4b0ef 100644 --- a/src/ppastats.c +++ b/src/ppastats.c @@ -137,25 +137,26 @@ static struct arch_stats *get_arch_stats(struct distro_stats *distro, } -static struct daily_download_total ** -add_total(struct daily_download_total **totals, - struct daily_download_total *total) +static struct daily_download_total **add_total +(struct daily_download_total **totals, struct daily_download_total *total) { struct daily_download_total **cur; struct daily_download_total *item; - cur = totals; - while (*cur) { - item = *cur; + if (totals) { + cur = totals; + while (*cur) { + item = *cur; + + if (item->date.tm_year == total->date.tm_year && + item->date.tm_mon == total->date.tm_mon && + item->date.tm_mday == total->date.tm_mday) { + item->count += total->count; + return totals; + } - if (item->date.tm_year == total->date.tm_year && - item->date.tm_mon == total->date.tm_mon && - item->date.tm_mday == total->date.tm_mday) { - item->count += total->count; - return totals; + cur++; } - - cur++; } item = malloc(sizeof(struct daily_download_total)); @@ -165,16 +166,12 @@ add_total(struct daily_download_total **totals, list_add((void **)totals, (void *)item); } -struct daily_download_total ** -add_totals(struct daily_download_total **total1, - struct daily_download_total **total2) +struct daily_download_total **add_totals +(struct daily_download_total **total1, struct daily_download_total **total2) { struct daily_download_total **cur; struct daily_download_total **result; - if (!total1) - return total2; - result = total1; cur = total2; while (*cur) { @@ -249,12 +246,16 @@ create_ppa_stats(const char *owner, ppastats->download_count += count; totals = get_daily_download_totals(h->self_link); - ppastats->daily_download_totals + + ppastats->daily_download_totals = add_totals(ppastats->daily_download_totals, totals); - if (ppastats->daily_download_totals != totals) - daily_download_total_list_free(totals); + package->daily_download_totals + = add_totals(package->daily_download_totals, + totals); + + daily_download_total_list_free(totals); h_cur++; } @@ -337,5 +338,7 @@ void ppa_stats_free(struct ppa_stats *ppastats) free(ppastats->owner); free(ppastats->name); + daily_download_total_list_free(ppastats->daily_download_totals); + free(ppastats); } diff --git a/src/ppastats.h b/src/ppastats.h index 019c5d4..be2f971 100644 --- a/src/ppastats.h +++ b/src/ppastats.h @@ -52,7 +52,7 @@ struct package_stats { struct version_stats **versions; int download_count; - struct daily_download_total *daily_download_totals; + struct daily_download_total **daily_download_totals; }; struct ppa_stats {