diff options
Diffstat (limited to 'apt-pkg')
-rw-r--r-- | apt-pkg/contrib/strutl.h | 12 | ||||
-rw-r--r-- | apt-pkg/deb/debsrcrecords.cc | 8 | ||||
-rw-r--r-- | apt-pkg/deb/dpkgpm.cc | 95 | ||||
-rw-r--r-- | apt-pkg/deb/dpkgpm.h | 5 | ||||
-rw-r--r-- | apt-pkg/init.cc | 3 | ||||
-rw-r--r-- | apt-pkg/init.h | 8 | ||||
-rw-r--r-- | apt-pkg/makefile | 11 | ||||
-rw-r--r-- | apt-pkg/packagemanager.cc | 17 | ||||
-rw-r--r-- | apt-pkg/packagemanager.h | 2 |
9 files changed, 120 insertions, 41 deletions
diff --git a/apt-pkg/contrib/strutl.h b/apt-pkg/contrib/strutl.h index 0cbf14a7a..2b2e147fb 100644 --- a/apt-pkg/contrib/strutl.h +++ b/apt-pkg/contrib/strutl.h @@ -68,15 +68,15 @@ int tolower_ascii(int c); #define APT_MKSTRCMP(name,func) \ inline int name(const char *A,const char *B) {return func(A,A+strlen(A),B,B+strlen(B));}; \ inline int name(const char *A,const char *AEnd,const char *B) {return func(A,AEnd,B,B+strlen(B));}; \ -inline int name(string A,const char *B) {return func(A.c_str(),A.c_str()+A.length(),B,B+strlen(B));}; \ -inline int name(string A,string B) {return func(A.c_str(),A.c_str()+A.length(),B.c_str(),B.c_str()+B.length());}; \ -inline int name(string A,const char *B,const char *BEnd) {return func(A.c_str(),A.c_str()+A.length(),B,BEnd);}; +inline int name(const string& A,const char *B) {return func(A.c_str(),A.c_str()+A.length(),B,B+strlen(B));}; \ +inline int name(const string& A,const string& B) {return func(A.c_str(),A.c_str()+A.length(),B.c_str(),B.c_str()+B.length());}; \ +inline int name(const string& A,const char *B,const char *BEnd) {return func(A.c_str(),A.c_str()+A.length(),B,BEnd);}; #define APT_MKSTRCMP2(name,func) \ inline int name(const char *A,const char *AEnd,const char *B) {return func(A,AEnd,B,B+strlen(B));}; \ -inline int name(string A,const char *B) {return func(A.begin(),A.end(),B,B+strlen(B));}; \ -inline int name(string A,string B) {return func(A.begin(),A.end(),B.begin(),B.end());}; \ -inline int name(string A,const char *B,const char *BEnd) {return func(A.begin(),A.end(),B,BEnd);}; +inline int name(const string& A,const char *B) {return func(A.begin(),A.end(),B,B+strlen(B));}; \ +inline int name(const string& A,const string& B) {return func(A.begin(),A.end(),B.begin(),B.end());}; \ +inline int name(const string& A,const char *B,const char *BEnd) {return func(A.begin(),A.end(),B,BEnd);}; int stringcmp(const char *A,const char *AEnd,const char *B,const char *BEnd); int stringcasecmp(const char *A,const char *AEnd,const char *B,const char *BEnd); diff --git a/apt-pkg/deb/debsrcrecords.cc b/apt-pkg/deb/debsrcrecords.cc index 2f87c767b..bde10aa6d 100644 --- a/apt-pkg/deb/debsrcrecords.cc +++ b/apt-pkg/deb/debsrcrecords.cc @@ -135,9 +135,15 @@ bool debSrcRecordParser::Files(vector<pkgSrcRecords::File> &List) string::size_type Tmp = F.Path.rfind('.',Pos); if (Tmp == string::npos) break; + if (F.Type == "tar") { + // source v3 has extension 'debian.tar.*' instead of 'diff.*' + if (string(F.Path, Tmp+1, Pos-Tmp) == "debian") + F.Type = "diff"; + break; + } F.Type = string(F.Path,Tmp+1,Pos-Tmp); - if (F.Type == "gz" || F.Type == "bz2" || F.Type == "lzma") + if (F.Type == "gz" || F.Type == "bz2" || F.Type == "lzma" || F.Type == "tar") { Pos = Tmp-1; continue; diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 332b3cf0b..2f84a5a87 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -51,6 +51,7 @@ namespace std::make_pair("install", N_("Installing %s")), std::make_pair("configure", N_("Configuring %s")), std::make_pair("remove", N_("Removing %s")), + std::make_pair("purge", N_("Completely removing %s")), std::make_pair("trigproc", N_("Running post-installation trigger %s")) }; @@ -560,45 +561,103 @@ void pkgDPkgPM::DoDpkgStatusFd(int statusfd, int OutStatusFd) dpkgbuf_pos = dpkgbuf+dpkgbuf_pos-p; } /*}}}*/ +// DPkgPM::WriteHistoryTag /*{{{*/ +void pkgDPkgPM::WriteHistoryTag(string tag, string value) +{ + if (value.size() > 0) + { + // poor mans rstrip(", ") + if (value[value.size()-2] == ',' && value[value.size()-1] == ' ') + value.erase(value.size() - 2, 2); + fprintf(history_out, "%s: %s\n", tag.c_str(), value.c_str()); + } +} /*}}}*/ // DPkgPM::OpenLog /*{{{*/ bool pkgDPkgPM::OpenLog() { string logdir = _config->FindDir("Dir::Log"); if(not FileExists(logdir)) return _error->Error(_("Directory '%s' missing"), logdir.c_str()); + + // get current time + char timestr[200]; + time_t t = time(NULL); + struct tm *tmp = localtime(&t); + strftime(timestr, sizeof(timestr), "%F %T", tmp); + + // open terminal log string logfile_name = flCombine(logdir, _config->Find("Dir::Log::Terminal")); if (!logfile_name.empty()) { term_out = fopen(logfile_name.c_str(),"a"); chmod(logfile_name.c_str(), 0600); - // output current time - char outstr[200]; - time_t t = time(NULL); - struct tm *tmp = localtime(&t); - strftime(outstr, sizeof(outstr), "%F %T", tmp); - fprintf(term_out, "\nLog started: "); - fprintf(term_out, "%s", outstr); + fprintf(term_out, "\n\nLog started: "); + fprintf(term_out, "%s", timestr); fprintf(term_out, "\n"); } + + // write + string history_name = flCombine(logdir, + _config->Find("Dir::Log::History")); + if (!history_name.empty()) + { + history_out = fopen(history_name.c_str(),"a"); + chmod(history_name.c_str(), 0644); + fprintf(history_out, "\nStart-Date: %s\n", timestr); + string remove, purge, install, upgrade, downgrade; + for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++) + { + if (Cache[I].NewInstall()) + install += I.Name() + string(" (") + Cache[I].CandVersion + string("), "); + else if (Cache[I].Upgrade()) + upgrade += I.Name() + string(" (") + Cache[I].CurVersion + string(", ") + Cache[I].CandVersion + string("), "); + else if (Cache[I].Downgrade()) + downgrade += I.Name() + string(" (") + Cache[I].CurVersion + string(", ") + Cache[I].CandVersion + string("), "); + else if (Cache[I].Delete()) + { + if ((Cache[I].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge) + purge += I.Name() + string(" (") + Cache[I].CurVersion + string("), "); + else + remove += I.Name() + string(" (") + Cache[I].CurVersion + string("), "); + } + } + WriteHistoryTag("Install", install); + WriteHistoryTag("Upgrade", upgrade); + WriteHistoryTag("Downgrade",downgrade); + WriteHistoryTag("Remove",remove); + WriteHistoryTag("Purge",purge); + fflush(history_out); + } + return true; } /*}}}*/ // DPkg::CloseLog /*{{{*/ bool pkgDPkgPM::CloseLog() { + char timestr[200]; + time_t t = time(NULL); + struct tm *tmp = localtime(&t); + strftime(timestr, sizeof(timestr), "%F %T", tmp); + if(term_out) { - char outstr[200]; - time_t t = time(NULL); - struct tm *tmp = localtime(&t); - strftime(outstr, sizeof(outstr), "%F %T", tmp); fprintf(term_out, "Log ended: "); - fprintf(term_out, "%s", outstr); + fprintf(term_out, "%s", timestr); fprintf(term_out, "\n"); fclose(term_out); } term_out = NULL; + + if(history_out) + { + if (dpkg_error.size() > 0) + fprintf(history_out, "Error: %s\n", dpkg_error.c_str()); + fprintf(history_out, "End-Date: %s\n", timestr); + fclose(history_out); + } + return true; } /*}}}*/ @@ -889,7 +948,8 @@ bool pkgDPkgPM::Go(int OutStatusFd) const char *s = _("Can not write log, openpty() " "failed (/dev/pts not mounted?)\n"); fprintf(stderr, "%s",s); - fprintf(term_out, "%s",s); + if(term_out) + fprintf(term_out, "%s",s); master = slave = -1; } else { struct termios rtt; @@ -1066,11 +1126,14 @@ bool pkgDPkgPM::Go(int OutStatusFd) RunScripts("DPkg::Post-Invoke"); if (WIFSIGNALED(Status) != 0 && WTERMSIG(Status) == SIGSEGV) - _error->Error("Sub-process %s received a segmentation fault.",Args[0]); + strprintf(dpkg_error, "Sub-process %s received a segmentation fault.",Args[0]); else if (WIFEXITED(Status) != 0) - _error->Error("Sub-process %s returned an error code (%u)",Args[0],WEXITSTATUS(Status)); + strprintf(dpkg_error, "Sub-process %s returned an error code (%u)",Args[0],WEXITSTATUS(Status)); else - _error->Error("Sub-process %s exited unexpectedly",Args[0]); + strprintf(dpkg_error, "Sub-process %s exited unexpectedly",Args[0]); + + if(dpkg_error.size() > 0) + _error->Error(dpkg_error.c_str()); if(stopOnError) { diff --git a/apt-pkg/deb/dpkgpm.h b/apt-pkg/deb/dpkgpm.h index 90e5b95e6..ce3e20f2e 100644 --- a/apt-pkg/deb/dpkgpm.h +++ b/apt-pkg/deb/dpkgpm.h @@ -29,7 +29,9 @@ class pkgDPkgPM : public pkgPackageManager char dpkgbuf[1024]; int dpkgbuf_pos; FILE *term_out; - + FILE *history_out; + string dpkg_error; + protected: int pkgFailures; @@ -68,6 +70,7 @@ class pkgDPkgPM : public pkgPackageManager // Helpers bool RunScriptsWithPkgs(const char *Cnf); bool SendV2Pkgs(FILE *F); + void WriteHistoryTag(string tag, string value); // apport integration void WriteApportReport(const char *pkgpath, const char *errormsg); diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc index 6f02203cd..67d321abf 100644 --- a/apt-pkg/init.cc +++ b/apt-pkg/init.cc @@ -75,7 +75,8 @@ bool pkgInitConfig(Configuration &Cnf) // State Cnf.Set("Dir::Log","var/log/apt"); Cnf.Set("Dir::Log::Terminal","term.log"); - + Cnf.Set("Dir::Log::History","history.log"); + // Translation Cnf.Set("APT::Acquire::Translation", "environment"); diff --git a/apt-pkg/init.h b/apt-pkg/init.h index 44d1d107c..f0757f644 100644 --- a/apt-pkg/init.h +++ b/apt-pkg/init.h @@ -16,10 +16,14 @@ #include <apt-pkg/configuration.h> #include <apt-pkg/pkgsystem.h> -// See the makefile +// These lines are extracted by the makefiles and the buildsystem +// Increasing MAJOR or MINOR results in the need of recompiling all +// reverse-dependencies of libapt-pkg against the new SONAME. +// Non-ABI-Breaks should only increase RELEASE number. +// See also buildlib/libversion.mak #define APT_PKG_MAJOR 4 #define APT_PKG_MINOR 8 -#define APT_PKG_RELEASE 1 +#define APT_PKG_RELEASE 0 extern const char *pkgVersion; extern const char *pkgLibVersion; diff --git a/apt-pkg/makefile b/apt-pkg/makefile index f2a8460a9..3d6209658 100644 --- a/apt-pkg/makefile +++ b/apt-pkg/makefile @@ -9,14 +9,13 @@ HEADER_TARGETDIRS = apt-pkg # Bring in the default rules include ../buildlib/defaults.mak -# The library name, don't forget to update init.h and the copy in -# methods/makefile - FIXME +# The library name and version (indirectly used from init.h) +include ../buildlib/libversion.mak LIBRARY=apt-pkg -LIBEXT=$(GLIBC_VER)$(LIBSTDCPP_VER) -MAJOR=4.8 -MINOR=1 +MAJOR=$(LIBAPTPKG_MAJOR) +MINOR=$(LIBAPTPKG_RELEASE) SLIBS=$(PTHREADLIB) $(INTLLIBS) -lutil -ldl -APT_DOMAIN:=libapt-pkg$(MAJOR) +APT_DOMAIN:=libapt-pkg$(LIBAPTPKG_MAJOR) # Source code for the contributed non-core things SOURCE = contrib/mmap.cc contrib/error.cc contrib/strutl.cc \ diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc index c6812ed11..491bff110 100644 --- a/apt-pkg/packagemanager.cc +++ b/apt-pkg/packagemanager.cc @@ -125,7 +125,7 @@ bool pkgPackageManager::FixMissing() /* This adds the immediate flag to the pkg and recursively to the dependendies */ -void pkgPackageManager::ImmediateAdd(PkgIterator I, bool UseInstallVer) +void pkgPackageManager::ImmediateAdd(PkgIterator I, bool UseInstallVer, unsigned const int &Depth) { DepIterator D; @@ -146,9 +146,9 @@ void pkgPackageManager::ImmediateAdd(PkgIterator I, bool UseInstallVer) if(!List->IsFlag(D.TargetPkg(), pkgOrderList::Immediate)) { if(Debug) - clog << "ImmediateAdd(): Adding Immediate flag to " << I.Name() << endl; + clog << OutputInDepth(Depth) << "ImmediateAdd(): Adding Immediate flag to " << D.TargetPkg() << " cause of " << D.DepType() << " " << I.Name() << endl; List->Flag(D.TargetPkg(),pkgOrderList::Immediate); - ImmediateAdd(D.TargetPkg(), UseInstallVer); + ImmediateAdd(D.TargetPkg(), UseInstallVer, Depth + 1); } } return; @@ -321,8 +321,9 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg) // Sanity Check if (List->IsFlag(Pkg,pkgOrderList::Configured) == false) - return _error->Error("Internal error, could not immediate configure %s",Pkg.Name()); - + return _error->Error(_("Could not perform immediate configuration on '%s'." + "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg.Name(),1); + return true; } /*}}}*/ @@ -474,7 +475,8 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg) List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States); if (List->IsFlag(Pkg,pkgOrderList::Immediate) == true) if (SmartConfigure(Pkg) == false) - return _error->Error("Internal Error, Could not perform immediate configuration (1) on %s",Pkg.Name()); + return _error->Error(_("Could not perform immediate configuration on already unpacked '%s'." + "Please see man 5 apt.conf under APT::Immediate-Configure for details."),Pkg.Name()); return true; } @@ -581,7 +583,8 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg) // Perform immedate configuration of the package. if (List->IsFlag(Pkg,pkgOrderList::Immediate) == true) if (SmartConfigure(Pkg) == false) - return _error->Error("Internal Error, Could not perform immediate configuration (2) on %s",Pkg.Name()); + return _error->Error(_("Could not perform immediate configuration on '%s'." + "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg.Name(),2); return true; } diff --git a/apt-pkg/packagemanager.h b/apt-pkg/packagemanager.h index a1bfdc52d..af1476b7a 100644 --- a/apt-pkg/packagemanager.h +++ b/apt-pkg/packagemanager.h @@ -49,7 +49,7 @@ class pkgPackageManager : protected pkgCache::Namespace bool Debug; bool DepAdd(pkgOrderList &Order,PkgIterator P,int Depth = 0); - void ImmediateAdd(PkgIterator P, bool UseInstallVer); + void ImmediateAdd(PkgIterator P, bool UseInstallVer, unsigned const int &Depth = 0); virtual OrderResult OrderInstall(); bool CheckRConflicts(PkgIterator Pkg,DepIterator Dep,const char *Ver); bool CreateOrderList(); |