From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16528 invoked by alias); 31 May 2017 11:05:34 -0000 Mailing-List: contact cygwin-apps-help@cygwin.com; run by ezmlm Precedence: bulk Sender: cygwin-apps-owner@cygwin.com List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Mail-Followup-To: cygwin-apps@cygwin.com Received: (qmail 16448 invoked by uid 89); 31 May 2017 11:05:33 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 spammy=houses X-HELO: rgout03.bt.lon5.cpcloud.co.uk Received: from rgout0304.bt.lon5.cpcloud.co.uk (HELO rgout03.bt.lon5.cpcloud.co.uk) (65.20.0.210) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 31 May 2017 11:05:30 +0000 X-OWM-Source-IP: 86.141.128.130 (GB) X-OWM-Env-Sender: jonturney@btinternet.com X-Junkmail-Premium-Raw: score=8/50,refid=2.7.2:2017.5.25.40315:17:8.707,ip=,rules=NO_URI_FOUND, NO_CTA_URI_FOUND, NO_MESSAGE_ID, NO_URI_HTTPS, TO_MALFORMED Received: from localhost.localdomain (86.141.128.130) by rgout03.bt.lon5.cpcloud.co.uk (9.0.019.13-1) (authenticated as jonturney@btinternet.com) id 58A82A5C0B89CAAE; Wed, 31 May 2017 12:05:33 +0100 From: Jon Turney To: cygwin-apps@cygwin.com Cc: Jon Turney Subject: [PATCH setup 13/14] Download/checksum/install/uninstall what transaction wants Date: Wed, 31 May 2017 11:05:00 -0000 Message-Id: <20170531110509.241220-3-jon.turney@dronecode.org.uk> In-Reply-To: <20170531110509.241220-1-jon.turney@dronecode.org.uk> References: <20170531105015.162228-1-jon.turney@dronecode.org.uk> <20170531110509.241220-1-jon.turney@dronecode.org.uk> X-SW-Source: 2017-05/txt/msg00173.txt.bz2 Some of this goes rather around the houses to avoid lots of churm: In lots of cases, we're looking up packagemeta for a given packageversion just so we can use the pacakgemeta to access the name, which we could do via packageversion just as easily. We do actually need packagmeta for a couple of things: To note the package as installed/uninstalled, and to note postinstalls scripts. If IncludeSource is on source packages installs will have been added to the task list in post-processing, so we don't need to handle that specially anymore. Source packages to be installed are kept in a separate queue as they are installed differently to binary packages (root is /usr/src, install isn't recorded, etc.) --- download.cc | 71 ++++++++++++++---------------------------- install.cc | 102 ++++++++++++++++++++++++------------------------------------ 2 files changed, 64 insertions(+), 109 deletions(-) diff --git a/download.cc b/download.cc index fda175f..4b2fb6f 100644 --- a/download.cc +++ b/download.cc @@ -44,14 +44,10 @@ #include "Exception.h" -#include "getopt++/BoolOption.h" - using namespace std; extern ThreeBarProgressPage Progress; -BoolOption IncludeSource (false, 'I', "include-source", "Automatically include source download"); - static bool validateCachedPackage (const std::string& fullname, packagesource & pkgsource) { @@ -202,59 +198,38 @@ do_download_thread (HINSTANCE h, HWND owner) Progress.SetText3 (""); packagedb db; - /* calculate the amount needed */ - for (packagedb::packagecollection::iterator i = db.packages.begin (); - i != db.packages.end (); ++i) + const SolverTransactionList &t = db.solution.transactions(); + + /* calculate the total size of the download */ + for (SolverTransactionList::const_iterator i = t.begin (); i != t.end (); ++i) { - packagemeta & pkg = *(i->second); - if (pkg.picked () || pkg.srcpicked ()) - { - packageversion version = pkg.desired; - packageversion sourceversion = version.sourcePackage(); - try - { - if (pkg.picked()) - { - if (!check_for_cached (*version.source())) - total_download_bytes += version.source()->size; - } - if (pkg.srcpicked () || IncludeSource) - { - if (!check_for_cached (*sourceversion.source())) - total_download_bytes += sourceversion.source()->size; - } - } - catch (Exception * e) - { - // We know what to do with these.. - if (e->errNo() == APPERR_CORRUPT_PACKAGE) - fatal (owner, IDS_CORRUPT_PACKAGE, pkg.name.c_str()); - // Unexpected exception. - throw e; - } - } + packageversion version = i->version; + + try + { + if (!check_for_cached (*version.source())) + total_download_bytes += version.source()->size; + } + catch (Exception * e) + { + // We know what to do with these.. + if (e->errNo() == APPERR_CORRUPT_PACKAGE) + fatal (owner, IDS_CORRUPT_PACKAGE, version.Name().c_str()); + // Unexpected exception. + throw e; + } } /* and do the download. FIXME: This here we assign a new name for the cached version * and check that above. */ - for (packagedb::packagecollection::iterator i = db.packages.begin (); - i != db.packages.end (); ++i) + for (SolverTransactionList::const_iterator i = t.begin (); i != t.end (); ++i) { - packagemeta & pkg = *(i->second); - if (pkg.picked () || pkg.srcpicked ()) + packageversion version = i->version; + { int e = 0; - packageversion version = pkg.desired; - packageversion sourceversion = version.sourcePackage(); - if (pkg.picked()) - { - e += download_one (*version.source(), owner); - } - if (sourceversion && (pkg.srcpicked() || IncludeSource)) - { - e += download_one (*sourceversion.source (), owner); - } + e += download_one (*version.source(), owner); errors += e; #if 0 if (e) diff --git a/install.cc b/install.cc index 9c4c01b..94c2b16 100644 --- a/install.cc +++ b/install.cc @@ -69,7 +69,6 @@ static long long int total_bytes = 0; static long long int total_bytes_sofar = 0; static int package_bytes = 0; -extern BoolOption IncludeSource; static BoolOption NoReplaceOnReboot (false, 'r', "no-replaceonreboot", "Disable replacing in-use files on next " "reboot."); @@ -799,84 +798,61 @@ do_install_thread (HINSTANCE h, HWND owner) /* Writes Cygwin/setup/rootdir registry value */ create_install_root (); - vector install_q, uninstall_q, sourceinstall_q; + vector install_q, uninstall_q, sourceinstall_q; packagedb db; + const SolverTransactionList &t = db.solution.transactions(); /* Calculate the amount of data to md5sum */ Progress.SetText1("Calculating..."); long long int md5sum_total_bytes = 0; - for (packagedb::packagecollection::iterator i = db.packages.begin (); - i != db.packages.end (); ++i) + for (SolverTransactionList::const_iterator i = t.begin (); i != t.end (); ++i) { - packagemeta & pkg = *(i->second); + packageversion version = i->version; - if (pkg.picked()) + if (i->type == SolverTransaction::transInstall) { - md5sum_total_bytes += pkg.desired.source()->size; - } - - if (pkg.srcpicked() || IncludeSource) - { - md5sum_total_bytes += pkg.desired.sourcePackage ().source()->size; + md5sum_total_bytes += version.source()->size; } } /* md5sum the packages, build lists of packages to install and uninstall and calculate the total amount of data to install */ long long int md5sum_total_bytes_sofar = 0; - for (packagedb::packagecollection::iterator i = db.packages.begin (); - i != db.packages.end (); ++i) + for (SolverTransactionList::const_iterator i = t.begin (); i != t.end (); ++i) { - packagemeta & pkg = *(i->second); + packageversion version = i->version; + packagemeta *pkgm = db.findBinary (PackageSpecification(version.Name())); + if (!pkgm) + pkgm = db.findSource (PackageSpecification(version.Name())); - if (pkg.picked()) + if (i->type == SolverTransaction::transInstall) { try { - chksum_one (pkg, *pkg.desired.source ()); + chksum_one (*pkgm, *version.source ()); } catch (Exception *e) { - if (yesno (owner, IDS_SKIP_PACKAGE, e->what()) == IDYES) - pkg.pick (false); + yesno (owner, IDS_SKIP_PACKAGE, e->what()); } - if (pkg.picked()) { - md5sum_total_bytes_sofar += pkg.desired.source()->size; - total_bytes += pkg.desired.source()->size; - install_q.push_back (&pkg); + md5sum_total_bytes_sofar += version.source()->size; + total_bytes += version.source()->size; + + // source packages are kept in a separate queue as they are installed + // differently: root is /usr/src, install isn't recorded, etc. + if (version.Type() == package_source) + sourceinstall_q.push_back (version); + else + install_q.push_back (version); } } - if (pkg.srcpicked() || IncludeSource) + /* Uninstall, upgrade or reinstall */ + if (i->type == SolverTransaction::transErase) { - bool skiprequested = false ; - try - { - chksum_one (pkg, *pkg.desired.sourcePackage ().source ()); - } - catch (Exception *e) - { - if (yesno (owner, IDS_SKIP_PACKAGE, e->what()) == IDYES) - { - skiprequested = true ; //(err occurred,) skip pkg desired - pkg.srcpick (false); - } - } - if (pkg.srcpicked() || (IncludeSource && !skiprequested)) - { - md5sum_total_bytes_sofar += pkg.desired.sourcePackage ().source()->size; - total_bytes += pkg.desired.sourcePackage ().source()->size; - sourceinstall_q.push_back (&pkg); - } - } - - /* Upgrade or reinstall */ - if ((pkg.installed && pkg.desired != pkg.installed) - || pkg.picked ()) - { - uninstall_q.push_back (&pkg); + uninstall_q.push_back (version); } if (md5sum_total_bytes > 0) @@ -885,27 +861,31 @@ do_install_thread (HINSTANCE h, HWND owner) /* start with uninstalls - remove files that new packages may replace */ Progress.SetBar2(0); - for (vector ::iterator i = uninstall_q.begin (); + for (vector ::iterator i = uninstall_q.begin (); i != uninstall_q.end (); ++i) { - myInstaller.preremoveOne (**i); + packagemeta *pkgm = db.findBinary (PackageSpecification(i->Name())); + myInstaller.preremoveOne (*pkgm); Progress.SetBar2(std::distance(uninstall_q.begin(), i) + 1, uninstall_q.size()); } Progress.SetBar2(0); - for (vector ::iterator i = uninstall_q.begin (); + for (vector ::iterator i = uninstall_q.begin (); i != uninstall_q.end (); ++i) { - myInstaller.uninstallOne (**i); + packagemeta *pkgm = db.findBinary (PackageSpecification(i->Name())); + myInstaller.uninstallOne (*pkgm); Progress.SetBar2(std::distance(uninstall_q.begin(), i) + 1, uninstall_q.size()); } - for (vector ::iterator i = install_q.begin (); + for (vector ::iterator i = install_q.begin (); i != install_q.end (); ++i) { - packagemeta & pkg = **i; + packageversion & pkg = *i; + packagemeta *pkgm = db.findBinary (PackageSpecification(i->Name())); + try { - myInstaller.installOne (pkg, pkg.desired, *pkg.desired.source(), + myInstaller.installOne (*pkgm, pkg, *pkg.source(), "cygfile://", "/", owner); } catch (exception *e) @@ -920,12 +900,12 @@ do_install_thread (HINSTANCE h, HWND owner) } } - for (vector ::iterator i = sourceinstall_q.begin (); + for (vector ::iterator i = sourceinstall_q.begin (); i != sourceinstall_q.end (); ++i) { - packagemeta & pkg = **i; - myInstaller.installOne (pkg, pkg.desired.sourcePackage(), - *pkg.desired.sourcePackage().source(), + packagemeta *pkgm = db.findSource (PackageSpecification(i->Name())); + packageversion & pkg = *i; + myInstaller.installOne (*pkgm, pkg, *pkg.source(), "cygfile://", "/usr/src/", owner); } -- 2.12.3