From f03bdf7f8edf27f8d06d3cd940d456d46d09a3b4 Mon Sep 17 00:00:00 2001 From: Nathan Wagner Date: Wed, 6 Feb 2019 02:43:12 +0000 Subject: [PATCH] use unsigned longs for op counts --- zpm-syncfs.c | 94 ++++++++++++++++++++++++++-------------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/zpm-syncfs.c b/zpm-syncfs.c index 9889c60..0e82b13 100644 --- a/zpm-syncfs.c +++ b/zpm-syncfs.c @@ -32,10 +32,10 @@ struct config { int setuser, setgroup; int reverse, exitonerror; int overwrite, accept, acceptdir, ignoredirmd; - int ops_total, ops_completed; - int ops_remove, ops_remove_completed; - int ops_update, ops_update_completed; - int ops_install, ops_install_completed; + unsigned long ops_total, ops_completed; + unsigned long ops_remove, ops_remove_completed; + unsigned long ops_update, ops_update_completed; + unsigned long ops_install, ops_install_completed; int progress; /* type of progress meter */ }; @@ -650,41 +650,48 @@ static int check_existing(void *f, int ncols, char **vals, char **cols) { return 0; } +static void update_progress(struct config *conf, char *op, char *path) { + if (!conf->verbose) { + return; + } + + if (conf->progress == 0) { + pdots(50, '.', conf->ops_completed-1, conf->ops_completed, conf->ops_total); + } else if (conf->progress == 1) { + size_t len = strlen(path); + int offset = 0; + if (len > 50) { + offset = len-50; + } + printf("\r%lu/%lu %.10s %.50s\n", conf->ops_completed, + conf->ops_total, op, path+offset); + } else if (conf->progress == 2) { + printf("%lu/%lu %s %s\n", conf->ops_completed, + conf->ops_total, op, path); + } + fflush(stdout); +} + static int remove_files(void *f, int ncols, char **vals, char **cols) { struct config *conf = f; char *dest; struct stat st; int flags = 0; + conf->ops_completed++; + dest = COL("dest"); + char *ftype = COL("filetype"); + if (!dest) return seterror(conf,"no file dest"); + if (!ftype) return seterror(conf,"no file type"); - if (conf->dryrun) { - char *ftype = COL("filetype"); - int t = *ftype; + update_progress(conf, *ftype == 'd' ? "rmdir" : "unlink", dest); - switch(t) { - case 'd': printf("rmdir %s\n", dest); break; - default: printf("unlink %s\n", dest); break; - } - fflush(stdout); + if (conf->dryrun) { return 0; } - if (conf->verbose) { - if (conf->progress == 2) { - fprintf(stderr, "%s(%s)\n", flags ? "rmdir" : "unlink", dest); - } else if (conf->progress == 1) { - /* overwrite */ - pdots(50, '.', conf->ops_completed, conf->ops_completed + 1, conf->ops_total); - conf->ops_completed++; - conf->ops_completed++; - } else { - pdots(50, '.', conf->ops_completed, conf->ops_completed + 1, conf->ops_total); - conf->ops_completed++; - } - } - errno = 0; if (lstat(dest, &st) == -1) { @@ -702,6 +709,9 @@ static int remove_files(void *f, int ncols, char **vals, char **cols) { flags = AT_REMOVEDIR; } /* TODO check that expected filetype matches actual filetype */ + /* alternatively, just use the expected type, skip the stat, + * and let it fail if the type is wrong + */ errno = 0; @@ -783,7 +793,6 @@ static int set_md(struct config *conf, struct nitem *item) { } } - rv = utimensat(AT_FDCWD, item->dest, item->times, AT_SYMLINK_NOFOLLOW); if (rv == -1) { setsyserr(conf, "can't set mtime %.0f %s", (double)item->mtime, @@ -1162,20 +1171,10 @@ static int install_files(void *f, int ncols, char **vals, char **cols) { high = sqlite3_memory_highwater(0)/1024/1024; fprintf(stderr, "memory = %ld MB / %ld MB\n", used, high); #endif - if (conf->verbose && !conf->dryrun) { - if (conf->progress == 2) { - fprintf(stderr, "%s '%c' %s\n", nitem.opstr, nitem.ftype, - nitem.dest); - } else if (conf->progress == 1) { - /* overwrite */ - pdots(50, '.', conf->ops_completed, conf->ops_completed + 1, conf->ops_total); - conf->ops_completed++; - conf->ops_completed++; - } else { - pdots(50, '.', conf->ops_completed, conf->ops_completed + 1, conf->ops_total); - conf->ops_completed++; - } - } + char action[40]; + sprintf(action, "%.8s %c", nitem.opstr, nitem.ftype); + conf->ops_completed++; + update_progress(conf, action, nitem.dest); unsigned int diffs = file_compare(&nitem, &existing); if (diffs >= D_ERROR) { @@ -1568,7 +1567,7 @@ int main(int ac, char **av) { conf.errabort = 1; conf.errors = 0; conf.conflicts = 0; - conf.verbose = 0; + conf.verbose = 1; conf.dryrun = 0; conf.setuser = 1; conf.setgroup = 1; @@ -1605,12 +1604,13 @@ int main(int ac, char **av) { * args are pkgid triple, but will do a pkg find on the pkgdb */ - while ((opt = getopt(ac, av, "f:d:c:nCR:vOAMDp")) != -1) { + while ((opt = getopt(ac, av, "f:d:c:nCR:vqOAMDp")) != -1) { switch (opt) { case 'd': localdbfile = optarg; break; case 'f': pkgdbfile = optarg; break; case 'n': conf.dryrun = 1; break; case 'v': conf.verbose++; break; + case 'q': conf.verbose--; break; case 'C': conf.errabort = 0; break; case 'R': conf.rootdir = optarg; break; case 'N': conf.setuser = 0; conf.setgroup = 0; break; @@ -1689,10 +1689,10 @@ int main(int ac, char **av) { conf.exitonerror = conf.dryrun ? 0 : 1; conf.errabort = conf.dryrun ? 0 : 1; count_ops(&conf); - fprintf(stderr, "file ops: %d\n", conf.ops_total); + fprintf(stderr, "file ops: %lu\n", conf.ops_total); if (conf.ops_remove > 0) { if (conf.verbose) { - fprintf(stderr, "removing %d file%s\n", conf.ops_remove, conf.ops_remove > 1 ? "s" : ""); + fprintf(stderr, "removing %lu file%s\n", conf.ops_remove, conf.ops_remove > 1 ? "s" : ""); } conf.reverse = 1; conf.ops_completed = 0; @@ -1706,7 +1706,7 @@ int main(int ac, char **av) { if (conf.ops_update > 0) { if (conf.verbose) { - fprintf(stderr, "updating %d file%s\n", conf.ops_update, conf.ops_update > 1 ? "s" : ""); + fprintf(stderr, "updating %lu file%s\n", conf.ops_update, conf.ops_update > 1 ? "s" : ""); } conf.reverse = 0; conf.ops_completed = 0; @@ -1720,7 +1720,7 @@ int main(int ac, char **av) { if (conf.ops_install > 0) { if (conf.verbose) { - fprintf(stderr, "installing %d file%s\n", conf.ops_install, conf.ops_install > 1 ? "s" : ""); + fprintf(stderr, "installing %lu file%s\n", conf.ops_install, conf.ops_install > 1 ? "s" : ""); } conf.reverse = 0; conf.ops_completed = 0; -- 2.40.0