Ken Brown [Mon, 27 Nov 2017 18:14:15 +0000 (13:14 -0500)]
Fix the reading and writing of the "extrakeys" user setting
ExtraKeysSetting::keybuffer is terminated by LF rather than NUL. So
we have to replace NUL by LF after calling
UserSettings::get("extrakeys") in the ExtraKeysSetting constructor.
Otherwise the last saved key is discarded. Also, bufsize has to be
set appropriately before the call to count_keys(), or else all saved
keys are discarded.
Similarly, the final LF in keybuffer has to be replaced by NUL in the
ExtraKeysSetting destructor before the call to
UserSettings::set("extrakeys", keybuffer). Otherwise we get garbage
at the end of the "extrakeys" setting in setup.rc.
Ken Brown [Fri, 24 Nov 2017 17:29:27 +0000 (12:29 -0500)]
site.cc, site.h: code cleanup
Remove site_list_type::init(), which was introduced to work around a
problem with gcc-2.95.
Add a bool member 'from_mirrors_lst' to the site_list_type class. Use
it to distinguish mirrors listed in mirrors.lst from user-added sites.
This replaces the (undocumented) use of
site_list_type::servername.size() for this purpose.
When registerSavedSite is called on a URL that's already in
'all_site_list', add the version from 'all_site_list' to 'site_list'
rather than adding a temporary version that contains no information
other than the URL.
Similarly, if the user adds a site that was already in
'all_site_list', don't replace the existent version with the new one
(which contains only the URL).
Ken Brown [Fri, 27 Oct 2017 18:47:23 +0000 (14:47 -0400)]
Remove the ScanFindVisitor class
This class was used for local installs in which the repository contains no
setup.ini file.
This seems of questionable usefulness, since it doesn't know anything about
dependencies
It also doesn't correctly handle filenames with colons.
There are now good instructions at
https://cygwin.com/package-server.html#overlay for creating a valid
repository, so we just remove the class instead of trying to fix it.
Ken Brown [Mon, 13 Nov 2017 17:27:58 +0000 (12:27 -0500)]
Query user after download error in interactive mode
Instead of just giving the user a "Try again?" Yes/No choice that goes
to IDD_SITE on Yes, create a dialog IDD_DOWNLOAD_ERROR with the
following choices: 'Retry' (retry the download), 'Back' (return to
IDD_CHOOSE), 'Continue' (ignore the errors), or 'Cancel' (exit).
The dialog lists the packages that had download errors so that the
user can make an informed choice.
Users who liked the old behavior (IDD_SITE) can select Back twice.
Ken Brown [Fri, 10 Nov 2017 14:43:35 +0000 (09:43 -0500)]
Just retry download after error in unattended mode
After a download error, setup was going back to IDD_SITE. This is
pointless in unattended mode, since no changes in the mirrors or
packages can be made.
Change misleading comment about retries in unattended mode; the Yes/No
dialog is not used in that case.
Jon Turney [Thu, 19 Oct 2017 01:20:55 +0000 (02:20 +0100)]
Fix -Werror=misleading-indentation errors seen with gcc 6
This looks like an actual bug which has been lurking here since forever,
fortunately not exposed since hardly anything uses Option::Optional...
libgetopt++/src/OptionSet.cc: In member function 'void OptionSet::doOption(std::__cxx11::string&, const size_type&)':
libgetopt++/src/OptionSet.cc:125:25: error: this 'if' clause does not guard... [-Werror=misleading-indentation]
if (!isOption(maybepos))
^~
libgetopt++/src/OptionSet.cc:128:8: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the 'if'
argv.erase(argv.begin() + 1);
^~~~
libgetopt++/src/OptionSet.cc:159:25: error: this 'if' clause does not guard... [-Werror=misleading-indentation]
if (!isOption(maybepos))
^~
libgetopt++/src/OptionSet.cc:161:8: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the 'if'
argv.erase(argv.begin() + 1);
^~~~
Jon Turney [Tue, 10 Oct 2017 16:10:57 +0000 (17:10 +0100)]
Fix spinning after replace-on-reboot failure or skipped
If:
- extracting a file failed AND --no-replaceonreboot was used
- OR, writing the .new file for replacing on reboot failed
we don't advance to the next file in the archive, so we just sit there,
trying the same operation repeatedly.
Yes, this seems to mean that --no-replaceonreboot never worked usefully.
Also advance to next file in extract_other error case.
See https://cygwin.com/ml/cygwin/2017-10/msg00090.html
Ake Rehnman [Tue, 2 May 2017 18:55:07 +0000 (20:55 +0200)]
Avoid messagebox spam with file:// protocol URLs
When using a file:// protocol URL for package repo, don't spam messageboxes
warning about absence of compressed setup files. We don't do that for
ftp:// or http:// protocol URLs.
A warning is still given we couldn't find a useable setup.ini from the URL
provided
Jon Turney [Fri, 2 Jun 2017 16:46:14 +0000 (17:46 +0100)]
Fix that clicking on any column changes "Keep" to "Uninstall"
A package's status is only changed by clicking on the "New" column, with one
exception: If the status is "Keep", it is changed to "Uninstall" after a
click (even accidental) on any other column.
"Keep" means desired == installed, picked = false. Only run the code which
is supposed to detect both "src?" and "bin?" unchecked when clicking on
those columns.
Jon Turney [Fri, 2 Jun 2017 11:20:36 +0000 (12:20 +0100)]
Add Option::isPresent() method
Add Option::isPresent() method, so we can distinguish between the cases of
an option which is present with the default value, and an option which is
absent.
Jon Turney [Fri, 28 Apr 2017 21:11:47 +0000 (22:11 +0100)]
Fold build(Install|Source)(MD5|SHA512) into buildPackage(Install|Source)
Fold build(Install|Source)(MD5|SHA512) into buildPackage(Install|Source), so
the (pathname, size, hash) information from an install: or source: line is
all processed together.
Jon Turney [Sun, 21 May 2017 18:45:29 +0000 (19:45 +0100)]
Rename category "Misc" to "Orphaned"
Packages which have no category are placed into this category. Since a
category is mandatory for all packages in setup.ini, this effectively means
packages which are "orphaned" in the sense that they are installed, but
don't appear in any setup.ini.
Usually it's safe to uninstall such packages (with --delete-orphans), unless
you are actually using them, or have locally built packages which rely on
them.
Jon Turney [Tue, 23 May 2017 13:40:24 +0000 (14:40 +0100)]
Restore a missing NULL-ness check
Accidentally dropped in 249e9360. This could go away if
packagesource::Canonical() was changed to return std::string and other uses
checked empty() rather than against NULL.
Jon Turney [Thu, 4 May 2017 21:21:45 +0000 (22:21 +0100)]
All, rather than just the first (usually current) version should get dependencies
It seems that dependencies are only recorded against the first version
encountered, which is fortunately usually the current version. If one were
to install a different version than that the first time a package is
installed, it's dependencies wouldn't be installed.
More zany hijinks from the wacky world of setup :)
Jon Turney [Sat, 29 Apr 2017 22:23:31 +0000 (23:23 +0100)]
Simplify class packagesource
packagesource::Filename() is unused
packagesource::Base() was only used in reporting progress in install.
Instead report the package name and package version. (It would be nice to
do so consistently in uninstall well, but we don't really know what version
we are uninstalling)
The default copy constructor is not overriden, which is unsafe, as the class
contains a pointer to new-ed memory. Use std::string instead, retaining the
relied-upon behaviour of returning NULL for an empty string.
Jon Turney [Thu, 18 May 2017 12:01:06 +0000 (13:01 +0100)]
Use INTERNET_FLAG_RESYNCHRONIZE when fetching cacheable URLs with wininet
It seems this is needed for correct cache behaviour when the server doesn't
add an ETags header (i.e. sending an If-Modified-Since: request). Why would
we want sane behaviour by default, eh?
Jon Turney [Thu, 30 Mar 2017 10:48:44 +0000 (11:48 +0100)]
Use wininet for fetching URLs in direct (non-proxy) case
From the discussion in [1], I was somewhat surprised to learn that setup
doesn't support https or ftps.
Switch to using wininet for fetching URLs in the direct (non-proxy) case, as
well. (It's already used in proxy case). This allows https and ftps
protocols to be used.
For the moment, we keep around the existing, hand-built URL fetching as
'Direct (legacy)'.
Arrange for mirrors.lst and setup.ini to be cached by wininet, but not
package archives (as setup maintains it's own cache of those)
Read from wininet in 64K chunks rather than the whole file, so we can report
progress feedback as we download.
Close rather than leak InternetOpenUrl() handles with errors.
Also fix up some bad indentation.
I think the reason we have a handbuilt HTTP client is that back in 2000 or
so, we were concerned about the case where IE5 wasn't installed and so
wininet wasn't available. But who knows...
Jon Turney [Sat, 21 Jan 2017 16:03:02 +0000 (16:03 +0000)]
Don't show source-only packages in package list
external-source: packages which have no binary package will be marked skip:
and so won't show up in setup.ini at all.
If we change to using the Source: line to identify a source package, which
is (by definition) source only, these will appear in setup.ini, but without
any install: lines, so we need to explcitly avoid showing them in the
package list.
Future work: perhaps add another view to show just source packages?
Jon Turney [Tue, 25 Apr 2017 18:15:16 +0000 (19:15 +0100)]
Don't do unneeded work when changing stability level
Since 2c4487b3, we stopped recomputing all the dependencies every time
something was changed in the PickView. Remove all the depsolver code which
was used to do that.
The only remaining use was when we changed stability level, to select all
the package versions at that stability level. That work is already being
done by packagedb::defaultTrust() (called by ChooserPage::changeTrust()).
(Note that this changes behaviour slightly: New dependencies of currently
installed packages used to be shown in the PickView, but now they won't be
reported until the PrereqChecker)
(This still leaves the crude depsolver we actually use in PrereqChecker,
which just selects all the unmet dependencies with the current trust level)
Jon Turney [Fri, 7 Apr 2017 19:11:08 +0000 (20:11 +0100)]
Remove pointless abstract base class IniDBBuilder
There can be no instances of IniDBBuilder (it has pure virtual methods).
There is only one derived class IniDBBuilderPackage.
We can't think of any use for other derived classes.
Jon Turney [Sat, 21 Jan 2017 18:07:02 +0000 (18:07 +0000)]
Add --allow-unsupported-windows option
This patch was suggested in a discussion with Peter Castro.
The concern is that using old versions of setup to install time machine
mirrors is not ideal, as it misses possible fixes in newer versions of
setup.
However, we do want to make it hard for someone to destroy their working XP
installation, so allowing setup to simply run on XP, which will break it by
upgrading it to the latest version (which doesn't work on XP), seems
contraindicated.
When --allow-unsupported-windows is on:
- Don't check the windows version
- Don't read the mirror list from cygwin.com
- Don't use any stored mirror selection in the 'last-mirror' key (as this
may point to a cygwin mirror, which, if we install from will break things)
- Retain the mirror selection (presumably a time machine circa given with
--site or via the GUI) in an alternate key 'last-mirror-unsupported'
Also, for discoverability, rearrange things so --help works even on
unsupported windows versions
Jon Turney [Wed, 14 Dec 2016 00:00:02 +0000 (00:00 +0000)]
Make package size and checksum mandatory in setup.ini
The setup.ini grammar is written such that size and checksum are optional in
install: lines, and checksum is optional in source: lines. Presumably this
had some historical use.
Change to make package size and checksum mandatory.
Future work: We keep the asymmetry between install: and source: where
buildPackageSource() sets both pathname and size, but buildPackageInstall()
only sets pathname, relying on a separate buildInstallSize() to set the size
later for the moment, as fixing that ripples through to other place.
Jon Turney [Wed, 31 Aug 2016 10:31:22 +0000 (11:31 +0100)]
Allow setup to parse more than 3 versions from the setup.ini file
This recognizes any "[foo]" line as introducing the information for another
version, which doesn't have one of the trust levels [curr], [prev] or
[test], and so isn't automatically selected when setup is told to install
all packages at that trust level (by default, [curr]).
Setup already does all the necessary sorting in version order etc. to use
these additional versions.
The value of <foo> carries no meaning, but the setup.ini specification
will be amended to mandate the use of "[ver<digits>]".
* PackageTrust.h (trusts): Add TRUST_OTHER.
* inilex.ll: tokenize any other [version] as the T_OTHER token.
* iniparse.yy: Add T_OTHER token and set package trust
to TRUST_OTHER when it is used.
Signed-off-by: Jon Turney <jon.turney@dronecode.org.uk>
Jon Turney [Tue, 22 Nov 2016 16:05:58 +0000 (16:05 +0000)]
Strip symbols to setup.dbg
As noted in https://cygwin.com/ml/cygwin/2016-11/msg00254.html debugging the
distributed setup executable is a lost cause at the moment. Preserve
symbols so it's not quite as hopeless.
Note: to debug the distributed setup executable with gdb, it will be
necessary to decompress the setup executable with 'upx -d', and, if the .dbg
file has been renamed to match the renamed setup executable, explicitly load
it into gdb with the 'symbol-file' command.
Signed-off-by: Jon Turney <jon.turney@dronecode.org.uk>
Jon Turney [Thu, 1 Sep 2016 19:30:44 +0000 (20:30 +0100)]
Refuse to run on Windows XP and earlier
Refuse to run on Windows versions less than 6.0 (XP or previous), as they
are no longer supported by Cygwin.
Future work: The version checked against should be read from setup.ini,
rather than hard-coded here, so that this version of setup cannot be used to
download a future version of Cygwin which isn't compatible with the Windows
version it's running on...
Signed-off-by: Jon Turney <jon.turney@dronecode.org.uk>
Jon Turney [Thu, 1 Sep 2016 18:21:55 +0000 (19:21 +0100)]
Fix incorrect heap memory access in SimpleSocket::gets()
nl is dereferenced to check if it's '\n' or '\r', before we check if we have
passed the start of the buffer. Re-order the check so we check if we have
passed the start of the buffer first.
Fix scope problem when using the return value of get_root_dir()
Let get_root_dir return a reference instead of a temporary
std::string object. In directory_is_absolute() and
directory_is_rootdir(), use std::string methods rather than
falling back to plain C techniques.