#include <u.h>#include <libc.h>#include <thread.h>#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 voidusage(void){ print("usage: %s [info | fetch] package...\n", argv0); threadexitsall("usage");} static intpkgcmp(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 voidpkginfo(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 voidpkgfetch(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 voidchtmpdir(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 intcleanup(void *, char *){ /* FIXME remove all temp files */ print("cleaning up\n"); return 0;} voidthreadmain(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);}
#include <u.h>
#include <libc.h>
#include <thread.h>
#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);
}