Skip to content

Commit

Permalink
dnf5: Check offline transaction state before download
Browse files Browse the repository at this point in the history
The transaction package download can be a lengthy and network intensive
operation. Begin the download only after the user confirms that the
previously scheduled offline transaction can be canceled.
  • Loading branch information
m-blaha committed Sep 5, 2024
1 parent 589626c commit e959db7
Showing 1 changed file with 13 additions and 10 deletions.
23 changes: 13 additions & 10 deletions dnf5/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,6 @@ void Context::Impl::store_offline(libdnf5::base::Transaction & transaction) {
const auto & installroot = base.get_config().get_installroot_option().get_value();
const auto & offline_datadir = installroot / libdnf5::offline::DEFAULT_DATADIR.relative_path();
std::filesystem::create_directories(offline_datadir);

constexpr const char * packages_in_trans_dir{"./packages"};
constexpr const char * comps_in_trans_dir{"./comps"};
const auto & comps_location = offline_datadir / comps_in_trans_dir;
Expand All @@ -354,15 +353,6 @@ void Context::Impl::store_offline(libdnf5::base::Transaction & transaction) {
libdnf5::offline::OfflineTransactionState state{state_path};

auto & offline_data = state.get_data();
if (offline_data.get_status() != libdnf5::offline::STATUS_DOWNLOAD_INCOMPLETE) {
print_error("There is already an offline transaction queued, initiated by the following command:");
print_error(fmt::format("\t{}", offline_data.get_cmd_line()));
print_error("Continuing will cancel the old offline transaction and replace it with this one.");
if (!libdnf5::cli::utils::userconfirm::userconfirm(base.get_config())) {
throw libdnf5::cli::AbortedByUserError();
}
}

offline_data.set_status(libdnf5::offline::STATUS_DOWNLOAD_INCOMPLETE);
state.write();

Expand Down Expand Up @@ -432,6 +422,19 @@ void Context::Impl::download_and_run(libdnf5::base::Transaction & transaction) {
const auto & installroot = base.get_config().get_installroot_option().get_value();
const auto & offline_datadir = installroot / libdnf5::offline::DEFAULT_DATADIR.relative_path();
std::filesystem::create_directories(offline_datadir);
const std::filesystem::path state_path{offline_datadir / libdnf5::offline::TRANSACTION_STATE_FILENAME};
libdnf5::offline::OfflineTransactionState state{state_path};

// Check whether there is another pending offline transaction present
auto & offline_data = state.get_data();
if (offline_data.get_status() != libdnf5::offline::STATUS_DOWNLOAD_INCOMPLETE) {
print_error("There is already an offline transaction queued, initiated by the following command:");
print_error(fmt::format("\t{}", offline_data.get_cmd_line()));
print_error("Continuing will cancel the old offline transaction and replace it with this one.");
if (!libdnf5::cli::utils::userconfirm::userconfirm(base.get_config())) {
throw libdnf5::cli::AbortedByUserError();
}
}

base.get_config().get_destdir_option().set(offline_datadir / "packages");
transaction.set_download_local_pkgs(true);
Expand Down

0 comments on commit e959db7

Please sign in to comment.