X-Git-Url: http://git.wpitchoune.net/gitweb/?p=ppastats.git;a=blobdiff_plain;f=src%2Fppastats.c;h=5fb0be11cbc28ee4202311ac169660ffd4bdb663;hp=fdcd6e1ffa34b56a44594d1089cd648e9c0ac2c4;hb=0303d0d705cfc2a100403a708fca0e93b12d2a93;hpb=a48a3dcf56462a9de729ee6e0bcbf789fe74d9cd diff --git a/src/ppastats.c b/src/ppastats.c index fdcd6e1..5fb0be1 100644 --- a/src/ppastats.c +++ b/src/ppastats.c @@ -1,21 +1,24 @@ /* - Copyright (C) 2011 jeanfi@gmail.com - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301 USA -*/ + * Copyright (C) 2011-2014 jeanfi@gmail.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include +#define _(String) gettext(String) #include #include @@ -23,13 +26,14 @@ #include "list.h" #include "lp_ws.h" +#include #include "ppastats.h" static struct package_stats *get_package_stats(struct ppa_stats *stats, const char *name) { - struct package_stats *p, **p_cur; + struct package_stats *p, **p_cur, **tmp; p_cur = stats->packages; while (p_cur && *p_cur) { @@ -48,8 +52,10 @@ static struct package_stats *get_package_stats(struct ppa_stats *stats, p->daily_download_totals = NULL; p->distros = NULL; - stats->packages = (struct package_stats **)list_add + tmp = (struct package_stats **)list_add ((void **)stats->packages, p); + free(stats->packages); + stats->packages = tmp; return p; } @@ -57,7 +63,7 @@ static struct package_stats *get_package_stats(struct ppa_stats *stats, static struct version_stats *get_version_stats(struct package_stats *package, const char *version) { - struct version_stats *v, **cur; + struct version_stats *v, **cur, **tmp; cur = package->versions; while (cur && *cur) { @@ -75,9 +81,10 @@ static struct version_stats *get_version_stats(struct package_stats *package, v->download_count = 0; v->daily_download_totals = NULL; - package->versions - = (struct version_stats **)list_add((void **)package->versions, - v); + tmp = (struct version_stats **)list_add((void **)package->versions, + v); + free((void **)package->versions); + package->versions = tmp; return v; } @@ -100,6 +107,7 @@ static struct distro_stats *get_distro_stats(struct version_stats *version, { struct distro_stats **cur = version->distros; struct distro_stats *d; + struct distro_stats **tmp; while (cur && *cur) { d = *cur; @@ -112,9 +120,11 @@ static struct distro_stats *get_distro_stats(struct version_stats *version, d = distro_stats_new(name); - version->distros - = (struct distro_stats **)list_add((void **)version->distros, + + tmp = (struct distro_stats **)list_add((void **)version->distros, d); + free(version->distros); + version->distros = tmp; return d; } @@ -124,6 +134,7 @@ static struct arch_stats *get_arch_stats(struct distro_stats *distro, { struct arch_stats **cur = distro->archs; struct arch_stats *a; + struct arch_stats **tmp; while (cur && *cur) { a = *cur; @@ -138,9 +149,10 @@ static struct arch_stats *get_arch_stats(struct distro_stats *distro, a->name = strdup(name); a->download_count = 0; - distro->archs - = (struct arch_stats **)list_add((void **)distro->archs, - a); + tmp = (struct arch_stats **)list_add((void **)distro->archs, + a); + free((void **)distro->archs); + distro->archs = tmp; return a; } @@ -149,7 +161,7 @@ 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) { - struct daily_download_total **cur; + struct daily_download_total **cur, **result; struct daily_download_total *item; if (totals) { @@ -171,21 +183,23 @@ static struct daily_download_total **add_total item = malloc(sizeof(struct daily_download_total)); memcpy(item, total, sizeof(struct daily_download_total)); - return (struct daily_download_total **) - list_add((void **)totals, (void *)item); + result = (struct daily_download_total **)list_add((void **)totals, + (void *)item); + + free(totals); + + return result; } 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; + struct daily_download_total **cur, **result; result = total1; cur = total2; while (*cur) { result = add_total(result, *cur); - cur++; } @@ -198,7 +212,7 @@ pkg_add_distro(struct package_stats *pkg, int distro_count, struct daily_download_total **ddts) { - struct distro_stats **pkg_distros, *pkg_distro; + struct distro_stats **pkg_distros, *pkg_distro, **tmp; pkg_distros = pkg->distros; pkg_distro = NULL; @@ -215,9 +229,10 @@ pkg_add_distro(struct package_stats *pkg, if (!pkg_distro) { pkg_distro = distro_stats_new(distro_name); - pkg->distros - = (struct distro_stats **) - list_add((void **)pkg->distros, (void *)pkg_distro); + tmp = (struct distro_stats **)list_add((void **)pkg->distros, + (void *)pkg_distro); + free(pkg->distros); + pkg->distros = tmp; } pkg_distro->download_count += distro_count; @@ -227,10 +242,11 @@ pkg_add_distro(struct package_stats *pkg, struct ppa_stats * create_ppa_stats(const char *owner, const char *ppa_name, - const char *package_status) + const char *package_status, + int ws_size) { struct ppa_stats *ppa; - struct binary_package_publishing_history **history, **h_cur, *h; + struct bpph **history, **h_cur, *h; char *ppa_url, *pkg_name, *pkg_version; struct package_stats *pkg; struct version_stats *version; @@ -242,12 +258,11 @@ create_ppa_stats(const char *owner, struct daily_download_total **totals; ppa_url = get_archive_url(owner, ppa_name); - history = get_binary_package_publishing_history_list(ppa_url, - package_status); + history = get_bpph_list(ppa_url, package_status, ws_size); free(ppa_url); if (!history) { - fprintf(stderr, "Failed to retrieve PPA information\n"); + log_err(_("Failed to retrieve PPA information")); exit(EXIT_FAILURE); } @@ -258,11 +273,15 @@ create_ppa_stats(const char *owner, ppa->daily_download_totals = NULL; ppa->download_count = 0; - h_cur = history; - while (*h_cur) { + for (h_cur = history; *h_cur; ++h_cur) { h = *h_cur; totals = get_daily_download_totals(h->self_link); - count = get_download_count(h->self_link); + if (!totals) { + log_err(_("Failed to retrieve download totals for %s"), + h->self_link); + continue; + } + count = ddts_get_count(totals); pkg_name = h->binary_package_name; pkg_version = h->binary_package_version; arch_series @@ -293,11 +312,9 @@ create_ppa_stats(const char *owner, pkg_add_distro(pkg, distro_series->name, count, totals); daily_download_total_list_free(totals); - - h_cur++; } - binary_package_publishing_history_list_free(history); + bpph_list_free(history); return ppa; } @@ -325,6 +342,16 @@ static void distro_stats_free(struct distro_stats *distro) free(distro); } +static void distro_stats_list_free(struct distro_stats **distros) +{ + if (distros) { + while (*distros) { + distro_stats_free(*distros); + distros++; + } + } +} + static void version_stats_free(struct version_stats *version) { struct distro_stats **distros; @@ -354,7 +381,7 @@ static void package_stats_free(struct package_stats *package) } free(package->versions); } - + distro_stats_list_free(package->distros); free(package->name); free(package); }