X-Git-Url: http://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Fhtml.c;h=2fd1eef4407f5291cf2e6cc7845eb05822efa5eb;hb=50cb5b56107bbbdc5eb1565404015efaba66bed4;hp=6ae462d1f3400506c5484e350615cdd87d0f2f6d;hpb=91119f38b1102166475467dc0cee470bac61f01c;p=ppastats.git diff --git a/src/html.c b/src/html.c index 6ae462d..2fd1eef 100644 --- a/src/html.c +++ b/src/html.c @@ -27,49 +27,34 @@ #include #include "html.h" +#include "io.h" #include "lp.h" #include "lp_ws.h" #include "ppastats.h" -enum file_copy_error { - FILE_COPY_ERROR_OPEN_SRC = 1, - FILE_COPY_ERROR_OPEN_DST, - FILE_COPY_ERROR_READ, - FILE_COPY_ERROR_WRITE, - FILE_COPY_ERROR_ALLOC_BUFFER -}; - -#define HTML_PKG_TEMPLATE \ -"\n\ - \n\ - \n\ - \n\ - \n\ - \n\ - \n\ - \n\ - \n\ - \n\ - \n\ - \n\ -

N/A

\n\ -

PPA: \n\ - \n\ - N/A/N/A\n\ -

\n\ -
\n\ -
Versions:
\n\ +#define HTML_FOOTER \ +"
Generated by \ +ppastats
\n\ \n\ " +#define HTML_PKG_TEMPLATE \ +"

N/A

