From 484babb7d00f7550cbaa592b7cb0022d38217fad Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Mon, 28 May 2018 17:02:17 +0200 Subject: Don't show acquire warning for "hidden" components Commit d7c92411dc1f4c6be098d1425f9c1c075e0c2154 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 'http://deb.debian.org/debian 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 --- apt-pkg/acquire-item.cc | 19 ++++++++++++++-- test/integration/framework | 24 ++++++++++++++------- ...879591-dont-warn-for-hidden-but-good-components | 25 ++++++++++++++++++++++ 3 files changed, 58 insertions(+), 10 deletions(-) create mode 100755 test/integration/test-bug-879591-dont-warn-for-hidden-but-good-components diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index a366b8981..0126b0f63 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -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 targetsSeen; + std::unordered_set 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) + componentsSeen.emplace(std::move(component)); + } + 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?)"), diff --git a/test/integration/framework b/test/integration/framework index f7c68859f..cfd621105 100644 --- a/test/integration/framework +++ b/test/integration/framework @@ -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 + DISTSECTION="main" + else + DISTSECTION="${SECTION%/*}" + fi 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" continue fi for arch in $(getarchitecturesfromcommalist "$ARCH"); do @@ -922,17 +929,17 @@ insertpackage() { ARCHS="$arch" fi for BUILDARCH in $ARCHS; do - 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" done done - 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" done } @@ -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" diff --git a/test/integration/test-bug-879591-dont-warn-for-hidden-but-good-components b/test/integration/test-bug-879591-dont-warn-for-hidden-but-good-components new file mode 100755 index 000000000..6eb4e04a6 --- /dev/null +++ b/test/integration/test-bug-879591-dont-warn-for-hidden-but-good-components @@ -0,0 +1,25 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +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') +signreleasefiles + +testsuccess aptget update + +sed -i -e 's# main\w*$# main main/debian-installer#' rootdir/etc/apt/sources.list.d/* + +testsuccess aptget update -- cgit v1.2.3