Browse Source

Don't show acquire warning for "hidden" components

Commit d7c92411dc introduced a warning for
non-existent files from components not mentioned in Components to hint
users at a mispelling or the disappearance of a component.

The debian-installer subcomponent isn't actively advertised in the
Release file through, so if apt ends up in acquiring a file which
doesn't exist for this component (like Translation files) apt would
produce a warning:

W: Skipping acquire of configured file
'main/debian-installer/i18n/Translation-en' as repository
' buster InRelease' doesn't have the
component 'main/debian-installer' (component misspelt in sources.list?)

We prevent this in the future by checking if any file exists from this
component which results in the warning to be produced still for the
intended cases and silence it on the d-i case.

This could potentially cause the warning not to be produced in cases it
should be if some marginal file remains, but as this message is just a
hint and the setup a bit pathological lets ignore it for now.

There is also the possibility of having no file present as they would
all be 0-length files and being a "hidden" component, but that would be
easy to workaround from the repository side and isn't really actively used
at the moment in the wild.

Closes: #879591
David Kalnischkies 3 years ago
3 changed files with 58 additions and 10 deletions
  1. +17
  2. +16
  3. +25

+ 17
- 2
apt-pkg/ View File

@@ -39,6 +39,7 @@
#include <random>
#include <sstream>
#include <string>
#include <unordered_set>
#include <vector>
#include <errno.h>
#include <stddef.h>
@@ -1511,7 +1512,7 @@ void pkgAcqMetaClearSig::QueueIndexes(bool const verify) /*{{{*/
// at this point the real Items are loaded in the fetcher
ExpectedAdditionalItems = 0;

std::set<std::string> targetsSeen;
std::unordered_set<std::string> targetsSeen, componentsSeen;
bool const hasReleaseFile = TransactionManager->MetaIndexParser != NULL;
bool hasHashes = true;
auto IndexTargets = TransactionManager->MetaIndexParser->GetIndexTargets();
@@ -1535,6 +1536,18 @@ void pkgAcqMetaClearSig::QueueIndexes(bool const verify) /*{{{*/
range_start = range_end;
} while (range_start != IndexTargets.end());
/* Collect all components for which files exist to prevent apt from warning users
about "hidden" components for which not all files exist like main/debian-installer
and Translation files */
if (hasReleaseFile == true)
for (auto const &Target : IndexTargets)
if (TransactionManager->MetaIndexParser->Exists(Target.MetaKey))
auto component = Target.Option(IndexTarget::COMPONENT);
if (component.empty() == false)

for (auto&& Target: IndexTargets)
// if we have seen a target which is created-by a target this one here is declared a
@@ -1566,7 +1579,9 @@ void pkgAcqMetaClearSig::QueueIndexes(bool const verify) /*{{{*/
if (TransactionManager->MetaIndexParser->Exists(Target.MetaKey) == false)
auto const component = Target.Option(IndexTarget::COMPONENT);
if (component.empty() == false && TransactionManager->MetaIndexParser->HasSupportForComponent(component) == false)
if (component.empty() == false &&
componentsSeen.find(component) == std::end(componentsSeen) &&
TransactionManager->MetaIndexParser->HasSupportForComponent(component) == false)
new CleanupItem(Owner, TransactionManager, Target);
_error->Warning(_("Skipping acquire of configured file '%s' as repository '%s' doesn't have the component '%s' (component misspelt in sources.list?)"),

+ 16
- 8
test/integration/framework View File

@@ -909,10 +909,17 @@ insertpackage() {
If you find such a package installed on your system,
something went horribly wrong! They are autogenerated
und used only by testcases and serve no other purpose…}"
local SECTION="${8:-other}"

if [ "$SECTION" = "${SECTION#*/}" ]; then
local ARCHS=""
for RELEASE in $(printf '%s' "$RELEASES" | tr ',' '\n'); do
if [ "$RELEASE" = 'installed' ]; then
insertinstalledpackage "$2" "$3" "$4" "$5" "$6" "$7"
insertinstalledpackage "$2" "$3" "$4" "$5" "$6" "$7" "$8"
for arch in $(getarchitecturesfromcommalist "$ARCH"); do
@@ -922,17 +929,17 @@ insertpackage() {
local PPATH="aptarchive/dists/${RELEASE}/main/binary-${BUILDARCH}"
local PPATH="aptarchive/dists/${RELEASE}/${DISTSECTION}/binary-${BUILDARCH}"
mkdir -p "$PPATH"
echo "Package: $NAME
Priority: $PRIORITY
Section: other
Section: $SECTION
Installed-Size: 42
Maintainer: Joe Sixpack <>"
test "$arch" = 'none' || echo "Architecture: $arch"
echo "Version: $VERSION
Filename: pool/main/${NAME}/${NAME}_${VERSION}_${arch}.deb"
Filename: pool/${DISTSECTION}/${NAME}/${NAME}_${VERSION}_${arch}.deb"
test -z "$DEPENDENCIES" || printf "%b\n" "$DEPENDENCIES"
echo "Description: $(printf '%s' "$DESCRIPTION" | head -n 1)"
echo "Description-md5: $(printf '%s' "$DESCRIPTION" | md5sum | cut -d' ' -f 1)"
@@ -941,12 +948,12 @@ Filename: pool/main/${NAME}/${NAME}_${VERSION}_${arch}.deb"
} >> "${PPATH}/Packages"
mkdir -p "aptarchive/dists/${RELEASE}/main/source" "aptarchive/dists/${RELEASE}/main/i18n"
touch "aptarchive/dists/${RELEASE}/main/source/Sources"
mkdir -p "aptarchive/dists/${RELEASE}/${DISTSECTION}/source" "aptarchive/dists/${RELEASE}/${DISTSECTION}/i18n"
touch "aptarchive/dists/${RELEASE}/${DISTSECTION}/source/Sources"
echo "Package: $NAME
Description-md5: $(printf '%s' "$DESCRIPTION" | md5sum | cut -d' ' -f 1)
Description-en: $DESCRIPTION
" >> "aptarchive/dists/${RELEASE}/main/i18n/Translation-en"
" >> "aptarchive/dists/${RELEASE}/${DISTSECTION}/i18n/Translation-en"

@@ -991,6 +998,7 @@ insertinstalledpackage() {
If you find such a package installed on your system,
something went horribly wrong! They are autogenerated
und used only by testcases and serve no other purpose…}"
local SECTION="${8:-other}"

local FILE='rootdir/var/lib/dpkg/status'
local INFO='rootdir/var/lib/dpkg/info'
@@ -998,7 +1006,7 @@ insertinstalledpackage() {
echo "Package: $NAME
Status: $STATUS
Priority: $PRIORITY
Section: other
Section: $SECTION
Installed-Size: 42
Maintainer: Joe Sixpack <>
Version: $VERSION" >> "$FILE"

+ 25
- 0
test/integration/test-bug-879591-dont-warn-for-hidden-but-good-components View File

@@ -0,0 +1,25 @@
set -e

TESTDIR="$(readlink -f "$(dirname "$0")")"
. "$TESTDIR/framework"
configarchitecture 'amd64'

insertpackage 'stable' 'foo' 'all' '1'
insertpackage 'stable' 'bar' 'all' '1' '' '' '' 'main/debian-installer/others'
insertpackage 'stable-backports' 'foo' 'all' '1+sb'
insertpackage 'stable-backports' 'bar' 'all' '1+sb' '' '' '' 'main/debian-installer/others'

find aptarchive/dists -path '*/debian-installer/i18n/Translation-en*' -delete

setupaptarchive --no-update
sed -i -e '/^Codename: / a\
Components: main contrib' $(find ./aptarchive -name 'Release')

testsuccess aptget update

sed -i -e 's# main\w*$# main main/debian-installer#' rootdir/etc/apt/sources.list.d/*

testsuccess aptget update