+v1.2.0
+------
+
+* added date created information in the generated HTML for a package
+ version.
+
v1.1.0
------
msgstr ""
"Project-Id-Version: ppastats 0.0.x\n"
"Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-02-25 13:33+0100\n"
+"POT-Creation-Date: 2014-02-27 17:20+0100\n"
"PO-Revision-Date: 2012-05-05 23:45+0200\n"
"Last-Translator: <jeanfi@gmail.com>\n"
"Language-Team: French\n"
msgid "exceed cache capacity"
msgstr ""
-#: src/html.c:351
+#: src/html.c:354
msgid "Failed to get the header template"
msgstr ""
-#: src/html.c:358
+#: src/html.c:361
#, c-format
msgid "Failed to open: %s"
msgstr ""
-#: src/html.c:404
+#: src/html.c:407
#, c-format
msgid "generating %s"
msgstr ""
-#: src/html.c:471 src/html.c:484
+#: src/html.c:474 src/html.c:487
#, c-format
msgid "Generating %s"
msgstr ""
-#: src/html.c:549
+#: src/html.c:552
#, c-format
msgid "Copying %s %s"
msgstr ""
msgid "Try `%s --help' for more information.\n"
msgstr ""
-#: src/ppastats.c:353
+#: src/ppastats.c:363
msgid "Failed to retrieve PPA information"
msgstr ""
-#: src/ppastats.c:363
+#: src/ppastats.c:373
#, c-format
msgid "Failed to retrieve download totals for %s"
msgstr ""
msgstr ""
"Project-Id-Version: ppastats 1.0.x\n"
"Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2014-02-25 13:33+0100\n"
+"POT-Creation-Date: 2014-02-27 17:20+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgid "exceed cache capacity"
msgstr ""
-#: src/html.c:351
+#: src/html.c:354
msgid "Failed to get the header template"
msgstr ""
-#: src/html.c:358
+#: src/html.c:361
#, c-format
msgid "Failed to open: %s"
msgstr ""
-#: src/html.c:404
+#: src/html.c:407
#, c-format
msgid "generating %s"
msgstr ""
-#: src/html.c:471 src/html.c:484
+#: src/html.c:474 src/html.c:487
#, c-format
msgid "Generating %s"
msgstr ""
-#: src/html.c:549
+#: src/html.c:552
#, c-format
msgid "Copying %s %s"
msgstr ""
msgid "Try `%s --help' for more information.\n"
msgstr ""
-#: src/ppastats.c:353
+#: src/ppastats.c:363
msgid "Failed to retrieve PPA information"
msgstr ""
-#: src/ppastats.c:363
+#: src/ppastats.c:373
#, c-format
msgid "Failed to retrieve download totals for %s"
msgstr ""
json_object_object_add(json,
"name", json_object_new_string(ver->version));
+ json_object_object_add(json,
+ "date_created", time_to_json(ver->date_created));
+
json_add_ddts(json, ver->daily_download_totals);
distros = ver->distros;
return -1;
}
-static json_object *time_to_json(time_t t)
+json_object *time_to_json(time_t t)
{
char *str;
json_object *j;
struct json_object *date_to_json(struct tm *tm);
+json_object *time_to_json(time_t t);
#endif
*/
#include <dirent.h>
+#include <fts.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
+#include <plog.h>
#include <pio.h>
-
/* Directory separator is \ when cross-compiling for MS Windows
systems */
#if defined(__MINGW32__)
FILE *fsrc, *fdst;
int ret = 0;
+ log_fct("copy %s to %s", src, dst);
+
fsrc = fopen(src, "r");
if (fsrc) {
void mkdirs(const char *dirs, mode_t mode)
{
- char *c = (char *)dirs;
- char *dir = malloc(strlen(dirs) + 1);
+ char *c, *dir;
+ int i;
+
+ log_fct("mkdirs %s", dirs);
- int i = 0;
+ c = (char *)dirs;
+ dir = malloc(strlen(dirs) + 1);
+
+ i = 0;
while (*c) {
if ((*c == DIRSEP || *c == '\0') && c != dirs) {
strncpy(dir, dirs, i);
printf("File copy error: unknown error %d.\n", code);
}
}
+
+int dir_rcopy(const char *src, const char *dst)
+{
+ int ret;
+ char **paths;
+ FTS *ftsp;
+ FTSENT *p, *chp;
+ int fts_options = FTS_COMFOLLOW | FTS_LOGICAL | FTS_NOCHDIR;
+ char *p_dst, *n_dst;
+
+ log_fct_enter();
+
+ log_fct("copy dir %s to %s", src, dst);
+
+ paths = malloc(2 * sizeof(char *));
+ paths[0] = strdup(src);
+ paths[1] = NULL;
+
+ ftsp = fts_open(paths, fts_options, NULL);
+ if (!ftsp)
+ return 1;
+
+ chp = fts_children(ftsp, 0);
+ if (!chp)
+ return 0;
+
+ n_dst = dir_normalize(dst);
+
+ while ((p = fts_read(ftsp)) != NULL) {
+ switch (p->fts_info) {
+ case FTS_D:
+ p_dst = path_append(n_dst,
+ p->fts_path + strlen(src) + 1);
+ mkdirs(p_dst, 0777);
+ free(p_dst);
+ break;
+ case FTS_F:
+ p_dst = path_append(n_dst,
+ p->fts_path + strlen(src) + 1);
+ file_copy(p->fts_path, p_dst);
+ free(p_dst);
+ break;
+ default:
+ break;
+ }
+ }
+ fts_close(ftsp);
+
+ free(n_dst);
+ free(paths);
+
+ ret = 0;
+
+ log_fct_exit();
+
+ return ret;
+}
#ifndef _P_IO_H
#define _P_IO_H
-#define P_IO_VER 1
+#define P_IO_VER 2
/* Returns '1' if a given 'path' denotates a directory else returns
0 */
*/
int file_copy(const char *src, const char *dst);
+int dir_rcopy(const char *, const char *);
+
void mkdirs(const char *dirs, mode_t mode);
#endif
#define LOG_BUFFER 4096
-static void vlogf(int lvl, const char *fmt, va_list ap)
+static void vlogf(int lvl, const char *fct, const char *fmt, va_list ap)
{
char buffer[1 + LOG_BUFFER];
char *lvl_str, *t;
return ;
if (file && lvl <= log_level) {
- fprintf(file, "[%s] %s %s\n", t, lvl_str, buffer);
+ if (fct)
+ fprintf(file,
+ "[%s] %s %s(): %s\n", t, lvl_str, fct, buffer);
+ else
+ fprintf(file, "[%s] %s %s\n", t, lvl_str, buffer);
fflush(file);
} else {
t = NULL;
else
stdf = stdout;
-
- fprintf(stdf, "[%s] %s %s\n", t, lvl_str, buffer);
+ if (fct)
+ fprintf(file,
+ "[%s] %s %s(): %s\n", t, lvl_str, fct, buffer);
+ else
+ fprintf(stdf, "[%s] %s %s\n", t, lvl_str, buffer);
}
free(t);
va_list ap;
va_start(ap, fmt);
- vlogf(lvl, fmt, ap);
+ vlogf(lvl, NULL, fmt, ap);
va_end(ap);
}
return ;
va_start(ap, fmt);
- vlogf(LOG_DEBUG, fmt, ap);
+ vlogf(LOG_DEBUG, NULL, fmt, ap);
va_end(ap);
}
va_list ap;
va_start(ap, fmt);
- vlogf(LOG_ERR, fmt, ap);
+ vlogf(LOG_ERR, NULL, fmt, ap);
va_end(ap);
}
va_list ap;
va_start(ap, fmt);
- vlogf(LOG_WARN, fmt, ap);
+ vlogf(LOG_WARN, NULL, fmt, ap);
va_end(ap);
}
va_list ap;
va_start(ap, fmt);
- vlogf(LOG_INFO, fmt, ap);
+ vlogf(LOG_INFO, NULL, fmt, ap);
+ va_end(ap);
+}
+
+void _log(const char *fct, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vlogf(LOG_DEBUG, fct, fmt, ap);
va_end(ap);
}
#ifndef _P_LOG_H_
#define _P_LOG_H_
-#define P_LOG_VER 1
+#define P_LOG_VER 2
enum log_level {
LOG_ERR ,
};
void log_open(const char *path);
+void log_close();
void log_printf(int lvl, const char *fmt, ...);
void log_debug(const char *fmt, ...);
void log_info(const char *fmt, ...);
void log_warn(const char *fmt, ...);
-void log_close();
+void _log(const char *fct, const char *fmt, ...);
+
+#define log_fct(...) _log(__func__, __VA_ARGS__)
+#define log_fct_enter() log_fct("ENTER")
+#define log_fct_exit() log_fct("EXIT")
/* level of the log file. */
extern int log_level;
return p;
}
+static struct version_stats *version_stats_new(const char *version)
+{
+ struct version_stats *v;
+
+ v = malloc(sizeof(struct version_stats));
+ v->version = strdup(version);
+ v->distros = NULL;
+ v->download_count = 0;
+ v->daily_download_totals = NULL;
+ v->date_created = 0;
+
+ return v;
+}
+
static struct version_stats *get_version_stats(struct package_stats *package,
const char *version)
{
cur++;
}
- v = malloc(sizeof(struct version_stats));
- v->version = strdup(version);
- v->distros = NULL;
- v->download_count = 0;
- v->daily_download_totals = NULL;
+ v = version_stats_new(version);
tmp = (struct version_stats **)list_add((void **)package->versions,
v);
pkg->daily_download_totals = tmp;
version = get_version_stats(pkg, pkg_version);
+ version->date_created = h->date_created;
+
version->download_count += count;
tmp = add_totals(version->daily_download_totals, totals);
if (version->daily_download_totals != tmp)
struct version_stats {
char *version;
+ time_t date_created;
struct distro_stats **distros;
int download_count;
});
ppastats_chart(data["ddts"]);
+
+ $("#date_created").append(data["date_created"]);
});
}
<em>Package</em>: <span id="pkg_name">N/A</span>
</div>
<div id="version"><em>Version</em>: </div>
+ <div id="date_created"><em>Date created</em>: </div>
<div id="distros">
<em>Distributions</em>:
</div>