summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2011-07-28 15:19:47 +0200
committerMichael Vogt <michael.vogt@ubuntu.com>2011-07-28 15:19:47 +0200
commit3671f6810b6306a07f0002b0a808435dad367ab0 (patch)
tree67aa1a70ebf550af64e899348eaddabc07378886
parentb20c16833e20da8e367221b32764889cafe5b4c1 (diff)
parent2ec858bc68bc2d79ec020fe24be2d76b7c5b6792 (diff)
merged from lp:~mvo/apt/mvo
-rw-r--r--apt-pkg/contrib/fileutl.cc11
-rw-r--r--apt-pkg/contrib/fileutl.h1
-rw-r--r--apt-pkg/pkgcachegen.cc18
-rw-r--r--apt-pkg/sourcelist.cc18
-rw-r--r--apt-pkg/sourcelist.h3
-rw-r--r--debian/changelog7
6 files changed, 54 insertions, 4 deletions
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc
index 50019872e..85dc6f600 100644
--- a/apt-pkg/contrib/fileutl.cc
+++ b/apt-pkg/contrib/fileutl.cc
@@ -446,6 +446,17 @@ string SafeGetCWD()
return S;
}
/*}}}*/
+// GetModificationTime - Get the mtime of the given file or -1 on error /*{{{*/
+// ---------------------------------------------------------------------
+/* We return / on failure. */
+time_t GetModificationTime(string const &Path)
+{
+ struct stat St;
+ if (stat(Path.c_str(), &St) < 0)
+ return -1;
+ return St.st_mtime;
+}
+ /*}}}*/
// flNotDir - Strip the directory from the filename /*{{{*/
// ---------------------------------------------------------------------
/* */
diff --git a/apt-pkg/contrib/fileutl.h b/apt-pkg/contrib/fileutl.h
index cde288ad2..a1b177f38 100644
--- a/apt-pkg/contrib/fileutl.h
+++ b/apt-pkg/contrib/fileutl.h
@@ -97,6 +97,7 @@ bool FileExists(string File);
bool RealFileExists(string File);
bool DirectoryExists(string const &Path) __attrib_const;
bool CreateDirectory(string const &Parent, string const &Path);
+time_t GetModificationTime(string const &Path);
/** \brief Ensure the existence of the given Path
*
diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc
index 70dcd9de9..24e95f2f2 100644
--- a/apt-pkg/pkgcachegen.cc
+++ b/apt-pkg/pkgcachegen.cc
@@ -916,8 +916,11 @@ unsigned long pkgCacheGenerator::WriteUniqString(const char *S,
/* This just verifies that each file in the list of index files exists,
has matching attributes with the cache and the cache does not have
any extra files. */
-static bool CheckValidity(const string &CacheFile, FileIterator Start,
- FileIterator End,MMap **OutMap = 0)
+static bool CheckValidity(const string &CacheFile,
+ pkgSourceList &List,
+ FileIterator Start,
+ FileIterator End,
+ MMap **OutMap = 0)
{
bool const Debug = _config->FindB("Debug::pkgCacheGen", false);
// No file, certainly invalid
@@ -928,6 +931,13 @@ static bool CheckValidity(const string &CacheFile, FileIterator Start,
return false;
}
+ if (List.GetLastModifiedTime() < GetModificationTime(CacheFile))
+ {
+ if (Debug == true)
+ std::clog << "sources.list is newer than the cache" << std::endl;
+ return false;
+ }
+
// Map it
FileFd CacheF(CacheFile,FileFd::ReadOnly);
SPtr<MMap> Map = new MMap(CacheF,0);
@@ -1153,7 +1163,7 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress
Progress->OverallProgress(0,1,1,_("Reading package lists"));
// Cache is OK, Fin.
- if (CheckValidity(CacheFile,Files.begin(),Files.end(),OutMap) == true)
+ if (CheckValidity(CacheFile, List, Files.begin(),Files.end(),OutMap) == true)
{
if (Progress != NULL)
Progress->OverallProgress(1,1,1,_("Reading package lists"));
@@ -1206,7 +1216,7 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress
// Lets try the source cache.
unsigned long CurrentSize = 0;
unsigned long TotalSize = 0;
- if (CheckValidity(SrcCacheFile,Files.begin(),
+ if (CheckValidity(SrcCacheFile, List, Files.begin(),
Files.begin()+EndOfSource) == true)
{
if (Debug == true)
diff --git a/apt-pkg/sourcelist.cc b/apt-pkg/sourcelist.cc
index 851eefdfe..c96ccfd77 100644
--- a/apt-pkg/sourcelist.cc
+++ b/apt-pkg/sourcelist.cc
@@ -341,4 +341,22 @@ bool pkgSourceList::ReadSourceDir(string Dir)
}
/*}}}*/
+// GetLastModified() /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+time_t pkgSourceList::GetLastModifiedTime()
+{
+ // go over the parts
+ string Main = _config->FindFile("Dir::Etc::sourcelist");
+ string Parts = _config->FindDir("Dir::Etc::sourceparts");
+ vector<string> const List = GetListOfFilesInDir(Parts, "list", true);
+
+ // calculate the time
+ time_t mtime_sources = GetModificationTime(Main);
+ for (vector<string>::const_iterator I = List.begin(); I != List.end(); I++)
+ mtime_sources = std::max(mtime_sources, GetModificationTime(*I));
+
+ return mtime_sources;
+}
+ /*}}}*/
diff --git a/apt-pkg/sourcelist.h b/apt-pkg/sourcelist.h
index e15314a5e..7b473ee64 100644
--- a/apt-pkg/sourcelist.h
+++ b/apt-pkg/sourcelist.h
@@ -92,6 +92,9 @@ class pkgSourceList
pkgIndexFile *&Found) const;
bool GetIndexes(pkgAcquire *Owner, bool GetAll=false) const;
+ // query last-modified time
+ time_t GetLastModifiedTime();
+
pkgSourceList();
pkgSourceList(string File);
~pkgSourceList();
diff --git a/debian/changelog b/debian/changelog
index e4d1cdd54..f59734a4f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -20,6 +20,13 @@ apt (0.8.16~exp4) UNRELEASED; urgency=low
* [ABI break] merge patch from Jonathan Thomas to speed up the
depcache by caching the install-recommends and install-suggests
values
+ * apt-pkg/contrib/fileutl.{cc,h}:
+ - add GetModificationTime() helper
+ * apt-pkg/pkgcachegen.cc:
+ - regenerate the cache if the sources.list changes to ensure
+ that changes in the ordering there will be honored by apt
+ * apt-pkg/sourcelist.{cc,h}:
+ - add pkgSourceList::GetLastModifiedTime() helper
-- Julian Andres Klode <jak@debian.org> Wed, 20 Jul 2011 16:23:55 +0200