\n\ +
\n\ +
\n\ +
\n\ +
\n\ +
\n\ + PPA: \n\ + \n\ + N/A/\n\ + N/A\n\ + \n\ +\n\ +
Distros:
\n\ +
Versions:
\n\ +
" + #define HTML_VERSION_TEMPLATE \ "\n\ \n\ @@ -80,6 +65,10 @@ enum file_copy_error { \n\ \n\ +\n\ \n\ \n\ @@ -94,85 +83,72 @@ enum file_copy_error {

N/A

\n\
Version:
\n\

PPA: \n\ - \n\ + \n\ N/A/N/A\n\

\n\ -
\n\ -
\n\ - Distros:\n\ - \n\ +
\n\ +
\n\
\n\ - \n\ -" - -#define FCOPY_BUF_SZ 4096 -static int file_copy(FILE * src, FILE * dst) -{ - int ret = 0; - char *buf = malloc(FCOPY_BUF_SZ); - int n; - - if (!buf) - return FILE_COPY_ERROR_ALLOC_BUFFER; - - while (!ret) { - n = fread(buf, 1, FCOPY_BUF_SZ, src); - if (n) { - if (fwrite(buf, 1, n, dst) != n) - ret = FILE_COPY_ERROR_WRITE; - } else { - if (!feof(src)) - ret = FILE_COPY_ERROR_READ; - else - break; - } - } - - free(buf); - - return ret; -} - -int -fcopy(const char *src, const char *dst) -{ - FILE *fsrc, *fdst; - int ret = 0; - - if (debug) - printf("DEBUG: copy: %s to %s\n", src, dst); - - fsrc = fopen(src, "r"); - - if (fsrc) { - fdst = fopen(dst, "w+"); - - if (fdst) { - ret = file_copy(fsrc, fdst); - fclose(fdst); - } else { - ret = FILE_COPY_ERROR_OPEN_DST; - } - - fclose(fsrc); - } else { - ret = FILE_COPY_ERROR_OPEN_SRC; - } - - return ret; -} +
\n\ +
\n\ + Distros:\n\ +
    \n\ +
    \n\ +
    \n\ +%s" -static char *get_path(const char *dir, const char *file) +#define HTML_HEADER \ +"\n\ + \n\ + %s\n\ + \n\ + \n\ + \n\ +\n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n" + +#define HTML_INDEX_TEMPLATE \ +"

    N/A

    \n\ +
    \n\ +
    \n\ + Packages:\n\ +
      \n\ +
      \n\ +
      \n\ +
      \n\ +
      \n\ +
      \n" + +static char *path_new(const char *dir, const char *file, const char *suffixe) { char *path = malloc(strlen(dir)+1+ strlen(file)+ strlen(".html")+ + (suffixe ? strlen(suffixe) : 0) + 1); strcpy(path, dir); strcat(path, "/"); strcat(path, file); - strcat(path, ".html"); + strcat(path, suffixe); return path; } @@ -218,11 +194,31 @@ static void json_add_ddts(json_object *json, } } -static char *pkg_to_json(struct ppa_stats *ppa, struct package_stats *pkg) +static json_object *distro_to_json(struct distro_stats *d) { - json_object *json, *json_versions; - char *ret; + json_object *json; + + json = json_object_new_object(); + + json_object_object_add(json, + "name", + json_object_new_string(d->name)); + + json_object_object_add(json, + "count", + json_object_new_int(d->download_count)); + + json_add_ddts(json, d->ddts); + + return json; +} + +static json_object * +pkg_to_json(struct ppa_stats *ppa, struct package_stats *pkg) +{ + json_object *json, *json_versions, *json_distros, *json_distro; struct version_stats **versions; + struct distro_stats **distros, *d; json = json_object_new_object(); @@ -246,13 +242,28 @@ static char *pkg_to_json(struct ppa_stats *ppa, struct package_stats *pkg) versions++; } - json_add_ddts(json, pkg->daily_download_totals); + distros = pkg->distros; + if (distros) { + json_distros = json_object_new_array(); + json_object_object_add(json, "distros", json_distros); - ret = strdup(json_object_to_json_string(json)); + while (*distros) { + d = *distros; - json_object_put(json); + if (d->download_count) { + json_distro = distro_to_json(d); - return ret; + json_object_array_add(json_distros, + json_distro); + } + + distros++; + } + } + + json_add_ddts(json, pkg->daily_download_totals); + + return json; } static char *version_to_json(struct ppa_stats *ppa, @@ -323,29 +334,39 @@ static char *version_to_json(struct ppa_stats *ppa, return ret; } -static void -pkg_to_html(struct ppa_stats *ppa, struct package_stats *pkg, const char *dir) +static json_object *ppa_to_json(struct ppa_stats *ppa) { - char *path; - FILE *f; - char *json; + json_object *json, *json_pkgs, *json_pkg; + struct package_stats **pkgs; - path = get_path(dir, pkg->name); - f = fopen(path, "w"); + json = json_object_new_object(); - if (!f) { - fprintf(stderr, "ERROR: failed to open: %s\n", path); - return ; - } + json_object_object_add(json, + "ppa_name", json_object_new_string(ppa->name)); + json_object_object_add(json, + "ppa_owner", + json_object_new_string(ppa->owner)); - json = pkg_to_json(ppa, pkg); + json_add_ddts(json, ppa->daily_download_totals); - fprintf(f, HTML_PKG_TEMPLATE, json); + pkgs = ppa->packages; + json_pkgs = json_object_new_array(); + json_object_object_add(json, "packages", json_pkgs); + while (*pkgs) { + json_pkg = json_object_new_object(); + json_object_array_add(json_pkgs, json_pkg); - fclose(f); + json_object_object_add(json_pkg, "name", + json_object_new_string((*pkgs)->name)); - free(path); - free(json); + json_object_object_add + (json_pkg, "count", + json_object_new_int((*pkgs)->download_count)); + + pkgs++; + } + + return json; } static void @@ -360,7 +381,7 @@ version_to_html(struct ppa_stats *ppa, f_name = malloc(strlen(pkg->name)+1+strlen(version->version)+1); sprintf(f_name, "%s_%s", pkg->name, version->version); - path = get_path(dir, f_name); + path = path_new(dir, f_name, ".html"); f = fopen(path, "w"); if (!f) { @@ -368,7 +389,9 @@ version_to_html(struct ppa_stats *ppa, return ; } - fprintf(f, HTML_VERSION_TEMPLATE, version_to_json(ppa, pkg, version)); + fprintf(f, HTML_VERSION_TEMPLATE, + version_to_json(ppa, pkg, version), + HTML_FOOTER); fclose(f); @@ -377,47 +400,117 @@ version_to_html(struct ppa_stats *ppa, } static void -packages_to_html(struct ppa_stats *ppa, - struct package_stats **packages, - const char *dir) +create_html(const char *path, + const char *title, + const char *body_template, + const char *script) { - struct package_stats **cur; - struct version_stats **versions; + FILE *f; - cur = packages; - while (*cur) { - pkg_to_html(ppa, *cur, dir); + f = fopen(path, "w"); - versions = (*cur)->versions; - while (*versions) { - version_to_html(ppa, *cur, *versions, dir); + if (!f) { + fprintf(stderr, "ERROR: failed to open: %s\n", path); + return ; + } - versions++; - } + fprintf(f, HTML_HEADER, title, script); + fputs(body_template, f); + fputs(HTML_FOOTER, f); - cur++; - } + fclose(f); } -static char *append_path(const char *odir, const char *name) +static char *ppa_display_name(const struct ppa_stats *ppa) { - char *dir; + char *ret; - dir = malloc(strlen(odir)+1+strlen(name)+1); + ret = malloc(4+strlen(ppa->name)+1+strlen(ppa->owner)+1); - sprintf(dir, "%s/%s", odir, name); + sprintf(ret, "ppa:%s/%s", ppa->owner, ppa->name); - return dir; + return ret; +} + +static void +index_to_html(struct ppa_stats *ppa, const char *dir) +{ + char *path, *json_path, *dname; + json_object *json; + + json = ppa_to_json(ppa); + json_path = path_new(dir, "index", ".json"); + if (debug) + printf("DEBUG: generating %s\n", json_path); + json_object_to_file(json_path, json); + json_object_put(json); + free(json_path); + + path = path_new(dir, "index", ".html"); + dname = ppa_display_name(ppa); + create_html(path, dname, HTML_INDEX_TEMPLATE, "ppastats_ppa();"); + free(path); + free(dname); +} + +static void +pkg_to_html(struct ppa_stats *ppa, struct package_stats *pkg, const char *dir) +{ + char *path, *json_path, *script; + json_object *json; + + json_path = path_new(dir, pkg->name, ".json"); + json = pkg_to_json(ppa, pkg); + if (debug) + printf("DEBUG: generating %s\n", json_path); + json_object_to_file(json_path, json); + json_object_put(json); + free(json_path); + + path = path_new(dir, pkg->name, ".html"); + script = malloc(strlen("ppastats_pkg(\"\");")+ + strlen(pkg->name)+ + strlen(".json")+ + 1); + sprintf(script, "ppastats_pkg(\"%s%s\");", pkg->name, ".json"); + + if (debug) + printf("DEBUG: generating %s\n", path); + + create_html(path, pkg->name, HTML_PKG_TEMPLATE, script); + free(path); + free(script); +} + +static void +pkgs_to_html(struct ppa_stats *ppa, + struct package_stats **pkgs, + const char *dir) +{ + struct version_stats **versions; + + while (*pkgs) { + pkg_to_html(ppa, *pkgs, dir); + + versions = (*pkgs)->versions; + while (*versions) { + version_to_html(ppa, *pkgs, *versions, dir); + + versions++; + } + + pkgs++; + } } void ppa_to_html(const char *owner, const char *ppa, const char *package_status, - const char *output_dir) + const char *output_dir, + const int install_static_files) { struct ppa_stats *ppastats; - struct daily_download_total **totals; char *path, *f_dst; char *css_dir, *js_dir; int i; @@ -428,33 +521,43 @@ ppa_to_html(const char *owner, "js/jqplot.dateAxisRenderer.min.js", DEFAULT_WWW_DIR"/jquery.jqplot.min.js", "js/jquery.jqplot.min.js", + DEFAULT_WWW_DIR"/excanvas.js", "js/excanvas.js", DEFAULT_WWW_DIR"/ppastats.css", "css/ppastats.css", DEFAULT_WWW_DIR"/jquery.jqplot.min.css", "css/jquery.jqplot.min.css" }; - css_dir = append_path(output_dir, "css"); - js_dir = append_path(output_dir, "js"); + mkdirs(output_dir, 0777); - mkdir(css_dir, 0777); - mkdir(js_dir, 0777); + if (install_static_files) { + css_dir = path_append(output_dir, "css"); + js_dir = path_append(output_dir, "js"); - for (i = 0; i < 6; i++) { - f_dst = append_path(output_dir, www_files[2*i+1]); - fcopy(www_files[2*i], f_dst); + mkdir(css_dir, 0777); + mkdir(js_dir, 0777); - free(f_dst); + for (i = 0; i < 7; i++) { + f_dst = path_append(output_dir, www_files[2*i+1]); + + if (debug) + printf("DEBUG: copying %s %s\n", + www_files[2*i], f_dst); + fcopy(www_files[2*i], f_dst); + + free(f_dst); + } + free(css_dir); + free(js_dir); } ppastats = create_ppa_stats(owner, ppa, package_status); - totals = ppastats->daily_download_totals; - path = get_path(output_dir, "ppa"); + path = path_new(output_dir, "ppa", ".html"); + + pkgs_to_html(ppastats, ppastats->packages, output_dir); - packages_to_html(ppastats, ppastats->packages, output_dir); + index_to_html(ppastats, output_dir); ppa_stats_free(ppastats); free(path); - free(css_dir); - free(js_dir); }