Index: install.cc =================================================================== RCS file: /cvs/cygwin-apps/setup/install.cc,v retrieving revision 2.72 diff -p -u -r2.72 install.cc --- install.cc 5 Apr 2005 21:37:41 -0000 2.72 +++ install.cc 7 Apr 2005 18:56:08 -0000 @@ -527,11 +527,19 @@ do_install_thread (HINSTANCE h, HWND own } } + /* save cygwin base files for last */ + packagemeta *cygwin_package = NULL; /* start with uninstalls - remove files that new packages may replace */ for (vector ::iterator i = db.packages.begin (); i != db.packages.end (); ++i) { packagemeta & pkg = **i; + if (pkg.name == "cygwin") + { + MessageBox (NULL, "Found cygwin!", "Got it!", MB_OK); + cygwin_package = *i; + continue; + } if (pkg.installed && (!pkg.desired || (pkg.desired != pkg.installed && pkg.desired.picked ()))) myInstaller.uninstallOne (pkg); @@ -545,6 +553,12 @@ do_install_thread (HINSTANCE h, HWND own i != db.packages.end (); ++i) { packagemeta & pkg = **i; + if (pkg.name == "cygwin") + { + MessageBox (NULL, "Found cygwin!", "Got it!", MB_OK); + cygwin_package = *i; + continue; + } if (pkg.installed && pkg.desired.picked()) { try { @@ -566,6 +580,57 @@ do_install_thread (HINSTANCE h, HWND own } } + /* Now, last of all, uninstall cygwin. Hopefully leaving the old one there + should have been sufficient for the uninstall scripts to run. We should + also make sure it's the very first thing that we re-install */ + if (cygwin_package) + { + MessageBox (NULL, "*now* uninstall cygwin!", "Got it!", MB_OK); + if (cygwin_package->installed && (!cygwin_package->desired || (cygwin_package->desired != cygwin_package->installed && + cygwin_package->desired.picked ()))) + myInstaller.uninstallOne (*cygwin_package); + else if (cygwin_package->installed && cygwin_package->desired.picked()) + { + try { + int e = 0; + e += myInstaller.replaceOne (*cygwin_package); + if (e) + errors++; + } + catch (exception *e) { + if (yesno (owner, IDS_INSTALL_ERROR, e->what()) != IDYES) + { + log (LOG_TIMESTAMP) + << "User cancelled setup after install error" << endLog; + LogSingleton::GetInstance().exit (1); + return; + } + } + } + /* That either uninstalled it, or upgraded in place, now reinstall */ + if (cygwin_package->desired && cygwin_package->desired.changeRequested()) + { + try + { + int e = 0; + MessageBox (NULL, "now reinstall cygwin!", "Got it!", MB_OK); + e += install_one (*cygwin_package); + if (e) + errors++; + } + catch (exception *e) + { + if (yesno (owner, IDS_INSTALL_ERROR, e->what()) != IDYES) + { + log (LOG_TIMESTAMP) + << "User cancelled setup after install error" << endLog; + LogSingleton::GetInstance().exit (1); + return; + } + } + } + } + for (vector ::iterator i = db.packages.begin (); i != db.packages.end (); ++i) {