summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2009-07-29 09:49:51 +0000
committerColin Watson <cjwatson@debian.org>2009-07-29 09:49:51 +0000
commit9e7d96f50df440f1ce1432e44f774799d4e5c0c0 (patch)
tree9b6fc6775cd8ecde0653ae320b3a44440ea4d535
parent91ea3a0cf08eddf8a0f134f4878387ef4fcd9c84 (diff)
downloaddebootstrap-9e7d96f50df440f1ce1432e44f774799d4e5c0c0.tar.gz
Cope with pre-dependencies of included packages that aren't in Priority:
required (closes: #487908). r59820
-rw-r--r--debian/changelog7
-rw-r--r--debootstrap.85
-rw-r--r--functions40
-rw-r--r--scripts/debian/sid13
-rw-r--r--scripts/ubuntu/gutsy13
5 files changed, 73 insertions, 5 deletions
diff --git a/debian/changelog b/debian/changelog
index 7b00511..17a9ec2 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+debootstrap (1.0.16) UNRELEASED; urgency=low
+
+ * Cope with pre-dependencies of included packages that aren't in Priority:
+ required (closes: #487908).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 29 Jul 2009 10:46:56 +0100
+
debootstrap (1.0.15) unstable; urgency=low
* On Linux, clear out /etc/mtab on exit if it's not a symlink. Should fix
diff --git a/debootstrap.8 b/debootstrap.8
index c1995cc..d909b34 100644
--- a/debootstrap.8
+++ b/debootstrap.8
@@ -47,11 +47,6 @@ See also \-\-foreign.
.IP "\fB\-\-include=alpha,beta\fP"
Comma separated list of packages which will be added to download and extract
lists.
-Beware that including packages that declare a Pre\-Depends relationship on
-any package that is not in the "required" set (i.e. "Priority: required"),
-or that depend directly or indirectly on packages that do so, will not work;
-you will need to install such packages separately after \fBdebootstrap\fP
-has completed.
.IP
.IP "\fB\-\-exclude=alpha,beta\fP"
Comma separated list of packages which will be removed from download and
diff --git a/functions b/functions
index 989fb6e..0312157 100644
--- a/functions
+++ b/functions
@@ -997,6 +997,24 @@ while (<STDIN>) {
local p="$4"
shift; shift; shift; shift
pkgdetails_field 0 "$f" "$m" "$@" < "$p"
+ elif [ "$1" = "STANZAS" ]; then
+ local pkgdest="$2"; shift; shift
+ perl -e '
+my $accum = "";
+while (<STDIN>) {
+ $accum .= $_;
+ $in = 1 if (/^Package: (.*)$/ && grep {$_ eq $1} @ARGV);
+ if ($in and /^$/) {
+ print $accum;
+ if (substr($accum, -1) != "\n") {
+ print "\n\n";
+ } elsif (substr($accum, -2, 1) != "\n") {
+ print "\n";
+ }
+ $in = 0;
+ }
+ $accum = "" if /^$/;
+}' <"$pkgdest" "$@"
fi
}
elif [ -e "/usr/lib/debootstrap/pkgdetails" ]; then
@@ -1032,6 +1050,28 @@ resolve_deps () {
echo $ALLPKGS
}
+setup_available () {
+ local m1="${MIRRORS%% *}"
+
+ for c in $COMPONENTS; do
+ local path="dists/$SUITE/$c/binary-$ARCH/Packages"
+ local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m1" "$path")"
+ # XXX: What if a package is in more than one component?
+ # -- cjwatson 2009-07-29
+ "$PKGDETAILS" STANZAS "$pkgdest" "$@"
+ done >"$TARGET/var/lib/dpkg/available"
+
+ for pkg; do
+ echo "$pkg install" | sudo dpkg --admindir "$TARGET/var/lib/dpkg" --set-selections
+ done
+}
+
+get_next_predep () {
+ local stanza="$(dpkg --admindir "$TARGET/var/lib/dpkg" --predep-package)" || return 1
+ [ "$stanza" ] || return 1
+ echo "$stanza" | grep '^Package:' | sed 's/^Package://; s/^ *//'
+}
+
################################################################### helpers
# Return zero if it is possible to create devices and execute programs in
diff --git a/scripts/debian/sid b/scripts/debian/sid
index 239b0c4..59e70fd 100644
--- a/scripts/debian/sid
+++ b/scripts/debian/sid
@@ -168,6 +168,19 @@ echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "$TARGET/sbin/
info UNPACKBASE "Unpacking the base system..."
+ setup_available $required $base
+ done_predeps=
+ while predep=$(get_next_predep); do
+ # We have to resolve dependencies of pre-dependencies manually because
+ # dpkg --predep-package doesn't handle this.
+ predep=$(without "$(without "$(resolve_deps $predep)" "$required")" "$done_predeps")
+ # XXX: progress is tricky due to how dpkg_progress works
+ # -- cjwatson 2009-07-29
+ p; smallyes '' | in_target dpkg --force-overwrite --force-confold --skip-same-version --install $(debfor $predep)
+ base=$(without "$base" "$predep")
+ done_predeps="$done_predeps $predep"
+ done
+
smallyes '' |
(repeatn 5 in_target_failmsg INST_BASE_FAIL_FIVE "Failure while installing base packages. This will be re-attempted up to five times." "" \
dpkg --status-fd 8 --force-overwrite --force-confold --skip-same-version --unpack $(debfor $base) 8>&1 1>&7 || echo EXITCODE $?) |
diff --git a/scripts/ubuntu/gutsy b/scripts/ubuntu/gutsy
index caca1f8..2331622 100644
--- a/scripts/ubuntu/gutsy
+++ b/scripts/ubuntu/gutsy
@@ -166,6 +166,19 @@ echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "$TARGET/sbin/
info UNPACKBASE "Unpacking the base system..."
+ setup_available $required $base
+ done_predeps=
+ while predep=$(get_next_predep); do
+ # We have to resolve dependencies of pre-dependencies manually because
+ # dpkg --predep-package doesn't handle this.
+ predep=$(without "$(without "$(resolve_deps $predep)" "$required")" "$done_predeps")
+ # XXX: progress is tricky due to how dpkg_progress works
+ # -- cjwatson 2009-07-29
+ p; smallyes '' | in_target dpkg --force-overwrite --force-confold --skip-same-version --install $(debfor $predep)
+ base=$(without "$base" "$predep")
+ done_predeps="$done_predeps $predep"
+ done
+
smallyes '' |
(repeatn 5 in_target_failmsg INST_BASE_FAIL_FIVE "Failure while installing base packages. This will be re-attempted up to five times." "" \
dpkg --status-fd 8 --force-overwrite --force-confold --skip-same-version --unpack $(debfor $base) 8>&1 1>&7 |