| delorie.com/archives/browse.cgi | search |
| X-Recipient: | archive-cygwin AT delorie DOT com |
| DomainKey-Signature: | a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id |
| :list-unsubscribe:list-subscribe:list-archive:list-post | |
| :list-help:sender:from:content-type:message-id:mime-version | |
| :subject:date:references:to:in-reply-to; q=dns; s=default; b=rCt | |
| ufvqN1bR5MaT+30CKSVLpUu21S5di1B8cbv+8bdSWtHL2QlEzU//3idBh/PpE1z7 | |
| BdvwUtDJBVituMkquilbmgykye/vCYQMVigIQSMWQuxHNZahNOBWpHD5A78ybWtx | |
| rq1rKcA8hokO6KbqFqHggTzQPG3+/GlLTwY/a9mc= | |
| DKIM-Signature: | v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id |
| :list-unsubscribe:list-subscribe:list-archive:list-post | |
| :list-help:sender:from:content-type:message-id:mime-version | |
| :subject:date:references:to:in-reply-to; s=default; bh=Q5saPLZls | |
| qgbhwpjzP6x9WMUrb0=; b=Yy7TQUSYHKMoYIjdDP++NBiJanawxg4+ZohdGN27V | |
| RI+Gprw8DGn6JevLCsx373J3GQiNZzcd9vobdFFMzjnIqu+BxCVF9QXdTnf+qLvV | |
| s+unQu+MVehB+xA509HL4DlRkKQI2/478ZqRTFaKX0U3C36LrVPvP5YvY5kRCvnK | |
| OE= | |
| Mailing-List: | contact cygwin-help AT cygwin DOT com; run by ezmlm |
| List-Id: | <cygwin.cygwin.com> |
| List-Subscribe: | <mailto:cygwin-subscribe AT cygwin DOT com> |
| List-Archive: | <http://sourceware.org/ml/cygwin/> |
| List-Post: | <mailto:cygwin AT cygwin DOT com> |
| List-Help: | <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs> |
| Sender: | cygwin-owner AT cygwin DOT com |
| Mail-Followup-To: | cygwin AT cygwin DOT com |
| Delivered-To: | mailing list cygwin AT cygwin DOT com |
| Authentication-Results: | sourceware.org; auth=none |
| X-Virus-Found: | No |
| X-Spam-SWARE-Status: | No, score=-0.7 required=5.0 tests=AWL,BAYES_00,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=H*i:sk:98C319E, H*MI:sk:98C319E, H*f:sk:98C319E, H*c:HHHH |
| X-HELO: | etr-usa.com |
| From: | Warren Young <wyml AT etr-usa DOT com> |
| Message-Id: | <44F329F2-C5FE-47D9-BCC5-BF7F9D85F68F@etr-usa.com> |
| Mime-Version: | 1.0 (Mac OS X Mail 9.3 \(3124\)) |
| Subject: | Re: Anecdotal: Rebase and Visual Studio 2015 and /etc |
| Date: | Fri, 1 Jul 2016 17:38:12 -0600 |
| References: | <693uFCmXF1392S07 DOT 1467203045 AT web07 DOT cms DOT usa DOT net> <3334CBDB-BF42-4CDA-83B5-CCA5B251A746 AT etr-usa DOT com> <98C319EE-D0EF-48CD-85D7-3384DA5051A9 AT etr-usa DOT com> |
| To: | The Cygwin Mailing List <cygwin AT cygwin DOT com> |
| In-Reply-To: | <98C319EE-D0EF-48CD-85D7-3384DA5051A9@etr-usa.com> |
| X-IsSubscribed: | yes |
--Apple-Mail=_2F68F56E-D85D-41C5-9D01-EEB5F28E794D
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset=utf-8
On Jul 1, 2016, at 4:40 PM, Warren Young wrote:
>=20
> I=E2=80=99ve written a script to do that automatically.
I=E2=80=99ve improved the script so that it no longer requires any paramete=
rs. It finds the last-used setup.ini file and extracts the list of current=
ly-installed packages, all on its own.
Thus, calling this script is now as simple as:
$ /path/to/setup*.exe -P $(/path/to/find-cyg-roots) ...
--Apple-Mail=_2F68F56E-D85D-41C5-9D01-EEB5F28E794D
Content-Disposition: attachment;
filename=find-cyg-roots
Content-Type: application/octet-stream;
name="find-cyg-roots"
Content-Transfer-Encoding: 7bit
#!/usr/bin/perl
use strict;
use warnings;
use URI::Escape;
my $prgname = $0;
#### find_setup_ini_file ###############################################
# Parse Cygwin's setup.rc file to find the last setup.ini file it used.
sub find_setup_ini_file {
open my $rc, '<', '/etc/setup/setup.rc'
or usage("could not read setup.rc file: $!");
my ($path, $mirror);
while (<$rc>) {
chomp;
if ($_ eq 'last-cache') {
$path = <$rc>;
chomp $path;
$path =~ s/^\s+//;
open my $cp, '-|', "cygpath -u '$path'";
$path = <$cp>;
chomp $path;
close $cp;
}
elsif ($_ eq 'last-mirror') {
$mirror = <$rc>;
chomp $mirror;
$mirror =~ s/^\s+//;
$mirror = uri_escape($mirror);
}
}
close $rc;
usage("could not find last Cygwin cache dir") unless $path;
usage("could not find last Cygwin DL mirror") unless $mirror;
for my $parent (glob("$path/$mirror/x86*")) {
my $path = "$parent/setup.ini";
return $path if -r $path;
}
usage("could not find setup.ini");
return;
}
#### get_installed_package_list ########################################
# Return a list of names of installed packages
sub get_installed_package_list {
open my $db, '<', '/etc/setup/installed.db'
or usage("failed to read installed package DB file: $!");
my $header = <$db>;
my @pkgnames;
while (<$db>) {
my ($name) = split;
push @pkgnames, $name;
}
return \@pkgnames;
}
#### parse_cygwin_setup_ini_file #######################################
# Extract dependency info from the Cygwin setup.ini file.
sub parse_cygwin_setup_ini_file {
my ($inifile, $piref) = @_;
open my $ini, '<', $inifile
or die "Cannot read INI file $inifile: $!\n";
# Skip to first package entry
while (<$ini>) { last if /^@/; }
# Parse package entries
my %deps;
while (defined $_) {
chomp;
my $p = substr $_, 2;
my $obs = 0;
while (<$ini>) {
if (/^@/) {
# Found next package entry; restart outer loop
last;
}
elsif (/^category: Base$/) {
# Mark this one as a special sort of root package: one
# we're going to install regardless of user selection,
# so we need not list it in our output.
$piref->{$p} = 2;
}
elsif (/^category: _obsolete$/) {
# Select this package's replacement instead below.
$piref->{$p} = 0;
$obs = 1;
}
elsif (/^requires:/) {
# Save this package's requirements as its dependents list.
my ($junk, @deps) = split;
$deps{$p} = \@deps;
# If this package was marked obsolete above, select its
# replacement as provisionally to-be-installed. That
# package still might end up removed from our output list
# if it in turn is a dependent of one of the packages we
# consider a "root" package at the end.
$piref->{$deps[0]} = 1 if $obs;
}
}
}
close $ini;
return \%deps;
}
#### usage #############################################################
# Print usage message plus optional error string, then exit
sub usage {
my ($error) = @_;
print "ERROR: $error\n\n" if length($error);
print <<"USAGE";
usage: $prgname
Finds the last-used Cygwin setup.ini file, then uses the
package dependency info found within it to pare the list of
currently-installed Cygwin packages down to a "root" set,
being those that will implicitly install all of the others
as dependencies.
The output is a list suitable for passing to setup.exe -P.
USAGE
exit ($error ? 1 : 0);
}
#### main ##############################################################
my $inifile = find_setup_ini_file;
# Convert package list to a hash so we can mark them non-root by name
my $pkgnames = get_installed_package_list;
my %packages = map { $_ => 1 } @$pkgnames;
my $deps = parse_cygwin_setup_ini_file($inifile, \%packages);
# For each given package name, mark any of its dependencies also found
# on the command line as as non-root.
for my $p (@$pkgnames) {
my $pdref = $deps->{$p};
for my $d (@$pdref) {
$packages{$d} = 0;
}
}
# Collect list of root packages and print it out
print join ',', sort(grep { $packages{$_} == 1 } @$pkgnames);
--Apple-Mail=_2F68F56E-D85D-41C5-9D01-EEB5F28E794D
Content-Type: text/plain; charset=us-ascii
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
--Apple-Mail=_2F68F56E-D85D-41C5-9D01-EEB5F28E794D--
| webmaster | delorie software privacy |
| Copyright © 2019 by DJ Delorie | Updated Jul 2019 |