allow empty sources.list entries

This commit is contained in:
Johannes Schauer Marin Rodrigues 2023-01-16 15:13:39 +01:00
parent 860a9048d5
commit 853634f298
Signed by: josch
GPG key ID: F2CBA5C78FBD83E1
3 changed files with 82 additions and 50 deletions

View file

@ -362,3 +362,5 @@ Variants: essential apt minbase
Test: apt-patterns Test: apt-patterns
Test: apt-patterns-custom Test: apt-patterns-custom
Test: empty-sources.list

View file

@ -2072,7 +2072,7 @@ sub run_setup() {
} }
# write /etc/apt/sources.list and files in /etc/apt/sources.list.d/ # write /etc/apt/sources.list and files in /etc/apt/sources.list.d/
{ if (scalar @{$options->{sourceslists}} > 0) {
my $firstentry = $options->{sourceslists}->[0]; my $firstentry = $options->{sourceslists}->[0];
# if the first sources.list entry is of one-line type and without # if the first sources.list entry is of one-line type and without
# explicit filename, then write out an actual /etc/apt/sources.list # explicit filename, then write out an actual /etc/apt/sources.list
@ -2299,6 +2299,9 @@ sub run_update() {
close $fh; close $fh;
if ($indextargets eq '') { if ($indextargets eq '') {
warning("apt-get indextargets output is empty"); warning("apt-get indextargets output is empty");
if (scalar @{ $options->{sourceslists} } == 0) {
warning "no known apt sources.list entry";
}
for my $list (@{ $options->{sourceslists} }) { for my $list (@{ $options->{sourceslists} }) {
if (defined $list->{fname}) { if (defined $list->{fname}) {
info("Filename: $list->{fname}"); info("Filename: $list->{fname}");
@ -5082,17 +5085,21 @@ sub main() {
## no critic (InputOutput::ProhibitExplicitStdin) ## no critic (InputOutput::ProhibitExplicitStdin)
<STDIN>; <STDIN>;
}; };
my $type = guess_sources_format($content); if ($content eq "") {
if (!defined $type warning "sources.list from standard input is empty";
|| ($type ne "deb822" and $type ne "one-line")) { } else {
error "cannot determine sources.list format"; my $type = guess_sources_format($content);
if (!defined $type
|| ($type ne "deb822" and $type ne "one-line")) {
error "cannot determine sources.list format";
}
push @{$sourceslists},
{
type => $type,
fname => undef,
content => $content,
};
} }
push @{$sourceslists},
{
type => $type,
fname => undef,
content => $content,
};
} else { } else {
my @components = (); my @components = ();
foreach my $comp (@{ $options->{components} }) { foreach my $comp (@{ $options->{components} }) {
@ -5112,9 +5119,11 @@ sub main() {
} }
} }
my $compstr = join " ", @components; my $compstr = join " ", @components;
# if the currently selected apt keyrings do not contain the # From the suite name we can maybe infer which key we need. If we
# necessary key material for the chosen suite, then attempt adding # can infer this information, then we need to check whether the
# a signed-by option # currently running apt actually trusts this key or not. If it
# doesn't, then we need to add a signed-by line to the sources.list
# entry.
my $signedby = ''; my $signedby = '';
my %suite_by_vendor = get_suite_by_vendor(); my %suite_by_vendor = get_suite_by_vendor();
my $gpgproc = sub { my $gpgproc = sub {
@ -5251,26 +5260,32 @@ sub main() {
## no critic (InputOutput::ProhibitExplicitStdin) ## no critic (InputOutput::ProhibitExplicitStdin)
<STDIN>; <STDIN>;
}; };
my $type = guess_sources_format($content); if ($content eq "") {
if (!defined $type warning
|| ($type ne 'deb822' and $type ne 'one-line')) { "sources.list from standard input is empty";
error "cannot determine sources.list format";
}
# if last entry is of same type and without filename,
# then append
if ( scalar @{$sourceslists} > 0
&& $sourceslists->[-1]{type} eq $type
&& !defined $sourceslists->[-1]{fname}) {
$sourceslists->[-1]{content}
.= ($type eq 'one-line' ? "\n" : "\n\n")
. $content;
} else { } else {
push @{$sourceslists}, my $type = guess_sources_format($content);
{ if (!defined $type
type => $type, || ($type ne 'deb822' and $type ne 'one-line'))
fname => undef, {
content => $content, error "cannot determine sources.list format";
}; }
# if last entry is of same type and without filename,
# then append
if ( scalar @{$sourceslists} > 0
&& $sourceslists->[-1]{type} eq $type
&& !defined $sourceslists->[-1]{fname}) {
$sourceslists->[-1]{content}
.= ($type eq 'one-line' ? "\n" : "\n\n")
. $content;
} else {
push @{$sourceslists},
{
type => $type,
fname => undef,
content => $content,
};
}
} }
} elsif ($arg =~ /^deb(-src)? /) { } elsif ($arg =~ /^deb(-src)? /) {
my $content = "$arg\n"; my $content = "$arg\n";
@ -5315,24 +5330,31 @@ sub main() {
$content .= $line; $content .= $line;
} }
close $fh; close $fh;
my $type = undef; if ($content eq "") {
if ($arg =~ /\.list$/) { warning "$arg is empty";
$type = 'one-line';
} elsif ($arg =~ /\.sources$/) {
$type = 'deb822';
} else { } else {
$type = guess_sources_format($content); my $type = undef;
if ($arg =~ /\.list$/) {
$type = 'one-line';
} elsif ($arg =~ /\.sources$/) {
$type = 'deb822';
} else {
$type = guess_sources_format($content);
}
if (!defined $type
|| ($type ne 'deb822' and $type ne 'one-line'))
{
error "cannot determine sources.list format";
}
push @{$sourceslists},
{
type => $type,
fname => basename($arg),
content => $content,
};
} }
if (!defined $type } elsif ($arg eq '') {
|| ($type ne 'deb822' and $type ne 'one-line')) { # empty
error "cannot determine sources.list format";
}
push @{$sourceslists},
{
type => $type,
fname => basename($arg),
content => $content,
};
} else { } else {
error "invalid mirror: $arg"; error "invalid mirror: $arg";
} }
@ -5351,7 +5373,7 @@ sub main() {
} }
} }
if (scalar @{$sourceslists} == 0) { if (scalar @{$sourceslists} == 0) {
error "empty apt sources.list"; warning "empty apt sources.list";
} }
debug("sources list entries:"); debug("sources list entries:");
for my $list (@{$sourceslists}) { for my $list (@{$sourceslists}) {

8
tests/empty-sources.list Normal file
View file

@ -0,0 +1,8 @@
#!/bin/sh
set -eu
export LC_ALL=C.UTF-8
trap "rm -f /tmp/debian-chroot.tar" EXIT INT TERM
printf '' | {{ CMD }} --mode={{ MODE }} --variant=apt \
--setup-hook='echo "deb {{ MIRROR }} {{ DIST }} main" > "$1"/etc/apt/sources.list' \
{{ DIST }} /tmp/debian-chroot.tar -
tar -tf /tmp/debian-chroot.tar | sort | diff -u tar1.txt -