Le mercredi 18 avril à 14h 40mn 35s (+0900), Hideki Yamane a écrit : > control: tags -1 +pending > > On Sat, 27 May 2017 11:27:06 +0200 jhcha54008 <jhcha54...@free.fr> wrote: > > I am testing the updated ([1],[2]) version attached of a > > debootstrap script to accomodate the peculiarities of non > > released port architectures from www.debian-ports.org : > (snip) > > I would be thankful for feedback if someone has the opportunity > > to test it. > > Adjust it to current git code, could you check it, please? >
Hi again, Here is a new version of the patch with a better separation of the main code from the one to support debian-ports. I hope it will help ! Regards, JH Chatenet diff -Naur debootstrap-1.0.97.orig/debian/rules debootstrap-1.0.97/debian/rules --- debootstrap-1.0.97.orig/debian/rules 2018-04-17 04:06:32.000000000 +0200 +++ debootstrap-1.0.97/debian/rules 2018-04-28 11:55:40.107863387 +0200 @@ -37,6 +37,7 @@ debian/debootstrap-udeb/usr/share/debootstrap/scripts/stable \ debian/debootstrap-udeb/usr/share/debootstrap/scripts/testing \ debian/debootstrap-udeb/usr/share/debootstrap/scripts/unstable + -rm -f debian/debootstrap-udeb/usr/share/debootstrap/sort_pkgs_perl override_dh_gencontrol: dh_gencontrol -- -Vkeyring=$(KEYRING) diff -Naur debootstrap-1.0.97.orig/debootstrap debootstrap-1.0.97/debootstrap --- debootstrap-1.0.97.orig/debootstrap 2018-04-17 04:06:32.000000000 +0200 +++ debootstrap-1.0.97/debootstrap 2018-04-28 11:55:40.211863902 +0200 @@ -46,6 +46,7 @@ CHECKCERTIF="" PRIVATEKEY="" CACHE_DIR="" +PORT="" DEF_MIRROR="http://deb.debian.org/debian" DEF_HTTPS_MIRROR="https://deb.debian.org/debian" @@ -124,6 +125,7 @@ --private-key=file read the private key from file --certificate=file use the client certificate stored in file (PEM) --no-check-certificate do not check certificate against certificate authorities + --debian-ports set up defaults for a port architecture (see www.ports.debian.org) EOF } @@ -384,6 +386,10 @@ CHECKCERTIF="--no-check-certificate" shift ;; + --debian-ports) + PORT=yes + shift + ;; -*) error 1 BADARG "unrecognized or invalid option %s" "$1" ;; @@ -428,6 +434,9 @@ TARGET=$CHROOTDIR fi SCRIPT=$DEBOOTSTRAP_DIR/suite-script + if [ -e "$DEBOOTSTRAP_DIR/functions_for_debian_ports" ]; then + PORT=yes + fi else if [ -z "$1" ] || [ -z "$2" ]; then usage_err 1 NEEDSUITETARGET "You must specify a suite and a target." @@ -613,6 +622,10 @@ ########################################################################### +if [ -n "$PORT" ]; then + . "$DEBOOTSTRAP_DIR/functions_for_debian_ports" +fi + . "$SCRIPT" if [ "$SECOND_STAGE_ONLY" = "true" ]; then @@ -716,6 +729,8 @@ echo "$base" >"$TARGET/debootstrap/base" chmod 755 "$TARGET/debootstrap/debootstrap" + [ "" = "$PORT" ] || \ + cp "$DEBOOTSTRAP_DIR/functions_for_debian_ports" "$TARGET/debootstrap/" fi fi diff -Naur debootstrap-1.0.97.orig/debootstrap.8 debootstrap-1.0.97/debootstrap.8 --- debootstrap-1.0.97.orig/debootstrap.8 2018-04-17 04:06:32.000000000 +0200 +++ debootstrap-1.0.97/debootstrap.8 2018-04-28 11:55:40.243864061 +0200 @@ -165,6 +165,10 @@ .IP .IP "\fB\-\-private\-key=FILE\fP" Read the private key from file +.IP +.IP "\fB\-\-debian\-ports=FILE\fP" +Tweaking for port architectures (see www.ports.debian.org) when downloading +from a ftp.ports.debian.org mirror. .SH EXAMPLES . diff -Naur debootstrap-1.0.97.orig/functions debootstrap-1.0.97/functions --- debootstrap-1.0.97.orig/functions 2018-04-17 04:06:32.000000000 +0200 +++ debootstrap-1.0.97/functions 2018-04-28 11:55:40.479865231 +0200 @@ -1801,3 +1801,8 @@ fakechroot" >> "$TARGET/var/lib/dpkg/diversions" } + +############################################################## debian-ports support +packages_merge_in_work_out_debs () { +: +} diff -Naur debootstrap-1.0.97.orig/functions_for_debian_ports debootstrap-1.0.97/functions_for_debian_ports --- debootstrap-1.0.97.orig/functions_for_debian_ports 1970-01-01 01:00:00.000000000 +0100 +++ debootstrap-1.0.97/functions_for_debian_ports 2018-04-28 12:05:10.262690632 +0200 @@ -0,0 +1,113 @@ +download_indices () { + mk_download_dirs + "$DOWNLOAD_INDICES" "$(echo "$@" | tr ' ' '\n' | sort)" + # debian-ports also needs "unreleased" architecture + local mem_SUITE + mem_SUITE="$SUITE" + SUITE="unreleased" "$DOWNLOAD_INDICES" $(echo "$@" | tr ' ' '\n' | sort) + SUITE="$mem_SUITE" +} + +merge_packages_files () { + local TEMP_COMPONENTS m c c1 path pkgdest path1 pkgdest1 + + COMPONENTS_WITHOUT_UNRELEASED=$(echo $COMPONENTS|tr ' ' '\n'|sort|uniq|tr '\n' ' ') + TEMP_COMPONENTS="$COMPONENTS_WITHOUT_UNRELEASED" + + for m in $MIRRORS; do + for c in $COMPONENTS_WITHOUT_UNRELEASED; do + path="dists/unreleased/$c/binary-$ARCH/Packages" + pkgdest="$TARGET/$($DLDEST pkg "unreleased" "$c" "$ARCH" "$m" "$path")" + path1="dists/$SUITE/$c/binary-$ARCH/Packages" + pkgdest1="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path1")" + + cat "$pkgdest1" "$pkgdest" > "${pkgdest1}.concatenate" + "$SORT_PKGS" "${pkgdest1}.concatenate" > "${pkgdest1}.merged" + if [ -s "${pkgdest1}.merged" ] ; then + if [ -n "$DEBOOTSTRAP_MERGE_KEEP_ORIGINAL" ] ; then + mv "$pkgdest1" "${pkgdest1}.original" + fi + mv "${pkgdest1}.merged" "$pkgdest1"; rm -f "${pkgdest1}.concatenate" + fi + done + done + + TEMP_COMPONENTS="$(echo $TEMP_COMPONENTS|tr ' ' '\n'|sort|uniq|tr '\n' ' ')" + if [ "$TEMP_COMPONENTS" != "$COMPONENTS_WITHOUT_UNRELEASED" ] ; then + COMPONENTS="$TEMP_COMPONENTS" + fi +} + +setup_apt_sources () { + mkdir -p "$TARGET/etc/apt" + for m in "$@"; do + local cs cs1 c path path1 pkgdest pkgdest1 + for c in ${COMPONENTS_WITHOUT_UNRELEASED:-$USE_COMPONENTS}; do + path="dists/$SUITE/$c/binary-$ARCH/Packages" + pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")" + if [ -e "$pkgdest" ]; then cs="$cs $c"; fi + # for "unreleased" archive (debian-ports) + path1="dists/unreleased/$c/binary-$ARCH/Packages" + 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" +} + +packages_merge_in_work_out_debs () { + if [ -z "$SORT_PKGS" ]; then + error 1 NO_SORTCMD "No sort_pkgs is available; either install perl, or build sort_pkgs.c from source" + fi + merge_packages_files +} + +################################################################# sort_pkgs + +# unstable and unreleased are merged and sorted by SORT_PKGS. An alternative +# sort program can be given in the environment variable DEBOOTSTRAP_SORT_PKGS +# If no perl interpreter is available, a minimal C implementation of sort_pkgs +# should be provided. + +if [ -n "$DEBOOTSTRAP_SORT_PKGS" ] ; then + if command -v "$DEBOOTSTRAP_SORT_PKGS" >/dev/null 2>&1; then + SORT_PKGS="$DEBOOTSTRAP_SORT_PKGS" + else + error 1 SORTCMDUNVL "%s is not available on the system" "$DEBOOTSTRAP_SORT_PKGS" + fi +elif in_path perl && [ -e "$DEBOOTSTRAP_DIR/sort_pkgs_perl" ]; then + . "$DEBOOTSTRAP_DIR/sort_pkgs_perl" +elif [ -e /usr/lib/debootstrap/di_sort_pkgs ]; then + # There is no perl available in debian-installer. + # A binary implementation of sort_pkgs should be provided by + # another udeb package under /usr/lib/debootstrap/di_sort_pkgs + SORT_PKGS=/usr/lib/debootstrap/di_sort_pkgs +elif [ -e "$DEBOOTSTRAP_DIR/sort_pkgs" ]; then + SORT_PKGS="$DEBOOTSTRAP_DIR/sort_pkgs" +else + SORT_PKGS="" +fi + +############################################################### debian-ports specific + +# debian-ports is only for unstable(sid) suite +if [ ! "$SUITE" = unstable ] && [ ! "$SUITE" = sid ]; then + error 1 ONLYUNSTABLE "debian-ports only provides unstable suite. Aborting..." +fi + +# use the debian-ports keyring if debian-ports-archive-keyring installed +keyring /usr/share/keyrings/debian-ports-archive-keyring.gpg +# or the one installed +keyring /etc/apt/trusted.gpg + +# Install debian-ports-archive-keyring (priority: optional) along with +# the important packages on the target if you try to install debian-ports +if [ -z "$ADDITIONAL" ]; then + ADDITIONAL="debian-ports-archive-keyring" +elif $(echo "$ADDITIONAL" | grep -qvF 'debian-ports-archive-keyring'); then + ADDITIONAL="${ADDITIONAL} debian-ports-archive-keyring" +fi + +default_mirror http://deb.debian.org/debian-ports + diff -Naur debootstrap-1.0.97.orig/Makefile debootstrap-1.0.97/Makefile --- debootstrap-1.0.97.orig/Makefile 2018-04-17 04:06:32.000000000 +0200 +++ debootstrap-1.0.97/Makefile 2018-04-28 11:55:40.487865271 +0200 @@ -12,6 +12,8 @@ cp -a scripts/* $(DSDIR)/scripts/ install -o root -g root -m 0644 functions $(DSDIR)/ + install -o root -g root -m 0644 sort_pkgs_perl $(DSDIR)/ + install -o root -g root -m 0644 functions_for_debian_ports $(DSDIR)/ sed 's/@VERSION@/$(VERSION)/g' debootstrap >$(DESTDIR)/usr/sbin/debootstrap chown root:root $(DESTDIR)/usr/sbin/debootstrap diff -Naur debootstrap-1.0.97.orig/scripts/debian-common debootstrap-1.0.97/scripts/debian-common --- debootstrap-1.0.97.orig/scripts/debian-common 2018-04-17 04:06:32.000000000 +0200 +++ debootstrap-1.0.97/scripts/debian-common 2018-04-28 11:55:40.495865311 +0200 @@ -10,12 +10,18 @@ esac work_out_debs () { - required="$(get_debs Priority: required)" + + # merge Packages files from unstable and unreleased if needed + packages_merge_in_work_out_debs + + # Duplicate package names (possibly from different versions) are causing errors. + required="$(get_debs Priority: required|tr ' ' '\n'|sort|uniq|tr '\n' ' ')" 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)" + # Duplicate package names (possibly from different versions) are causing errors. + base="$(get_debs Priority: important|tr ' ' '\n'|sort|uniq|tr '\n' ' ')" elif doing_variant buildd; then base="apt build-essential" elif doing_variant minbase; then @@ -32,6 +38,11 @@ base="$base apt-transport-https ca-certificates" ;; esac + + # Duplicate package names (in required and in base) are causing errors. + if [ "$RESOLVE_DEPS" != true ]; then + base=$(without "$base" "$required") + fi } first_stage_install () { diff -Naur debootstrap-1.0.97.orig/scripts/sid debootstrap-1.0.97/scripts/sid --- debootstrap-1.0.97.orig/scripts/sid 2018-04-17 04:06:32.000000000 +0200 +++ debootstrap-1.0.97/scripts/sid 2018-04-28 12:05:57.950927105 +0200 @@ -4,6 +4,34 @@ variants - buildd fakechroot minbase keyring /usr/share/keyrings/debian-archive-keyring.gpg +# Check for debian-ports and print a warning if needed +if [ -z "$PORT" ] && [ ! "$SECOND_STAGE_ONLY" = true ]; then + # If PORT is set, the user took the responsability ... + if [ -z "$USER_MIRROR" ] || [ ! "$USER_MIRROR" = "${USER_MIRROR#http://}" ] || \ + [ ! "$USER_MIRROR" = "${USER_MIRROR#https://}" ]; then + # The option '--debian-ports' is useful if we download from a debian-ports mirror + # it shouldn't be set if we install from a CD, or from a regular debian mirror + if [ -n "$PORTS_ARCH" ]; then + PORTS_ARCH_LIST="$PORTS_ARCH" + else + # As of 2018/04/18 + PORTS_ARCH_LIST="alpha hppa hurd-i386 m68k powerpcspe ppc64 riscv64 sh4 sparc64 x32" + fi + + for port_name in $PORTS_ARCH_LIST + do + if [ "$port_name" = "$ARCH" ]; then + if [ -z "$PORTS_ARCH" ]; then + info ISPORTARCH1 "As of 2018/04/18 :" + fi + info ISPORTARCH2 "the selected architecture '%s' is hosted at ftp.ports.debian.org. You may find the option --debian-ports useful" "$ARCH" + break + fi + done + fi +fi + + # include common settings if [ -d /usr/share/debootstrap/scripts ]; then . /usr/share/debootstrap/scripts/debian-common diff -Naur debootstrap-1.0.97.orig/sort_pkgs_perl debootstrap-1.0.97/sort_pkgs_perl --- debootstrap-1.0.97.orig/sort_pkgs_perl 1970-01-01 01:00:00.000000000 +0100 +++ debootstrap-1.0.97/sort_pkgs_perl 2018-04-28 11:55:40.511865390 +0200 @@ -0,0 +1,186 @@ +# +# Here is a debootstrap helper to sort Packages files by ascending version number. +# +# This file re-use functions 'pkg_name_is_illegal', 'version_check', 'version_order', +# 'version_compare_string', 'version_split_digits' and 'version_compare_part' from +# debian package 'libdpkg-perl' (see the copyright file therein for attribution). +# + + SORT_PKGS=sort_pkgs_perl + + sort_pkgs_perl () { + perl -e ' +defined($ARGV[0]) or die("no file argument"); + +open PACKAGES,$ARGV[0] + or die("open : $!"); + +# adapted from Dpkg::Package and Dpkg::Version +sub pkg_name_is_illegal($) { + my $name = shift || ""; + + $name eq "" && + return "may not be empty string"; + $name =~ m/[^-+.0-9a-z]/o && + return sprintf("character %s not allowed", $&); + $name =~ m/^[0-9a-z]/o || + return "must start with an alphanumeric character"; + return; +} + +sub version_split($) { + my $ver = shift; + my ($epoch,$version,$revision); + + if ($ver =~ /^([^:]*):(.+)$/) { + $epoch = $1; + $ver = $2; + } else { + $epoch = 0; + } + + if ($ver =~ /(.*)-(.*)$/) { + $version = $1; + $revision = $2; + } else { + $version = $ver; + $revision = 0; + } + + return ($epoch, $version, $revision); +} + +sub version_check($$$$) { + my ($str, $epoch, $version, $revision) = @_; + +# version number cannot be empty + if (not defined($str) or not length($str)) { + return 0; + } +# version number does not start with digit + if ($version =~ m/^[^\d]/) { + return 0; + } +# version number contains illegal character + if ($str =~ m/([^-+:.0-9a-zA-Z~])/o) { + return 0; + } +# epoch part of the version number is not a number + if ($epoch !~ /^\d*$/) { + return 0; + } + +# version number is valid + return 1; +} + +sub _version_order { + my ($x) = @_; + + if ($x eq "~") { + return -1; + } elsif ($x =~ /^\d$/) { + return $x * 1 + 1; + } elsif ($x =~ /^[A-Za-z]$/) { + return ord($x); + } else { + return ord($x) + 256; + } +} + +sub version_compare_string($$) { + my @a = map { _version_order($_) } split(//, shift); + my @b = map { _version_order($_) } split(//, shift); + while (1) { + my ($a, $b) = (shift @a, shift @b); + return 0 if not defined($a) and not defined($b); + $a ||= 0; # Default order for "no character" + $b ||= 0; + return 1 if $a > $b; + return -1 if $a < $b; + } +} + +sub version_split_digits($) { + return split(/(?<=\d)(?=\D)|(?<=\D)(?=\d)/, $_[0]); +} + +sub version_compare_part($$) { + my @a = version_split_digits(shift); + my @b = version_split_digits(shift); + while (1) { + my ($a, $b) = (shift @a, shift @b); + return 0 if not defined($a) and not defined($b); + $a ||= 0; # Default value for lack of version + $b ||= 0; + if ($a =~ /^\d+$/ and $b =~ /^\d+$/) { + # Numerical comparison + my $cmp = $a <=> $b; + return $cmp if $cmp; + } else { + # String comparison + my $cmp = version_compare_string($a, $b ); + return $cmp if $cmp; + } + } +} + +# order package names as apt-sortpkgs would + +sub compare_pkgname($$) { + my ( $a,$b ) = @_; + + if ((length($a) < length($b)) && + substr($b,0,length($a)) eq $a) { + return +1; + } elsif ((length($a) > length($b)) && + substr($a,0,length($b)) eq $b) { + return -1; + } else { + return $a cmp $b; + } +} + +my $stanza_begin = 0; +my @pkg_list = (); +my ($f, $v, $pkg, $ver, $stanza_end); +my ($version_is_valid, $ver_epoch, $ver_ver, $ver_rev); +while(<PACKAGES>) { + chomp; + next if (/^ /); + if (/^([^:]*:)\s*(.*)$/) { + $f = lc($1); $v = $2; + $pkg = $v if ($f eq "package:"); + $ver = $v if ($f eq "version:"); + } elsif (/^$/) { + $stanza_end = tell(); + ($ver_epoch, $ver_ver, $ver_rev) = version_split($ver); + $version_is_valid + = version_check($ver,$ver_epoch,$ver_ver,$ver_rev); + if ($version_is_valid && (! pkg_name_is_illegal($pkg))) { + push @pkg_list,[$pkg,$stanza_begin,$stanza_end, + $ver_epoch,$ver_ver,$ver_rev]; + } + $stanza_begin = $stanza_end; + } +} + +@pkg_list = sort({compare_pkgname($a->[0],$b->[0]) or + $a->[3] <=> $b->[3] or + version_compare_part($a->[4],$b->[4]) or + version_compare_part($a->[5],$b->[5]) or + $a->[1] <=> $b->[1]} @pkg_list); + +my $pkg_elt; +foreach $pkg_elt (@pkg_list) { + seek(PACKAGES,$pkg_elt->[1],0); + while(<PACKAGES>) { + print $_; + last if tell() >= $pkg_elt->[2]; + } +} +close(PACKAGES); +' "$@" +} + +