diff options
Diffstat (limited to 'src/generic/apt/download_install_manager.cc')
-rw-r--r-- | src/generic/apt/download_install_manager.cc | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/src/generic/apt/download_install_manager.cc b/src/generic/apt/download_install_manager.cc index 9c779f86..7c9aa835 100644 --- a/src/generic/apt/download_install_manager.cc +++ b/src/generic/apt/download_install_manager.cc @@ -39,7 +39,8 @@ using namespace std; download_install_manager::download_install_manager(bool _download_only, const run_dpkg_in_terminal_func &_run_dpkg_in_terminal) - : log(NULL), download_only(_download_only), pm(new pkgDPkgPM(*apt_cache_file)), + : log(NULL), download_only(_download_only), + pm(new pkgDPkgPM(*apt_cache_file)), run_dpkg_in_terminal(_run_dpkg_in_terminal) { } @@ -102,7 +103,7 @@ bool download_install_manager::prepare(OpProgress &progress, download_manager::result download_install_manager::finish_pre_dpkg(pkgAcquire::RunResult res) { - if(res != pkgAcquire::Continue) + if(res == pkgAcquire::Failed) return failure; bool failed=false; @@ -110,15 +111,18 @@ download_manager::result download_install_manager::finish_pre_dpkg(pkgAcquire::R i != fetcher->ItemsEnd(); ++i) { if((*i)->Status == pkgAcquire::Item::StatDone && - (*i)->Complete) + (*i)->Complete == true) continue; if((*i)->Status == pkgAcquire::Item::StatIdle) - continue; + { + // Transient = true; + continue; + } failed=true; - _error->Error(_("Failed to fetch %s: %s"), (*i)->DescURI().c_str(), (*i)->ErrorText.c_str()); - break; + _error->Warning(_("Failed to fetch %s: %s"), + (*i)->DescURI().c_str(), (*i)->ErrorText.c_str()); } if(download_only) @@ -148,13 +152,17 @@ download_manager::result download_install_manager::finish_pre_dpkg(pkgAcquire::R // control the code at dpkg's end), them's the breaks. apt_cache_file->ReleaseLock(); - result rval = success; + download_manager::result rval; const pkgPackageManager::OrderResult pre_fork_result = pm->DoInstallPreFork(); - if(pre_fork_result == pkgPackageManager::Failed) - rval = failure; + switch(pre_fork_result) + { + case pkgPackageManager::Completed: rval = success; break; + case pkgPackageManager::Failed: rval = failure; break; + case pkgPackageManager::Incomplete: rval = do_again; break; + } return rval; } @@ -171,7 +179,7 @@ pkgPackageManager::OrderResult download_install_manager::run_dpkg(int status_fd) switch(pmres) { case pkgPackageManager::Failed: - _error->DumpErrors(); + _error->DumpErrors(std::cerr, GlobalError::WARNING, false); cerr << _("A package failed to install. Trying to recover:") << endl; if(system("DPKG_NO_TSTP=1 dpkg --configure -a") != 0) { /* ignore */ } break; @@ -191,16 +199,15 @@ void download_install_manager::finish_post_dpkg(pkgPackageManager::OrderResult d OpProgress *progress, const sigc::slot1<void, result> &k) { - result rval = success; - + result rval; switch(dpkg_result) { case pkgPackageManager::Failed: rval = failure; break; case pkgPackageManager::Completed: + rval = success; break; - case pkgPackageManager::Incomplete: rval = do_again; break; @@ -208,15 +215,23 @@ void download_install_manager::finish_post_dpkg(pkgPackageManager::OrderResult d fetcher->Shutdown(); + if(_error->PendingError() == true) + rval = failure; + // Get the archives again. This was necessary for multi-CD // installs, according to my comments in an old commit log in the // Subversion repository. - if(!pm->GetArchives(fetcher, &src_list, apt_package_records)) - rval = failure; - else if(!apt_cache_file->GainLock()) + if(rval == do_again) + { + if(!pm->GetArchives(fetcher, &src_list, apt_package_records)) + rval = failure; + } + + if(!apt_cache_file->GainLock()) // This really shouldn't happen. { - _error->Error(_("Could not regain the system lock! (Perhaps another apt or dpkg is running?)")); + _error->Error(_("Could not regain the system lock! (Perhaps another" + " apt or dpkg is running?)")); rval = failure; } @@ -257,7 +272,7 @@ void download_install_manager::finish(pkgAcquire::RunResult result, { const download_manager::result pre_res = finish_pre_dpkg(result); - if(pre_res == success && !download_only) + if(pre_res != failure && !download_only) { run_dpkg_in_terminal(sigc::mem_fun(*this, &download_install_manager::run_dpkg), sigc::bind(sigc::mem_fun(*this, &download_install_manager::finish_post_dpkg), @@ -268,7 +283,6 @@ void download_install_manager::finish(pkgAcquire::RunResult result, else { pkgPackageManager::OrderResult res; - switch(pre_res) { case success: @@ -278,7 +292,6 @@ void download_install_manager::finish(pkgAcquire::RunResult result, res = pkgPackageManager::Incomplete; break; case failure: - default: res = pkgPackageManager::Failed; break; } |