From 0a9a23716feba9e31e7980d1cfad049fac8a6ada Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 21 Jul 2011 15:44:10 +0200 Subject: [PATCH] Fix download information. --- pakfire/builder.py | 3 +-- pakfire/packages/util.py | 10 ++++++-- pakfire/transaction.py | 42 +++++++++++++++++++++++++++--- pakfire/util.py | 32 ++++++++++++++++++++++- po/pakfire.pot | 55 +++++++++++++++++++++++----------------- 5 files changed, 110 insertions(+), 32 deletions(-) diff --git a/pakfire/builder.py b/pakfire/builder.py index 72fdd9093..b25f2f631 100644 --- a/pakfire/builder.py +++ b/pakfire/builder.py @@ -77,8 +77,7 @@ class Builder(object): self.log.info(line % logdata) # Create pakfire instance. - self.pakfire = base.Pakfire("builder", distro_config=distro_config, - **pakfire_args) + self.pakfire = base.Pakfire(distro_config=distro_config, **pakfire_args) self.distro = self.pakfire.distro self.path = self.pakfire.path diff --git a/pakfire/packages/util.py b/pakfire/packages/util.py index 4a00630d1..bee2ccce4 100644 --- a/pakfire/packages/util.py +++ b/pakfire/packages/util.py @@ -71,14 +71,20 @@ def text_wrap(s, length=65): return [" ".join(l) for l in t] def format_size(s): - units = ("B", "k", "M", "G", "T") + units = (" ", "k", "M", "G", "T") unit = 0 while s >= 1024 and unit < len(units): s /= 1024 unit += 1 - return "%d%s" % (int(s), units[unit]) + return "%d %s" % (int(s), units[unit]) + +def format_time(s): + return "%02d:%02d" % (s // 60, s % 60) + +def format_speed(s): + return "%sB/s" % format_size(s) def calc_hash1(filename=None, data=None): h = hashlib.sha1() diff --git a/pakfire/transaction.py b/pakfire/transaction.py index 60d785eb5..79f767e99 100644 --- a/pakfire/transaction.py +++ b/pakfire/transaction.py @@ -4,6 +4,7 @@ import logging import os import progressbar import sys +import time import packages import satsolver @@ -204,13 +205,46 @@ class Transaction(object): return [a for a in self.actions if a.needs_download] def download(self): - downloads = self.downloads + # Get all download actions as a list. + downloads = [d for d in self.downloads] + downloads.sort() + + # If there are no downloads, we can just stop here. + if not downloads: + return + + logging.info(_("Downloading packages:")) + time_start = time.time() + + # Calculate downloadsize. + download_size = 0 + for action in downloads: + download_size += action.pkg.size i = 0 - for action in self.actions: + for action in downloads: i += 1 - - action.download(text="(%02d/%02d): " % (i, len(downloads))) + action.download(text="(%d/%d): " % (i, len(downloads))) + + # Write an empty line to the console when there have been any downloads. + width, height = util.terminal_size() + + # Print a nice line. + logging.info("-" * width) + + # Format and calculate download information. + time_stop = time.time() + download_time = time_stop - time_start + download_speed = download_size / download_time + download_speed = util.format_speed(download_speed) + download_size = util.format_size(download_size) + download_time = util.format_time(download_time) + + line = _("%s | %-5sB %s ") % \ + (download_speed, download_size, download_time) + line = " " * (width - len(line)) + line + logging.info(line) + logging.info("") def dump_pkg(self, pkg): ret = [] diff --git a/pakfire/util.py b/pakfire/util.py index d452f20d5..2c263a8ff 100644 --- a/pakfire/util.py +++ b/pakfire/util.py @@ -1,15 +1,18 @@ #!/usr/bin/python +import fcntl import os import progressbar import random import shutil import string +import struct import sys +import termios import time from errors import Error -from packages.util import calc_hash1, format_size +from packages.util import calc_hash1, format_size, format_speed, format_time from i18n import _ def cli_is_interactive(): @@ -92,3 +95,30 @@ def rm(path, *args, **kargs): os.system("chattr -R -i %s" % path) else: raise + +def ioctl_GWINSZ(fd): + try: + cr = struct.unpack("hh", fcntl.ioctl(fd, termios.TIOCGWINSZ, "1234")) + except: + return None + + return cr + +def terminal_size(): + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except: + pass + + if not cr: + try: + cr = (os.environ['LINES'], os.environ['COLUMNS']) + except: + cr = (25, 80) + + return int(cr[1]), int(cr[0]) diff --git a/po/pakfire.pot b/po/pakfire.pot index d91bbcd5f..6c597ecb1 100644 --- a/po/pakfire.pot +++ b/po/pakfire.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-07-21 14:50+0200\n" +"POT-Creation-Date: 2011-07-21 15:40+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ../pakfire/builder.py:247 +#: ../pakfire/builder.py:246 #, python-format msgid "Extracting: %s (source)" msgstr "" @@ -130,7 +130,7 @@ msgstr "" msgid "Cleanup all temporary files." msgstr "" -#: ../pakfire/cli.py:234 ../pakfire/transaction.py:248 +#: ../pakfire/cli.py:234 ../pakfire/transaction.py:281 msgid "Repository" msgstr "" @@ -238,11 +238,11 @@ msgstr "" msgid "Name" msgstr "" -#: ../pakfire/packages/base.py:70 ../pakfire/transaction.py:247 +#: ../pakfire/packages/base.py:70 ../pakfire/transaction.py:280 msgid "Arch" msgstr "" -#: ../pakfire/packages/base.py:71 ../pakfire/transaction.py:247 +#: ../pakfire/packages/base.py:71 ../pakfire/transaction.py:280 msgid "Version" msgstr "" @@ -250,7 +250,7 @@ msgstr "" msgid "Release" msgstr "" -#: ../pakfire/packages/base.py:73 ../pakfire/transaction.py:248 +#: ../pakfire/packages/base.py:73 ../pakfire/transaction.py:281 msgid "Size" msgstr "" @@ -318,78 +318,87 @@ msgstr "" msgid "Loading installed packages" msgstr "" -#: ../pakfire/transaction.py:103 +#: ../pakfire/transaction.py:104 #, python-format msgid "Extracting: %s" msgstr "" -#: ../pakfire/transaction.py:106 +#: ../pakfire/transaction.py:107 #, python-format msgid "Installing: %s" msgstr "" -#: ../pakfire/transaction.py:108 +#: ../pakfire/transaction.py:109 #, python-format msgid "Reinstalling: %s" msgstr "" -#: ../pakfire/transaction.py:110 +#: ../pakfire/transaction.py:111 #, python-format msgid "Updating: %s" msgstr "" -#: ../pakfire/transaction.py:112 +#: ../pakfire/transaction.py:113 #, python-format msgid "Downgrading: %s" msgstr "" -#: ../pakfire/transaction.py:129 +#: ../pakfire/transaction.py:130 #, python-format msgid "Removing: %s" msgstr "" -#: ../pakfire/transaction.py:247 +#: ../pakfire/transaction.py:216 +msgid "Downloading packages:" +msgstr "" + +#: ../pakfire/transaction.py:243 +#, python-format +msgid "%s | %-5sB %s " +msgstr "" + +#: ../pakfire/transaction.py:280 msgid "Package" msgstr "" -#: ../pakfire/transaction.py:252 +#: ../pakfire/transaction.py:285 msgid "Installing:" msgstr "" -#: ../pakfire/transaction.py:253 +#: ../pakfire/transaction.py:286 msgid "Reinstalling:" msgstr "" -#: ../pakfire/transaction.py:254 +#: ../pakfire/transaction.py:287 msgid "Updating:" msgstr "" -#: ../pakfire/transaction.py:255 +#: ../pakfire/transaction.py:288 msgid "Downgrading:" msgstr "" -#: ../pakfire/transaction.py:256 +#: ../pakfire/transaction.py:289 msgid "Removing:" msgstr "" -#: ../pakfire/transaction.py:262 +#: ../pakfire/transaction.py:295 msgid "Transaction Summary" msgstr "" -#: ../pakfire/transaction.py:269 +#: ../pakfire/transaction.py:302 msgid "package" msgstr "" -#: ../pakfire/transaction.py:275 +#: ../pakfire/transaction.py:308 #, python-format msgid "Total download size: %s" msgstr "" -#: ../pakfire/transaction.py:284 +#: ../pakfire/transaction.py:317 msgid "Is this okay?" msgstr "" -#: ../pakfire/util.py:36 +#: ../pakfire/util.py:39 #, python-format msgid "%s [y/N]" msgstr "" -- 2.39.5