This is the mail archive of the
cygwin-apps
mailing list for the Cygwin project.
[PATCH setup 13/14] Download/checksum/install/uninstall what transaction wants
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 <packagemeta *> install_q, uninstall_q, sourceinstall_q;
+ vector <packageversion> 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 <packagemeta *>::iterator i = uninstall_q.begin ();
+ for (vector <packageversion>::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 <packagemeta *>::iterator i = uninstall_q.begin ();
+ for (vector <packageversion>::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 <packagemeta *>::iterator i = install_q.begin ();
+ for (vector <packageversion>::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 <packagemeta *>::iterator i = sourceinstall_q.begin ();
+ for (vector <packageversion>::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