This is the mail archive of the
cygwin-apps-cvs
mailing list for the cygwin-apps project.
[setup - the official Cygwin setup program used to install Cygwin and keep it up to date] branch master, updated. release_2.874-18-g63766d3
- From: jturney at sourceware dot org
- To: cygwin-apps-cvs at sourceware dot org
- Date: 3 Aug 2016 20:47:03 -0000
- Subject: [setup - the official Cygwin setup program used to install Cygwin and keep it up to date] branch master, updated. release_2.874-18-g63766d3
https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=63766d30dc3d306661ca6b8a0d70cf8a742aa0eb
commit 63766d30dc3d306661ca6b8a0d70cf8a742aa0eb
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Tue Aug 2 12:40:01 2016 +0100
Reserve paths starting "." for package metadata
Reserve pathnames starting "." (i.e. dotfiles in the root directory) for
package metadata, so don't extract them.
There are no current uses of these pathnames
https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=b8752287e2511fe238dfb9aa3620e73338fba821
commit b8752287e2511fe238dfb9aa3620e73338fba821
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Mon Aug 1 18:05:14 2016 +0100
Add an additional filter view, showing packages which were user picked
Add an additional filter view, showing installed packages which were
selected for installation by the user, not installed as dependencies.
Future work:
Why is PickView::views is not an enum?
The view button would make more sense as a pop-up menu, allowing a specific
filter view to be directly selected, rather than cycling around the possible
filter views (and this situation is made worse by adding another filter
view)
https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=f6d6c600edffdb83a57ed13384e38a504fdc366b
commit f6d6c600edffdb83a57ed13384e38a504fdc366b
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Tue Aug 2 12:19:09 2016 +0100
Track if a package was installed by user, or as a dependency
Update the installed.db file format to version 3, containing the user_picked
flag.
This extends the semantics of user_pick somewhat: currently it is only used
for UI purposes, to record if a package was picked in the current session.
Now we also use it to record if an installed package has ever been picked
via the UI (otherwise it is only installed because it is a dependency).
So, we are careful not to set it when a currently installed package has it's
installed version adjusted via the GUI.
We also arrange for user_pick to be set when a package was selected for
installation via CLI.
Add a heuristic to initially populate user_pick when upgrading from older
installed.db formats: All non-base installed packages which aren't
dependencies are assumed to be user_pick-ed.
Note: other tools (e.g. cygcheck) which read the installed.db file will need
updating appropriately
v2:
Don't gratuitously break compatiblity with other existing readers of
installed.db, keep recording version as a notional filename.
Don't treat unknown future installed.db format versions as format version 1,
instead treat setup downgrading as a fatal error.
https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=e4814417d7f0e13f0a3091e8a4255b7b919a2807
commit e4814417d7f0e13f0a3091e8a4255b7b919a2807
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Mon Aug 1 13:45:40 2016 +0100
Remove unused fn member from cygpackage
This is set, but never used.
https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=f480a7df426ab3d3e2f83b7322ef37ba2ab201de
commit f480a7df426ab3d3e2f83b7322ef37ba2ab201de
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Mon Aug 1 13:43:34 2016 +0100
Remove obsolete installed_from member from packagemeta
This just stores a made-up tarfile name read from installed.db, and is never
used.
https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=657d8c71a45caa648cce7bc09ab944b57969a58c
commit 657d8c71a45caa648cce7bc09ab944b57969a58c
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Thu Jul 7 14:34:22 2016 +0100
Properly report progress in PrereqChecker::isMet
Properly report progress in PrereqChecker::isMet after additional dependency
work is found.
https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=14f0a1347d870a340f09b5a789d80cb9ee14e864
commit 14f0a1347d870a340f09b5a789d80cb9ee14e864
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Tue Jun 21 16:25:22 2016 +0100
Downgrade "Running preremove script" logging to debug
This is emitted for every package, regardless of it has any scripts or not.
Actual script execution is logged separately.
Also a cosmetic fix to remove a doubled space.
https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=379d3682722fcebdae231edc401592bb8ca1def3
commit 379d3682722fcebdae231edc401592bb8ca1def3
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Mon Aug 1 12:16:14 2016 +0100
Add lex and yacc generated files to .gitignore
https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=7852d6981af422bc641f92cf56f50a3121754f51
commit 7852d6981af422bc641f92cf56f50a3121754f51
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Fri Jul 8 12:06:10 2016 +0100
Prevent libtool warning that a getopt++ shared library cannot be built
libtool: warning: undefined symbols not allowed in i686-w64-mingw32 shared libraries; building static only
https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=6557bf589e58e3aa0699706397a22a62f483e0d1
commit 6557bf589e58e3aa0699706397a22a62f483e0d1
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Mon Aug 1 18:35:43 2016 +0100
Remove stray execute permissions
Diff:
---
.gitignore | 3 +
PickView.cc | 16 ++++-
PickView.h | 4 +-
cygpackage.cc | 3 -
cygpackage.h | 8 +--
cygwin.pub | Bin 964 -> 964 bytes
ini.cc | 4 +
install.cc | 11 +++-
libgetopt++/Makefile.am | 3 +-
package_db.cc | 141 +++++++++++++++++++++++++++++++++++++----------
package_db.h | 3 +
package_meta.cc | 6 +-
package_meta.h | 11 +---
prereq.cc | 1 +
res.rc | 6 ++-
resource.h | 1 +
tree-minus.bmp | Bin 106 -> 106 bytes
tree-plus.bmp | Bin 106 -> 106 bytes
18 files changed, 162 insertions(+), 59 deletions(-)
diff --git a/.gitignore b/.gitignore
index 2186aac..8b81166 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,6 @@ make.out
CVS
tags
autoconf.h.in*
+inilex.cc
+iniparse.cc
+iniparse.hh
diff --git a/KeysSetting.cc b/KeysSetting.cc
old mode 100755
new mode 100644
diff --git a/KeysSetting.h b/KeysSetting.h
old mode 100755
new mode 100644
diff --git a/PickView.cc b/PickView.cc
index 4630ee9..c784a2a 100644
--- a/PickView.cc
+++ b/PickView.cc
@@ -57,8 +57,9 @@ const PickView::views PickView::views::Unknown (0);
const PickView::views PickView::views::PackageFull (1);
const PickView::views PickView::views::Package (2);
const PickView::views PickView::views::PackageKeeps (3);
-const PickView::views PickView::views::PackageSkips = PickView::views (4);
-const PickView::views PickView::views::Category (5);
+const PickView::views PickView::views::PackageSkips (4);
+const PickView::views PickView::views::PackageUserPicked (5);
+const PickView::views PickView::views::Category (6);
ATOM PickView::WindowClassAtom = 0;
@@ -92,7 +93,8 @@ PickView::set_header_column_order (views vm)
if (vm == views::Unknown)
return -1;
else if (vm == views::PackageFull || vm == views::Package
- || vm == views::PackageKeeps || vm == views::PackageSkips)
+ || vm == views::PackageKeeps || vm == views::PackageSkips
+ || vm == views::PackageUserPicked)
{
headers = pkg_headers;
current_col = 0;
@@ -197,7 +199,11 @@ PickView::setViewMode (views mode)
// "Not installed"
|| (view_mode == PickView::views::PackageSkips &&
- (!pkg.desired && !pkg.installed)))
+ (!pkg.desired && !pkg.installed))
+
+ // "UserPick" : installed packages that were picked by user
+ || (view_mode == PickView::views::PackageUserPicked &&
+ (pkg.installed && pkg.user_picked)))
{
// Filter by package name
if (packageFilterString.empty ()
@@ -246,6 +252,8 @@ PickView::views::caption ()
case 4:
return "Not Installed";
case 5:
+ return "Picked";
+ case 6:
return "Category";
default:
return "";
diff --git a/PickView.h b/PickView.h
index 0ce7581..fd20dc9 100644
--- a/PickView.h
+++ b/PickView.h
@@ -104,15 +104,15 @@ public:
static const views Package;
static const views PackageKeeps;
static const views PackageSkips;
+ static const views PackageUserPicked;
static const views Category;
- static const views NView;
views ():_value (0)
{
};
views (int aInt)
{
_value = aInt;
- if (_value < 0 || _value > 5)
+ if (_value < 0 || _value > 6)
_value = 0;
}
views & operator++ ();
diff --git a/crypto.cc b/crypto.cc
old mode 100755
new mode 100644
diff --git a/crypto.h b/crypto.h
old mode 100755
new mode 100644
diff --git a/cyg-pubkey.h b/cyg-pubkey.h
old mode 100755
new mode 100644
diff --git a/cygpackage.cc b/cygpackage.cc
index 4b05cb3..71816f9 100644
--- a/cygpackage.cc
+++ b/cygpackage.cc
@@ -39,7 +39,6 @@ name (),
vendor (),
packagev (),
canonical (),
-fn (),
sdesc (),
ldesc (),
status (package_installed),
@@ -66,14 +65,12 @@ cygpackage::createInstance (const std::string& pkgname,
packageversion
cygpackage::createInstance (const std::string& pkgname,
- const std::string& filename,
const std::string& version,
package_status_t const newstatus,
package_type_t const newtype)
{
cygpackage *temp = new cygpackage;
temp->name = pkgname;
- temp->fn = filename;
temp->status = newstatus;
temp->type = newtype;
temp->setCanonicalVersion (version);
diff --git a/cygpackage.h b/cygpackage.h
index 0b08e0d..991072a 100644
--- a/cygpackage.h
+++ b/cygpackage.h
@@ -70,10 +70,9 @@ public:
static packageversion createInstance (const std::string& pkgname,
const package_type_t type);
- static packageversion createInstance (const std::string& ,
- const std::string& ,
- const std::string& ,
- package_status_t const,
+ static packageversion createInstance (const std::string& pkgname,
+ const std::string& version,
+ package_status_t const,
package_type_t const);
private:
@@ -83,7 +82,6 @@ private:
std::string vendor;
std::string packagev;
std::string canonical;
- std::string fn;
std::string sdesc, ldesc;
char getfilenamebuffer[CYG_PATH_MAX];
diff --git a/gpg-packet.cc b/gpg-packet.cc
old mode 100755
new mode 100644
diff --git a/gpg-packet.h b/gpg-packet.h
old mode 100755
new mode 100644
diff --git a/ini.cc b/ini.cc
index 456eb6e..f925bf5 100644
--- a/ini.cc
+++ b/ini.cc
@@ -51,6 +51,7 @@
#include "compress.h"
#include "Exception.h"
#include "crypto.h"
+#include "package_db.h"
extern ThreeBarProgressPage Progress;
@@ -351,6 +352,9 @@ do_ini_thread (HINSTANCE h, HWND owner)
else
ini_count = do_remote_ini (owner);
+ packagedb db;
+ db.upgrade();
+
if (ini_count == 0)
return false;
diff --git a/install.cc b/install.cc
index 2b714bc..8aad3a5 100644
--- a/install.cc
+++ b/install.cc
@@ -159,7 +159,7 @@ Installer::preremoveOne (packagemeta & pkg)
{
Progress.SetText1 ("Running preremove script...");
Progress.SetText2 (pkg.name.c_str());
- Log (LOG_PLAIN) << "Running preremove script for " << pkg.name << endLog;
+ Log (LOG_BABBLE) << "Running preremove script for " << pkg.name << endLog;
const unsigned numexts = 4;
const char* exts[numexts] = { ".dash", ".sh", ".bat", ".cmd" };
for (unsigned i = 0; i < numexts; i++)
@@ -471,6 +471,15 @@ Installer::installOne (packagemeta &pkgm, const packageversion &ver,
while ((fn = tarstream->next_file_name ()).size ())
{
std::string canonicalfn = prefixPath + fn;
+
+ // pathnames starting "." (i.e. dotfiles in the root directory) are
+ // reserved for package metadata. Don't extract them.
+ if (fn[0] == '.')
+ {
+ tarstream->skip_file ();
+ continue;
+ }
+
Progress.SetText3 (canonicalfn.c_str ());
Log (LOG_BABBLE) << "Installing file " << prefixURL << prefixPath
<< fn << endLog;
diff --git a/libgetopt++/Makefile.am b/libgetopt++/Makefile.am
index f820d71..34dc6fd 100644
--- a/libgetopt++/Makefile.am
+++ b/libgetopt++/Makefile.am
@@ -28,7 +28,7 @@ libgetopt___la_SOURCES = src/GetOption.cc src/Option.cc src/BoolOption.cc \
src/OptionSet.cc \
src/StringArrayOption.cc src/StringOption.cc
-libgetopt___la_LDFLAGS = -version-info 1:1:0
+libgetopt___la_LDFLAGS = -version-info 1:1:0 -no-undefined
getoptinclude_HEADERS = include/getopt++/Option.h \
include/getopt++/BoolOption.h \
@@ -49,4 +49,3 @@ tests_BoolOptionTest_LDADD = libgetopt++.la
tests_OptionSet_SOURCES = tests/OptionSet.cc
tests_OptionSet_LDADD = libgetopt++.la
-
diff --git a/package_db.cc b/package_db.cc
index 73dfbf6..eb7ff6b 100644
--- a/package_db.cc
+++ b/package_db.cc
@@ -42,6 +42,8 @@ static const char *cvsid =
#include "package_meta.h"
#include "Exception.h"
#include "Generic.h"
+#include "LogSingleton.h"
+#include "resource.h"
using namespace std;
@@ -55,37 +57,44 @@ packagedb::packagedb ()
installeddbread = 1;
if (!db)
return;
- /* flush_local_db_package_data */
- char line[1000], pkgname[1000], inst[1000];
- int instsz;
+ char line[1000], pkgname[1000];
if (db->gets (line, 1000))
{
+ /* Look for header line (absent in version 1) */
+ int instsz;
int dbver;
sscanf (line, "%s %d", pkgname, &instsz);
- if (!strcasecmp (pkgname, "INSTALLED.DB") && instsz == 2)
- dbver = 2;
+ if (!strcasecmp (pkgname, "INSTALLED.DB"))
+ dbver = instsz;
else
dbver = 1;
delete db;
db = 0;
- /* Later versions may not use installed.db other than to record the version. */
- if (dbver == 1 || dbver == 2)
+
+ Log (LOG_BABBLE) << "INSTALLED.DB version " << dbver << endLog;
+
+ if (dbver <= 3)
{
+ char inst[1000];
+
db =
io_stream::open ("cygfile:///etc/setup/installed.db", "rt", 0);
- if (dbver == 2)
+
+ // skip over already-parsed header line
+ if (dbver >= 2)
db->gets (line, 1000);
+
while (db->gets (line, 1000))
{
int parseable;
- int ign;
+ int user_picked = 0;
pkgname[0] = '\0';
inst[0] = '\0';
- sscanf (line, "%s %s %d", pkgname, inst, &ign);
+ int res = sscanf (line, "%s %s %d", pkgname, inst, &user_picked);
- if (pkgname[0] == '\0' || inst[0] == '\0')
+ if (res < 3 || pkgname[0] == '\0' || inst[0] == '\0')
continue;
fileparse f;
@@ -96,29 +105,31 @@ packagedb::packagedb ()
packagemeta *pkg = findBinary (PackageSpecification(pkgname));
if (!pkg)
{
- pkg = new packagemeta (pkgname, inst);
+ pkg = new packagemeta (pkgname);
packages.insert (packagedb::packagecollection::value_type(pkgname, pkg));
- /* we should install a new handler then not check this...
- */
- //if (!pkg)
- //die badly
}
packageversion binary =
- cygpackage::createInstance (pkgname, inst, f.ver,
- package_installed,
- package_binary);
+ cygpackage::createInstance (pkgname, f.ver,
+ package_installed,
+ package_binary);
pkg->add_version (binary);
pkg->set_installed (binary);
pkg->desired = pkg->installed;
+
+ if (dbver == 3)
+ pkg->user_picked = (user_picked & 1);
}
delete db;
db = 0;
}
else
- // unknown dbversion
- exit (1);
+ {
+ fatal(NULL, IDS_INSTALLEDB_VERSION);
+ }
+
+ installeddbver = dbver;
}
}
}
@@ -138,21 +149,23 @@ packagedb::flush ()
if (!ndb)
return errno ? errno : 1;
- ndb->write ("INSTALLED.DB 2\n", strlen ("INSTALLED.DB 2\n"));
+ ndb->write ("INSTALLED.DB 3\n", strlen ("INSTALLED.DB 3\n"));
for (packagedb::packagecollection::iterator i = packages.begin ();
i != packages.end (); ++i)
{
packagemeta & pkgm = *(i->second);
if (pkgm.installed)
{
- /* size here is irrelevant - as we can assume that this install source
- * no longer exists, and it does not correlate to used disk space
- * also note that we are writing a fictional install source
- * to keep cygcheck happy.
- */
+ /*
+ In INSTALLED.DB 3, lines are: 'packagename version flags', where
+ version is encoded in a notional filename for backwards
+ compatibility, and the only currently defined flag is user-picked
+ (bit 0).
+ */
std::string line;
- line = pkgm.name + " " + pkgm.name + "-" +
- std::string(pkgm.installed.Canonical_version()) + ".tar.bz2 0\n";
+ line = pkgm.name + " " +
+ pkgm.name + "-" + std::string(pkgm.installed.Canonical_version()) + ".tar.bz2 " +
+ (pkgm.user_picked ? "1" : "0") + "\n";
ndb->write (line.c_str(), line.size());
}
}
@@ -166,6 +179,18 @@ packagedb::flush ()
return 0;
}
+void
+packagedb::upgrade()
+{
+ if (installeddbver < 3)
+ {
+ /* Guess which packages were user_picked. This has to take place after
+ setup.ini has been parsed as it needs dependency information. */
+ guessUserPicked();
+ installeddbver = 3;
+ }
+}
+
packagemeta *
packagedb::findBinary (PackageSpecification const &spec) const
{
@@ -199,13 +224,13 @@ packagedb::findSource (PackageSpecification const &spec) const
/* static members */
int packagedb::installeddbread = 0;
+int packagedb::installeddbver = 0;
packagedb::packagecollection packagedb::packages;
packagedb::categoriesType packagedb::categories;
packagedb::packagecollection packagedb::sourcePackages;
PackageDBActions packagedb::task = PackageDB_Install;
std::vector <packagemeta *> packagedb::dependencyOrderedPackages;
-#include "LogSingleton.h"
#include <stack>
class
@@ -449,3 +474,59 @@ packagedb::defaultTrust (trusts trust)
packagedb::categories.erase (n++);
}
}
+
+void
+packagedb::guessUserPicked()
+{
+ /*
+ Assume that any non-base installed package which is a dependency of an
+ installed package wasn't user_picked
+
+ i.e. only installed packages which aren't in the base category, and aren't
+ a dependency of any installed package are user_picked
+ */
+
+ /* First mark all installed non-base packages */
+ for (packagedb::packagecollection::iterator i = packages.begin ();
+ i != packages.end (); ++i)
+ {
+ packagemeta & pkgm = *(i->second);
+
+ if (pkgm.categories.find ("Base") != pkgm.categories.end ())
+ continue;
+
+ if (pkgm.installed)
+ pkgm.user_picked = TRUE;
+ }
+
+ /* Then clear the mark for all dependencies of all installed packages */
+ for (packagedb::packagecollection::iterator i = packages.begin ();
+ i != packages.end (); ++i)
+ {
+ packagemeta & pkgm = *(i->second);
+
+ if (!pkgm.installed)
+ continue;
+
+ /* walk through each and clause */
+ vector <vector <PackageSpecification *> *>::const_iterator dp = pkgm.installed.depends()->begin();
+ while (dp != pkgm.installed.depends()->end())
+ {
+ /* check each or clause for an installed match */
+ vector <PackageSpecification *>::const_iterator i = find_if ((*dp)->begin(), (*dp)->end(), checkForInstalled);
+ if (i != (*dp)->end())
+ {
+ const packagedb::packagecollection::iterator n = packages.find((*i)->packageName());
+ if (n != packages.end())
+ {
+ packagemeta *pkgm2 = n->second;
+ pkgm2->user_picked = FALSE;
+ }
+ /* skip to next and clause */
+ ++dp;
+ continue;
+ }
+ ++dp;
+ }
+ }
+}
diff --git a/package_db.h b/package_db.h
index bc828a1..6a99398 100644
--- a/package_db.h
+++ b/package_db.h
@@ -65,6 +65,7 @@ public:
packagedb ();
/* 0 on success */
int flush ();
+ void upgrade ();
packagemeta * findBinary (PackageSpecification const &) const;
packagemeta * findSource (PackageSpecification const &) const;
PackageDBConnectedIterator connectedBegin();
@@ -84,8 +85,10 @@ public:
static PackageDBActions task;
private:
static int installeddbread; /* do we have to reread this */
+ static int installeddbver;
friend class ConnectedLoopFinder;
static std::vector <packagemeta *> dependencyOrderedPackages;
+ void guessUserPicked(void);
};
#endif /* SETUP_PACKAGE_DB_H */
diff --git a/package_meta.cc b/package_meta.cc
index 34ff78c..3923b13 100644
--- a/package_meta.cc
+++ b/package_meta.cc
@@ -91,7 +91,7 @@ packagemeta::_actions::caption ()
}
packagemeta::packagemeta (packagemeta const &rhs) :
- name (rhs.name), key (rhs.name), installed_from (),
+ name (rhs.name), key (rhs.name),
categories (rhs.categories), versions (rhs.versions),
installed (rhs.installed), prev (rhs.prev),
curr (rhs.curr),
@@ -458,7 +458,8 @@ packagemeta::set_action (trusts const trust)
else
desired = packageversion ();
/* Memorize the fact that the user picked at least once. */
- user_picked = true;
+ if (!installed)
+ user_picked = true;
}
int
@@ -510,6 +511,7 @@ packagemeta::set_action (_actions action, packageversion const &default_version)
if (desired != installed)
if (desired.accessible ())
{
+ user_picked = true;
desired.pick (true, this);
desired.sourcePackage ().pick (false, NULL);
}
diff --git a/package_meta.h b/package_meta.h
index b24d4fc..3d6ccd2 100644
--- a/package_meta.h
+++ b/package_meta.h
@@ -35,17 +35,11 @@ public:
static void ScanDownloadedFiles (bool);
packagemeta (packagemeta const &);
packagemeta (const std::string& pkgname)
- : name (pkgname), key(pkgname), installed_from (), user_picked (false),
+ : name (pkgname), key(pkgname), user_picked (false),
architecture (), priority(), visited_(false)
{
}
- packagemeta (const std::string& pkgname, const std::string& installedfrom)
- : name (pkgname), key(pkgname), installed_from (installedfrom),
- user_picked (false), architecture (), priority(), visited_(false)
- {
- }
-
~packagemeta ();
void add_version (packageversion &);
@@ -118,8 +112,7 @@ public:
std::string name; /* package name, like "cygwin" */
std::string key;
- /* legacy variable used to output data for installed.db versions <= 2 */
- std::string installed_from;
+
/* true if package was selected on command-line. */
bool isManuallyWanted() const;
/* true if package was deleted on command-line. */
diff --git a/prereq.cc b/prereq.cc
index bdc609e..a5083ed 100644
--- a/prereq.cc
+++ b/prereq.cc
@@ -238,6 +238,7 @@ PrereqChecker::isMet ()
{
// newly found dependency: add to worklist
todo.push (dep);
+ max++;
}
unmet[dep].push_back (pack);
}
diff --git a/res.rc b/res.rc
index f1cf406..2fae133 100644
--- a/res.rc
+++ b/res.rc
@@ -551,7 +551,10 @@ BEGIN
"are at the desired version already.\r\n"
"\r\n"
"Not installed: Show packages that are are not currently installed "
- "and haven't been selected for installation."
+ "and haven't been selected for installation.\r\n"
+ "\r\n"
+ "Picked: Show installed packages that were selected, not installed "
+ "as a dependency."
IDS_HIDEOBS_TOOLTIP "If selected, setup will hide packages in categories "
"with names that begin with '_'. Such packages are usually empty "
"placeholders for packages that have been removed or renamed, or are "
@@ -569,4 +572,5 @@ BEGIN
IDS_NO_LOCALDIR "Local package directory %s not found.\nYou can still use setup-%s.exe to remove installed\npackages, but there "
"will be nothing to install.\n\nPress OK if that's what you wanted\nor Cancel to choose a different directory."
IDS_ELEVATED "Hand installation over to elevated child process."
+ IDS_INSTALLEDB_VERSION "Unknown INSTALLED.DB version"
END
diff --git a/resource.h b/resource.h
index 48f03ab..68e8023 100644
--- a/resource.h
+++ b/resource.h
@@ -39,6 +39,7 @@
#define IDS_CANT_MKDIR 137
#define IDS_NO_LOCALDIR 138
#define IDS_ELEVATED 139
+#define IDS_INSTALLEDB_VERSION 140
// Dialogs