Package: choose-mirror
Version: 2.82
Severity: whishlist
Tags: patch
X-Debbugs-CC: "Helge Deller" <del...@gmx.de>, "John Paul Adrian Glaubitz" 
<glaub...@physik.fu-berlin.de>, "James Clarke" <jrt...@debian.org>

Dear Maintainer,

The following is a reformulation of a previous bug
report by Helge Deller [1].

The mirror list for non released architectures is empty -
"manual selection" is the only choice available.

The patch below make use of the 'Ports-architecture' fields
in the mirror masterlist to create a non empty mirror list.
A file 'port_architecture' is created on non released architectures
for the use of other packages.

Regards,
JH Chatenet

[1] : http://lists.debian.org/debian-boot/2017/05/msg00029.html

--- a/Makefile
+++ b/Makefile
@@ -79,6 +79,7 @@
 
 debian/httplist-countries: $(MASTERLIST) debian/iso_3166.tab
        ./mirrorlist httplist $^
+       # As a side effect, a file 'port_architecture' is created on non 
released architectures
 
 debian/httpslist-countries: $(MASTERLIST) debian/iso_3166.tab
        ./mirrorlist httpslist $^
--- a/debian/clean
+++ b/debian/clean
@@ -1 +1,2 @@
 debian/choose-mirror-bin.templates
+port_architecture
--- a/debian/rules
+++ b/debian/rules
@@ -26,3 +26,10 @@
        ./sort-templates
        # Make sure templates are not obviously broken (#834383):
        [ ! -d debian/choose-mirror-bin/DEBIAN ] || grep -qs '^Template:' 
debian/choose-mirror-bin/DEBIAN/templates
+
+override_dh_auto_install:
+       dh_auto_install
+       # Expose the file 'port_architecture' for the use of other packages
+ifneq (,$(filter choose-mirror-bin, $(shell dh_listpackages)))
+       if test -e port_architecture; then install -D -m 0644 port_architecture 
debian/choose-mirror-bin/usr/lib/choose-mirror/port_architecture; fi
+endif
--- a/mirrorlist
+++ b/mirrorlist
@@ -104,12 +104,35 @@
        $data[$id]->{rating}=$rating;
 }
 
+# Defaults for released architectures
+my $archive_archlist = 'archive-architecture';
+my $archive_type = "archive-$type";
+
+# Is $hostarch a port architecture ? 
+# Such architectures appear in a Ports-architecture: field
+# As an exception, deb.debian.org carries port architectures but has no 
Ports-architecture: field
+foreach my $id (0..$#data) {
+       if (exists $data[$id]->{'ports-architecture'} &&
+           $data[$id]->{'ports-architecture'} ne "any") {
+               my @arches = split ' ', $data[$id]->{'ports-architecture'};
+               my %arches = map { $_ => 1 } @arches;
+               if (exists $arches{$hostarch} or exists $arches{'!'.$hostarch}) 
{
+                       $archive_archlist = 'ports-architecture';
+                       $archive_type = "ports-$type";
+                       open(PORTARCHITECTURE,"> port_architecture") || die 
"Unable to write port_architecture\n";
+                       print PORTARCHITECTURE "1";
+                       close PORTARCHITECTURE;
+                       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_archlist} &&
+           $data[$id]->{$archive_archlist} ne "any") {
+               my @arches = split ' ', $data[$id]->{$archive_archlist};
                if (grep /^!/, @arches) {
                        my %notarches = map { substr($_, 1) => 1 } grep /^!/, 
@arches;
                        next if exists $notarches{$hostarch};
@@ -124,9 +147,11 @@
 
 if ($type =~ /(.*)list/) {
        my $type=$1;
+       $archive_type =~ s/list$//;
+
        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"
@@ -154,13 +179,13 @@
                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_archlist}) {
+                       print STDERR "warning: missing 
(archive|ports)-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";

Reply via email to