X-Git-Url: http://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Fppastats.c;h=7d67bc44723f1651c73d12530d7193aca5094bc7;hb=f534061fc8230481a3ca40abc1d1e9b79d3c4976;hp=9dd5c46bb71383fc4ef2541572ec6372aca34d2e;hpb=acc20f9c4b9a38e732514c278e47071cf6293a06;p=ppastats.git diff --git a/src/ppastats.c b/src/ppastats.c index 9dd5c46..7d67bc4 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,6 +26,7 @@ #include "list.h" #include "lp_ws.h" +#include #include "ppastats.h" static struct package_stats *get_package_stats(struct ppa_stats *stats, @@ -46,6 +50,7 @@ static struct package_stats *get_package_stats(struct ppa_stats *stats, p->versions = NULL; p->download_count = 0; p->daily_download_totals = NULL; + p->distros = NULL; stats->packages = (struct package_stats **)list_add ((void **)stats->packages, p); @@ -81,6 +86,19 @@ static struct version_stats *get_version_stats(struct package_stats *package, return v; } +static struct distro_stats *distro_stats_new(const char *name) +{ + struct distro_stats *d; + + d = malloc(sizeof(struct distro_stats)); + d->name = strdup(name); + d->archs = NULL; + d->download_count = 0; + d->ddts = NULL; + + return d; +} + static struct distro_stats *get_distro_stats(struct version_stats *version, const char *name) { @@ -96,10 +114,7 @@ static struct distro_stats *get_distro_stats(struct version_stats *version, cur++; } - d = malloc(sizeof(struct distro_stats)); - d->name = strdup(name); - d->archs = NULL; - d->download_count = 0; + d = distro_stats_new(name); version->distros = (struct distro_stats **)list_add((void **)version->distros, @@ -181,13 +196,46 @@ struct daily_download_total **add_totals return result; } +static void +pkg_add_distro(struct package_stats *pkg, + const char *distro_name, + int distro_count, + struct daily_download_total **ddts) +{ + struct distro_stats **pkg_distros, *pkg_distro; + + pkg_distros = pkg->distros; + pkg_distro = NULL; + + if (pkg_distros) + while (*pkg_distros) { + if (!strcmp((*pkg_distros)->name, distro_name)) { + pkg_distro = *pkg_distros; + break; + } + + pkg_distros++; + } + + if (!pkg_distro) { + pkg_distro = distro_stats_new(distro_name); + pkg->distros + = (struct distro_stats **) + list_add((void **)pkg->distros, (void *)pkg_distro); + } + + pkg_distro->download_count += distro_count; + pkg_distro->ddts = add_totals(pkg_distro->ddts, ddts); +} + 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; @@ -199,12 +247,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); } @@ -215,11 +262,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 @@ -247,12 +298,12 @@ create_ppa_stats(const char *owner, arch = get_arch_stats(distro, arch_series->architecture_tag); arch->download_count += count; - daily_download_total_list_free(totals); + pkg_add_distro(pkg, distro_series->name, count, totals); - h_cur++; + daily_download_total_list_free(totals); } - binary_package_publishing_history_list_free(history); + bpph_list_free(history); return ppa; }