From 5a8bbc99be0ec8ea264fca061276e9ec798bca5e Mon Sep 17 00:00:00 2001 From: Aaron Griffin Date: Tue, 31 Oct 2006 06:41:42 +0000 Subject: Numerous changes: * Added 'ILoveCandy' support to all progress bars * Changed download callback with regards to libfetch libalpm changes * libfetch error output on failed sync * Misc others I may have forgot to name (check the diff, heh) --- src/pacman/Makefile.am | 14 ++-- src/pacman/download.c | 182 ++++++++++++++++++++++++++++--------------------- src/pacman/download.h | 4 +- src/pacman/log.c | 6 +- src/pacman/package.c | 4 +- src/pacman/pacman.c | 52 ++++---------- src/pacman/query.c | 10 ++- src/pacman/sync.c | 19 ++++-- src/pacman/trans.c | 43 ++++++++++-- 9 files changed, 191 insertions(+), 143 deletions(-) (limited to 'src') diff --git a/src/pacman/Makefile.am b/src/pacman/Makefile.am index 6b5f8bc1..fdfac1eb 100644 --- a/src/pacman/Makefile.am +++ b/src/pacman/Makefile.am @@ -7,17 +7,19 @@ DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ AM_CFLAGS = -D_GNU_SOURCE \ -I$(top_srcdir)/lib/libalpm \ - -I$(top_srcdir)/lib/libftp + -I$(top_srcdir)/lib/libfetch pacman_SOURCES = util.c log.c list.c package.c download.c trans.c add.c \ remove.c upgrade.c query.c sync.c conf.c deptest.c pacman.c pacman_static_SOURCES = $(pacman_SOURCES) -pacman_LDADD = \ - $(top_srcdir)/lib/libalpm/libalpm.la +pacman_LDADD = -L$(top_srcdir)/lib/libalpm/.libs \ + -L$(top_srcdir)/lib/libfetch -lfetch \ + -larchive -lm -lalpm -lssl -lcrypto -pacman_static_LDADD = \ - $(top_srcdir)/lib/libalpm/.libs/libalpm.a $(LDFLAGS) +pacman_static_LDADD = -L$(top_srcdir)/lib/libalpm/.libs/ \ + -L$(top_srcdir)/lib/libfetch -lfetch \ + -larchive -lm -lalpm -lssl -lcrypto -pacman_static_LDFLAGS = -all-static +pacman_static_LDFLAGS = $(LDFLAGS) -all-static diff --git a/src/pacman/download.c b/src/pacman/download.c index 1b28cccf..17d0cf21 100644 --- a/src/pacman/download.c +++ b/src/pacman/download.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include @@ -40,112 +39,139 @@ #include "conf.h" /* progress bar */ -char sync_fnm[PM_DLFNM_LEN+1]; -int offset; -struct timeval t0, t; -float rate; -int xfered1; -unsigned int eta_h, eta_m, eta_s; +float rate_last; +int xfered_last; +struct timeval last_time; +struct timeval initial_time; /* pacman options */ extern config_t *config; extern unsigned int maxcols; -int log_progress(netbuf *ctl, int xfered, void *arg) +#define FILENAME_TRIM_LEN 21 +#define UPDATE_SPEED_SEC 0.1 + +void log_progress(const char *filename, int xfered, int total) { - int fsz = *(int*)arg; - int pct = ((float)(xfered+offset) / fsz) * 100; - static int lastpct=0; - unsigned int i, cur; - struct timeval t1; - float timediff; - /* a little hard to conceal easter eggs in open-source software, but - * they're still fun. ;) - */ - int chomp; - static unsigned short mouth; - static unsigned int lastcur = 0; + static int lasthash = 0, mouth = 0; + int i, hash; + long chomp = 0; + char *fname, *p; + unsigned int progresslen = maxcols - 57; + int percent = ((float)xfered) / ((float)total) * 100; + struct timeval current_time; + float rate = 0.0; + unsigned int eta_h = 0, eta_m = 0, eta_s = 0; + float total_timediff, timediff; - /* we don't need that parameter */ - ctl=NULL; + if(xfered == 0) { + gettimeofday(&initial_time, NULL); + gettimeofday(&last_time, NULL); + xfered_last = 0; + rate_last = 0.0; + } - if(config->noprogressbar || (pct == 100 && lastpct == 100)) { - return(1); + if(config->noprogressbar) { + return; } - alpm_get_option(PM_OPT_CHOMP, (long *)&chomp); + /* a little hard to conceal easter eggs in open-source software, but they're still fun. ;) */ + alpm_get_option(PM_OPT_CHOMP, &chomp); - gettimeofday(&t1, NULL); - if(xfered+offset == fsz) { - t = t0; + gettimeofday(¤t_time, NULL); + total_timediff = current_time.tv_sec-initial_time.tv_sec + + (float)(current_time.tv_usec-initial_time.tv_usec) / 1000000; + timediff = current_time.tv_sec-last_time.tv_sec + + (float)(current_time.tv_usec-last_time.tv_usec) / 1000000; + + if(xfered == total) { + /* compute final values */ + rate = total / (total_timediff * 1024); + eta_s = (int)total_timediff; + } else if(timediff < UPDATE_SPEED_SEC) { + /* we avoid computing the ETA on too small periods of time, so that + results are more significant */ + return; + } else { + rate = (xfered - xfered_last) / (timediff * 1024); + rate = (rate + 2*rate_last) / 3; + eta_s = (total - xfered) / (rate * 1024); } - timediff = t1.tv_sec-t.tv_sec + (float)(t1.tv_usec-t.tv_usec) / 1000000; - - if(xfered+offset == fsz) { - /* average download rate */ - rate = xfered / (timediff * 1024); - /* total download time */ - eta_s = (int)timediff; - eta_h = eta_s / 3600; - eta_s -= eta_h * 3600; - eta_m = eta_s / 60; - eta_s -= eta_m * 60; - } else if(timediff > 1) { - /* we avoid computing the rate & ETA on too small periods of time, so that - results are more significant */ - rate = (xfered-xfered1) / (timediff * 1024); - xfered1 = xfered; - gettimeofday(&t, NULL); - eta_s = (fsz-(xfered+offset)) / (rate * 1024); - eta_h = eta_s / 3600; - eta_s -= eta_h * 3600; - eta_m = eta_s / 60; - eta_s -= eta_m * 60; + + rate_last = rate; + last_time = current_time; + xfered_last = xfered; + + /* fix up time for display */ + eta_h = eta_s / 3600; + eta_s -= eta_h * 3600; + eta_m = eta_s / 60; + eta_s -= eta_m * 60; + + fname = strdup(filename); + if((p = strstr(fname, PM_EXT_PKG)) || (p = strstr(fname, PM_EXT_DB))) { + *p = '\0'; + } + if(strlen(fname) > FILENAME_TRIM_LEN) { + fname[FILENAME_TRIM_LEN] = '\0'; } - if(rate > 1000) { - printf("%*s %6dK %6.0fK/s %02d:%02d:%02d [", PM_DLFNM_LEN, sync_fnm, ((xfered+offset) / 1024), rate, eta_h, eta_m, eta_s); - } else { - printf("%*s %6dK %6.1fK/s %02d:%02d:%02d [", PM_DLFNM_LEN, sync_fnm, ((xfered+offset) / 1024), rate, eta_h, eta_m, eta_s); + /* hide the cursor i - prevent flicker + printf("\033[?25l\033[?1c"); + */ + + /* + * DL rate cap, for printf formatting - this should be sane for a while + * if anything we can change to MB/s if we need a higher rate + */ + if(rate > 9999.9) { + rate = 9999.9; } - cur = (int)((maxcols-57)*pct/100); - for(i = 0; i < maxcols-57; i++) { + + printf(" %-*s %6dK %#6.1fK/s %02d:%02d:%02d [", FILENAME_TRIM_LEN, fname, xfered/1024, rate, eta_h, eta_m, eta_s); + + free(fname); + + hash = percent*progresslen/100; + for(i = progresslen; i > 0; --i) { if(chomp) { - if(i < cur) { + if(i > progresslen - hash) { printf("-"); - } else { - if(i == cur) { - if(lastcur == cur) { - if(mouth) { - printf("\033[1;33mC\033[m"); - } else { - printf("\033[1;33mc\033[m"); - } + } else if(i == progresslen - hash) { + if(lasthash == hash) { + if(mouth) { + printf("\033[1;33mC\033[m"); } else { - mouth = mouth == 1 ? 0 : 1; - if(mouth) { - printf("\033[1;33mC\033[m"); - } else { - printf("\033[1;33mc\033[m"); - } + printf("\033[1;33mc\033[m"); } } else { - printf("\033[0;37m*\033[m"); + lasthash = hash; + mouth = mouth == 1 ? 0 : 1; + if(mouth) { + printf("\033[1;33mC\033[m"); + } else { + printf("\033[1;33mc\033[m"); + } } + } else if(i%3 == 0) { + printf("\033[0;37mo\033[m"); + } else { + printf("\033[0;37m \033[m"); } + } else if(i > progresslen - hash) { + printf("#"); } else { - (i < cur) ? printf("#") : printf(" "); + printf("-"); } } - printf("] %3d%%\r", pct); - if(lastpct != 100 && pct == 100) { + printf("] %3d%%\r", percent); + + if(percent == 100) { printf("\n"); } - lastcur = cur; - lastpct = pct; fflush(stdout); - return(1); + return; } /* vim: set ts=2 sw=2 noet: */ diff --git a/src/pacman/download.h b/src/pacman/download.h index 80364f9c..9fc628ce 100644 --- a/src/pacman/download.h +++ b/src/pacman/download.h @@ -28,9 +28,7 @@ extern float rate; extern int xfered1; extern unsigned int eta_h, eta_m, eta_s; -#ifdef __FTPLIB_H -int log_progress(netbuf *ctl, int xfered, void *arg); -#endif +void log_progress(const char *filename, int xfered, int total); #endif /* _PM_DOWNLOAD_H */ diff --git a/src/pacman/log.c b/src/pacman/log.c index 52f30902..01a9a143 100644 --- a/src/pacman/log.c +++ b/src/pacman/log.c @@ -74,6 +74,7 @@ void cb_log(unsigned short level, char *msg) break; } +#ifdef PACMAN_DEBUG time_t t; struct tm *tmp; char timestr[10] = {0}; @@ -84,6 +85,9 @@ void cb_log(unsigned short level, char *msg) timestr[8] = '\0'; MSG(NL, "[%s] %s: %s\n", timestr, str, msg); +#else + MSG(NL, "%s: %s\n", str, msg); +#endif } /* Wrapper to fprintf() that allows to choose if we want the output @@ -96,7 +100,7 @@ void pm_fprintf(FILE *file, unsigned short line, char *fmt, ...) char str[LOG_STR_LEN]; if(neednl == 1 && line == NL) { - fprintf(stdout, "\n"); + fprintf(file, "\n"); neednl = 0; } diff --git a/src/pacman/package.c b/src/pacman/package.c index af60421a..0a069055 100644 --- a/src/pacman/package.c +++ b/src/pacman/package.c @@ -88,8 +88,10 @@ void dump_pkg_full(PM_PKG *pkg, int level) if(level > 1) { PM_LIST *i; + long lroot; char *root; - alpm_get_option(PM_OPT_ROOT, (long *)&root); + alpm_get_option(PM_OPT_ROOT, &lroot); + root = (void *)&root; fprintf(stdout, "\n"); for(i = alpm_list_first(alpm_pkg_getinfo(pkg, PM_PKG_BACKUP)); i; i = alpm_list_next(i)) { struct stat buf; diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 3b1fb8fa..a6072a22 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -40,7 +40,6 @@ #include /* debug */ #endif #include -#include #include /* pacman */ @@ -220,7 +219,11 @@ static void cleanup(int signum) if(neednl) { putchar('\n'); } + + /* restore the cursor + printf("\033[?25h\033[?0c"); fflush(stdout); + */ exit(signum); } @@ -431,6 +434,10 @@ int main(int argc, char *argv[]) signal(SIGTERM, cleanup); signal(SIGSEGV, cleanup); + /* hide the cursor, prevent flicker during fancy graphics + printf("\033[?25l\033[?1c"); + */ + /* i18n init */ lang=getenv("LC_ALL"); if(lang==NULL || lang[0]=='\0') @@ -533,46 +540,13 @@ int main(int argc, char *argv[]) ERR(NL, _("failed to set option DLCB (%s)\n"), alpm_strerror(pm_errno)); cleanup(1); } - if(alpm_set_option(PM_OPT_DLFNM, (long)sync_fnm) == -1) { - ERR(NL, _("failed to set option DLFNM (%s)\n"), alpm_strerror(pm_errno)); - cleanup(1); - } - if(alpm_set_option(PM_OPT_DLOFFSET, (long)&offset) == -1) { - ERR(NL, _("failed to set option DLOFFSET (%s)\n"), alpm_strerror(pm_errno)); - cleanup(1); - } - if(alpm_set_option(PM_OPT_DLT0, (long)&t0) == -1) { - ERR(NL, _("failed to set option DLT0 (%s)\n"), alpm_strerror(pm_errno)); - cleanup(1); - } - if(alpm_set_option(PM_OPT_DLT, (long)&t) == -1) { - ERR(NL, _("failed to set option DLT (%s)\n"), alpm_strerror(pm_errno)); - cleanup(1); - } - if(alpm_set_option(PM_OPT_DLRATE, (long)&rate) == -1) { - ERR(NL, _("failed to set option DLRATE (%s)\n"), alpm_strerror(pm_errno)); - cleanup(1); - } - if(alpm_set_option(PM_OPT_DLXFERED1, (long)&xfered1) == -1) { - ERR(NL, _("failed to set option DLXFERED1 (%s)\n"), alpm_strerror(pm_errno)); - cleanup(1); - } - if(alpm_set_option(PM_OPT_DLETA_H, (long)&eta_h) == -1) { - ERR(NL, _("failed to set option DLETA_H (%s)\n"), alpm_strerror(pm_errno)); - cleanup(1); - } - if(alpm_set_option(PM_OPT_DLETA_M, (long)&eta_m) == -1) { - ERR(NL, _("failed to set option DLETA_M (%s)\n"), alpm_strerror(pm_errno)); - cleanup(1); - } - if(alpm_set_option(PM_OPT_DLETA_S, (long)&eta_s) == -1) { - ERR(NL, _("failed to set option DLETA_S (%s)\n"), alpm_strerror(pm_errno)); - cleanup(1); - } FREE(config->dbpath); - alpm_get_option(PM_OPT_DBPATH, (long *)&config->dbpath); + long ldbpath, lcachedir; + alpm_get_option(PM_OPT_DBPATH, &ldbpath); + config->dbpath = (void *)&ldbpath; FREE(config->cachedir); - alpm_get_option(PM_OPT_CACHEDIR, (long *)&config->cachedir); + alpm_get_option(PM_OPT_CACHEDIR, &lcachedir); + config->cachedir = (void *)&lcachedir; for(lp = config->op_s_ignore; lp; lp = lp->next) { if(alpm_set_option(PM_OPT_IGNOREPKG, (long)lp->data) == -1) { diff --git a/src/pacman/query.c b/src/pacman/query.c index 54828072..48d4cde5 100644 --- a/src/pacman/query.c +++ b/src/pacman/query.c @@ -46,6 +46,7 @@ static int query_fileowner(PM_DB *db, char *filename) int gotcha = 0; char rpath[PATH_MAX]; PM_LIST *lp; + long lroot; char *root; if(db == NULL) { @@ -61,7 +62,8 @@ static int query_fileowner(PM_DB *db, char *filename) return(1); } - alpm_get_option(PM_OPT_ROOT, (long *)&root); + alpm_get_option(PM_OPT_ROOT, &lroot); + root = (void *)&lroot; for(lp = alpm_db_getpkgcache(db); lp && !gotcha; lp = alpm_list_next(lp)) { PM_PKG *info; @@ -250,7 +252,7 @@ int pacman_query(list_t *targets) } } } else { - char *pkgname, *pkgver, changelog[PATH_MAX]; + char *pkgname = NULL, *pkgver = NULL, changelog[PATH_MAX]; info = alpm_db_readpkg(db_local, package); if(info == NULL) { @@ -261,8 +263,10 @@ int pacman_query(list_t *targets) /* find a target */ if(config->op_q_changelog || config->op_q_info || config->op_q_list) { if(config->op_q_changelog) { + long ldbpath; char *dbpath; - alpm_get_option(PM_OPT_DBPATH, (long *)&dbpath); + alpm_get_option(PM_OPT_DBPATH, &ldbpath); + dbpath = (void *)&ldbpath; snprintf(changelog, PATH_MAX, "%s%s/%s/%s-%s/changelog", config->root, dbpath, (char*)alpm_db_getinfo(db_local, PM_DB_TREENAME), diff --git a/src/pacman/sync.c b/src/pacman/sync.c index 07cd3699..012a7604 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -37,6 +37,7 @@ #endif #include +#include /* fetchLastErrString */ /* pacman */ #include "util.h" #include "log.h" @@ -53,11 +54,14 @@ extern list_t *pmc_syncs; static int sync_cleancache(int level) { + long lroot, lcachedir; char *root, *cachedir; char dirpath[PATH_MAX]; - alpm_get_option(PM_OPT_ROOT, (long *)&root); - alpm_get_option(PM_OPT_CACHEDIR, (long *)&cachedir); + alpm_get_option(PM_OPT_ROOT, &lroot); + root = (void *)&lroot; + alpm_get_option(PM_OPT_CACHEDIR, &lcachedir); + cachedir = (void *)&lcachedir; snprintf(dirpath, PATH_MAX, "%s%s", root, cachedir); @@ -162,14 +166,15 @@ static int sync_synctree(int level, list_t *syncs) sync_t *sync = (sync_t *)i->data; ret = alpm_db_update((level < 2 ? 0 : 1), sync->db); - if(ret > 0) { + if(ret < 0) { if(pm_errno == PM_ERR_DB_SYNC) { - ERR(NL, _("failed to synchronize %s\n"), sync->treename); + /* use libfetch error */ + ERR(NL, _("failed to synchronize %s: %s\n"), sync->treename, fetchLastErrString); } else { ERR(NL, _("failed to update %s (%s)\n"), sync->treename, alpm_strerror(pm_errno)); } success--; - } else if(ret < 0) { + } else if(ret == 1) { MSG(NL, _(" %s is up to date\n"), sync->treename); } } @@ -350,7 +355,7 @@ int pacman_sync(list_t *targets) { int confirm = 0; int retval = 0; - list_t *i; + list_t *i = NULL; PM_LIST *packages, *data, *lp; if(pmc_syncs == NULL || !list_count(pmc_syncs)) { @@ -495,7 +500,7 @@ int pacman_sync(list_t *targets) /* targ not found in sync db, searching for providers... */ PM_LIST *k = NULL; PM_PKG *pkg; - char *pname; + char *pname = NULL; for(j = pmc_syncs; j && !k; j = j->next) { sync_t *sync = j->data; k = alpm_db_whatprovides(sync->db, targ); diff --git a/src/pacman/trans.c b/src/pacman/trans.c index 29e55791..2fffcb18 100644 --- a/src/pacman/trans.c +++ b/src/pacman/trans.c @@ -288,9 +288,11 @@ void cb_trans_conv(unsigned char event, void *data1, void *data2, void *data3, i void cb_trans_progress(unsigned char event, char *pkgname, int percent, int howmany, int remain) { + static int lasthash = 0, mouth = 0; int i, hash; + long chomp = 0; unsigned int maxpkglen, progresslen = maxcols - 57; - char *addstr, *upgstr, *removestr, *conflictstr, *ptr; + char *addstr, *upgstr, *removestr, *conflictstr, *ptr = NULL; addstr = strdup(_("installing")); upgstr = strdup(_("upgrading")); removestr = strdup(_("removing")); @@ -355,14 +357,45 @@ void cb_trans_progress(unsigned char event, char *pkgname, int percent, int howm break; } + alpm_get_option(PM_OPT_CHOMP, &chomp); + + /* hide the cursor, prevent flicker during fancy graphics + printf("\033[?25l\033[?1c["); + */ printf("["); - for (i = progresslen; i > 0; i--) { - if (i >= progresslen - hash) + for(i = progresslen; i > 0; --i) { + if(chomp) { + if(i > progresslen - hash) { + printf("-"); + } else if(i == progresslen - hash) { + if(lasthash == hash) { + if(mouth) { + printf("\033[1;33mC\033[m"); + } else { + printf("\033[1;33mc\033[m"); + } + } else { + lasthash = hash; + mouth = mouth == 1 ? 0 : 1; + if(mouth) { + printf("\033[1;33mC\033[m"); + } else { + printf("\033[1;33mc\033[m"); + } + } + } else if(i%3 == 0) { + printf("\033[0;37mo\033[m"); + } else { + printf("\033[0;37m \033[m"); + } + } else if(i > progresslen - hash) { printf("#"); - else + } else { printf("-"); + } } - MSG(CL, "] %3d%%\r", percent); + printf("] %3d%%\r", percent); + FREE(addstr); FREE(upgstr); FREE(removestr); -- cgit v1.2.3-54-g00ecf