Exemplo n.º 1
0
 def test_fill_exact_width(self):
     msg = "message"
     pre = "<"
     suf = ">"
     self.assertEqual("%-*.*s" % (5, 10, msg), fill_exact_width(msg, 5, 10))
     self.assertEqual("重uř ", fill_exact_width("重uř", 5, 10))
     self.assertEqual("%10.5s" % msg, fill_exact_width(msg, 10, 5, left=False))
     self.assertEqual("%s%.5s%s" % (pre, msg, suf), fill_exact_width(msg, 0, 5, prefix=pre, suffix=suf))
Exemplo n.º 2
0
 def test_fill_exact_width(self):
     msg = "message"
     pre = "<"
     suf = ">"
     self.assertEqual("%-*.*s" % (5, 10, msg), fill_exact_width(msg, 5, 10))
     self.assertEqual("重uř ", fill_exact_width("重uř", 5, 10))
     self.assertEqual("%10.5s" % msg,
                      fill_exact_width(msg, 10, 5, left=False))
     self.assertEqual("%s%.5s%s" % (pre, msg, suf),
                      fill_exact_width(msg, 0, 5, prefix=pre, suffix=suf))
Exemplo n.º 3
0
    def run(self, extcmds):
        if len(extcmds) >= 1 and extcmds[0] in ('all', 'disabled', 'enabled'):
            arg = extcmds[0]
            extcmds = extcmds[1:]
        else:
            arg = 'enabled'
        extcmds = [x.lower() for x in extcmds]

        verbose = self.base.conf.verbose

        repos = list(self.base.repos.values())
        repos.sort(key=operator.attrgetter('id'))
        enabled_repos = self.base.repos.enabled()
        term = self.output.term
        on_ehibeg = term.FG_COLOR['green'] + term.MODE['bold']
        on_dhibeg = term.FG_COLOR['red']
        on_hiend = term.MODE['normal']
        tot_num = 0
        cols = []
        for repo in repos:
            if len(extcmds) and not _repo_match(repo, extcmds):
                continue
            (ehibeg, dhibeg, hiend) = '', '', ''
            ui_enabled = ''
            ui_endis_wid = 0
            ui_num = ""
            ui_excludes_num = ''
            force_show = False
            if arg == 'all' or repo.id in extcmds or repo.name in extcmds:
                force_show = True
                (ehibeg, dhibeg, hiend) = (on_ehibeg, on_dhibeg, on_hiend)
            if repo in enabled_repos:
                enabled = True
                if arg == 'enabled':
                    force_show = False
                elif arg == 'disabled' and not force_show:
                    continue
                if force_show or verbose:
                    ui_enabled = ehibeg + _('enabled') + hiend
                    ui_endis_wid = exact_width(_('enabled'))
                    if not verbose:
                        ui_enabled += ": "
                        ui_endis_wid += 2
                if verbose:
                    ui_size = _repo_size(self.base.sack, repo)
                # We don't show status for list disabled
                if arg != 'disabled' or verbose:
                    num = len(
                        self.base.sack.query().filter(reponame__eq=repo.id))
                    ui_num = _num2ui_num(num)
                    tot_num += num
            else:
                enabled = False
                if arg == 'disabled':
                    force_show = False
                elif arg == 'enabled' and not force_show:
                    continue
                ui_enabled = dhibeg + _('disabled') + hiend
                ui_endis_wid = exact_width(_('disabled'))

            if not verbose:
                rid = repo.id
                if enabled and repo.metalink:
                    mdts = repo.metadata.timestamp
                    if mdts > repo.metadata.md_timestamp:
                        rid = '*' + rid
                cols.append(
                    (rid, repo.name, (ui_enabled, ui_endis_wid), ui_num))
            else:
                if enabled:
                    md = repo.metadata
                else:
                    md = None
                out = [
                    self.output.fmtKeyValFill(_("Repo-id      : "), repo.id),
                    self.output.fmtKeyValFill(_("Repo-name    : "), repo.name)
                ]

                if force_show or extcmds:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-status  : "),
                                                  ui_enabled)
                    ]
                if md and md.revision is not None:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-revision: "),
                                                  md.revision)
                    ]
                if md and md.content_tags:
                    tags = md.content_tags
                    out += [
                        self.output.fmtKeyValFill(_("Repo-tags    : "),
                                                  ", ".join(sorted(tags)))
                    ]

                if md and md.distro_tags:
                    for (distro, tags) in md.distro_tags.items():
                        out += [
                            self.output.fmtKeyValFill(
                                _("Repo-distro-tags: "),
                                "[%s]: %s" % (distro, ", ".join(sorted(tags))))
                        ]

                if md:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-updated : "),
                                                  time.ctime(md.md_timestamp)),
                        self.output.fmtKeyValFill(_("Repo-pkgs    : "),
                                                  ui_num),
                        self.output.fmtKeyValFill(_("Repo-size    : "),
                                                  ui_size)
                    ]

                if repo.metalink:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-metalink: "),
                                                  repo.metalink)
                    ]
                    if enabled:
                        ts = repo.metadata.timestamp
                        out += [
                            self.output.fmtKeyValFill(_("  Updated    : "),
                                                      time.ctime(ts))
                        ]
                elif repo.mirrorlist:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-mirrors : "),
                                                  repo.mirrorlist)
                    ]
                baseurls = repo.baseurl
                if baseurls:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-baseurl : "),
                                                  ", ".join(baseurls))
                    ]
                elif enabled and md.mirrors:
                    url = "%s (%d more)" % (md.mirrors[0], len(md.mirrors) - 1)
                    out += [
                        self.output.fmtKeyValFill(_("Repo-baseurl : "), url)
                    ]

                expire = _expire_str(repo, md)
                out += [
                    self.output.fmtKeyValFill(_("Repo-expire  : "), expire)
                ]

                if repo.exclude:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-exclude : "),
                                                  ", ".join(repo.exclude))
                    ]

                if repo.include:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-include : "),
                                                  ", ".join(repo.include))
                    ]

                if ui_excludes_num:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-excluded: "),
                                                  ui_excludes_num)
                    ]

                if repo.repofile:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-filename: "),
                                                  repo.repofile)
                    ]

                logger.log(dnf.logging.DEBUG, "%s\n", "\n".join(map(ucd, out)))

        if not verbose and cols:
            #  Work out the first (id) and last (enabled/disalbed/count),
            # then chop the middle (name)...
            id_len = exact_width(_('repo id'))
            nm_len = 0
            st_len = 0
            ui_len = 0

            for (rid, rname, (ui_enabled, ui_endis_wid), ui_num) in cols:
                if id_len < exact_width(rid):
                    id_len = exact_width(rid)
                if nm_len < exact_width(rname):
                    nm_len = exact_width(rname)
                if st_len < (ui_endis_wid + len(ui_num)):
                    st_len = (ui_endis_wid + len(ui_num))
                # Need this as well as above for: fill_exact_width()
                if ui_len < len(ui_num):
                    ui_len = len(ui_num)
            if arg == 'disabled':  # Don't output a status column.
                left = term.columns - (id_len + 1)
            elif exact_width(_('status')) > st_len:
                left = term.columns - (id_len + len(_('status')) + 2)
            else:
                left = term.columns - (id_len + st_len + 2)

            if left < nm_len:  # Name gets chopped
                nm_len = left
            else:  # Share the extra...
                left -= nm_len
                id_len += left // 2
                nm_len += left - (left // 2)

            txt_rid = fill_exact_width(_('repo id'), id_len)
            txt_rnam = fill_exact_width(_('repo name'), nm_len, nm_len)
            if arg == 'disabled':  # Don't output a status column.
                logger.info("%s %s", txt_rid, txt_rnam)
            else:
                logger.info("%s %s %s", txt_rid, txt_rnam, _('status'))
            for (rid, rname, (ui_enabled, ui_endis_wid), ui_num) in cols:
                if arg == 'disabled':  # Don't output a status column.
                    logger.info("%s %s", fill_exact_width(rid, id_len),
                                fill_exact_width(rname, nm_len, -nm_len))
                    continue

                if ui_num:
                    ui_num = fill_exact_width(ui_num, ui_len, left=False)
                logger.info("%s %s %s%s", fill_exact_width(rid, id_len),
                            fill_exact_width(rname, nm_len, nm_len),
                            ui_enabled, ui_num)
        msg = 'Total packages: %s' % _num2ui_num(tot_num)
        logger.debug(msg)
Exemplo n.º 4
0
    def run(self):
        arg = self.opts.repos_action
        extcmds = [x.lower() for x in self.opts.repos]

        verbose = self.base.conf.verbose

        repos = list(self.base.repos.values())
        repos.sort(key=operator.attrgetter('id'))
        term = self.output.term
        on_ehibeg = term.FG_COLOR['green'] + term.MODE['bold']
        on_dhibeg = term.FG_COLOR['red']
        on_hiend = term.MODE['normal']
        tot_num = 0
        cols = []
        if not repos:
            logger.warning(_('No repositories available'))
            return
        include_status = arg == 'all' or (arg == 'enabled-default' and extcmds)
        repoinfo_output = []
        for repo in repos:
            if len(extcmds) and not _repo_match(repo, extcmds):
                continue
            (ehibeg, dhibeg, hiend) = '', '', ''
            ui_enabled = ''
            ui_endis_wid = 0
            ui_excludes_num = ''
            if include_status:
                (ehibeg, dhibeg, hiend) = (on_ehibeg, on_dhibeg, on_hiend)
            if repo.enabled:
                enabled = True
                if arg == 'disabled':
                    continue
                if any((include_status, verbose, 'repoinfo'
                        in self.opts.command)):
                    ui_enabled = ehibeg + _('enabled') + hiend
                    ui_endis_wid = exact_width(_('enabled'))
                if verbose or ('repoinfo' in self.opts.command):
                    ui_size = _repo_size(self.base.sack, repo)
            else:
                enabled = False
                if arg == 'enabled' or (arg == 'enabled-default'
                                        and not extcmds):
                    continue
                ui_enabled = dhibeg + _('disabled') + hiend
                ui_endis_wid = exact_width(_('disabled'))

            if not any((verbose, ('repoinfo' in self.opts.command))):
                rid = ucd(repo.id)
                cols.append((rid, repo.name, (ui_enabled, ui_endis_wid)))
            else:
                if enabled:
                    md = repo.metadata
                else:
                    md = None
                out = [
                    self.output.fmtKeyValFill(_("Repo-id            : "),
                                              repo.id),
                    self.output.fmtKeyValFill(_("Repo-name          : "),
                                              repo.name)
                ]

                if include_status:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-status        : "),
                                                  ui_enabled)
                    ]
                if md and repo._repo.getRevision():
                    out += [
                        self.output.fmtKeyValFill(_("Repo-revision      : "),
                                                  repo._repo.getRevision())
                    ]
                if md and repo._repo.getContentTags():
                    tags = repo._repo.getContentTags()
                    out += [
                        self.output.fmtKeyValFill(_("Repo-tags          : "),
                                                  ", ".join(sorted(tags)))
                    ]

                if md and repo._repo.getDistroTags():
                    distroTagsDict = {
                        k: v
                        for (k, v) in repo._repo.getDistroTags()
                    }
                    for (distro, tags) in distroTagsDict.items():
                        out += [
                            self.output.fmtKeyValFill(
                                _("Repo-distro-tags      : "),
                                "[%s]: %s" % (distro, ", ".join(sorted(tags))))
                        ]

                if md:
                    num = len(
                        self.base.sack.query(
                            flags=hawkey.IGNORE_EXCLUDES).filterm(
                                reponame__eq=repo.id))
                    num_available = len(
                        self.base.sack.query().filterm(reponame__eq=repo.id))
                    ui_num = _num2ui_num(num)
                    ui_num_available = _num2ui_num(num_available)
                    tot_num += num
                    out += [
                        self.output.fmtKeyValFill(
                            _("Repo-updated       : "),
                            dnf.util.normalize_time(
                                repo._repo.getMaxTimestamp())),
                        self.output.fmtKeyValFill(_("Repo-pkgs          : "),
                                                  ui_num),
                        self.output.fmtKeyValFill(_("Repo-available-pkgs: "),
                                                  ui_num_available),
                        self.output.fmtKeyValFill(_("Repo-size          : "),
                                                  ui_size)
                    ]

                if repo.metalink:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-metalink      : "),
                                                  repo.metalink)
                    ]
                    if enabled:
                        ts = repo._repo.getTimestamp()
                        out += [
                            self.output.fmtKeyValFill(
                                _("  Updated          : "),
                                dnf.util.normalize_time(ts))
                        ]
                elif repo.mirrorlist:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-mirrors       : "),
                                                  repo.mirrorlist)
                    ]
                baseurls = repo.baseurl
                if baseurls:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-baseurl       : "),
                                                  ", ".join(baseurls))
                    ]
                elif enabled:
                    mirrors = repo._repo.getMirrors()
                    if mirrors:
                        url = "%s (%d more)" % (mirrors[0], len(mirrors) - 1)
                        out += [
                            self.output.fmtKeyValFill(
                                _("Repo-baseurl       : "), url)
                        ]

                expire = _expire_str(repo, md)
                out += [
                    self.output.fmtKeyValFill(_("Repo-expire        : "),
                                              expire)
                ]

                if repo.excludepkgs:
                    # TRANSLATORS: Packages that are excluded - their names like (dnf systemd)
                    out += [
                        self.output.fmtKeyValFill(_("Repo-exclude       : "),
                                                  ", ".join(repo.excludepkgs))
                    ]

                if repo.includepkgs:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-include       : "),
                                                  ", ".join(repo.includepkgs))
                    ]

                if ui_excludes_num:
                    # TRANSLATORS: Number of packages that where excluded (5)
                    out += [
                        self.output.fmtKeyValFill(_("Repo-excluded      : "),
                                                  ui_excludes_num)
                    ]

                if repo.repofile:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-filename      : "),
                                                  repo.repofile)
                    ]
                repoinfo_output.append("\n".join(map(ucd, out)))

        if repoinfo_output:
            print("\n\n".join(repoinfo_output))
        if not verbose and cols:
            #  Work out the first (id) and last (enabled/disabled/count),
            # then chop the middle (name)...

            id_len = exact_width(_('repo id'))
            nm_len = 0
            st_len = 0

            for (rid, rname, (ui_enabled, ui_endis_wid)) in cols:
                if id_len < exact_width(rid):
                    id_len = exact_width(rid)
                if nm_len < exact_width(rname):
                    nm_len = exact_width(rname)
                if st_len < ui_endis_wid:
                    st_len = ui_endis_wid
                # Need this as well as above for: fill_exact_width()
            if include_status:
                if exact_width(_('status')) > st_len:
                    left = term.columns - (id_len + len(_('status')) + 2)
                else:
                    left = term.columns - (id_len + st_len + 2)
            else:  # Don't output a status column.
                left = term.columns - (id_len + 1)

            if left < nm_len:  # Name gets chopped
                nm_len = left
            else:  # Share the extra...
                left -= nm_len
                id_len += left // 2
                nm_len += left - (left // 2)

            txt_rid = fill_exact_width(_('repo id'), id_len)
            if include_status:
                txt_rnam = fill_exact_width(_('repo name'), nm_len, nm_len)
            else:
                txt_rnam = _('repo name')
            if not include_status:  # Don't output a status column.
                print("%s %s" % (txt_rid, txt_rnam))
            else:
                print("%s %s %s" % (txt_rid, txt_rnam, _('status')))
            for (rid, rname, (ui_enabled, ui_endis_wid)) in cols:
                if not include_status:  # Don't output a status column.
                    print("%s %s" % (fill_exact_width(rid, id_len), rname))
                    continue

                print("%s %s %s" %
                      (fill_exact_width(rid, id_len),
                       fill_exact_width(rname, nm_len, nm_len), ui_enabled))
        if any((verbose, ('repoinfo' in self.opts.command))):
            msg = _('Total packages: {}')
            print(msg.format(_num2ui_num(tot_num)))
Exemplo n.º 5
0
    def run(self):
        extcmds = self.opts.extcmds
        if len(extcmds) >= 1 and extcmds[0] in ('all', 'disabled', 'enabled'):
            arg = extcmds[0]
            extcmds = extcmds[1:]
        else:
            arg = 'enabled'
        extcmds = [x.lower() for x in extcmds]

        verbose = self.base.conf.verbose

        repos = list(self.base.repos.values())
        repos.sort(key=operator.attrgetter('id'))
        enabled_repos = self.base.repos.enabled()
        term = self.output.term
        on_ehibeg = term.FG_COLOR['green'] + term.MODE['bold']
        on_dhibeg = term.FG_COLOR['red']
        on_hiend = term.MODE['normal']
        tot_num = 0
        cols = []
        for repo in repos:
            if len(extcmds) and not _repo_match(repo, extcmds):
                continue
            (ehibeg, dhibeg, hiend) = '', '', ''
            ui_enabled = ''
            ui_endis_wid = 0
            ui_num = ""
            ui_excludes_num = ''
            force_show = False
            if arg == 'all' or repo.id in extcmds or repo.name in extcmds:
                force_show = True
                (ehibeg, dhibeg, hiend) = (on_ehibeg, on_dhibeg, on_hiend)
            if repo in enabled_repos:
                enabled = True
                if arg == 'enabled':
                    force_show = False
                elif arg == 'disabled' and not force_show:
                    continue
                if force_show or verbose:
                    ui_enabled = ehibeg + _('enabled') + hiend
                    ui_endis_wid = exact_width(_('enabled'))
                    if not verbose:
                        ui_enabled += ": "
                        ui_endis_wid += 2
                if verbose:
                    ui_size = _repo_size(self.base.sack, repo)
                # We don't show status for list disabled
                if arg != 'disabled' or verbose:
                    num = len(self.base.sack.query().filter(
                        reponame__eq=repo.id))
                    ui_num = _num2ui_num(num)
                    tot_num += num
            else:
                enabled = False
                if arg == 'disabled':
                    force_show = False
                elif arg == 'enabled' and not force_show:
                    continue
                ui_enabled = dhibeg + _('disabled') + hiend
                ui_endis_wid = exact_width(_('disabled'))

            if not verbose:
                rid = repo.id
                if enabled and repo.metalink:
                    mdts = repo.metadata.timestamp
                    if mdts > repo.metadata.md_timestamp:
                        rid = '*' + rid
                cols.append((rid, repo.name,
                             (ui_enabled, ui_endis_wid), ui_num))
            else:
                if enabled:
                    md = repo.metadata
                else:
                    md = None
                out = [self.output.fmtKeyValFill(_("Repo-id      : "), repo.id),
                       self.output.fmtKeyValFill(_("Repo-name    : "), repo.name)]

                if force_show or extcmds:
                    out += [self.output.fmtKeyValFill(_("Repo-status  : "),
                                               ui_enabled)]
                if md and md.revision is not None:
                    out += [self.output.fmtKeyValFill(_("Repo-revision: "),
                                               md.revision)]
                if md and md.content_tags:
                    tags = md.content_tags
                    out += [self.output.fmtKeyValFill(_("Repo-tags    : "),
                                               ", ".join(sorted(tags)))]

                if md and md.distro_tags:
                    for (distro, tags) in md.distro_tags.items():
                        out += [self.output.fmtKeyValFill(_("Repo-distro-tags: "),
                                                   "[%s]: %s" % (distro,
                                                   ", ".join(sorted(tags))))]

                if md:
                    out += [
                        self.output.fmtKeyValFill(_("Repo-updated : "),
                                                  time.ctime(md.md_timestamp)),
                        self.output.fmtKeyValFill(_("Repo-pkgs    : "), ui_num),
                        self.output.fmtKeyValFill(_("Repo-size    : "), ui_size)]

                if repo.metalink:
                    out += [self.output.fmtKeyValFill(_("Repo-metalink: "),
                                               repo.metalink)]
                    if enabled:
                        ts = repo.metadata.timestamp
                        out += [self.output.fmtKeyValFill(_("  Updated    : "),
                                                   time.ctime(ts))]
                elif repo.mirrorlist:
                    out += [self.output.fmtKeyValFill(_("Repo-mirrors : "),
                                               repo.mirrorlist)]
                baseurls = repo.baseurl
                if baseurls:
                    out += [self.output.fmtKeyValFill(_("Repo-baseurl : "),
                                               ", ".join(baseurls))]
                elif enabled and md.mirrors:
                    url = "%s (%d more)" % (md.mirrors[0], len(md.mirrors) - 1)
                    out += [self.output.fmtKeyValFill(_("Repo-baseurl : "), url)]

                expire = _expire_str(repo, md)
                out += [self.output.fmtKeyValFill(_("Repo-expire  : "), expire)]

                if repo.exclude:
                    out += [self.output.fmtKeyValFill(_("Repo-exclude : "),
                                               ", ".join(repo.exclude))]

                if repo.include:
                    out += [self.output.fmtKeyValFill(_("Repo-include : "),
                                               ", ".join(repo.include))]

                if ui_excludes_num:
                    out += [self.output.fmtKeyValFill(_("Repo-excluded: "),
                                               ui_excludes_num)]

                if repo.repofile:
                    out += [self.output.fmtKeyValFill(_("Repo-filename: "),
                                               repo.repofile)]

                logger.log(dnf.logging.DEBUG, "%s\n", "\n".join(map(ucd, out)))

        if not verbose and cols:
            #  Work out the first (id) and last (enabled/disalbed/count),
            # then chop the middle (name)...
            id_len = exact_width(_('repo id'))
            nm_len = 0
            st_len = 0
            ui_len = 0

            for (rid, rname, (ui_enabled, ui_endis_wid), ui_num) in cols:
                if id_len < exact_width(rid):
                    id_len = exact_width(rid)
                if nm_len < exact_width(rname):
                    nm_len = exact_width(rname)
                if st_len < (ui_endis_wid + len(ui_num)):
                    st_len = (ui_endis_wid + len(ui_num))
                # Need this as well as above for: fill_exact_width()
                if ui_len < len(ui_num):
                    ui_len = len(ui_num)
            if arg == 'disabled': # Don't output a status column.
                left = term.columns - (id_len + 1)
            elif exact_width(_('status')) > st_len:
                left = term.columns - (id_len + len(_('status')) + 2)
            else:
                left = term.columns - (id_len + st_len + 2)

            if left < nm_len: # Name gets chopped
                nm_len = left
            else: # Share the extra...
                left -= nm_len
                id_len += left // 2
                nm_len += left - (left // 2)

            txt_rid = fill_exact_width(_('repo id'), id_len)
            txt_rnam = fill_exact_width(_('repo name'), nm_len, nm_len)
            if arg == 'disabled': # Don't output a status column.
                print("%s %s" % (txt_rid, txt_rnam))
            else:
                print("%s %s %s" % (txt_rid, txt_rnam, _('status')))
            for (rid, rname, (ui_enabled, ui_endis_wid), ui_num) in cols:
                if arg == 'disabled': # Don't output a status column.
                    print("%s %s" % (fill_exact_width(rid, id_len),
                                     fill_exact_width(rname, nm_len, -nm_len)))
                    continue

                if ui_num:
                    ui_num = fill_exact_width(ui_num, ui_len, left=False)
                print("%s %s %s%s" % (fill_exact_width(rid, id_len),
                                      fill_exact_width(rname, nm_len, nm_len),
                                      ui_enabled, ui_num))
        msg = 'Total packages: %s'
        logger.debug(msg, _num2ui_num(tot_num))
Exemplo n.º 6
0
    def run(self):
        arg = self.opts.repos_action
        extcmds = [x.lower() for x in self.opts.repos]

        verbose = self.base.conf.verbose

        repos = list(self.base.repos.values())
        repos.sort(key=operator.attrgetter('id'))
        enabled_repos = list(self.base.repos.iter_enabled())
        term = self.output.term
        on_ehibeg = term.FG_COLOR['green'] + term.MODE['bold']
        on_dhibeg = term.FG_COLOR['red']
        on_hiend = term.MODE['normal']
        tot_num = 0
        cols = []
        if not repos:
            logger.warning(_('No repositories available'))
            return

        for repo in repos:
            if len(extcmds) and not _repo_match(repo, extcmds):
                continue
            (ehibeg, dhibeg, hiend) = '', '', ''
            ui_enabled = ''
            ui_endis_wid = 0
            ui_num = ""
            ui_excludes_num = ''
            force_show = False
            if arg == 'all' or repo.id in extcmds or repo.name in extcmds:
                force_show = True
                (ehibeg, dhibeg, hiend) = (on_ehibeg, on_dhibeg, on_hiend)
            if repo in enabled_repos:
                enabled = True
                if arg == 'enabled':
                    force_show = False
                elif arg == 'disabled' and not force_show:
                    continue
                if any((force_show, verbose, 'repoinfo' in self.opts.command)):
                    ui_enabled = ehibeg + _('enabled') + hiend
                    ui_endis_wid = exact_width(_('enabled'))
                    if not any((verbose, 'repoinfo' in self.opts.command)):
                        ui_enabled += ": "
                        ui_endis_wid += 2
                if verbose or ('repoinfo' in self.opts.command):
                    ui_size = _repo_size(self.base.sack, repo)
                # We don't show status for list disabled
                if arg != 'disabled' or verbose:
                    num = len(self.base.sack.query().filterm(reponame__eq=repo.id))
                    ui_num = _num2ui_num(num)
                    tot_num += num
            else:
                enabled = False
                if arg == 'disabled':
                    force_show = False
                elif arg == 'enabled' and not force_show:
                    continue
                ui_enabled = dhibeg + _('disabled') + hiend
                ui_endis_wid = exact_width(_('disabled'))

            if not any((verbose, ('repoinfo' in self.opts.command))):
                rid = ucd(repo.id)
                if enabled and repo.metalink:
                    mdts = repo._repo.getTimestamp()
                    if mdts > repo._repo.getMaxTimestamp():
                        rid = '*' + rid
                cols.append((rid, repo.name,
                             (ui_enabled, ui_endis_wid), ui_num))
            else:
                if enabled:
                    md = repo.metadata
                else:
                    md = None
                out = [self.output.fmtKeyValFill(_("Repo-id      : "), repo.id),
                       self.output.fmtKeyValFill(_("Repo-name    : "), repo.name)]

                if force_show or extcmds:
                    out += [self.output.fmtKeyValFill(_("Repo-status  : "),
                                                      ui_enabled)]
                if md and repo._repo.getRevision():
                    out += [self.output.fmtKeyValFill(_("Repo-revision: "),
                                                      repo._repo.getRevision())]
                if md and repo._repo.getContentTags():
                    tags = repo._repo.getContentTags()
                    out += [self.output.fmtKeyValFill(_("Repo-tags    : "),
                                                      ", ".join(sorted(tags)))]

                if md and repo._repo.getDistroTags():
                    distroTagsDict = {k: v for (k, v) in repo._repo.getDistroTags()}
                    for (distro, tags) in distroTagsDict.items():
                        out += [self.output.fmtKeyValFill(
                            _("Repo-distro-tags: "),
                            "[%s]: %s" % (distro, ", ".join(sorted(tags))))]

                if md:
                    out += [
                        self.output.fmtKeyValFill(
                            _("Repo-updated : "),
                            dnf.util.normalize_time(repo._repo.getMaxTimestamp())),
                        self.output.fmtKeyValFill(_("Repo-pkgs    : "), ui_num),
                        self.output.fmtKeyValFill(_("Repo-size    : "), ui_size)]

                if repo.metalink:
                    out += [self.output.fmtKeyValFill(_("Repo-metalink: "),
                                                      repo.metalink)]
                    if enabled:
                        ts = repo._repo.getTimestamp()
                        out += [self.output.fmtKeyValFill(
                            _("  Updated    : "), dnf.util.normalize_time(ts))]
                elif repo.mirrorlist:
                    out += [self.output.fmtKeyValFill(_("Repo-mirrors : "),
                                                      repo.mirrorlist)]
                baseurls = repo.baseurl
                if baseurls:
                    out += [self.output.fmtKeyValFill(_("Repo-baseurl : "),
                                                      ", ".join(baseurls))]
                elif enabled:
                    mirrors = repo._repo.getMirrors()
                    if mirrors:
                        url = "%s (%d more)" % (mirrors[0], len(mirrors) - 1)
                        out += [self.output.fmtKeyValFill(_("Repo-baseurl : "), url)]

                expire = _expire_str(repo, md)
                out += [self.output.fmtKeyValFill(_("Repo-expire  : "), expire)]

                if repo.excludepkgs:
                    # TRANSLATORS: Packages that are excluded - their names like (dnf systemd)
                    out += [self.output.fmtKeyValFill(_("Repo-exclude : "),
                                                      ", ".join(repo.excludepkgs))]

                if repo.includepkgs:
                    out += [self.output.fmtKeyValFill(_("Repo-include : "),
                                                      ", ".join(repo.includepkgs))]

                if ui_excludes_num:
                    # TRANSLATORS: Number of packages that where excluded (5)
                    out += [self.output.fmtKeyValFill(_("Repo-excluded: "),
                                                      ui_excludes_num)]

                if repo.repofile:
                    out += [self.output.fmtKeyValFill(_("Repo-filename: "),
                                                      repo.repofile)]

                print("\n" + "\n".join(map(ucd, out)))

        if not verbose and cols:
            #  Work out the first (id) and last (enabled/disalbed/count),
            # then chop the middle (name)...
            id_len = exact_width(_('repo id'))
            nm_len = 0
            st_len = 0
            ui_len = 0

            for (rid, rname, (ui_enabled, ui_endis_wid), ui_num) in cols:
                if id_len < exact_width(rid):
                    id_len = exact_width(rid)
                if nm_len < exact_width(rname):
                    nm_len = exact_width(rname)
                if st_len < (ui_endis_wid + len(ui_num)):
                    st_len = (ui_endis_wid + len(ui_num))
                # Need this as well as above for: fill_exact_width()
                if ui_len < len(ui_num):
                    ui_len = len(ui_num)
            if arg == 'disabled': # Don't output a status column.
                left = term.columns - (id_len + 1)
            elif exact_width(_('status')) > st_len:
                left = term.columns - (id_len + len(_('status')) + 2)
            else:
                left = term.columns - (id_len + st_len + 2)

            if left < nm_len: # Name gets chopped
                nm_len = left
            else: # Share the extra...
                left -= nm_len
                id_len += left // 2
                nm_len += left - (left // 2)

            txt_rid = fill_exact_width(_('repo id'), id_len)
            txt_rnam = fill_exact_width(_('repo name'), nm_len, nm_len)
            if arg == 'disabled': # Don't output a status column.
                print("%s %s" % (txt_rid, txt_rnam))
            else:
                print("%s %s %s" % (txt_rid, txt_rnam, _('status')))
            for (rid, rname, (ui_enabled, ui_endis_wid), ui_num) in cols:
                if arg == 'disabled': # Don't output a status column.
                    print("%s %s" % (fill_exact_width(rid, id_len),
                                     fill_exact_width(rname, nm_len, nm_len)))
                    continue

                if ui_num:
                    ui_num = fill_exact_width(ui_num, ui_len, left=False)
                print("%s %s %s%s" % (fill_exact_width(rid, id_len),
                                      fill_exact_width(rname, nm_len, nm_len),
                                      ui_enabled, ui_num))
        msg = _('Total packages: %s')
        logger.debug(msg, _num2ui_num(tot_num))