#include #include #include #include "pkg.h" #include "src.h" #define MAX(a,b) ((a)>=(b)?(a):(b)) Pkg *pkgs[] = { &fontsel, &git9, &hx, &libtags, &makeu, &mpl, &orca, &pal, &picker, &unionfs, &whiteboardfs, &xmpp, &zuke, }; static int maxname; static void usage(void) { print("usage: %s [info | fetch] package...\n", argv0); threadexitsall("usage"); } static int pkgcmp(void *a_, void *b_) { Pkg **a, **b; a = a_; b = b_; maxname = MAX(maxname, MAX(strlen((*a)->name), strlen((*b)->name))); return strcmp((*a)->name, (*b)->name); } static void pkginfo(Pkg *p, int v) { int i; if(p == nil) return; if(v){ print("name %s\n", p->name); if(p->ver != nil) print("version %s\n", p->ver); print("description %s\n", p->meta.descr); print("web %s\n", p->meta.web); print("license %s\n", p->meta.license); if(p->inputs.build[0] != nil || p->inputs.runtime[0] != nil){ print("dependencies "); for(i = 0; i < nelem(p->inputs.build) && p->inputs.build[i] != nil; i++) print(" %s", p->inputs.build[i]->name); for(i = 0; i < nelem(p->inputs.build) && p->inputs.runtime[i] != nil; i++) print(" %s", p->inputs.runtime[i]->name); print("\n"); } }else{ print("%-*s\t%s\n", maxname, p->name, p->meta.descr); } } static void pkgfetch(Pkg *p) { int d; if(p == nil) return; if((d = fetchsrc(&p->src)) < 0) fprint(2, "fetchsrc: %r\n"); else close(d); } static Pkg * pkgfind(char *name) { int i; for(i = 0; i < nelem(pkgs); i++) if(strcmp(pkgs[i]->name, name) == 0) return pkgs[i]; fprint(2, "Error: package not found: %s\n", name); return nil; } static void chtmpdir(void) { char tempdir[20] = "/tmp/pkgXXXXXXXXXXX"; char *s; s = mktemp(tempdir); if(s[0] == 0) sysfatal("mktemp failed"); if(create(s, OREAD|ORCLOSE, DMDIR|0700) < 0) sysfatal("can't create %s: %r", s); if(chdir(tempdir) != 0) sysfatal("can't chdir: %r"); } static int cleanup(void *, char *) { /* FIXME remove all temp files */ print("cleaning up\n"); return 0; } void threadmain(int argc, char **argv) { int i; ARGBEGIN{ }ARGEND quotefmtinstall(); qsort(pkgs, nelem(pkgs), sizeof(*pkgs), pkgcmp); threadwaitchan(); threadnotify(cleanup, 1); chtmpdir(); if(argc < 1){ for(i = 0; i < nelem(pkgs); i++) pkginfo(pkgs[i], 0); goto done; }else if(argc >= 2 && strcmp(argv[0], "info") == 0){ for(i = 1; i < argc; i++) pkginfo(pkgfind(argv[i]), 1); }else if(argc >= 2 && strcmp(argv[0], "fetch") == 0){ for(i = 1; i < argc; i++) pkgfetch(pkgfind(argv[i])); }else{ usage(); } done: threadexitsall(nil); }