diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pacman/add.c | 2 | ||||
-rw-r--r-- | src/pacman/callback.c | 32 | ||||
-rw-r--r-- | src/pacman/remove.c | 2 | ||||
-rw-r--r-- | src/pacman/sync.c | 77 |
4 files changed, 61 insertions, 52 deletions
diff --git a/src/pacman/add.c b/src/pacman/add.c index debe5c47..9d646e11 100644 --- a/src/pacman/add.c +++ b/src/pacman/add.c @@ -115,7 +115,7 @@ int pacman_add(alpm_list_t *targets) for(i = targets; i; i = alpm_list_next(i)) { char *targ = alpm_list_getdata(i); if(alpm_trans_addtarget(targ) == -1) { - printf("failed.\n"); + printf(_("failed.\n")); fprintf(stderr, _("error: '%s': %s\n"), targ, alpm_strerrorlast()); add_cleanup(); diff --git a/src/pacman/callback.c b/src/pacman/callback.c index 268a8a7f..cf07a09d 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -329,9 +329,8 @@ void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent, /* size of line to allocate for text printing (e.g. not progressbar) */ const int infolen = 50; - int tmp, digits, oprlen, textlen, pkglen; + int tmp, digits, oprlen, textlen, remainlen; char *opr = NULL; - wchar_t *wcopr = NULL; if(config->noprogressbar) { return; @@ -373,15 +372,6 @@ void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent, opr = _("checking for file conflicts"); break; } - /* convert above strings to wide chars */ - oprlen = strlen(opr); - wcopr = calloc(oprlen, sizeof(wchar_t)); - if(!wcopr) { - fprintf(stderr, "malloc failure: could not allocate %zd bytes\n", - strlen(opr) * sizeof(wchar_t)); - return; - } - oprlen = mbstowcs(wcopr, opr, oprlen); /* find # of digits in package counts to scale output */ digits = 1; @@ -392,30 +382,24 @@ void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent, /* determine room left for non-digits text [not ( 1/12) part] */ textlen = infolen - 3 - (2 * digits); - /* room left for package name */ - pkglen = textlen - oprlen - 1; + + oprlen = mbstowcs(NULL, opr, 0); + /* room left (eg for package name) */ + remainlen = textlen - oprlen - 1; switch (event) { case PM_TRANS_PROGRESS_ADD_START: case PM_TRANS_PROGRESS_UPGRADE_START: case PM_TRANS_PROGRESS_REMOVE_START: - /* old way of doing it, but ISO C does not recognize it - printf("(%2$*1$d/%3$*1$d) %4$s %6$-*5$.*5$s", digits, remain, howmany, - opr, pkglen, pkgname);*/ printf("(%*d/%*d) %s %-*.*s", digits, remain, digits, howmany, - opr, pkglen, pkglen, pkgname); + opr, remainlen, remainlen, pkgname); break; case PM_TRANS_PROGRESS_CONFLICTS_START: - /* old way of doing it, but ISO C does not recognize it - printf("(%2$*1$d/%3$*1$d) %5$-*4$s", digits, remain, howmany, - textlen, opr);*/ - printf("(%*d/%*d) %-*s", digits, remain, digits, howmany, - textlen, opr); + printf("(%*d/%*d) %s %-*s", digits, remain, digits, howmany, + opr, remainlen, ""); break; } - free(wcopr); - /* call refactored fill progress function */ fill_progress(percent, percent, getcols() - infolen); diff --git a/src/pacman/remove.c b/src/pacman/remove.c index 0722057f..4c5b5c09 100644 --- a/src/pacman/remove.c +++ b/src/pacman/remove.c @@ -107,7 +107,7 @@ int pacman_remove(alpm_list_t *targets) for(i = finaltargs; i; i = alpm_list_next(i)) { char *targ = alpm_list_getdata(i); if(alpm_trans_addtarget(targ) == -1) { - printf("failed.\n"); + printf(_("failed.\n")); fprintf(stderr, _("error: '%s': %s\n"), targ, alpm_strerrorlast()); remove_cleanup(); diff --git a/src/pacman/sync.c b/src/pacman/sync.c index 27218d61..e3e87703 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -25,6 +25,7 @@ #include <limits.h> #include <unistd.h> #include <dirent.h> +#include <sys/stat.h> #include <alpm.h> #include <alpm_list.h> @@ -57,6 +58,7 @@ static int sync_cleandb(const char *dbpath, int keep_used) { /* step through the directory one file at a time */ while((ent = readdir(dir)) != NULL) { char path[PATH_MAX]; + struct stat buf; alpm_list_t *syncdbs = NULL, *i; int found = 0; char *dname = ent->d_name; @@ -68,6 +70,15 @@ static int sync_cleandb(const char *dbpath, int keep_used) { if(!strcmp(dname, "sync") || !strcmp(dname, "local")) { continue; } + + /* build the full path */ + snprintf(path, PATH_MAX, "%s%s", dbpath, ent->d_name); + /* skip entries that are not dirs (lock file, etc.) */ + stat(path, &buf); + if(!S_ISDIR(buf.st_mode)) { + continue; + } + if(keep_used) { syncdbs = alpm_option_get_syncdbs(); for(i = syncdbs; i && !found; i = alpm_list_next(i)) { @@ -78,9 +89,6 @@ static int sync_cleandb(const char *dbpath, int keep_used) { /* We have a directory that doesn't match any syncdb. * Ask the user if he wants to remove it. */ if(!found) { - /* build the full path */ - snprintf(path, PATH_MAX, "%s%s", dbpath, ent->d_name); - if(!yesno(_("Do you want to remove %s? [Y/n] "), path)) { continue; } @@ -197,6 +205,28 @@ static int sync_cleancache(int level) return(0); } +static int sync_trans_init(pmtransflag_t flags) { + if(alpm_trans_init(PM_TRANS_TYPE_SYNC, flags, cb_trans_evt, + cb_trans_conv, cb_trans_progress) == -1) { + fprintf(stderr, _("error: failed to init transaction (%s)\n"), + alpm_strerrorlast()); + if(pm_errno == PM_ERR_HANDLE_LOCK) { + printf(_(" if you're sure a package manager is not already\n" + " running, you can remove %s.\n"), alpm_option_get_lockfile()); + } + return(-1); + } + return(0); +} + +static int sync_trans_release() { + if(alpm_trans_release() == -1) { + fprintf(stderr, _("error: failed to release transaction (%s)\n"), + alpm_strerrorlast()); + return(-1); + } + return(0); +} static int sync_synctree(int level, alpm_list_t *syncs) { alpm_list_t *i; @@ -476,14 +506,7 @@ static int sync_trans(alpm_list_t *targets, int sync_only) alpm_list_t *sync_dbs = alpm_option_get_syncdbs(); /* Step 1: create a new transaction... */ - if(alpm_trans_init(PM_TRANS_TYPE_SYNC, config->flags, cb_trans_evt, - cb_trans_conv, cb_trans_progress) == -1) { - fprintf(stderr, _("error: failed to init transaction (%s)\n"), - alpm_strerrorlast()); - if(pm_errno == PM_ERR_HANDLE_LOCK) { - printf(_(" if you're sure a package manager is not already\n" - " running, you can remove %s.\n"), alpm_option_get_lockfile()); - } + if(sync_trans_init(config->flags) == -1) { return(1); } @@ -529,22 +552,15 @@ static int sync_trans(alpm_list_t *targets, int sync_only) printf(_(":: pacman has detected a newer version of itself.\n")); if(yesno(_(":: Do you want to cancel the current operation\n" ":: and install the new pacman version now? [Y/n] "))) { - if(alpm_trans_release() == -1) { - fprintf(stderr, _("error: failed to release transaction (%s)\n"), - alpm_strerrorlast()); - retval = 1; - goto cleanup; + if(sync_trans_release() == -1) { + return(1); } - if(alpm_trans_init(PM_TRANS_TYPE_SYNC, config->flags, - cb_trans_evt, cb_trans_conv, cb_trans_progress) == -1) { - fprintf(stderr, _("error: failed to init transaction (%s)\n"), - alpm_strerrorlast()); + if(sync_trans_init(0) == -1) { return(1); } if(alpm_trans_addtarget("pacman") == -1) { fprintf(stderr, _("error: pacman: %s\n"), alpm_strerrorlast()); - retval = 1; - goto cleanup; + return(1); } break; } @@ -744,9 +760,7 @@ cleanup: if(data) { FREELIST(data); } - if(alpm_trans_release() == -1) { - fprintf(stderr, _("error: failed to release transaction (%s)\n"), - alpm_strerrorlast()); + if(sync_trans_release() == -1) { retval = 1; } @@ -760,8 +774,19 @@ int pacman_sync(alpm_list_t *targets) /* clean the cache */ if(config->op_s_clean) { - int ret = sync_cleancache(config->op_s_clean); + int ret = 0; + + if(sync_trans_init(0) == -1) { + return(1); + } + + ret += sync_cleancache(config->op_s_clean); ret += sync_cleandb_all(); + + if(sync_trans_release() == -1) { + ret++; + } + return(ret); } |