X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=zpm-syncfs.c;h=ecc66c84f8bec7df14a66bd2ad21a50e8fe81431;hb=2e468963f264e40379425a83048000965320a78e;hp=94297a044a02e0bec4855a0268d2542897b6fb6d;hpb=cd81b1cb33d940e748ba52877267291a8ab27d18;p=zpackage diff --git a/zpm-syncfs.c b/zpm-syncfs.c index 94297a0..ecc66c8 100644 --- a/zpm-syncfs.c +++ b/zpm-syncfs.c @@ -709,12 +709,94 @@ static int install(struct config *conf, struct nitem *item, unsigned int flags) return success; } +/* + * + */ +static int adjust_for_config(struct config *conf, struct nitem *n, unsigned int + diffs) { +#if 0 + if (!n->oldwasconf) { + return 0; + } +#endif + /* TODO what if old was a directory? */ + if (!n->configuration) { + /* replacing conf with non-conf */ + /* absorb file, mark todo */ + char hash[ZPM_HASH_STRLEN+1]; + if (zpm_import(conf->log, n->dest, 0, hash)) { + zpm_note_add(conf->log, n->pkglist, n->dest, hash, + "replaced config file with non-config. zpm-cat %.8s", hash); + } else { + fprintf(stderr, "unable to import existing config file %s\n", n->dest); + return 1; + } + return 0; + } + + int sametype = (!(diffs & D_TYPE)); + int isdir = (diffs & D_ISDIR); + int eisdir = (diffs & D_EISDIR); + + /* both old and new are config files */ + if (isdir && sametype) { + /* both config directories, can only be changing + * metadata, so no adjustment needed + */ + return 0; + } + + if (isdir) { + char hash[ZPM_HASH_STRLEN+1]; + + /* replacing old file with new directory */ + /* absorb, make note */ + if (zpm_import(conf->log, n->dest, 0, hash)) { + zpm_note_add(conf->log, n->pkglist, n->dest, hash, + "replaced config file with config directory. zpm-cat %.8s", hash); + } else { + fprintf(stderr, "unable to import existing config file %s\n", n->dest); + return -1; + } + return 0; + } + + if (eisdir) { + /* replacing old conf directory with a conf file. + * nothing needs to be done, if the directory + * is empty, it's ok to remove. if it's not empty, + * the install will fail + */ + return 0; + } + + /* replacing old file with new file */ + /* new is same as on disk */ + if (!(diffs & D_HASH)) { + return 0; + } + + /* new is different than on disk, but on disk is same as old */ + if (!(diffs & D_OHASH)) { + /* ok to do the update, since same as default */ + fprintf(stderr, "updating default config %s\n", n->dest); + return 0; + } + + /* new is different than on disk, and disk different than old */ + /* log */ + zpm_note_add(conf->log, n->pkglist, n->dest, n->hash, + "default config file update. zpm-cat %.8s", n->hash); + /* TODO check for note error */ + return 1; + +} + static int install_files(void *f, int ncols, char **vals, char **cols) { struct config *conf = f; struct nitem nitem; struct stat existing; int update = 0; - char dest[4096]; /* TODO put the result row in a hash table. May not actually * be faster @@ -776,28 +858,12 @@ static int install_files(void *f, int ncols, char **vals, char **cols) { return install(conf, &nitem, 3); } - if (nitem.configuration) { - /* ohash == nhash, not an update */ - /* fhash == ohash, just update */ - /* fhash != ohash, install as dest.zpmnew, warn */ - /* TODO handle replacing config file - * with config directory */ - /* We don't have the information as to which - * package this is a config file for, so - * we'll need to look it up. - */ - if (diffs & D_OHASH) { - zpm_note_add(conf->log, nitem.pkglist, - nitem.path, nitem.hash, - "default config file update installed as %s.zpmnew", nitem.dest); - - if (strlen(nitem.dest) > sizeof dest - 8) { - return seterror(conf,"config file path too long for install as %s.zpmnew", nitem.dest); - } - fprintf(stderr, "installing as .zpmnew\n"); - sprintf(dest, "%s.zpmnew", nitem.dest); - nitem.dest = dest; - } + switch (adjust_for_config(conf, &nitem, diffs)) { + case -1: return conf->errabort; break; + case 1: + fprintf(stderr, "skipping changed default config file: %s\n", nitem.dest); + return 0; break; + default: break; } /* file exists in filesystem */ @@ -861,6 +927,7 @@ static int install_files(void *f, int ncols, char **vals, char **cols) { return install(conf, &nitem, 7); } /* error, should not be possible, assert(0)? */ + fprintf(stderr,"impossible state: %s:%d\n", __func__, __LINE__); } if (installing) {