diff options
author | Julian Andres Klode <jak@debian.org> | 2024-01-08 09:15:34 +0000 |
---|---|---|
committer | Julian Andres Klode <jak@debian.org> | 2024-01-08 09:15:34 +0000 |
commit | 6e43eef9ca8250eb561f2c9af2f4890d674f3911 (patch) | |
tree | 94e31c8f341cc886f55f87b7a6e8048187994934 /apt-pkg | |
parent | 7a9a7c1025a5a9dcb27b0e8b5a2d40327fd3b911 (diff) | |
parent | afcdbcf895284efd76903b2b3ba5cc849059ce50 (diff) |
Merge branch 'fix/dontstorediffindex' into 'main'
Do not store .diff_Index files in update
See merge request apt-team/apt!316
Diffstat (limited to 'apt-pkg')
-rw-r--r-- | apt-pkg/acquire-item.cc | 46 | ||||
-rw-r--r-- | apt-pkg/acquire.cc | 24 | ||||
-rw-r--r-- | apt-pkg/acquire.h | 17 |
3 files changed, 36 insertions, 51 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index 7df6483ba..400838dcb 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -276,6 +276,15 @@ static HashStringList GetExpectedHashesFromFor(metaIndex * const Parser, std::st return R->Hashes; } /*}}}*/ +static void RemoveOldLeftoverDiffIndex(IndexTarget const &Target) /*{{{*/ +{ + std::string const FinalFile = GetFinalFileNameFromURI(GetDiffIndexURI(Target)); + RemoveFile("TransactionCommit", FinalFile); + for (auto const &ext: APT::Configuration::getCompressorExtensions()) + if (not ext.empty() && ext != ".") + RemoveFile("TransactionCommit", FinalFile + ext); +} + /*}}}*/ class pkgAcquire::Item::Private /*{{{*/ { @@ -414,12 +423,16 @@ bool pkgAcqTransactionItem::QueueURI(pkgAcquire::ItemDesc &Item) std::clog << "Skip " << Target.URI << " as transaction was already dealt with!" << std::endl; return false; } - std::string const FinalFile = GetFinalFilename(); - if (TransactionManager->IMSHit == true && FileExists(FinalFile) == true) + if (TransactionManager->IMSHit) { - PartialFile = DestFile = FinalFile; - Status = StatDone; - return false; + std::string const FinalFile = GetFinalFilename(); + if (FinalFile.empty() || FileExists(FinalFile)) + { + if (not FinalFile.empty()) + PartialFile = DestFile = FinalFile; + Status = StatDone; + return false; + } } // this ensures we rewrite only once and only the first step auto const OldBaseURI = Target.Option(IndexTarget::BASE_URI); @@ -508,11 +521,7 @@ std::string pkgAcquire::Item::GetFinalFilename() const } std::string pkgAcqDiffIndex::GetFinalFilename() const { - std::string const FinalFile = GetFinalFileNameFromURI(GetDiffIndexURI(Target)); - // we don't want recompress, so lets keep whatever we got - if (CurrentCompressionExtension == "uncompressed") - return FinalFile; - return FinalFile + "." + CurrentCompressionExtension; + return {}; } std::string pkgAcqIndex::GetFinalFilename() const { @@ -675,12 +684,11 @@ bool pkgAcqDiffIndex::TransactionState(TransactionStates const state) switch (state) { - case TransactionStarted: _error->Fatal("Item %s changed to invalid transaction start state!", Target.URI.c_str()); break; + case TransactionStarted: _error->Fatal("Item %s changed to invalid transaction start state!", GetDiffIndexURI(Target).c_str()); break; case TransactionCommit: + RemoveOldLeftoverDiffIndex(Target); break; case TransactionAbort: - std::string const Partial = GetPartialFileNameFromURI(Target.URI); - RemoveFile("TransactionAbort", Partial); break; } @@ -761,6 +769,7 @@ class APT_HIDDEN CleanupItem : public pkgAcqTransactionItem /*{{{*/ std::clog << "rm " << DestFile << " # " << DescURI() << std::endl; if (RemoveFile("TransItem::TransactionCommit", DestFile) == false) return false; + RemoveOldLeftoverDiffIndex(Target); break; } return true; @@ -1704,9 +1713,6 @@ void pkgAcqMetaClearSig::QueueIndexes(bool const verify) /*{{{*/ if (filename.empty() == false) { new NoActionItem(Owner, Target, filename); - std::string const idxfilename = GetFinalFileNameFromURI(GetDiffIndexURI(Target)); - if (FileExists(idxfilename)) - new NoActionItem(Owner, Target, idxfilename); targetsSeen.emplace(Target.Option(IndexTarget::CREATED_BY)); continue; } @@ -2703,12 +2709,8 @@ void pkgAcqDiffIndex::Failed(string const &Message,pkgAcquire::MethodConfig cons new pkgAcqIndex(Owner, TransactionManager, Target); } /*}}}*/ -bool pkgAcqDiffIndex::VerifyDone(std::string const &Message, pkgAcquire::MethodConfig const * const)/*{{{*/ +bool pkgAcqDiffIndex::VerifyDone(std::string const &/*Message*/, pkgAcquire::MethodConfig const * const)/*{{{*/ { - string const FinalFile = GetFinalFilename(); - if(StringToBool(LookupTag(Message,"IMS-Hit"),false)) - DestFile = FinalFile; - if (ParseDiffIndex(DestFile)) return true; @@ -2748,7 +2750,7 @@ void pkgAcqDiffIndex::Done(string const &Message,HashStringList const &Hashes, / } } - TransactionManager->TransactionStageCopy(this, DestFile, GetFinalFilename()); + TransactionManager->TransactionStageRemoval(this, DestFile); Complete = true; Status = StatDone; diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc index 727880e71..1cb55bf14 100644 --- a/apt-pkg/acquire.cc +++ b/apt-pkg/acquire.cc @@ -826,11 +826,11 @@ pkgAcquire::Worker *pkgAcquire::WorkerStep(Worker *I) return I->NextAcquire; } /*}}}*/ -// Acquire::CleanDir - Cleans a directory /*{{{*/ +// CleanDir - Cleans a directory /*{{{*/ // --------------------------------------------------------------------- /* This is a bit simplistic, it looks at every file in the dir and sees if it matches the predicate or not. */ -bool pkgAcquire::CleanDir(string Dir, std::function<bool(char const*)> const &Keep, char const * const Caller) +static bool CleanDir(std::string const &Dir, std::function<bool(std::string_view)> const &Keep, char const * const Caller) { // non-existing directories are by definition clean… if (DirectoryExists(Dir) == false) @@ -855,7 +855,7 @@ bool pkgAcquire::CleanDir(string Dir, std::function<bool(char const*)> const &Ke strcmp(E->d_name, "lost+found") == 0 || strcmp(E->d_name, ".") == 0 || strcmp(E->d_name, "..") == 0 || - Keep(E->d_name) == true) + Keep(E->d_name)) continue; RemoveFileAt(Caller, dirfd, E->d_name); } @@ -867,12 +867,12 @@ bool pkgAcquire::CleanDir(string Dir, std::function<bool(char const*)> const &Ke // --------------------------------------------------------------------- /* This is a bit simplistic, it looks at every file in the dir and sees if it is part of the download set. */ -bool pkgAcquire::Clean(string Dir) +bool pkgAcquire::Clean(std::string Dir) { return CleanDir( Dir, // Look in the get list and if found then keep - [this](char const *FName) { + [this](std::string_view const FName) { return std::any_of(Items.cbegin(), Items.cend(), [FName](pkgAcquire::Item const * const I) { return flNotDir(I->DestFile) == FName; @@ -882,21 +882,19 @@ bool pkgAcquire::Clean(string Dir) ); } /*}}}*/ -// Acquire::CleanLists - Cleans a directory of list files /*{{{*/ -// --------------------------------------------------------------------- -/* */ -bool pkgAcquire::CleanLists(string Dir) +// Acquire::CleanLists - Cleans a directory of list files /*{{{*/ +bool pkgAcquire::CleanLists(std::string const &Dir) { + std::regex const KeepPattern(".*_(Release|Release\\.gpg|InRelease)"); return CleanDir( Dir, - [](char const *FName) noexcept { - static const std::regex KeepPattern(".*_(Release|Release.gpg|InRelease)"); - return std::regex_match(FName, KeepPattern); + [&KeepPattern](std::string_view const FName) noexcept { + return std::regex_match(FName.begin(), FName.end(), KeepPattern); }, "pkgAcquire::CleanLists" ); } - /*}}}*/ + /*}}}*/ // Acquire::TotalNeeded - Number of bytes to fetch /*{{{*/ // --------------------------------------------------------------------- /* This is the total number of bytes needed */ diff --git a/apt-pkg/acquire.h b/apt-pkg/acquire.h index a5f7a40c8..f7c40aa5f 100644 --- a/apt-pkg/acquire.h +++ b/apt-pkg/acquire.h @@ -70,7 +70,6 @@ #include <apt-pkg/weakptr.h> #include <chrono> -#include <functional> #include <string> #include <vector> @@ -338,7 +337,7 @@ class APT_PUBLIC pkgAcquire * * \return \b true if the directory exists and is readable. */ - bool CleanLists(std::string Dir); + bool CleanLists(std::string const &Dir); /** \return the total size in bytes of all the items included in * this download. @@ -381,20 +380,6 @@ class APT_PUBLIC pkgAcquire private: APT_HIDDEN void Initialize(); - - /** Delete each entry in the given directory whose name does \em not match - * a criterion. - * - * \param Dir The directory to be cleaned. - * - * \param KeepP A predicate telling to keep the named file; if it is - * non-empty and returns true, the file is kept. - * - * \param Caller Log name of the caller. - * - * \return \b true if the directory exists and is readable. - */ - APT_HIDDEN static bool CleanDir(std::string Dir, std::function<bool(char const*)> const &KeepP, char const * const Caller); }; /** \brief Represents a single download source from which an item |