]> pd.if.org Git - zpackage/blobdiff - src/add.c
rework zpm-add
[zpackage] / src / add.c
index 86b289d9748d836aff391c7ef4f32f6f3d20bb4c..1be34e81805c0393971fff05f5d4230a0c728d59 100644 (file)
--- a/src/add.c
+++ b/src/add.c
@@ -21,7 +21,7 @@ struct opts {
        int complete, addcontent, isconfig, opt_l, recursive, verbose;
        int followsymlinks;
        int xargs, noclear;
-       int striparg;
+       int striparg, init;
        mode_t clmode;
 
        char *cltype, *clhash, *clmtime, *prefix, *strip, *cltarget;
@@ -381,6 +381,11 @@ int main(int ac, char **av) {
        struct opts opt = { 0 };
        int i;
        int option;
+       char *pkgstr = 0, *pkgid = 0;
+
+       char package[128];
+       char version[64];
+       int release;
 
        char hash[ZPM_HASH_STRLEN+1];
 
@@ -392,8 +397,10 @@ int main(int ac, char **av) {
 
        opt.addcontent = 1;
 
-       while ((option = getopt(ac, av, "CF:H:M:NP:S:T:cf:g:hlm:ru:vxz")) != -1) {
+       while ((option = getopt(ac, av, "iCF:H:M:NP:S:T:cf:g:hlm:ru:vxzp:")) != -1) {
                switch (option) {
+                       case 'f': dbfile = optarg; break;
+                       case 'i': opt.init = 1; break;
                        case 'C': opt.complete = 1; break;
                        case 'F': opt.cltype = optarg; break;
                        case 'H': opt.clhash = optarg; break;
@@ -404,7 +411,6 @@ int main(int ac, char **av) {
                        case 's': opt.striparg = 1; break;
                        case 'T': opt.cltarget = optarg; break;
                        case 'c': opt.isconfig = 1; break;
-                       case 'f': dbfile = optarg; break;
                        case 'g': opt.clgroup = optarg; break;
                        case 'h': opt.followsymlinks = 1; break;
                        case 'l': opt.opt_l = 1; break;
@@ -414,6 +420,7 @@ int main(int ac, char **av) {
                        case 'v': opt.verbose++; break;
                        case 'x': opt.xargs = 1; dieval = 255; break;
                        case 'z': opt.noclear = 1; break;
+                       case 'p': pkgstr = optarg; break;
                        default:
                                  exit(EXIT_FAILURE);
                                  break;
@@ -424,10 +431,20 @@ int main(int ac, char **av) {
                exit(EXIT_FAILURE);
        }
 
-       if (!zpm_open(&zpm, dbfile)) {
-               die("can't open zpm db %s", dbfile);
+       if (opt.init) {
+               if (!zpm_init(&zpm, dbfile)) {
+                       die("can't open zpm db %s", dbfile);
+               }
+               if (opt.verbose) {
+                       fprintf(stderr, "inited %s\n", dbfile);
+               }
+       } else {
+               if (!zpm_open(&zpm, dbfile)) {
+                       die("can't open zpm db %s", dbfile);
+               }
        }
 
+
 #if 0
        i = sqlite3_config(SQLITE_CONFIG_MMAP_SIZE,98222080);
        if (i != SQLITE_OK) {
@@ -435,19 +452,28 @@ int main(int ac, char **av) {
        }
 #endif
 
-       /* package is first arg */
-       char *pkgstr;
-       char *pkgid;
-       pkgstr = av[optind++];
+       if (!pkgstr) {
+               pkgstr = dbfile;
+       }
        pkgid = zpm_findpkg(&zpm, pkgstr, NULL);
        if (!pkgid) {
-               die("package %s not found\n", pkgstr);
+               int rv;
+               if (opt.init) {
+                       rv = zpm_parse_package(pkgstr, package, version, &release);
+                       if (rv != 3) {
+                               die("incomplete package string '%s'\n", pkgstr);
+                       } else {
+                               rv = zpm_create_package(&zpm, package, version, release);
+                               pkgid = zpm_findpkg(&zpm, pkgstr, NULL);
+                               if (!rv) {
+                                       die("unable to create package %s\n", pkgstr);
+                               }
+                       }
+               } else {
+                       die("package %s not found\n", pkgstr);
+               }
        }
 
-       char package[128];
-       char version[64];
-       int release;
-
        zpm_parse_package(pkgid, package, version, &release);
        opt.package = package;
        opt.version = version;