Hello,

Samuel Thibault, le mer. 13 nov. 2019 00:12:50 +0100, a ecrit:
> I have significantly reworked and simplified the patch:

I have modified it a bit to fix the "directory" value in the manual
configuration, which should be /debian-ports/

That is useful for the case when there is no mirror for the ports
architecture (which is e.g. the case for hurd-i386 ATM).

I could test it with success on hurd-i386 with a mirror for the arch,
on hurd-i386 without a mirror for the arch, and on linux-amd64 (thus
non-port), it behave fine.

Any red flag before I commit?

Samuel

> - avoid creating several files at the same time
> - always create usr/lib/choose-mirror/port_architecture to make rules
>   much simpler.
> - use a single variable $archive that normally contains 'archive' but
>   can be set to 'ports'.
> 
> so that we end up only doing this in mirrorlist:
> 
> - set $archive to 'archive' by default
> - loop for the architecture in a Ports-architecture field, if so set
>   $archive to 'ports'.
> - replace 'archive' with $archive in the strings.
> - create the port_architecture containing either 0 or 1 when requested to
> 
> I tried to build with on amd64 and on hurd-i386, I am getting the expected 
> results:
> - /usr/lib/choose-mirror/port_architecture contains 0 on amd64 and 1 on
> hurd-i386.
> - The choose-mirror binary contains the full mirror list on amd64, it
> contains only deb.debian.org on hurd-i386.
> 
> Does anybody think of anything else I should check before I commit this?
diff --git a/Makefile b/Makefile
index b4a7ecc..e10c167 100644
--- a/Makefile
+++ b/Makefile
@@ -86,7 +86,10 @@ debian/httpslist-countries: $(MASTERLIST) debian/iso_3166.tab
 debian/ftplist-countries: $(MASTERLIST) debian/iso_3166.tab
        ./mirrorlist ftplist $^
 
-debian/choose-mirror-bin.templates: $(MASTERLIST) $(templates) 
debian/httplist-countries debian/httpslist-countries debian/ftplist-countries 
debian/iso_3166.tab
+debian/port_architecture: $(MASTERLIST) debian/iso_3166.tab
+       ./mirrorlist port_architecture $^
+
+debian/choose-mirror-bin.templates: $(MASTERLIST) $(templates) 
debian/httplist-countries debian/httpslist-countries debian/ftplist-countries 
debian/iso_3166.tab debian/port_architecture
        # Grab ISO codes from iso-codes package
        ./get-iso-codes
        # Build the templates
@@ -132,6 +135,7 @@ clean:
        rm -f demo demo.templates
        rm -rf debian/iso-codes/ debian/pobuild*/
        rm -f debian/iso_3166.tab
+       rm -f debian/port_architecture
 
 reallyclean: clean
        rm -f debian/choose-mirror-bin.templates
diff --git a/debian/choose-mirror-bin.install b/debian/choose-mirror-bin.install
index 7a92821..568306a 100644
--- a/debian/choose-mirror-bin.install
+++ b/debian/choose-mirror-bin.install
@@ -1 +1,2 @@
 choose-mirror bin
+debian/port_architecture usr/lib/choose-mirror
diff --git a/mirrorlist b/mirrorlist
index 0a811b2..f3b6925 100755
--- a/mirrorlist
+++ b/mirrorlist
@@ -104,12 +104,28 @@ foreach my $id (0..$#data) {
        $data[$id]->{rating}=$rating;
 }
 
