Пример #1
0
    def end(self, payload, status, err_msg):
        start = now = time()
        text = unicode(payload)
        size = int(payload.download_size)

        if self.multi_download_id is not None:
            text = self.multi_download_id

        # update state
        if status == dnf.callback.STATUS_MIRROR:
            pass
        elif status == dnf.callback.STATUS_DRPM:
            self.done_drpm += 1
        elif text in self.state:
            if self.multi_download_id is not None:
                start, done = self.state[text]
                size = 0
            else:
                start, done = self.state.pop(text)
                size -= done
            if unicode(payload) in self.active:
                self.active.remove(unicode(payload))
            self.done_files += 1
            self.done_size += size
        elif status == dnf.callback.STATUS_ALREADY_EXISTS:
            self.done_files += 1
            self.done_size += size

        text = unicode(payload)

        if status:
            # the error message, no trimming
            if status is dnf.callback.STATUS_DRPM and self.total_drpm > 1:
                msg = '[%s %d/%d] %s: ' % (self.STATUS_2_STR[status],
                                           self.done_drpm, self.total_drpm,
                                           text)
            else:
                msg = '[%s] %s: ' % (self.STATUS_2_STR[status], text)
            left = _term_width() - len(msg) - 1
            msg = '%s%-*s\n' % (msg, left, err_msg)
        else:
            if self.total_files > 1:
                text = '(%d/%d): %s' % (self.done_files, self.total_files,
                                        text)

            # average rate, file size, download time
            tm = max(now - start, 0.001)
            msg = ' %5sB/s | %5sB %9s    \n' % (format_number(
                float(done) / tm), format_number(done), format_time(tm))
            left = _term_width() - len(msg)
            msg = '%-*.*s%s' % (left, left, text, msg)
        self.message(msg)

        # now there's a blank line. fill it if possible.
        if self.active:
            self._update(now)
Пример #2
0
    def end(self, payload, status, err_msg):
        start = now = time()
        text = unicode(payload)
        size = int(payload.download_size)
        done = 0

        # update state
        if status == dnf.callback.STATUS_MIRROR:
            pass
        elif status == dnf.callback.STATUS_DRPM:
            self.done_drpm += 1
        elif text in self.state:
            start, done = self.state.pop(text)
            self.active.remove(text)
            size -= done
            self.done_files += 1
            self.done_size += size
        elif status == dnf.callback.STATUS_ALREADY_EXISTS:
            self.done_files += 1
            self.done_size += size

        if status:
            # the error message, no trimming
            if status is dnf.callback.STATUS_DRPM and self.total_drpm > 1:
                msg = '[%s %d/%d] %s: ' % (self.STATUS_2_STR[status], self.done_drpm,
                                           self.total_drpm, text)
            else:
                msg = '[%s] %s: ' % (self.STATUS_2_STR[status], text)
            left = _term_width() - len(msg) - 1
            msg = '%s%-*s\n' % (msg, left, err_msg)
        else:
            if self.total_files > 1:
                text = '(%d/%d): %s' % (self.done_files, self.total_files, text)

            # average rate, file size, download time
            tm = max(now - start, 0.001)
            msg = ' %5sB/s | %5sB %9s    \n' % (
                format_number(float(done) / tm),
                format_number(done),
                format_time(tm))
            left = _term_width() - len(msg)
            msg = '%-*.*s%s' % (left, left, text, msg)
        self.message(msg)

        # now there's a blank line. fill it if possible.
        if self.active:
            self._update(now)
Пример #3
0
    def end(self, text, size, err, status='FAILED'):
        """Display a message that file has finished downloading

        text -- the file id
        size -- the file size. None => not a file.
        err -- None if ok, error message otherwise
        status -- Download status (relevant when err != None)
        """
        start = now = time()
        if size is not None:
            # update state
            if text in self.state:
                start, done = self.state.pop(text)
                self.active.remove(text)
                size -= done
            self.done_files += 1
            self.done_size += size

        if err:
            # the error message, no trimming
            msg = '[%s] %s: ' % (status, text)
            left = _term_width() - len(msg) - 1
            msg = '%s%-*s\n' % (msg, left, err)
        else:
            if self.total_files > 1:
                text = '(%d/%d): %s' % (self.done_files, self.total_files, text)

            # average rate, file size, download time
            tm = max(now - start, 0.001)
            msg = ' %5sB/s | %5sB %9s    \n' % (
                format_number(float(done) / tm),
                format_number(done),
                format_time(tm))
            left = _term_width() - len(msg)
            msg = '%-*.*s%s' % (left, left, text, msg)
        self.fo.write(msg)
        self.fo.flush()

        # now there's a blank line. fill it if possible.
        if self.active:
            self._update(now)
Пример #4
0
    def _update(self, now):
        if self.last_time:
            delta_time = now - self.last_time
            delta_size = self.done_size - self.last_size
            if delta_time > 0 and delta_size > 0:
                # update the average rate
                rate = delta_size / delta_time
                if self.rate is not None:
                    weight = min(delta_time / self.rate_average, 1)
                    rate = rate * weight + self.rate * (1 - weight)
                self.rate = rate
        self.last_time = now
        self.last_size = self.done_size
        if not self.isatty:
            return
        # pick one of the active downloads
        text = self.active[int(now / self.tick_period) % len(self.active)]
        if self.total_files > 1:
            n = '%d' % (self.done_files + 1)
            if len(self.active) > 1:
                n += '-%d' % (self.done_files + len(self.active))
            text = '(%s/%d): %s' % (n, self.total_files, text)

        # average rate, total done size, estimated remaining time
        if self.rate and self.total_size:
            time_eta = format_time(
                (self.total_size - self.done_size) / self.rate)
        else:
            time_eta = '--:--'
        msg = ' %5sB/s | %5sB %9s ETA\r' % (format_number(
            self.rate) if self.rate else '---  ', format_number(
                self.done_size), time_eta)
        left = _term_width() - len(msg)
        bl = (left - 7) // 2
        if bl > 8:
            # use part of the remaining space for progress bar
            if self.total_size:
                pct = self.done_size * 100 // self.total_size
                n, p = divmod(self.done_size * bl * 2 // self.total_size, 2)
                bar = '=' * n + '-' * p
                msg = '%3d%% [%-*s]%s' % (pct, bl, bar, msg)
                left -= bl + 7
            else:
                n = self.unknown_progres - 3
                p = 3
                n = 0 if n < 0 else n
                bar = ' ' * n + '=' * p
                msg = '%3s%% [%-*s]%s' % ('???', bl, bar, msg)
                left -= bl + 7
                self.unknown_progres = self.unknown_progres + 3 if self.unknown_progres + 3 < bl \
                    else 0

        self.message('%-*.*s%s' % (left, left, text, msg))
Пример #5
0
    def _update(self, now):
        if self.last_time:
            delta_time = now - self.last_time
            delta_size = self.done_size - self.last_size
            if delta_time > 0 and delta_size > 0:
                # update the average rate
                rate = delta_size / delta_time
                if self.rate is not None:
                    weight = min(delta_time/self.rate_average, 1)
                    rate = rate*weight + self.rate*(1 - weight)
                self.rate = rate
        self.last_time = now
        self.last_size = self.done_size
        if not self.isatty:
            return
        # pick one of the active downloads
        text = self.active[int(now/self.tick_period) % len(self.active)]
        if self.total_files > 1:
            n = '%d' % (self.done_files + 1)
            if len(self.active) > 1:
                n += '-%d' % (self.done_files + len(self.active))
            text = '(%s/%d): %s' % (n, self.total_files, text)

        # average rate, total done size, estimated remaining time
        if self.rate and self.total_size:
            time_eta = format_time((self.total_size - self.done_size) / self.rate)
        else:
            time_eta = '--:--'
        msg = ' %5sB/s | %5sB %9s ETA\r' % (
            format_number(self.rate) if self.rate else '---  ',
            format_number(self.done_size),
            time_eta)
        left = _term_width() - len(msg)
        bl = (left - 7)//2
        if bl > 8:
            # use part of the remaining space for progress bar
            if self.total_size:
                pct = self.done_size * 100 // self.total_size
                n, p = divmod(self.done_size * bl * 2 // self.total_size, 2)
                bar = '=' * n + '-' * p
                msg = '%3d%% [%-*s]%s' % (pct, bl, bar, msg)
                left -= bl + 7
            else:
                n = self.unknown_progres - 3
                p = 3
                n = 0 if n < 0 else n
                bar = ' ' * n + '=' * p
                msg = '%3s%% [%-*s]%s' % ('???', bl, bar, msg)
                left -= bl + 7
                self.unknown_progres = self.unknown_progres + 3 if self.unknown_progres + 3 < bl \
                    else 0

        self.message('%-*.*s%s' % (left, left, text, msg))
Пример #6
0
    def _update(self, now):
        if self.last_time:
            delta_time = now - self.last_time
            delta_size = self.done_size - self.last_size
            if delta_time > 0 and delta_size > 0:
                # update the average rate
                rate = delta_size / delta_time
                if self.rate is not None:
                    weight = min(delta_time/self.rate_average, 1)
                    rate = rate*weight + self.rate*(1 - weight)
                self.rate = rate
        self.last_time = now
        self.last_size = self.done_size

        # pick one of the active downloads
        text = self.active[int(now/self.tick_period) % len(self.active)]
        if self.total_files > 1:
            n = '%d' % (self.done_files + 1)
            if len(self.active) > 1:
                n += '-%d' % (self.done_files + len(self.active))
            text = '(%s/%d): %s' % (n, self.total_files, text)

        # average rate, total done size, estimated remaining time
        msg = ' %5sB/s | %5sB %9s ETA\r' % (
            format_number(self.rate) if self.rate else '---  ',
            format_number(self.done_size),
            format_time((self.total_size - self.done_size) / self.rate) if self.rate else '--:--')
        left = _term_width() - len(msg)
        bl = (left - 7)//2
        # the progressbar is way too big when installing in parallel
        indent = int(bl / 2) if _term_width() <= 120 else 0
        if (bl - indent) > 8:
            # use part of the remaining space for progress bar
            pct = self.done_size*100 // self.total_size
            n, p = divmod(self.done_size*(bl - indent)*2 // self.total_size, 2)
            bar = '='*n + '-'*p
            msg = '%3d%% [%-*s]%s' % (pct, bl - indent, bar, msg)
            left -= bl + 7
        self.fo.write('%-*.*s%s' % (left + indent, left + indent, text, msg))
        self.fo.flush()
Пример #7
0
    def end(self, payload, status, err_msg):
        start = now = time()
        text = str(payload)
        size = int(payload.download_size)

        # update state
        if status in (dnf.callback.STATUS_MIRROR, dnf.callback.STATUS_DRPM):
            pass
        elif text in self.state:
            start, done = self.state.pop(text)
            self.active.remove(text)
            size -= done
            self.done_files += 1
            self.done_size += size
        elif status == dnf.callback.STATUS_ALREADY_EXISTS:
            self.done_files += 1
            self.done_size += size

        if status:
            # the error message, no trimming
            msg = '[%s] %s: ' % (self.STATUS_2_STR[status], text)
            left = _term_width() - len(msg) - 1
            msg = '%s%-*s\n' % (msg, left, err_msg)
        else:
            if self.total_files > 1:
                text = '(%d/%d): %s' % (self.done_files, self.total_files,
                                        text)

            # average rate, file size, download time
            tm = max(now - start, 0.001)
            msg = ' %5sB/s | %5sB %9s    \n' % (format_number(
                float(done) / tm), format_number(done), format_time(tm))
            left = _term_width() - len(msg)
            msg = '%-*.*s%s' % (left, left, text, msg)
        self.fo.write(msg)
        self.fo.flush()

        # now there's a blank line. fill it if possible.
        if self.active:
            self._update(now)
Пример #8
0
    def _update(self, now):
        if self.last_time:
            delta_time = now - self.last_time
            delta_size = self.done_size - self.last_size
            if delta_time > 0 and delta_size > 0:
                # update the average rate
                rate = delta_size / delta_time
                if self.rate is not None:
                    weight = min(delta_time / self.rate_average, 1)
                    rate = rate * weight + self.rate * (1 - weight)
                self.rate = rate
        self.last_time = now
        self.last_size = self.done_size

        # pick one of the active downloads
        text = self.active[int(now / self.tick_period) % len(self.active)]
        if self.total_files > 1:
            n = "%d" % (self.done_files + 1)
            if len(self.active) > 1:
                n += "-%d" % (self.done_files + len(self.active))
            text = "(%s/%d): %s" % (n, self.total_files, text)

        # average rate, total done size, estimated remaining time
        msg = " %5sB/s | %5sB %9s ETA\r" % (
            format_number(self.rate) if self.rate else "---  ",
            format_number(self.done_size),
            format_time((self.total_size - self.done_size) / self.rate) if self.rate else "--:--",
        )
        left = _term_width() - len(msg)
        bl = (left - 7) // 2
        if bl > 8:
            # use part of the remaining space for progress bar
            pct = self.done_size * 100 // self.total_size
            n, p = divmod(self.done_size * bl * 2 // self.total_size, 2)
            bar = "=" * n + "-" * p
            msg = "%3d%% [%-*s]%s" % (pct, bl, bar, msg)
            left -= bl + 7
        self.fo.write("%-*.*s%s" % (left, left, text, msg))
        self.fo.flush()