URI: 
       tRework information logging - pm - barely a pack manager
  HTML git clone git://z3bra.org/pm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit e75a29dc260ce4d1a54c83eb9ec5de73c958875d
   DIR parent 5f251565fd50d808e101a1dcbce3ed48fb9502bb
  HTML Author: z3bra <willyatmailoodotorg>
       Date:   Sat, 18 Jun 2016 01:19:03 +0200
       
       Rework information logging
       
       There are now 3 logging levels: INFO, VERBOSE, DEBUG
       
       INFO: write out which action has been done
       VERBOSE: explain HOW an action is being done
       DEBUG: report every change made to the filesystem
       
       The logging level can be increased by passing the verbose flags (-v) again.
       Each level includes the messages of the previous levels.
       
       Diffstat:
         M pm.c                                |      79 ++++++++++++++++++++-----------
       
       1 file changed, 51 insertions(+), 28 deletions(-)
       ---
   DIR diff --git a/pm.c b/pm.c
       t@@ -20,6 +20,8 @@
        #define PACK_SEPARATOR '#'
        #define PACK_EXTENSION ".tar.bz2"
        
       +#define log(l,...) if(verbose>=l){printf(__VA_ARGS__);}
       +
        struct pack {
                char *path;
                char *name;
       t@@ -46,6 +48,13 @@ enum {
                ERR_UNPACK         = 6,
        };
        
       +enum {
       +        LOG_NONE    = 0,
       +        LOG_INFO    = 1,
       +        LOG_VERBOSE = 2,
       +        LOG_DEBUG   = 3
       +};
       +
        void usage(char *name);
        int is_empty(char *dir);
        int mkdir_parents(char *dir, mode_t mode);
       t@@ -75,7 +84,7 @@ int install(const char *rootfs, const char *datadir, char *path);
        int update(const char *rootfs, const char *datadir, char *path);
        int delete(const char *rootfs, const char *datadir, char *name);
        
       -int verbose = 0;
       +int verbose = LOG_NONE;
        int overwrite = 0;
        
        void
       t@@ -187,8 +196,10 @@ inspect_collision(const char *rootfs, struct pack *p)
                archive_read_support_format_tar(a);
        
                r = archive_read_open_filename(a, p->path, 0);
       -        if (r != ARCHIVE_OK)
       +        if (r != ARCHIVE_OK) {
       +                fprintf(stderr, "%s: %s\n", p->path, archive_error_string(a));
                        return -1;
       +        }
        
                getcwd(cwd, PATH_MAX);
                chdir(rootfs);
       t@@ -287,12 +298,16 @@ write_metadata(const char *datadir, struct pack *p)
                char tmp[PATH_MAX];
        
                snprintf(tmp, PATH_MAX, "%s/%s", datadir, p->name);
       +
                if (stat(tmp, &st) < 0 && errno == ENOENT) {
       +                log(LOG_DEBUG, "creating metadata directory %s\n", tmp);
                        if ((r = mkdir_parents(tmp, 0755)) < 0)
                                return r;
                }
        
                snprintf(tmp, PATH_MAX, "%s/%s/version", datadir, p->name);
       +
       +        log(LOG_DEBUG, "openning %s for writing\n", tmp);
                if ((fd = open(tmp, O_CREAT|O_WRONLY|O_TRUNC, 0644)) < 0) {
                        perror(tmp);
                        return -1;
       t@@ -355,6 +370,8 @@ unpack(const char *rootfs, const char *datadir, struct pack *p)
                          |ARCHIVE_EXTRACT_SECURE_NODOTDOT;
        
                snprintf(tmp, PATH_MAX, "%s/%s/files", datadir, p->name);
       +
       +        log(LOG_DEBUG, "openning %s for writing\n", tmp);
                if ((fd = open(tmp, O_WRONLY|O_CREAT|O_TRUNC, 0644)) < 0) {
                        perror(tmp);
                        return -1;
       t@@ -366,7 +383,7 @@ unpack(const char *rootfs, const char *datadir, struct pack *p)
        
                /* try and open the tarball of our pack */
                if ((r = archive_read_open_filename(a, p->path, 0)) != ARCHIVE_OK) {
       -                fprintf(stderr, "%s: %s\n", p->name, archive_error_string(a));
       +                fprintf(stderr, "%s: %s\n", p->path, archive_error_string(a));
                        archive_read_free(a);
                        return r;
                }
       t@@ -389,6 +406,7 @@ unpack(const char *rootfs, const char *datadir, struct pack *p)
                                break;
                        }
        
       +                log(LOG_DEBUG, "+ %s\n", archive_entry_pathname(e));
                        if ((r = write_entry(a, w)) != ARCHIVE_OK) {
                                fprintf(stderr, "%s: %s\n", archive_entry_pathname(e),
                                                            archive_error_string(w));
       t@@ -418,36 +436,27 @@ pack_install(const char *rootfs, const char *datadir, struct pack *p)
                char tmp[PATH_MAX] = "";
                struct stat st;
        
       -        if (verbose == 1)
       -                printf("%s: installing to %s\n", p->name, rootfs);
       -
                if (overwrite == 0) {
                        snprintf(tmp, PATH_MAX, "%s/%s", datadir, p->name);
       +                log(LOG_VERBOSE, "checking installation status\n");
                        if (stat(tmp, &st) == 0 && S_ISDIR(st.st_mode)) {
                                fprintf(stderr, "%s: already installed\n", p->name);
                                return -1;
                        }
       -
       -                if (verbose == 1)
       -                        printf("%s: checking collisions\n", p->name);
       +                log(LOG_VERBOSE, "checking for collisions\n");
                        if (inspect_collision(rootfs, p) != 0)
                                return -1;
                }
        
       -        if (verbose == 1)
       -                printf("%s: writing metadata\n", p->name);
       +        log(LOG_VERBOSE, "writing metadata to %s\n", datadir);
                if (write_metadata(datadir, p) < 0) {
                        perror(datadir);
                        return -1;
                }
        
       -        if (verbose == 1)
       -                printf("%s: extracting %s\n", p->name, p->path);
       +        log(LOG_VERBOSE, "extracting pack to %s\n", rootfs);
                r = unpack(rootfs, datadir, p);
        
       -        if (verbose == 1)
       -                printf("%s: installation %s\n", p->name, r != 0 ? "failed" : "complete");
       -
                return r;
        }
        
       t@@ -468,6 +477,8 @@ delete_node(char *path)
                if (path[len - 1] == '/')
                        path[--len] = 0;
        
       +        log(LOG_DEBUG, "- %s\n", path);
       +
                /*
                 * if path doesn't exist anymore, it's all good :)
                 * we use lstat here so that dangling links can be delt with too
       t@@ -475,9 +486,6 @@ delete_node(char *path)
                if (lstat(path, &st) < 0 && errno == ENOENT)
                        return 0;
        
       -        if (verbose == 1)
       -                printf("- %s\n", path);
       -
                if (S_ISDIR(st.st_mode) && is_empty(path) == 0) {
                        if ((r = rmdir(path)) < 0) {
                                perror(path);
       t@@ -557,43 +565,44 @@ pack_delete(const char *rootfs, const char *datadir, struct pack *p)
                        perror(tmp);
                        return ERR_DELETE;
                }
       +
                addr = mmap(0, st.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
                if (addr == MAP_FAILED) {
                        perror(tmp);
                        close(fd);
                }
        
       -        if (verbose == 1)
       -                printf("%s: deleting from %s\n", packname, rootfs);
                if (chdir(rootfs) < 0) {
                        perror(rootfs);
                        close(fd);
                        return ERR_DELETE;
                }
        
       +        log(LOG_VERBOSE, "deleting installed files\n");
                /* ignore errors so everything gets deleted */
                if (delete_content(addr, st.st_size) < 0) {
       -                fprintf(stderr, "%s: cannot remove pack\n", p->name);
       +                fprintf(stderr, "%s: pack not removed\n", p->name);
                        close(fd);
                        return ERR_DELETE;
                }
                close(fd);
        
       -        if (verbose == 1)
       -                printf("%s: removing metadata\n", p->name);
       +        log(LOG_VERBOSE, "removing %s\n", tmp);
                if (unlink(tmp) < 0) {
                        perror(tmp);
       -                fprintf(stderr, "%s: cannot remove file list\n", p->name);
                        return ERR_DELETE;
                }
        
       -        snprintf(tmp, PATH_MAX, "%s/version", p->path);
       +        snprintf(tmp, PATH_MAX, "%s/%s/version", datadir, p->name);
       +
       +        log(LOG_VERBOSE, "removing %s\n", tmp);
                if (unlink(tmp) < 0) {
                        perror(tmp);
       -                fprintf(stderr, "%s: cannot clean version\n", p->name);
                        return ERR_DELETE;
                }
        
       +        /* remove metadata directory, no matter what */
       +        log(LOG_DEBUG, "removing %s\n", p->path);
                return rmdir(p->path);
        }
        
       t@@ -610,7 +619,12 @@ install(const char *rootfs, const char *datadir, char *path)
                if ((p = pack_load(datadir, path)) == NULL)
                        return ERR_PACK_LOAD;
        
       +
                r += pack_install(rootfs, datadir, p);
       +
       +        if (r == 0)
       +                log(LOG_INFO, "installed %s (%s)\n", p->name, p->version);
       +
                pack_free(p);
        
                return r;
       t@@ -634,6 +648,10 @@ update(const char *rootfs, const char *datadir, char *path)
                        return ERR_DELETE;
        
                r += pack_install(rootfs, datadir, p);
       +
       +        if (r == 0)
       +                log(LOG_INFO, "updated %s to %s\n", p->name, p->version);
       +
                pack_free(p);
        
                return r;
       t@@ -651,7 +669,12 @@ delete(const char *rootfs, const char *datadir, char *name)
                if ((p = pack_load(datadir, tmp)) == NULL)
                        return ERR_PACK_LOAD;
        
       +
                r += pack_delete(rootfs, datadir, p);
       +
       +        if (r == 0)
       +                log(LOG_INFO, "deleted %s\n", p->name);
       +
                pack_free(p);
        
                return r;
       t@@ -809,7 +832,7 @@ main (int argc, char **argv)
                        action = ACTION_UPDATE;
                        break;
                case 'v':
       -                verbose = 1;
       +                verbose++;
                        break;
                default:
                        action = ACTION_INVALID;