Package: debootstrap Version: 1.0.42 Severity: wishlist Tags: patch Dear Maintainer,
I wonder if we could have debootstrap support the repository ftp.debian-ports.org. Please find the script attached as an illustration of the requested features, in the form of a script /usr/share/debootstrap/scripts/debian-ports. (A diff against the stock script for unstable is attached as from_unstable_to_debian-ports.diff.gz) ftp.debian-ports.org hosts unofficial architectures until they are integrated in the main Debian archive (currently alpha, hppa, m68k, powerpcspe, ppc64, sh4 and sparc64, and GNU/Hurd). It requires specific workarounds in debootstrap since the needed packages are sometimes not in the "unstable" suite of the repository. Thanks in advance ! J-H Chatenet -- System Information: Debian Release: wheezy/sid APT prefers unreleased APT policy: (500, 'unreleased'), (500, 'unstable') Architecture: alpha Kernel: Linux 3.2.0-4-alpha-generic Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages debootstrap depends on: ii wget 1.14-1 Versions of packages debootstrap recommends: ii debian-archive-keyring 2012.4 ii gnupg 1.4.12-4 debootstrap suggests no packages. -- debconf-show failed
# /usr/share/debootstrap/scripts/debian-ports SUITE="unstable" DEF_MIRROR="http://ftp.debian-ports.org/debian" mirror_style release download_style apt finddebs_style from-indices variants - buildd fakechroot minbase scratchbox # use the debian-ports keyring if debian-ports-archive-keyring is installed #keyring /usr/share/keyrings/debian-archive-keyring.gpg keyring /usr/share/keyrings/debian-ports-archive-keyring.gpg # or the one installed keyring /etc/apt/trusted.gpg # Install debian-ports-archive-keyring (priority: extra) along with the important packages on the target if [ -z "$ADDITIONAL" ]; then ADDITIONAL="debian-ports-archive-keyring" elif $(echo "$ADDITIONAL" | fgrep -qv 'debian-ports-archive-keyring'); then ADDITIONAL="${ADDITIONAL} debian-ports-archive-keyring" fi if doing_variant fakechroot; then test "$FAKECHROOT" = "true" || error 1 FAKECHROOTREQ "This variant requires fakechroot environment to be started" fi case $ARCH in alpha|ia64) LIBC="libc6.1" ;; kfreebsd-*) LIBC="libc0.1" ;; hurd-*) LIBC="libc0.3" ;; *) LIBC="libc6" ;; esac # overload download_indices from /usr/share/debootstrap/functions download_indices () { local mem_suite mk_download_dirs "$DOWNLOAD_INDICES" $(echo "$@" | tr ' ' '\n' | sort) mem_suite=$SUITE SUITE="unreleased" "$DOWNLOAD_INDICES" $(echo "$@" | tr ' ' '\n' | sort) SUITE=$mem_suite } # add unreleased add_fake_component () { local TEMP_COMPONENTS local m2 c c1 path1 pkgdest1 path2 pkgdest2 components_wo_unreleased=$(echo $COMPONENTS|tr ' ' '\n'|\ sort|uniq|tr '\n' ' ') TEMP_COMPONENTS="$components_wo_unreleased" for m2 in $MIRRORS; do for c in $components_wo_unreleased; do path1="dists/unreleased/$c/binary-$ARCH/Packages" pkgdest1="$TARGET/$($DLDEST pkg "unreleased" "$c" "$ARCH" "$m2" "$path1")" # Fake component unreleased c1="${c}unreleased" path2="dists/$SUITE/$c1/binary-$ARCH/Packages" pkgdest2="$TARGET/$($DLDEST pkg "$SUITE" "$c1" "$ARCH" "$m2" "$path2")" ln -sf $(basename $pkgdest1) $pkgdest2 TEMP_COMPONENTS="${TEMP_COMPONENTS} ${c1}" done done TEMP_COMPONENTS="$(echo $TEMP_COMPONENTS|tr ' ' '\n'|sort|uniq|tr '\n' ' ')" if [ "$TEMP_COMPONENTS" != "$components_wo_unreleased" ] ; then COMPONENTS="$TEMP_COMPONENTS" fi } work_out_debs () { # add a symlink for unreleased add_fake_component required="$(get_debs Priority: required)" if doing_variant - || doing_variant fakechroot; then #required="$required $(get_debs Priority: important)" # ^^ should be getting debconf here somehow maybe base="$(get_debs Priority: important)" elif doing_variant buildd || doing_variant scratchbox; then base="apt build-essential" elif doing_variant minbase; then base="apt" fi if doing_variant fakechroot; then # ldd.fake needs binutils required="$required binutils" fi } # from /usr/share/debootstrap/scripts/sid unmodified first_stage_install () { extract $required mkdir -p "$TARGET/var/lib/dpkg" : >"$TARGET/var/lib/dpkg/status" : >"$TARGET/var/lib/dpkg/available" setup_etc if [ ! -e "$TARGET/etc/fstab" ]; then echo '# UNCONFIGURED FSTAB FOR BASE SYSTEM' > "$TARGET/etc/fstab" chown 0:0 "$TARGET/etc/fstab"; chmod 644 "$TARGET/etc/fstab" fi x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" echo \ "Package: $pkg Version: $ver Maintainer: unknown Status: install ok installed" >> "$TARGET/var/lib/dpkg/status" touch "$TARGET/var/lib/dpkg/info/${pkg}.list" } x_feign_install dpkg } # Remove the symlinks to unreleased clean_fake_component () { local m2 c c1 path pkgdest for m2 in $MIRRORS; do for c in $components_wo_unreleased; do c1="${c}unreleased" path="dists/$SUITE/$c1/binary-$ARCH/Packages" pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c1" "$ARCH" "$m2" "$path")" if [ -h $pkgdest ] ; then rm $pkgdest fi done done } second_stage_install () { setup_devices x_core_install () { smallyes '' | in_target dpkg --force-depends --install $(debfor "$@") } p () { baseprog="$(($baseprog + ${1:-1}))" } if doing_variant fakechroot; then setup_proc_fakechroot elif doing_variant scratchbox; then true else setup_proc in_target /sbin/ldconfig fi DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN baseprog=0 bases=7 p; progress $baseprog $bases INSTCORE "Installing core packages" #1 info INSTCORE "Installing core packages..." p; progress $baseprog $bases INSTCORE "Installing core packages" #2 ln -sf mawk "$TARGET/usr/bin/awk" x_core_install base-files base-passwd p; progress $baseprog $bases INSTCORE "Installing core packages" #3 x_core_install dpkg if [ ! -e "$TARGET/etc/localtime" ]; then ln -sf /usr/share/zoneinfo/UTC "$TARGET/etc/localtime" fi if doing_variant fakechroot; then install_fakechroot_tools fi p; progress $baseprog $bases INSTCORE "Installing core packages" #4 x_core_install $LIBC p; progress $baseprog $bases INSTCORE "Installing core packages" #5 x_core_install perl-base p; progress $baseprog $bases INSTCORE "Installing core packages" #6 rm "$TARGET/usr/bin/awk" x_core_install mawk p; progress $baseprog $bases INSTCORE "Installing core packages" #7 if doing_variant -; then x_core_install debconf fi baseprog=0 bases=$(set -- $required; echo $#) info UNPACKREQ "Unpacking required packages..." exec 7>&1 smallyes '' | (repeatn 5 in_target_failmsg UNPACK_REQ_FAIL_FIVE "Failure while unpacking required packages. This will be attempted up to five times." "" \ dpkg --status-fd 8 --force-depends --unpack $(debfor $required) 8>&1 1>&7 || echo EXITCODE $?) | dpkg_progress $baseprog $bases UNPACKREQ "Unpacking required packages" UNPACKING info CONFREQ "Configuring required packages..." mv "$TARGET/sbin/start-stop-daemon" "$TARGET/sbin/start-stop-daemon.REAL" echo \ "#!/bin/sh echo echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "$TARGET/sbin/start-stop-daemon" chmod 755 "$TARGET/sbin/start-stop-daemon" setup_dselect_method apt smallyes '' | (in_target_failmsg CONF_REQ_FAIL "Failure while configuring required packages." "" \ dpkg --status-fd 8 --configure --pending --force-configure-any --force-depends 8>&1 1>&7 || echo EXITCODE $?) | dpkg_progress $baseprog $bases CONFREQ "Configuring required packages" CONFIGURING baseprog=0 bases="$(set -- $base; echo $#)" 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 $?) | dpkg_progress $baseprog $bases UNPACKBASE "Unpacking base system" UNPACKING info CONFBASE "Configuring the base system..." smallyes '' | (repeatn 5 in_target_failmsg CONF_BASE_FAIL_FIVE "Failure while configuring base packages. This will be re-attempted up to five times." "" \ dpkg --status-fd 8 --force-confold --skip-same-version --configure -a 8>&1 1>&7 || echo EXITCODE $?) | dpkg_progress $baseprog $bases CONFBASE "Configuring base system" CONFIGURING mv "$TARGET/sbin/start-stop-daemon.REAL" "$TARGET/sbin/start-stop-daemon" progress $bases $bases CONFBASE "Configuring base system" info BASESUCCESS "Base system installed successfully." # remove the symlink to unreleased clean_fake_component } # overload setup_apt_sources from /usr/share/debootstrap/functions setup_apt_sources () { mkdir -p "$TARGET/etc/apt" for m in "$@"; do local cs="" local cs1="" for c in $components_wo_unreleased; do local path="dists/$SUITE/$c/binary-$ARCH/Packages" local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")" if [ -e "$pkgdest" ]; then cs="$cs $c"; fi # "unreleased" archive local path1="dists/unreleased/$c/binary-$ARCH/Packages" local pkgdest1="$TARGET/$($DLDEST pkg unreleased "$c" "$ARCH" "$m" "$path1")" if [ -e "$pkgdest1" ]; then cs1="$cs1 $c"; fi done if [ "$cs" != "" ]; then echo "deb $m $SUITE$cs"; fi if [ "$cs1" != "" ]; then echo "deb $m unreleased$cs1"; fi done > "$TARGET/etc/apt/sources.list" }
from_unstable_to_debian-ports.diff.gz
Description: Binary data
debootstrap and debian-ports ---------------------------- Usage ----- debootstrap debian-ports target-directory or debootstrap [ some options ] debian-ports target-directory [ a_debian-ports_mirror] Make sure that the script is installed as /usr/share/debootstrap/scripts/debian-ports. (If not, give the actual location of the script as the last argument of debootstrap, e.g. debootstrap unstable my_target_directory http://ftp.de.debian.org/debian-ports ./debian-ports using the mirror ftp.de.debian.org with a copy of the script in the current working directory.) Why a debootstrap script ? -------------------------- According to the description on http://www.debian-ports.org and http://www.debian-ports.org/archive : "The goal of this machine is to provide an infrastructure for unofficial architectures until they are integrated in the main Debian archive. " "The archive is currently shared between GNU/Linux alpha, hppa, m68k, powerpcspe, ppc64, sh4 and sparc64, and GNU/Hurd." There are 3 suites : unstable, unreleased and experimental. "The unreleased suite : this suite is used to upload packages which need hacks to build until the changes are integrated into Debian." It occurs that the needed files for an initial installation with debootstrap are spread among both suites unstable and unreleased. And the main code of debootstrap allows for one sole suite. Please note that no support for experimental packages is provided here. Under the hood -------------- The script symlinks unreleased as a (fake) component "mainunreleased" of unstable. The default mirror is changed to ftp.debian-ports.org and the default keyring to debian-ports-archive-keyring. debian-ports-archive-keyring (Prority : extra) is selected for installation in the target. A line for unreleased is added to sources.list.