[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#690210: debootstrap: please add support for debian-ports



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"
}

Attachment: 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.

Reply to: