summaryrefslogtreecommitdiffstats
path: root/src/pacman/sync.c
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2012-03-16 23:57:04 +0100
committerDan McGee <dan@archlinux.org>2012-03-16 23:57:04 +0100
commit8da489eac53513841d62380a72aae1baecc44e61 (patch)
tree1526dbe3366f0d62d2749c3c5cd75eb80c96228e /src/pacman/sync.c
parent0972b7acfd7c8fadb6aeec6606ea85bf6c5d3d3d (diff)
downloadpacman-8da489eac53513841d62380a72aae1baecc44e61.tar.gz
pacman-8da489eac53513841d62380a72aae1baecc44e61.tar.xz
Reduce calls to getcols
This dramatically improves upon a much older attempt in 2008 in commit ce3d70aa99ab86. We don't need to call it once per line we print unless there is a reasonable expectation of being able to resize the terminal mid-operation; this is really only the case during our callback progress bars. Some before and after numbers of ioctl() calls, gleaned from strace of the following operations (no targets to any of them to maximize the amount of output): pacman -Qii : 37768 -> 2616 (93.1% decrease) pacman -Qs : 2616 -> 4 (99.8%) pacman -Sii : 133036 -> 10926 (91.8%) pacman -Ss : 10926 -> 14 (99.9%) Obviously the search results are astounding; we only call getcols() once in the case of -Qs, and once per repo in the case of -Ss. For -Qii and -Sii we are still calling it once per package, but this is much better than once per line of info output. Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'src/pacman/sync.c')
-rw-r--r--src/pacman/sync.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/pacman/sync.c b/src/pacman/sync.c
index d782a94d..74e417c4 100644
--- a/src/pacman/sync.c
+++ b/src/pacman/sync.c
@@ -360,6 +360,7 @@ static int sync_search(alpm_list_t *syncs, alpm_list_t *targets)
for(i = syncs; i; i = alpm_list_next(i)) {
alpm_db_t *db = i->data;
+ unsigned short cols;
/* if we have a targets list, search for packages matching it */
if(targets) {
ret = alpm_db_search(db, targets);
@@ -373,6 +374,7 @@ static int sync_search(alpm_list_t *syncs, alpm_list_t *targets)
} else {
found = 1;
}
+ cols = getcols(fileno(stdout));
for(j = ret; j; j = alpm_list_next(j)) {
alpm_list_t *grp;
alpm_pkg_t *pkg = j->data;
@@ -402,10 +404,10 @@ static int sync_search(alpm_list_t *syncs, alpm_list_t *targets)
print_installed(db_local, pkg);
/* we need a newline and initial indent first */
- printf("\n ");
- indentprint(alpm_pkg_get_desc(pkg), 4);
+ fputs("\n ", stdout);
+ indentprint(alpm_pkg_get_desc(pkg), 4, cols);
}
- printf("\n");
+ fputc('\n', stdout);
}
/* we only want to free if the list was a search list */
if(freelist) {
@@ -1005,7 +1007,7 @@ int pacman_sync(alpm_list_t *targets)
if(config->op_s_upgrade || (tmp = alpm_list_diff(targets, packages, (alpm_list_fn_cmp)strcmp))) {
alpm_list_free(tmp);
printf(_(":: The following packages should be upgraded first :\n"));
- list_display(" ", packages);
+ list_display(" ", packages, getcols(fileno(stdout)));
if(yesno(_(":: Do you want to cancel the current operation\n"
":: and upgrade these packages now?"))) {
FREELIST(targs);