URI: 
       tInclude version number in metadata - pm - barely a pack manager
  HTML git clone git://z3bra.org/pm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit cf0441277b56ecaae38641dfe2bd5a2355617ac1
   DIR parent a90605e2b376486576007c7acb6967ca3af0823f
  HTML Author: z3bra <willyatmailoodotorg>
       Date:   Wed, 30 Dec 2015 17:02:41 +0100
       
       Include version number in metadata
       
       Diffstat:
         M pm.c                                |      56 +++++++++++++++++++++++--------
       
       1 file changed, 42 insertions(+), 14 deletions(-)
       ---
   DIR diff --git a/pm.c b/pm.c
       t@@ -49,7 +49,7 @@ int inspect(char *name);
        int list_archive(int fd, char *filename);
        int list_local(int fd, char *packname);
        int list_content(int fd, char *packname);
       -int metadata(char *datadir, char *filename);
       +int metadata(char *datadir, struct pkg *pack);
        int pack(char *out, char **filename);
        int unpack(char *root, char *in);
        int delete_content(FILE *metafile);
       t@@ -200,6 +200,9 @@ list_local(int fd, char *datadir)
        {
                DIR *d;
                struct dirent *p;
       +        char tmp[PATH_MAX];
       +        int meta;
       +        size_t len;
        
                if (!(d = opendir(datadir))) {
                        perror("opendir");
       t@@ -207,8 +210,19 @@ list_local(int fd, char *datadir)
                }
        
                while ((p = readdir(d)))
       -                if (strcmp(p->d_name, ".") && strcmp(p->d_name, ".."))
       -                        dprintf(fd, "%s\n", p->d_name);
       +                if (strcmp(p->d_name, ".") && strcmp(p->d_name, "..")) {
       +                        snprintf(tmp, PATH_MAX, "%s/%s/version",
       +                                 datadir, p->d_name);
       +
       +                        if ((meta = open(tmp, O_RDONLY)) < 0) {
       +                                perror("open");
       +                                closedir(d);
       +                                return (1);
       +                        }
       +                        len = read(meta, tmp, 32);
       +                        tmp[len - 1] = 0;
       +                        dprintf(fd, "%s\t%s\n", p->d_name, tmp);
       +                }
        
                closedir(d);
                return 0;
       t@@ -219,16 +233,16 @@ list_local(int fd, char *datadir)
         * write metadata about a package file
         *
         * TODO:
       - *        + /deps /asdep /version
       + *        + /deps /asdep
         */
        int
       -metadata(char *datadir, char *filename)
       +metadata(char *datadir, struct pkg *pack)
        {
                int fd, r;
                struct stat st;
                char tmp[PATH_MAX], *name;
        
       -        name = strdup(filename);
       +        name = strdup(pack->path);
                name = strtok(name, ":");
                sprintf(tmp, "%s/%s", datadir, base_name(name));
        
       t@@ -240,15 +254,26 @@ metadata(char *datadir, char *filename)
                                return r;
                }
        
       -        strncat(tmp, "/files", PATH_MAX);
       +        snprintf(tmp, PATH_MAX, "%s/%s/files", datadir, pack->name);
                fd = open(tmp, O_CREAT|O_WRONLY|O_TRUNC, 0644);
       -        if (fd > 0) {
       -                list_archive(fd, filename);
       -                close(fd);
       -                return 0;
       +        if (fd < 0) {
       +                perror("open");
       +                return -1;
                }
       +        list_archive(fd, pack->path);
       +        close(fd);
        
       -        return -1;
       +        snprintf(tmp, PATH_MAX, "%s/%s/version", datadir, pack->name);
       +        fd = open(tmp, O_CREAT|O_WRONLY|O_TRUNC, 0644);
       +        if (fd < 0) {
       +                perror("open");
       +                return -1;
       +        }
       +        write(fd, pack->version, strlen(pack->version));
       +        write(fd, "\n", 1);
       +        close(fd);
       +
       +        return 0;
        }
        
        /*
       t@@ -405,8 +430,10 @@ delete(const char *datadir, const char *rootfs, const char *name)
                FILE *f;
                char meta[PATH_MAX];
        
       -        snprintf(meta, PATH_MAX, "%s/%s/files", datadir, name);
       +        snprintf(meta, PATH_MAX, "%s/%s/version", datadir, name);
       +        unlink(meta);
        
       +        snprintf(meta, PATH_MAX, "%s/%s/files", datadir, name);
                if ((f = fopen(meta, "r")) == NULL) {
                        perror("fopen");
                        return -1;
       t@@ -426,6 +453,7 @@ delete(const char *datadir, const char *rootfs, const char *name)
                chdir(cwd);
        
                unlink(meta);
       +
                snprintf(meta, PATH_MAX, "%s/%s", datadir, name);
                rmdir(meta);
        
       t@@ -525,7 +553,7 @@ main (int argc, char **argv)
                case ACTION_INSTALL:
                        if (!p)
                                return ERR_PACKAGE_LOAD;
       -                if (metadata(PACKAGE_DATA, p->path) == 0)
       +                if (metadata(PACKAGE_DATA, p) == 0)
                                return unpack(PACKAGE_ROOT, p->path);
                        fprintf(stderr, "could not write metadata for %s\n", p->name);
                        return ERR_METADATA;