+# Defaults for released architectures
+my $archive = 'archive';
+
+# Is $hostarch a port architecture ?
+# Such architectures appear in a Ports-architecture: field
+foreach my $id (0..$#data) {
+       if (exists $data[$id]->{'ports-architecture'}) {
+               my @arches = split ' ', $data[$id]->{'ports-architecture'};
+               my %arches = map { $_ => 1 } @arches;
+               if (exists $arches{$hostarch} or exists $arches{'!'.$hostarch}) 
{
+                       $archive = 'ports';
+                       last;
+               }
+       }
+}
+
 # Filter out mirrors that don't carry the target architecture.
 my @newdata;
 foreach my $id (0..$#data) {
-       if (exists $data[$id]->{'archive-architecture'} &&
-           $data[$id]->{'archive-architecture'} ne "any") {
-               my @arches = split ' ', $data[$id]->{'archive-architecture'};
+       if (exists $data[$id]->{"$archive-architecture"} &&
+           $data[$id]->{"$archive-architecture"} ne "any") {
+               my @arches = split ' ', $data[$id]->{"$archive-architecture"};
                if (grep /^!/, @arches) {
                        my %notarches = map { substr($_, 1) => 1 } grep /^!/, 
@arches;
                        next if exists $notarches{$hostarch};
@@ -126,7 +142,7 @@ if ($type =~ /(.*)list/) {
        my $type=$1;
        open (LIST, ">debian/${type}list-countries") or die 
"debian/${type}list-countries: $!";
        foreach my $id (0..$#data) {
-               next unless exists $data[$id]->{"archive-$type"} and
+               next unless exists $data[$id]->{"$archive-$type"} and
                                    exists $data[$id]->{country};
                my $cc = $data[$id]->{country};
                die "Error: country code '$cc' does not occur in iso-3166 table"
@@ -138,6 +154,15 @@ if ($type =~ /(.*)list/) {
        }
        close LIST;
 }
+elsif ($type eq "port_architecture") {
+       open(OUT,"> debian/port_architecture") || die "Unable to write 
debian/port_architecture\n";
+       if ($archive eq 'ports') {
+               print OUT "1";
+       } else {
+               print OUT "0";
+       }
+       close OUT;
+}
 else {
        open (OUT, ">mirrors_$type.h") or die "mirrors_$type.h: $!";
        print OUT "/* Automatically generated; do not edit. */\n";
@@ -154,13 +179,13 @@ else {
                else {
                        $cc=$q.$data[$id]->{country}.$q;
                }
-               next unless exists $data[$id]->{"archive-$type"} and defined 
$cc;
-               if (! exists $data[$id]->{'archive-architecture'}) {
-                       print STDERR "warning: missing archive-architecture for 
mirror ".$data[$id]->{site}."; assuming it contains all architectures.\n";
+               next unless exists $data[$id]->{"$archive-$type"} and defined 
$cc;
+               if (! exists $data[$id]->{"$archive-architecture"}) {
+                       print STDERR "warning: missing $archive-architecture 
for mirror ".$data[$id]->{site}."; assuming it contains all architectures.\n";
                }
                print OUT "\t{",
                          join(", ", $q.$data[$id]->{site}.$q, $cc,
-                               $q.$data[$id]->{"archive-$type"}.$q),
+                               $q.$data[$id]->{"$archive-$type"}.$q),
                          "},\n";
        }
        print OUT "\t{NULL, NULL, NULL}\n";
diff --git a/mktemplates b/mktemplates
index 8240550..b0c9d6f 100755
--- a/mktemplates
+++ b/mktemplates
@@ -15,6 +15,18 @@ if [ -z "$DEB_HOST_ARCH" ]; then
        DEB_HOST_ARCH="$(dpkg-architecture -qDEB_HOST_ARCH)"
 fi
 
+if [ "$(cat debian/port_architecture)" = 1 ]; then
+       set_debian_ports() {
+               perl -pe 'if (m,http/directory$,) { $found = 1; } elsif ($found 
and /^Default:/) { s/\/debian\/$/\/debian-ports\//; $found = 0; }' | \
+               perl -pe 'if (m,https/directory$,) { $found = 1; } elsif 
($found and /^Default:/) { s/\/debian\/$/\/debian-ports\//; $found = 0; }' | \
+               perl -pe 'if (m,ftp/directory$,) { $found = 1; } elsif ($found 
and /^Default:/) { s/\/debian\/$/\/debian-ports\//; $found = 0; }'
+       }
+else
+       set_debian_ports() {
+               cat
+       }
+fi
+
 # Get the English names for the country codes in the list
 country_names() {
        # Ensure commas in country names end up escaped
@@ -46,6 +58,7 @@ printf "Insert the lists of choices into the templates 
file..."
                echo
        done
 ) | debian/templates-build.pl "$DEB_HOST_ARCH" | \
+    set_debian_ports | \
     perl -pe 'if (m,http/countries$,) { $found = 2; } elsif ($found and 
/^Choices-C:/ && length "'"$HTTPCODECHOICES"'") { s/$/, '"$HTTPCODECHOICES"'/; 
$found -= 1; }  elsif ($found and /^__Choices:/ && length "'"$HTTPCHOICES"'") { 
s/$/'"$HTTPCHOICES"'/; $found -= 1; }' | \
     perl -pe 'if (m,https/countries$,) { $found = 2; } elsif ($found and 
/^Choices-C:/ && length "'"$HTTPSCODECHOICES"'") { s/$/, 
'"$HTTPSCODECHOICES"'/; $found -= 1; }  elsif ($found and /^__Choices:/ && 
length "'"$HTTPSCHOICES"'") { s/$/'"$HTTPSCHOICES"'/; $found -= 1; }' | \
     perl -pe 'if (m,ftp/countries$,) { $found = 2; } elsif ($found and 
/^Choices-C:/ && length "'"$FTPCODECHOICES"'") { s/$/, '"$FTPCODECHOICES"'/;  
$found -= 1; } elsif ($found and /^__Choices:/ && length "'"$FTPCHOICES"'") { 
s/$/'"$FTPCHOICES"'/;  $found -= 1; }' \

Reply via email to