############# DNF5 Workflow ############# Typical DNF5 workflow consists of: #. set up loggers #. create base #. add dnf5 commands #. load dnf5 plugins: (See :ref:`DNF5 Plugins ` for details.) #. dnf5 plugin ``init`` hook #. dnf5 plugin ``create_commands`` hook #. run command specific ``set_parent_command`` step #. run command specific ``set_argument_parser`` step #. | run command specific ``register_subcommands`` step | (for native dnf5 commands the last 3 steps are done as a part of 'add dnf5 commands') #. load aliases #. parse command line arguments #. run command specific ``pre_configure`` step #. load main configuration #. enable/disable libdnf5 plugins #. base setup: #. load libdnf5 plugins (See :ref:`LIBDNF5 Plugins ` for details.) #. libdnf5 plugin ``init`` hook #. libdnf5 plugin ``pre_base_setup`` hook #. lock installroot #. load Vars and lock varsdir #. libdnf5 plugin ``post_base_setup`` hook #. create repo sack #. create repos from system configuration * perform Vars substitution on repository id and all values (See :ref:`Repo Variables ` for details.) #. create repos from paths (such as --repofrompath arg) * perform Vars substitution on specified id and path #. apply repository setopts (such as --setopt=fedora.metadata_expire=0) #. run command specific ``configure`` step #. libdnf5 plugin ``repos_configured`` hook #. if command requires privileges check for them #. load repositories: #. if required load system repository #. if required load enabled repositories: #. load metadata from cache if valid #. try to reuse root's cache #. metadata download #. metadata OpenPGP check #. if required import repository OpenPGP keys and try again #. libdnf5 plugin ``repos_loaded`` hook #. run command specific ``load_additional_packages`` step #. run command specific ``run`` step #. if the command produced a goal: #. libdnf5 plugin ``pre_add_cmdline_packages`` hook #. add commandline packages #. libdnf5 plugin ``post_add_cmdline_packages`` hook #. resolve goal (resolve dependencies) #. libdnf5 plugin ``goal_resolved`` hook #. run command specific ``goal_resolved`` step #. print transaction table #. check for user approval #. download inbound transaction packages #. check OpenPGP signatures for inbound transaction packages #. lock transaction ``libdnf5::utils::Locker`` #. create rpm transaction #. run rpm test transaction #. libdnf5 plugin ``pre_transaction`` hook #. start database transaction #. run rpm transaction #. update system_state (See :manpage:`dnf5-system-state(7)`, :ref:`System state ` for details.) #. finish database transaction #. libdnf5 plugin ``post_transaction`` hook #. unlock transaction ``libdnf5::utils::Locker`` #. libdnf5 plugin ``finish`` hook #. dnf5 plugin ``finish`` hook