diff options
author | Arch Librarian <arch@canonical.com> | 2004-09-20 16:52:40 +0000 |
---|---|---|
committer | Arch Librarian <arch@canonical.com> | 2004-09-20 16:52:40 +0000 |
commit | 1bc849af8f694ab80887bd0e9b94280f78771dbc (patch) | |
tree | 9ef7ce0628b4e3fb0bdd14b352507d8f3a09da2d /apt-pkg | |
parent | 17caf1b19355813fa7a58828d4979ecf21b1e1f9 (diff) |
Clean support
Author: jgg
Date: 1999-02-01 08:11:57 GMT
Clean support
Diffstat (limited to 'apt-pkg')
-rw-r--r-- | apt-pkg/acquire-item.cc | 4 | ||||
-rw-r--r-- | apt-pkg/clean.cc | 111 | ||||
-rw-r--r-- | apt-pkg/clean.h | 30 | ||||
-rw-r--r-- | apt-pkg/contrib/strutl.cc | 28 | ||||
-rw-r--r-- | apt-pkg/contrib/strutl.h | 3 | ||||
-rw-r--r-- | apt-pkg/makefile | 6 |
6 files changed, 174 insertions, 8 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index beb4260ac..ebef611d8 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: acquire-item.cc,v 1.22 1999/02/01 02:22:11 jgg Exp $ +// $Id: acquire-item.cc,v 1.23 1999/02/01 08:11:57 jgg Exp $ /* ###################################################################### Acquire Item - Item to acquire @@ -363,7 +363,7 @@ pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources, // Generate the final file name as: package_version_arch.deb StoreFilename = QuoteString(Version.ParentPkg().Name(),"_:") + '_' + QuoteString(Version.VerStr(),"_:") + '_' + - QuoteString(Version.Arch(),"_:") + ".deb"; + QuoteString(Version.Arch(),"_:.") + ".deb"; // Select a source if (QueueNext() == false && _error->PendingError() == false) diff --git a/apt-pkg/clean.cc b/apt-pkg/clean.cc new file mode 100644 index 000000000..db47b1cc4 --- /dev/null +++ b/apt-pkg/clean.cc @@ -0,0 +1,111 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +// $Id: clean.cc,v 1.1 1999/02/01 08:11:57 jgg Exp $ +/* ###################################################################### + + Clean - Clean out downloaded directories + + ##################################################################### */ + /*}}}*/ +// Includes /*{{{*/ +#ifdef __GNUG__ +#pragma implementation "apt-pkg/clean.h" +#endif + +#include <apt-pkg/clean.h> +#include <apt-pkg/strutl.h> +#include <apt-pkg/error.h> + +#include <dirent.h> +#include <sys/stat.h> +#include <unistd.h> + /*}}}*/ + +// ArchiveCleaner::Go - Perform smart cleanup of the archive /*{{{*/ +// --------------------------------------------------------------------- +/* Scan the directory for files to erase, we check the version information + against our database to see if it is interesting */ +bool pkgArchiveCleaner::Go(string Dir,pkgCache &Cache) +{ + DIR *D = opendir(Dir.c_str()); + if (D == 0) + return _error->Errno("opendir","Unable to read %s",Dir.c_str()); + + string StartDir = SafeGetCWD(); + if (chdir(Dir.c_str()) != 0) + { + closedir(D); + return _error->Errno("chdir","Unable to change to ",Dir.c_str()); + } + + for (struct dirent *Dir = readdir(D); Dir != 0; Dir = readdir(D)) + { + // Skip some files.. + if (strcmp(Dir->d_name,"lock") == 0 || + strcmp(Dir->d_name,"partial") == 0 || + strcmp(Dir->d_name,".") == 0 || + strcmp(Dir->d_name,"..") == 0) + continue; + + struct stat St; + if (stat(Dir->d_name,&St) != 0) + return _error->Errno("stat","Unable to stat %s.",Dir->d_name); + + // Grab the package name + const char *I = Dir->d_name; + for (; *I != 0 && *I != '_';I++); + if (*I != '_') + continue; + string Pkg = DeQuoteString(string(Dir->d_name,I-Dir->d_name)); + + // Grab the version + const char *Start = I + 1; + for (I = Start; *I != 0 && *I != '_';I++); + if (*I != '_') + continue; + string Ver = DeQuoteString(string(Start,I-Start)); + + // Grab the arch + Start = I + 1; + for (I = Start; *I != 0 && *I != '.' ;I++); + if (*I != '.') + continue; + string Arch = DeQuoteString(string(Start,I-Start)); + + // Lookup the package + pkgCache::PkgIterator P = Cache.FindPkg(Pkg); + if (P.end() != true) + { + pkgCache::VerIterator V = P.VersionList(); + for (; V.end() == false; V++) + { + // See if we can fetch this version at all + bool IsFetchable = false; + for (pkgCache::VerFileIterator J = V.FileList(); + J.end() == false; J++) + { + if ((J.File()->Flags & pkgCache::Flag::NotSource) != 0) + continue; + IsFetchable = true; + break; + } + + // See if this verison matches the file + if (IsFetchable == true && Ver == V.VerStr()) + break; + } + + // We found a match, keep the file + if (V.end() == false) + continue; + } + + Erase(Dir->d_name,Pkg,Ver,St); + unlink(Dir->d_name); + }; + + chdir(StartDir.c_str()); + closedir(D); + return true; +} + /*}}}*/ diff --git a/apt-pkg/clean.h b/apt-pkg/clean.h new file mode 100644 index 000000000..afb5aa4f5 --- /dev/null +++ b/apt-pkg/clean.h @@ -0,0 +1,30 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +// $Id: clean.h,v 1.1 1999/02/01 08:11:57 jgg Exp $ +/* ###################################################################### + + Clean - Clean out downloaded directories + + ##################################################################### */ + /*}}}*/ +#ifndef APTPKG_CLEAN_H +#define APTPKG_CLEAN_H + +#ifdef __GNUG__ +#pragma interface "apt-pkg/clean.h" +#endif + +#include <apt-pkg/pkgcache.h> + +class pkgArchiveCleaner +{ + protected: + + virtual void Erase(const char *File,string Pkg,string Ver,struct stat &St) {}; + + public: + + bool Go(string Dir,pkgCache &Cache); +}; + +#endif diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc index e0188e3b8..b5086be04 100644 --- a/apt-pkg/contrib/strutl.cc +++ b/apt-pkg/contrib/strutl.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: strutl.cc,v 1.18 1999/01/27 02:48:52 jgg Exp $ +// $Id: strutl.cc,v 1.19 1999/02/01 08:11:57 jgg Exp $ /* ###################################################################### String Util - Some usefull string functions. @@ -116,7 +116,7 @@ bool ParseQuoteWord(const char *&String,string &Res) { Tmp[0] = Start[1]; Tmp[1] = Start[2]; - Tmp[3] = 0; + Tmp[2] = 0; *I = (char)strtol(Tmp,0,16); Start += 3; continue; @@ -177,6 +177,30 @@ bool ParseCWord(const char *String,string &Res) return true; } /*}}}*/ +// DeQuoteString - Convert a string from quoted from /*{{{*/ +// --------------------------------------------------------------------- +/* This undoes QuoteString */ +string DeQuoteString(string Str) +{ + string Res; + for (string::iterator I = Str.begin(); I != Str.end(); I++) + { + if (*I == '%' && I + 2 < Str.end()) + { + char Tmp[3]; + Tmp[0] = I[1]; + Tmp[1] = I[2]; + Tmp[2] = 0; + Res += (char)strtol(Tmp,0,16); + I += 2; + continue; + } + else + Res += *I; + } + return Res; +} + /*}}}*/ // QuoteString - Convert a string into quoted from /*{{{*/ // --------------------------------------------------------------------- /* */ diff --git a/apt-pkg/contrib/strutl.h b/apt-pkg/contrib/strutl.h index e9a31f144..a79f28e4e 100644 --- a/apt-pkg/contrib/strutl.h +++ b/apt-pkg/contrib/strutl.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: strutl.h,v 1.11 1999/01/27 02:48:53 jgg Exp $ +// $Id: strutl.h,v 1.12 1999/02/01 08:11:57 jgg Exp $ /* ###################################################################### String Util - These are some usefull string functions @@ -30,6 +30,7 @@ char *_strtabexpand(char *String,size_t Len); bool ParseQuoteWord(const char *&String,string &Res); bool ParseCWord(const char *String,string &Res); string QuoteString(string Str,const char *Bad); +string DeQuoteString(string Str); string SizeToStr(double Bytes); string TimeToStr(unsigned long Sec); string SubstVar(string Str,string Subst,string Contents); diff --git a/apt-pkg/makefile b/apt-pkg/makefile index 08b8b2941..87a5e46f6 100644 --- a/apt-pkg/makefile +++ b/apt-pkg/makefile @@ -24,9 +24,9 @@ SOURCE = contrib/mmap.cc contrib/error.cc contrib/strutl.cc \ SOURCE+= pkgcache.cc version.cc fileutl.cc pkgcachegen.cc depcache.cc \ orderlist.cc tagfile.cc sourcelist.cc packagemanager.cc \ pkgrecords.cc algorithms.cc acquire.cc acquire-item.cc \ - acquire-worker.cc acquire-method.cc init.cc templates.cc + acquire-worker.cc acquire-method.cc init.cc clean.cc templates.cc -# Source code for the debian specific components +# Source code for the debian specific components SOURCE+= deb/deblistparser.cc deb/debrecords.cc deb/dpkgpm.cc deb/dpkginit.cc # Public apt-pkg header files @@ -35,7 +35,7 @@ HEADERS = algorithms.h depcache.h mmap.h pkgcachegen.h cacheiterators.h \ packagemanager.h tagfile.h deblistparser.h init.h pkgcache.h \ version.h progress.h pkgrecords.h debrecords.h cmndline.h \ acquire.h acquire-worker.h acquire-item.h acquire-method.h md5.h \ - dpkgpm.h dpkginit.h cdromutl.h strutl.h + dpkgpm.h dpkginit.h cdromutl.h strutl.h clean.h HEADERS := $(addprefix apt-pkg/,$(HEADERS)) |