|
Packit Service |
21c75c |
..
|
|
Packit Service |
21c75c |
Copyright (C) 2014-2018 Red Hat, Inc.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
This copyrighted material is made available to anyone wishing to use,
|
|
Packit Service |
21c75c |
modify, copy, or redistribute it subject to the terms and conditions of
|
|
Packit Service |
21c75c |
the GNU General Public License v.2, or (at your option) any later version.
|
|
Packit Service |
21c75c |
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
Packit Service |
21c75c |
ANY WARRANTY expressed or implied, including the implied warranties of
|
|
Packit Service |
21c75c |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
Packit Service |
21c75c |
Public License for more details. You should have received a copy of the
|
|
Packit Service |
21c75c |
GNU General Public License along with this program; if not, write to the
|
|
Packit Service |
21c75c |
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
Packit Service |
21c75c |
02110-1301, USA. Any Red Hat trademarks that are incorporated in the
|
|
Packit Service |
21c75c |
source code or documentation are not subject to the GNU General Public
|
|
Packit Service |
21c75c |
License and may only be used or replicated with the express permission of
|
|
Packit Service |
21c75c |
Red Hat, Inc.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
===================================
|
|
Packit Service |
21c75c |
``Base``---The centerpiece of DNF
|
|
Packit Service |
21c75c |
===================================
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. class:: dnf.Base
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Instances of :class:`dnf.Base` are the central point of functionality supplied by DNF. An application will typically create a single instance of this class which it will keep for the runtime needed to accomplish its packaging tasks. Plugins are managed by DNF and get a reference to :class:`dnf.Base` object when they run.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
:class:`.Base` instances are stateful objects holding references to various data sources and data sinks. To properly finalize and close off any handles the object may hold, client code should either call :meth:`.Base.close` when it has finished operations with the instance, or use the instance as a context manager. After the object has left the context, or its :meth:`.Base.close` has been called explicitly, it must not be used. :meth:`.Base.close` will delete all downloaded packages upon successful transaction.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. attribute:: comps
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Is ``None`` by default. Explicit load via :meth:`read_comps` initializes this attribute to a :class:`dnf.comps.Comps` instance.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. attribute:: conf
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
An instance of :class:`dnf.conf.Conf`, concentrates all the different configuration options. :meth:`__init__` initializes this to usable defaults.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. attribute:: goal
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
An instance of :class:`dnf.goal.Goal` that this :class:`Base<dnf.Base>` object is using.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. attribute:: repos
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
A :class:`dnf.repodict.RepoDict` instance, this member object contains all the repositories available.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. attribute:: sack
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
The :class:`Sack<dnf.sack.Sack>` that this :class:`Base<dnf.Base>` object is using. It needs to be explicitly initialized by :meth:`fill_sack`.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. attribute:: transaction
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
A resolved transaction object, a :class:`dnf.transaction.Transaction` instance, or ``None`` if no transaction has been prepared yet.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: __init__()
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Init an instance with a reasonable default configuration. The constructor takes no arguments.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: add_remote_rpms(path_list, strict=True, progress=None)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
This function must be called before anything is added to the :attr:`goal`. Adds RPM files
|
|
Packit Service |
21c75c |
in path_list to the :attr:`sack` and return the list of respective :class:`dnf.package.Package`
|
|
Packit Service |
21c75c |
instances. Downloads the RPMs to a temporary file for each path if it is a remote URL.
|
|
Packit Service |
21c75c |
Raises :exc:`IOError` if there are `IO` problems with files and `strict=True`. Raises
|
|
Packit Service |
21c75c |
:exc:`dnf.exceptions.Error` if the :attr:`goal` is not empty. `progress`, if given, should be a
|
|
Packit Service |
21c75c |
:class:`.DownloadProgress` instance which can be used to monitor the progress of the download.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: close()
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Close all external handles the object holds. This is called automatically via context manager mechanism if the instance is handled using the ``with`` statement.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: init_plugins([disabled_glob=None, cli=None])
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Initialize plugins. If you want to disable some plugins pass the list of their name patterns to
|
|
Packit Service |
21c75c |
`disabled_glob`. When run from interactive script then also pass your :class:`dnf.cli.Cli` instance.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: pre_configure_plugins()
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Configure plugins by running their pre_configure() method. It makes possible to change
|
|
Packit Service |
21c75c |
variables before repo files and rpmDB are loaded. It also makes possible to create internal
|
|
Packit Service |
21c75c |
repositories that will be affected by ``--disablerepo`` and ``--enablerepo``.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: configure_plugins()
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Configure plugins by running their configure() method.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: fill_sack([load_system_repo=True, load_available_repos=True])
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Setup the package sack. If `load_system_repo` is ``True``, load information about packages in the local RPMDB into the sack. Else no package is considered installed during dependency solving. If `load_available_repos` is ``True``, load information about packages from the available repositories into the sack.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
This operation will call :meth:`load() <dnf.repo.Repo.load>` for repos as necessary and can take a long time. Adding repositories or changing repositories' configuration does not affect the information within the sack until :meth:`fill_sack` has been called.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Before this method is invoked, the client application should setup any explicit configuration relevant to the operation. This will often be at least :attr:`conf.cachedir <.Conf.cachedir>` and the substitutions used in repository URLs. See :attr:`.Conf.substitutions`.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Throws `IOError` exception in case cached metadata could not be opened.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Example::
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
#!/usr/bin/python3
|
|
Packit Service |
21c75c |
import dnf
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
base = dnf.Base()
|
|
Packit Service |
21c75c |
conf = base.conf
|
|
Packit Service |
21c75c |
conf.cachedir = '/tmp/my_cache_dir'
|
|
Packit Service |
21c75c |
conf.substitutions['releasever'] = '30'
|
|
Packit Service |
21c75c |
conf.substitutions['basearch'] = 'x86_64'
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
base.repos.add_new_repo('my-repo', conf,
|
|
Packit Service |
21c75c |
baseurl=["http://download.fedoraproject.org/pub/fedora/linux/releases/$releasever/Everything/$basearch/os/"])
|
|
Packit Service |
21c75c |
base.fill_sack()
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
print("Enabled repositories:")
|
|
Packit Service |
21c75c |
for repo in base.repos.iter_enabled():
|
|
Packit Service |
21c75c |
print("id: {}".format(repo.id))
|
|
Packit Service |
21c75c |
print("baseurl: {}".format(repo.baseurl))
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: do_transaction([display])
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Perform the resolved transaction. Use the optional `display` object(s) to report the progress. `display` can be either an instance of a subclass of :class:`dnf.callback.TransactionProgress` or a sequence of such instances. Raise :exc:`dnf.exceptions.Error` or dnf.exceptions.TransactionCheckError.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: download_packages(pkglist, progress=None, callback_total=None)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Download packages in `pkglist` from remote repositories. Packages from local repositories or from the command line are not downloaded. `progress`, if given, should be a :class:`.DownloadProgress` and can be used by the caller to monitor the progress of the download. `callback_total` is a function accepting two parameters: total size of the downloaded content in bytes and time when the download process started, in seconds since the epoch. Raises :exc:`.DownloadError` if some packages failed to download.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: group_install(group_id, pkg_types, exclude=None, strict=True)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Mark group with corresponding `group_id` installed and mark the packages in the group for installation. Return the number of packages that the operation has marked for installation. `pkg_types` is a sequence of strings determining the kinds of packages to be installed, where the respective groups can be selected by including ``"mandatory"``, ``"default"`` or ``"optional"`` in it. If `exclude` is given, it has to be an iterable of package name glob patterns: :meth:`.group_install` will then not mark the respective packages for installation whenever possible. Parameter `strict` is a boolean indicating whether group packages that exist but are non-installable due to e.g. dependency issues should be skipped (False) or cause transaction to fail to resolve (True).
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: group_remove(group_id)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Mark group with corresponding `group_id` not installed. All the packages marked as belonging to this group will be marked for removal. Return the number of packages marked for removal in this call.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: group_upgrade(group_id)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Upgrade group with corresponding `group_id`. If there has been packages added to the group's comps information since installing on the system, they will be marked for installation. Similarly, removed packages get marked for removal. The remaining packages in the group are marked for an upgrade. The operation respects the package types from the original installation of the group.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: environment_install(env_id, types, exclude=None, strict=True, exclude_groups=None)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Similar to :meth:`.group_install` but operates on environmental groups. `exclude_groups` is an iterable of group IDs that will not be marked as installed.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: environment_remove(env_id)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Similar to :meth:`.group_remove` but operates on environmental groups.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: environment_upgrade(env_id)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Similar to :meth:`.group_upgrade` but operates on environmental groups.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: read_all_repos()
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Read repository configuration from the main configuration file specified by :attr:`dnf.conf.Conf.config_file_path` and any ``.repo`` files under :attr:`dnf.conf.Conf.reposdir`. All the repositories found this way are added to :attr:`~.Base.repos`.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: read_comps(arch_filter=False)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Read comps data from all the enabled repositories and initialize the :attr:`comps` object. If `arch_filter` is set to ``True``, the result is limited to system basearch.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: reset(\*\*kwargs)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Reset the state of different :class:`.Base` attributes. Selecting attributes to reset is controlled by passing the method keyword arguments set to ``True``. When called with no arguments the method has no effect.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
=============== =================================================
|
|
Packit Service |
21c75c |
argument passed effect
|
|
Packit Service |
21c75c |
=============== =================================================
|
|
Packit Service |
21c75c |
`goal=True` drop all the current :ref:`packaging requests <package_marking-label>`
|
|
Packit Service |
21c75c |
`repos=True` drop the current repositories (see :attr:`.repos`). This won't
|
|
Packit Service |
21c75c |
affect the package data already loaded into the :attr:`.sack`.
|
|
Packit Service |
21c75c |
`sack=True` drop the current sack (see :attr:`.sack`)
|
|
Packit Service |
21c75c |
=============== =================================================
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: resolve(allow_erasing=False)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Resolve the marked requirements and store the resulting :class:`dnf.transaction.Transaction` into :attr:`transaction`. Raise :exc:`dnf.exceptions.DepsolveError` on a depsolving error. Return ``True`` if the resolved transaction is non-empty.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Enabling `allow_erasing` lets the solver remove other packages while looking to fulfill the current packaging requests. For instance, this is used to allow the solver to remove dependants of a package being removed.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
The exact operation of the solver further depends on the :attr:`dnf.conf.Conf.best` setting.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: update_cache(timer=False)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Downloads and caches in binary format metadata for all known repos. Tries to avoid downloading
|
|
Packit Service |
21c75c |
whenever possible (e.g. when the local metadata hasn’t expired yet or when the metadata
|
|
Packit Service |
21c75c |
timestamp hasn’t changed).
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
If 'timer' equals 'True', DNF becomes more resource-aware, meaning DNF will not do anything if
|
|
Packit Service |
21c75c |
running on battery power and will terminate immediately if it’s too soon after the last
|
|
Packit Service |
21c75c |
successful update_cache operation.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
When the method is used after :meth:`fill_sack`, information about packages will not be updated.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: package_signature_check(pkg)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Verify the GPG signature of the given package object.
|
|
Packit Service |
21c75c |
Returns tuple (`result`, `error_string`) where result is:
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
======= =================================================
|
|
Packit Service |
21c75c |
result meaning
|
|
Packit Service |
21c75c |
======= =================================================
|
|
Packit Service |
21c75c |
0 GPG signature verifies ok or verification is not required.
|
|
Packit Service |
21c75c |
1 GPG verification failed but installation of the right GPG key might help.
|
|
Packit Service |
21c75c |
2 Fatal GPG verification error, give up.
|
|
Packit Service |
21c75c |
======= =================================================
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: package_import_key(pkg, askcb=None, fullaskcb=None)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Retrieve a key for a package. If needed, use the given callback to prompt whether the key should be imported. Raises :exc:`dnf.exceptions.Error` if there are errors retrieving the keys.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
`askcb`: callback function to use to ask permission to import a key. The arguments `askcb` should take are the package object, the userid of the key, and the keyid
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
`fullaskcb`: callback function to use to ask permission to import a key. This differs from `askcb` in that it gets passed a dictionary so that we can expand the values passed.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Callback functions return ``True`` if the key should be imported, ``False`` otherwise.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. _package_marking-label:
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
The :class:`.Base` class provides a number of methods to make packaging requests that can later be resolved and turned into a transaction. The `pkg_spec` argument some of them take must be a package specification recognized by :class:`dnf.subject.Subject`. If these methods fail to find suitable packages for the operation they raise a :exc:`~dnf.exceptions.MarkingError`. Note that successful completion of these methods does not necessarily imply that the desired transaction can be carried out (e.g. for dependency reasons).
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: downgrade(pkg_spec)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Mark packages matching `pkg_spec` for downgrade.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: install(pkg_spec, reponame=None, strict=True, forms=None)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Mark packages matching `pkg_spec` for installation.
|
|
Packit Service |
21c75c |
`reponame` can be a name of a repository or a list of repository names. If given, the selection of available packages is limited to packages from these repositories. If strict is set to False, the installation ignores packages with dependency solving problems. Parameter `forms` has the same meaning as in :meth:`dnf.subject.Subject.get_best_query`.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: package_downgrade(pkg, strict=False)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
If `pkg` is a :class:`dnf.package.Package` in an available repository, mark the matching installed package for downgrade to `pkg`. If strict=False it ignores problems with dep-solving.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: package_install(pkg, strict=True)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Mark `pkg` (a :class:`dnf.package.Package` instance) for installation. Ignores package that is already installed. `strict` has the same meaning as in :meth:`install`.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: package_upgrade(pkg)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
If `pkg` is a :class:`dnf.package.Package` in an available repository, mark the matching installed package for upgrade to `pkg`.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: autoremove()
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Removes all 'leaf' packages from the system that were originally installed as dependencies of user-installed packages but which are no longer required by any such package.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: remove(pkg_spec, reponame=None, forms=None)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Mark packages matching `pkg_spec` for removal. `reponame` and `forms` have the same meaning as in :meth:`install`.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: upgrade(pkg_spec, reponame=None)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Mark packages matching `pkg_spec` for upgrade. `reponame` has the same meaning as in :meth:`install`.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: upgrade_all(reponame=None)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Mark all installed packages for an upgrade. `reponame` has the same meaning as in :meth:`install`.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: urlopen(url, repo=None, mode='w+b', \*\*kwargs):
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Open the specified absolute `url` and return a file object which respects proxy setting even for non-repo downloads
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
.. method:: install_specs(install, exclude=None, reponame=None, strict=True, forms=None)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Provides unified way to mark packages, groups or modules for installation. The `install` and `exclude` arguments have to be iterables containing specifications of packages (e.g. 'dnf') or groups/modules (e.g. '\@core'). Specifications from the `exclude` list will not be marked for installation. The `reponame`, `strict` and `forms` parameters have the same meaning as in :meth:`install`. In case of errors the method raises :exc:`dnf.exceptions.MarkingErrors`.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
Example to install two groups and a package::
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
#!/usr/bin/python3
|
|
Packit Service |
21c75c |
import dnf
|
|
Packit Service |
21c75c |
import dnf.cli.progress
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
base = dnf.Base()
|
|
Packit Service |
21c75c |
base.read_all_repos()
|
|
Packit Service |
21c75c |
base.fill_sack()
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
base.install_specs(['acpi', '@Web Server', '@core'])
|
|
Packit Service |
21c75c |
print("Resolving transaction...",)
|
|
Packit Service |
21c75c |
base.resolve()
|
|
Packit Service |
21c75c |
print("Downloading packages...")
|
|
Packit Service |
21c75c |
progress = dnf.cli.progress.MultiFileProgressMeter()
|
|
Packit Service |
21c75c |
base.download_packages(base.transaction.install_set, progress)
|
|
Packit Service |
21c75c |
print("Installing...")
|
|
Packit Service |
21c75c |
base.do_transaction()
|