allow empty sources.list entries
This commit is contained in:
parent
860a9048d5
commit
853634f298
3 changed files with 82 additions and 50 deletions
|
@ -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
|
||||||
|
|
122
mmdebstrap
122
mmdebstrap
|
@ -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
8
tests/empty-sources.list
Normal 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 -
|
Loading…
Reference in a new issue