diff options
Diffstat (limited to 'src/pacman/trans.c')
-rw-r--r-- | src/pacman/trans.c | 257 |
1 files changed, 224 insertions, 33 deletions
diff --git a/src/pacman/trans.c b/src/pacman/trans.c index 279d431a..2f770cf0 100644 --- a/src/pacman/trans.c +++ b/src/pacman/trans.c @@ -26,6 +26,7 @@ #include <sys/stat.h> #include <unistd.h> #include <dirent.h> +#include <math.h> #include <libintl.h> #include <alpm.h> @@ -39,63 +40,123 @@ #define LOG_STR_LEN 256 extern config_t *config; +extern unsigned int maxcols; + +int prevpercent=0; /* for less progressbar output */ /* Callback to handle transaction events */ void cb_trans_evt(unsigned char event, void *data1, void *data2) { char str[LOG_STR_LEN] = ""; + char out[PATH_MAX]; + int i; switch(event) { case PM_TRANS_EVT_CHECKDEPS_START: - MSG(NL, _("checking dependencies... ")); + pm_fprintf(stderr, NL, _("checking dependencies... ")); break; case PM_TRANS_EVT_FILECONFLICTS_START: - MSG(NL, _("checking for file conflicts... ")); + pm_fprintf(stderr, NL, _("checking for file conflicts... ")); break; case PM_TRANS_EVT_RESOLVEDEPS_START: - MSG(NL, _("resolving dependencies... ")); + pm_fprintf(stderr, NL, _("resolving dependencies... ")); break; case PM_TRANS_EVT_INTERCONFLICTS_START: - MSG(NL, _("looking for inter-conflicts... ")); + pm_fprintf(stderr, NL, _("looking for inter-conflicts... ")); break; case PM_TRANS_EVT_CHECKDEPS_DONE: case PM_TRANS_EVT_FILECONFLICTS_DONE: case PM_TRANS_EVT_RESOLVEDEPS_DONE: case PM_TRANS_EVT_INTERCONFLICTS_DONE: - MSG(CL, _("done.\n")); + pm_fprintf(stderr, CL, _("done.\n")); + break; + case PM_TRANS_EVT_EXTRACT_DONE: + if(!config->noprogressbar) { + MSG(NL, ""); + } break; case PM_TRANS_EVT_ADD_START: - MSG(NL, _("installing %s... "), (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME)); + if(config->noprogressbar) { + MSG(NL, _("installing %s... "), (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME)); + } break; case PM_TRANS_EVT_ADD_DONE: - MSG(CL, _("done.\n")); + if(config->noprogressbar) { + MSG(CL, _("done.\n")); + } snprintf(str, LOG_STR_LEN, _("installed %s (%s)"), (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME), (char *)alpm_pkg_getinfo(data1, PM_PKG_VERSION)); alpm_logaction(str); break; case PM_TRANS_EVT_REMOVE_START: + if(config->noprogressbar) { MSG(NL, _("removing %s... "), (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME)); + } break; case PM_TRANS_EVT_REMOVE_DONE: - MSG(CL, _("done.\n")); + if(config->noprogressbar) { + MSG(CL, _("done.\n")); + } else { + MSG(NL, ""); + } snprintf(str, LOG_STR_LEN, _("removed %s (%s)"), (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME), (char *)alpm_pkg_getinfo(data1, PM_PKG_VERSION)); alpm_logaction(str); break; case PM_TRANS_EVT_UPGRADE_START: - MSG(NL, _("upgrading %s... "), (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME)); + if(config->noprogressbar) { + MSG(NL, _("upgrading %s... "), (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME)); + } break; case PM_TRANS_EVT_UPGRADE_DONE: - MSG(CL, _("done.\n")); + if(config->noprogressbar) { + MSG(CL, _("done.\n")); + } snprintf(str, LOG_STR_LEN, _("upgraded %s (%s -> %s)"), (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME), (char *)alpm_pkg_getinfo(data2, PM_PKG_VERSION), (char *)alpm_pkg_getinfo(data1, PM_PKG_VERSION)); alpm_logaction(str); break; + case PM_TRANS_EVT_INTEGRITY_START: + MSG(NL, _("checking package integrity... ")); + break; + case PM_TRANS_EVT_INTEGRITY_DONE: + MSG(CL, _("done.\n")); + break; + case PM_TRANS_EVT_SCRIPTLET_INFO: + MSG(NL, "%s\n", (char*)data1); + break; + case PM_TRANS_EVT_SCRIPTLET_START: + MSG(NL, (char*)data1); + MSG(CL, "..."); + break; + case PM_TRANS_EVT_SCRIPTLET_DONE: + if(!(long)data1) { + MSG(CL, _(" done.\n")); + } else { + MSG(CL, _(" failed.\n")); + } + break; + case PM_TRANS_EVT_PRINTURI: + MSG(NL, "%s%s\n", (char*)data1, (char*)data2); + break; + case PM_TRANS_EVT_RETRIEVE_START: + MSG(NL, _("\n:: Retrieving packages from %s...\n"), (char*)data1); + fflush(stdout); + break; + case PM_TRANS_EVT_RETRIEVE_LOCAL: + MSG(NL, " %s [", (char*)data1); + STRNCPY(out, (char*)data2, maxcols-42); + MSG(CL, "%s", out); + for(i = strlen(out); i < maxcols-43; i++) { + MSG(CL, " "); + } + fputs(_("] 100% LOCAL "), stdout); + break; } } @@ -105,46 +166,176 @@ void cb_trans_conv(unsigned char event, void *data1, void *data2, void *data3, i switch(event) { case PM_TRANS_CONV_INSTALL_IGNOREPKG: - snprintf(str, LOG_STR_LEN, _(":: %s requires %s, but it is in IgnorePkg. Install anyway? [Y/n] "), - (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME), - (char *)alpm_pkg_getinfo(data2, PM_PKG_NAME)); - *response = yesno(str); + if(config->noask) { + if(config->ask & PM_TRANS_CONV_INSTALL_IGNOREPKG) { + *response = 1; + } else { + *response = 0; + } + } else { + snprintf(str, LOG_STR_LEN, _(":: %s requires %s, but it is in IgnorePkg. Install anyway? [Y/n] "), + (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME), + (char *)alpm_pkg_getinfo(data2, PM_PKG_NAME)); + *response = yesno(str); + } + break; + case PM_TRANS_CONV_REMOVE_HOLDPKG: + if(config->noask) { + if(config->ask & PM_TRANS_CONV_REMOVE_HOLDPKG) { + *response = 1; + } else { + *response = 0; + } + } else { + snprintf(str, LOG_STR_LEN, _(":: %s is designated as a HoldPkg. Remove anyway? [Y/n] "), + (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME)); + *response = yesno(str); + } break; case PM_TRANS_CONV_REPLACE_PKG: - snprintf(str, LOG_STR_LEN, _(":: Replace %s with %s/%s? [Y/n] "), - (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME), - (char *)data3, - (char *)alpm_pkg_getinfo(data2, PM_PKG_NAME)); - *response = yesno(str); + if(config->noask) { + if(config->ask & PM_TRANS_CONV_REPLACE_PKG) { + *response = 1; + } else { + *response = 0; + } + } else { + snprintf(str, LOG_STR_LEN, _(":: Replace %s with %s/%s? [Y/n] "), + (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME), + (char *)data3, + (char *)alpm_pkg_getinfo(data2, PM_PKG_NAME)); + *response = yesno(str); + } break; case PM_TRANS_CONV_CONFLICT_PKG: - snprintf(str, LOG_STR_LEN, _(":: %s conflicts with %s. Remove %s? [Y/n] "), - (char *)data1, - (char *)data2, - (char *)data2); - *response = yesno(str); + if(config->noask) { + if(config->ask & PM_TRANS_CONV_CONFLICT_PKG) { + *response = 1; + } else { + *response = 0; + } + } else { + snprintf(str, LOG_STR_LEN, _(":: %s conflicts with %s. Remove %s? [Y/n] "), + (char *)data1, + (char *)data2, + (char *)data2); + *response = yesno(str); + } break; case PM_TRANS_CONV_LOCAL_NEWER: - if(!config->op_s_downloadonly) { - snprintf(str, LOG_STR_LEN, _(":: %s-%s: local version is newer. Upgrade anyway? [Y/n] "), + if(config->noask) { + if(config->ask & PM_TRANS_CONV_LOCAL_NEWER) { + *response = 1; + } else { + *response = 0; + } + } else { + if(!config->op_s_downloadonly) { + snprintf(str, LOG_STR_LEN, _(":: %s-%s: local version is newer. Upgrade anyway? [Y/n] "), (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME), (char *)alpm_pkg_getinfo(data1, PM_PKG_VERSION)); - *response = yesno(str); - } else { - *response = 1; + *response = yesno(str); + } else { + *response = 1; + } } break; case PM_TRANS_CONV_LOCAL_UPTODATE: - if(!config->op_s_downloadonly) { - snprintf(str, LOG_STR_LEN, _(":: %s-%s: local version is up to date. Upgrade anyway? [Y/n] "), + if(config->noask) { + if(config->ask & PM_TRANS_CONV_LOCAL_UPTODATE) { + *response = 1; + } else { + *response = 0; + } + } else { + if(!config->op_s_downloadonly) { + snprintf(str, LOG_STR_LEN, _(":: %s-%s: local version is up to date. Upgrade anyway? [Y/n] "), (char *)alpm_pkg_getinfo(data1, PM_PKG_NAME), (char *)alpm_pkg_getinfo(data1, PM_PKG_VERSION)); - *response = yesno(str); + *response = yesno(str); + } else { + *response = 1; + } + } + break; + case PM_TRANS_CONV_CORRUPTED_PKG: + if(config->noask) { + if(config->ask & PM_TRANS_CONV_CORRUPTED_PKG) { + *response = 1; + } else { + *response = 0; + } } else { - *response = 1; + if(!config->noconfirm) { + snprintf(str, LOG_STR_LEN, _(":: Archive %s is corrupted. Do you want to delete it? [Y/n] "), + (char *)data1); + *response = yesno(str); + } else { + *response = 1; + } } break; } } +void cb_trans_progress(unsigned char event, char *pkgname, int percent, int howmany, int remain) +{ + int i, hash; + unsigned int maxpkglen, progresslen = maxcols - 57; + char *addstr, *upgstr, *removestr, *ptr; + addstr = strdup(_("installing")); + upgstr = strdup(_("upgrading")); + removestr = strdup(_("removing")); + + if(config->noprogressbar) { + return; + } + + if (!pkgname) + return; + if (percent > 100) + return; + if(percent == prevpercent) + return; + + prevpercent=percent; + switch (event) { + case PM_TRANS_PROGRESS_ADD_START: + ptr = addstr; + break; + + case PM_TRANS_PROGRESS_UPGRADE_START: + ptr = upgstr; + break; + case PM_TRANS_PROGRESS_REMOVE_START: + ptr = removestr; + break; + } + hash=percent*progresslen/100; + + // if the package name is too long, then slice the ending + maxpkglen=46-strlen(ptr)-(3+2*(int)log10(howmany)); + if(strlen(pkgname)>maxpkglen) + pkgname[maxpkglen]='\0'; + + putchar('('); + for(i=0;i<(int)log10(howmany)-(int)log10(remain);i++) + putchar(' '); + printf("%d/%d) %s %s ", remain, howmany, ptr, pkgname); + if (strlen(pkgname)<maxpkglen) + for (i=maxpkglen-strlen(pkgname)-1; i>0; i--) + putchar(' '); + printf("["); + for (i = progresslen; i > 0; i--) { + if (i >= progresslen - hash) + printf("#"); + else + printf("-"); + } + MSG(CL, "] %3d%%\r", percent); + FREE(addstr); + FREE(upgstr); + FREE(removestr); +} + /* vim: set ts=2 sw=2 noet: */ |