summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/clean.cc5
-rw-r--r--apt-private/private-download.cc26
-rw-r--r--test/integration/framework5
-rwxr-xr-xtest/integration/test-apt-get-clean24
4 files changed, 50 insertions, 10 deletions
diff --git a/apt-pkg/clean.cc b/apt-pkg/clean.cc
index 8e6bd6255..fe57c26a2 100644
--- a/apt-pkg/clean.cc
+++ b/apt-pkg/clean.cc
@@ -38,6 +38,11 @@ bool pkgArchiveCleaner::Go(std::string Dir,pkgCache &Cache)
if(Dir == "/")
return _error->Error(_("Clean of %s is not supported"), Dir.c_str());
+ // non-existing directories are always clean
+ // we do not check for a directory explicitly to support symlinks
+ if (FileExists(Dir) == false)
+ return true;
+
DIR *D = opendir(Dir.c_str());
if (D == 0)
return _error->Errno("opendir",_("Unable to read %s"),Dir.c_str());
diff --git a/apt-private/private-download.cc b/apt-private/private-download.cc
index 40312d0c8..5cdcf6038 100644
--- a/apt-private/private-download.cc
+++ b/apt-private/private-download.cc
@@ -309,12 +309,18 @@ bool DoClean(CommandLine &)
}
pkgAcquire Fetcher;
- Fetcher.GetLock(archivedir);
- Fetcher.Clean(archivedir);
- Fetcher.Clean(archivedir + "partial/");
+ if (archivedir.empty() == false && FileExists(archivedir) == true)
+ {
+ Fetcher.GetLock(archivedir);
+ Fetcher.Clean(archivedir);
+ Fetcher.Clean(archivedir + "partial/");
+ }
- Fetcher.GetLock(listsdir);
- Fetcher.Clean(listsdir + "partial/");
+ if (listsdir.empty() == false && FileExists(listsdir) == true)
+ {
+ Fetcher.GetLock(listsdir);
+ Fetcher.Clean(listsdir + "partial/");
+ }
pkgCacheFile::RemoveCaches();
@@ -338,11 +344,15 @@ bool DoClean(CommandLine &)
};
bool DoAutoClean(CommandLine &)
{
+ std::string const archivedir = _config->FindDir("Dir::Cache::Archives");
+ if (FileExists(archivedir) == false)
+ return true;
+
// Lock the archive directory
FileFd Lock;
if (_config->FindB("Debug::NoLocking",false) == false)
{
- int lock_fd = GetLock(_config->FindDir("Dir::Cache::Archives") + "lock");
+ int lock_fd = GetLock(flCombine(archivedir, "lock"));
if (lock_fd < 0)
return _error->Error(_("Unable to lock the download directory"));
Lock.Fd(lock_fd);
@@ -354,7 +364,7 @@ bool DoAutoClean(CommandLine &)
LogCleaner Cleaner;
- return Cleaner.Go(_config->FindDir("Dir::Cache::archives"),*Cache) &&
- Cleaner.Go(_config->FindDir("Dir::Cache::archives") + "partial/",*Cache);
+ return Cleaner.Go(archivedir, *Cache) &&
+ Cleaner.Go(flCombine(archivedir, "partial/"), *Cache);
}
/*}}}*/
diff --git a/test/integration/framework b/test/integration/framework
index 2cc6be3dd..691eb793b 100644
--- a/test/integration/framework
+++ b/test/integration/framework
@@ -1510,7 +1510,10 @@ msgfailoutput() {
if expr match "$1" "$FILEFLAGS" >/dev/null; then
echo "#### stat(2) of file: $2 ####"
stat "$2" || true
- if test -e "$2"; then
+ if test -d "$2"; then
+ echo "#### The directory contains: $2 ####"
+ ls >&2 "$2" || true
+ elif test -e "$2"; then
echo "#### Complete file: $2 ####"
cat >&2 "$2" || true
fi
diff --git a/test/integration/test-apt-get-clean b/test/integration/test-apt-get-clean
index 00f9d4e60..78cb95d74 100755
--- a/test/integration/test-apt-get-clean
+++ b/test/integration/test-apt-get-clean
@@ -36,4 +36,26 @@ testfailure test -e rootdir/var/cache/apt/archives/foo_2_all.deb
testfailure test -e rootdir/var/cache/apt/archives/foo_3_all.deb
testfailure test -e rootdir/var/cache/apt/archives/foo_4_all.deb
-
+directorygone() {
+ rm -rf "$1"
+ testsuccess apt autoclean
+ testfailure test -d "$1"
+ testsuccess apt clean
+ # clean creates an empty partial directory via GetLock
+ if [ "$(basename "$1")" = 'partial' ]; then
+ testsuccess test -d "$1"
+ else
+ testfailure test -d "$1"
+ fi
+}
+msgmsg 'Partial directory missing'
+directorygone 'rootdir/var/cache/apt/archives/partial'
+directorygone 'rootdir/var/lib/apt/lists/partial'
+
+msgmsg 'Archives directory missing'
+directorygone 'rootdir/var/cache/apt/archives'
+directorygone 'rootdir/var/lib/apt/lists'
+
+msgmsg 'apt directory missing'
+directorygone 'rootdir/var/cache/apt'
+directorygone 'rootdir/var/lib/apt'