summaryrefslogtreecommitdiff
path: root/src/pacman/trans.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pacman/trans.c')
-rw-r--r--src/pacman/trans.c257
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: */