diff options
37 files changed, 1473 insertions, 304 deletions
diff --git a/apt-inst/extract.cc b/apt-inst/extract.cc index 85363b9a1..cd8edb27a 100644 --- a/apt-inst/extract.cc +++ b/apt-inst/extract.cc @@ -372,7 +372,6 @@ bool pkgExtract::HandleOverwrites(pkgFLCache::NodeIterator Nde, pkgFLCache::NodeIterator TmpNde = Nde; unsigned long DiverOwner = 0; unsigned long FileGroup = Nde->File; - const char *FirstOwner = 0; for (; Nde.end() == false && FileGroup == Nde->File; Nde++) { if ((Nde->Flags & pkgFLCache::Node::Diversion) != 0) @@ -392,8 +391,7 @@ bool pkgExtract::HandleOverwrites(pkgFLCache::NodeIterator Nde, if something has already been diverted by this diversion */ if (FPkg.Offset() == DiverOwner) continue; - FirstOwner = FPkg.Name(); - + // Now see if this package matches one in a replace depends pkgCache::DepIterator Dep = Ver.DependsList(); bool Ok = false; diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc index f4ab066d7..db6057ea3 100644 --- a/apt-pkg/contrib/fileutl.cc +++ b/apt-pkg/contrib/fileutl.cc @@ -191,7 +191,7 @@ int GetLock(string File,bool Errors) /*}}}*/ // FileExists - Check if a file exists /*{{{*/ // --------------------------------------------------------------------- -/* */ +/* Beware: Directories are also files! */ bool FileExists(string File) { struct stat Buf; @@ -200,6 +200,17 @@ bool FileExists(string File) return true; } /*}}}*/ +// RealFileExists - Check if a file exists and if it is really a file /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool RealFileExists(string File) +{ + struct stat Buf; + if (stat(File.c_str(),&Buf) != 0) + return false; + return ((Buf.st_mode & S_IFREG) != 0); +} + /*}}}*/ // DirectoryExists - Check if a directory exists and is really one /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -304,6 +315,13 @@ std::vector<string> GetListOfFilesInDir(string const &Dir, std::vector<string> c } std::vector<string> List; + + if (DirectoryExists(Dir.c_str()) == false) + { + _error->Error(_("List of files can't be created as '%s' is not a directory"), Dir.c_str()); + return List; + } + Configuration::MatchAgainstConfig SilentIgnore("Dir::Ignore-Files-Silently"); DIR *D = opendir(Dir.c_str()); if (D == 0) diff --git a/apt-pkg/contrib/fileutl.h b/apt-pkg/contrib/fileutl.h index 1380f06b4..146d917d8 100644 --- a/apt-pkg/contrib/fileutl.h +++ b/apt-pkg/contrib/fileutl.h @@ -93,6 +93,7 @@ bool RunScripts(const char *Cnf); bool CopyFile(FileFd &From,FileFd &To); int GetLock(string File,bool Errors = true); bool FileExists(string File); +bool RealFileExists(string File); bool DirectoryExists(string const &Path) __attrib_const; bool CreateDirectory(string const &Parent, string const &Path); diff --git a/apt-pkg/contrib/progress.cc b/apt-pkg/contrib/progress.cc index cffdddc4f..45e81edcb 100644 --- a/apt-pkg/contrib/progress.cc +++ b/apt-pkg/contrib/progress.cc @@ -135,7 +135,7 @@ bool OpProgress::CheckChange(float Interval) OpTextProgress::OpTextProgress(Configuration &Config) : NoUpdate(false), NoDisplay(false), LastLen(0) { - if (Config.FindI("quiet",0) >= 1) + if (Config.FindI("quiet",0) >= 1 || Config.FindB("quiet::NoUpdate", false) == true) NoUpdate = true; if (Config.FindI("quiet",0) >= 2) NoDisplay = true; diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc index daf87c87f..f37045810 100644 --- a/apt-pkg/contrib/strutl.cc +++ b/apt-pkg/contrib/strutl.cc @@ -972,15 +972,14 @@ bool StrToNum(const char *Str,unsigned long &Res,unsigned Len,unsigned Base) // --------------------------------------------------------------------- /* This is used in decoding the 256bit encoded fixed length fields in tar files */ -bool Base256ToNum(const char *Str,unsigned long &Res,unsigned Len) +bool Base256ToNum(const char *Str,unsigned long &Res,unsigned int Len) { - int i; if ((Str[0] & 0x80) == 0) return false; else { Res = Str[0] & 0x7F; - for(i=1; i<Len; i++) + for(unsigned int i = 1; i < Len; ++i) Res = (Res<<8) + Str[i]; return true; } diff --git a/apt-pkg/contrib/strutl.h b/apt-pkg/contrib/strutl.h index 591c992d0..6e0e253cf 100644 --- a/apt-pkg/contrib/strutl.h +++ b/apt-pkg/contrib/strutl.h @@ -52,7 +52,7 @@ string LookupTag(const string &Message,const char *Tag,const char *Default = 0); int StringToBool(const string &Text,int Default = -1); bool ReadMessages(int Fd, vector<string> &List); bool StrToNum(const char *Str,unsigned long &Res,unsigned Len,unsigned Base = 0); -bool Base256ToNum(const char *Str,unsigned long &Res,unsigned Len); +bool Base256ToNum(const char *Str,unsigned long &Res,unsigned int Len); bool Hex2Num(const string &Str,unsigned char *Num,unsigned int Length); bool TokSplitString(char Tok,char *Input,char **List, unsigned long ListMax); diff --git a/apt-pkg/contrib/weakptr.h b/apt-pkg/contrib/weakptr.h index 5158e393c..8de727d89 100644 --- a/apt-pkg/contrib/weakptr.h +++ b/apt-pkg/contrib/weakptr.h @@ -22,6 +22,8 @@ #define WEAK_POINTER_H #include <set> +#include <stddef.h> + /** * Class for objects providing support for weak pointers. * diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 9f0da3be6..3b10e1a23 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -322,7 +322,6 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf) return _error->Errno("fdopen","Faild to open new FD"); // Feed it the filenames. - bool Die = false; if (Version <= 1) { for (vector<Item>::iterator I = List.begin(); I != List.end(); I++) @@ -339,14 +338,11 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf) into the pipe. */ fprintf(F,"%s\n",I->File.c_str()); if (ferror(F) != 0) - { - Die = true; break; - } } } else - Die = !SendV2Pkgs(F); + SendV2Pkgs(F); fclose(F); @@ -1415,7 +1411,7 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg) { while( fgets(buf, sizeof(buf), log) != NULL) fprintf(report, " %s", buf); - fclose(log); + pclose(log); } } @@ -1431,7 +1427,7 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg) { while( fgets(buf, sizeof(buf), log) != NULL) fprintf(report, " %s", buf); - fclose(log); + pclose(log); } } diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index 23abc76c1..5f59b6d49 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -10,6 +10,7 @@ // Include Files /*{{{*/ #include <apt-pkg/depcache.h> #include <apt-pkg/version.h> +#include <apt-pkg/versionmatch.h> #include <apt-pkg/error.h> #include <apt-pkg/sptr.h> #include <apt-pkg/algorithms.h> @@ -166,7 +167,7 @@ bool pkgDepCache::readStateFile(OpProgress *Prog) /*{{{*/ { FileFd state_file; string const state = _config->FindFile("Dir::State::extended_states"); - if(FileExists(state)) { + if(RealFileExists(state)) { state_file.Open(state, FileFd::ReadOnly); int const file_size = state_file.Size(); if(Prog != NULL) @@ -225,7 +226,7 @@ bool pkgDepCache::writeStateFile(OpProgress *prog, bool InstalledOnly) /*{{{*/ string const state = _config->FindFile("Dir::State::extended_states"); // if it does not exist, create a empty one - if(!FileExists(state)) + if(!RealFileExists(state)) { StateFile.Open(state, FileFd::WriteAtomic); StateFile.Close(); @@ -1329,8 +1330,6 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst, for (DepIterator D = instVer.DependsList(); D.end() != true; D++) { //FIXME: deal better with or-groups(?) - DepIterator LocalStart = D; - if(IsImportantDep(D) && !D.IsCritical() && Start.TargetPkg() == D.TargetPkg()) { @@ -1510,15 +1509,19 @@ void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To) /* */ void pkgDepCache::SetCandidateVersion(VerIterator TargetVer, bool const &Pseudo) { - ActionGroup group(*this); pkgCache::PkgIterator Pkg = TargetVer.ParentPkg(); StateCache &P = PkgState[Pkg->ID]; + if (P.CandidateVer == TargetVer) + return; + + ActionGroup group(*this); + RemoveSizes(Pkg); RemoveStates(Pkg); - if (P.CandidateVer == P.InstallVer) + if (P.CandidateVer == P.InstallVer && P.Install() == true) P.InstallVer = (Version *)TargetVer; P.CandidateVer = (Version *)TargetVer; P.Update(Pkg,*this); @@ -1549,7 +1552,171 @@ void pkgDepCache::SetCandidateVersion(VerIterator TargetVer, bool const &Pseudo) } } } + /*}}}*/ +// DepCache::SetCandidateRelease - Change the candidate version /*{{{*/ +// --------------------------------------------------------------------- +/* changes the candidate of a package and walks over all its dependencies + to check if it needs to change the candidate of the dependency, too, + to reach a installable versionstate */ +bool pkgDepCache::SetCandidateRelease(pkgCache::VerIterator TargetVer, + std::string const &TargetRel) +{ + std::list<std::pair<pkgCache::VerIterator, pkgCache::VerIterator> > Changed; + return SetCandidateRelease(TargetVer, TargetRel, Changed); +} +bool pkgDepCache::SetCandidateRelease(pkgCache::VerIterator TargetVer, + std::string const &TargetRel, + std::list<std::pair<pkgCache::VerIterator, pkgCache::VerIterator> > &Changed) +{ + ActionGroup group(*this); + SetCandidateVersion(TargetVer); + + if (TargetRel == "installed" || TargetRel == "candidate") // both doesn't make sense in this context + return true; + + pkgVersionMatch Match(TargetRel, pkgVersionMatch::Release); + // save the position of the last element we will not undo - if we have to + std::list<std::pair<pkgCache::VerIterator, pkgCache::VerIterator> >::iterator newChanged = --(Changed.end()); + + for (pkgCache::DepIterator D = TargetVer.DependsList(); D.end() == false; ++D) + { + if (D->Type != pkgCache::Dep::PreDepends && D->Type != pkgCache::Dep::Depends && + ((D->Type != pkgCache::Dep::Recommends && D->Type != pkgCache::Dep::Suggests) || + IsImportantDep(D) == false)) + continue; + + // walk over an or-group and check if we need to do anything + // for simpilicity no or-group is handled as a or-group including one dependency + pkgCache::DepIterator Start = D; + bool itsFine = false; + for (bool stillOr = true; stillOr == true; ++Start) + { + stillOr = (Start->CompareOp & Dep::Or) == Dep::Or; + pkgCache::PkgIterator const P = Start.TargetPkg(); + // virtual packages can't be a solution + if (P.end() == true || (P->ProvidesList == 0 && P->VersionList == 0)) + continue; + pkgCache::VerIterator const Cand = PkgState[P->ID].CandidateVerIter(*this); + // no versioned dependency - but is it installable? + if (Start.TargetVer() == 0 || Start.TargetVer()[0] == '\0') + { + // Check if one of the providers is installable + if (P->ProvidesList != 0) + { + pkgCache::PrvIterator Prv = P.ProvidesList(); + for (; Prv.end() == false; ++Prv) + { + pkgCache::VerIterator const C = PkgState[Prv.OwnerPkg()->ID].CandidateVerIter(*this); + if (C.end() == true || C != Prv.OwnerVer() || + (VersionState(C.DependsList(), DepInstall, DepCandMin, DepCandPolicy) & DepCandMin) != DepCandMin) + continue; + break; + } + if (Prv.end() == true) + continue; + } + // no providers, so check if we have an installable candidate version + else if (Cand.end() == true || + (VersionState(Cand.DependsList(), DepInstall, DepCandMin, DepCandPolicy) & DepCandMin) != DepCandMin) + continue; + itsFine = true; + break; + } + if (Cand.end() == true) + continue; + // check if the current candidate is enough for the versioned dependency - and installable? + if (VS().CheckDep(P.CandVersion(), Start->CompareOp, Start.TargetVer()) == true && + (VersionState(Cand.DependsList(), DepInstall, DepCandMin, DepCandPolicy) & DepCandMin) == DepCandMin) + { + itsFine = true; + break; + } + } + + if (itsFine == true) { + // something in the or-group was fine, skip all other members + for (; (D->CompareOp & Dep::Or) == Dep::Or; ++D); + continue; + } + + // walk again over the or-group and check each if a candidate switch would help + itsFine = false; + for (bool stillOr = true; stillOr == true; ++D) + { + stillOr = (D->CompareOp & Dep::Or) == Dep::Or; + // changing candidate will not help if the dependency is not versioned + if (D.TargetVer() == 0 || D.TargetVer()[0] == '\0') + { + if (stillOr == true) + continue; + break; + } + + pkgCache::VerIterator V; + if (TargetRel == "newest") + V = D.TargetPkg().VersionList(); + else + V = Match.Find(D.TargetPkg()); + + // check if the version from this release could satisfy the dependency + if (V.end() == true || VS().CheckDep(V.VerStr(), D->CompareOp, D.TargetVer()) == false) + { + if (stillOr == true) + continue; + break; + } + + pkgCache::VerIterator oldCand = PkgState[D.TargetPkg()->ID].CandidateVerIter(*this); + if (V == oldCand) + { + // Do we already touched this Version? If so, their versioned dependencies are okay, no need to check again + for (std::list<std::pair<pkgCache::VerIterator, pkgCache::VerIterator> >::const_iterator c = Changed.begin(); + c != Changed.end(); ++c) + { + if (c->first->ParentPkg != V->ParentPkg) + continue; + itsFine = true; + break; + } + } + + if (itsFine == false) + { + // change the candidate + Changed.push_back(make_pair(oldCand, TargetVer)); + if (SetCandidateRelease(V, TargetRel, Changed) == false) + { + if (stillOr == false) + break; + // undo the candidate changing + SetCandidateVersion(oldCand); + Changed.pop_back(); + continue; + } + itsFine = true; + } + + // something in the or-group was fine, skip all other members + for (; (D->CompareOp & Dep::Or) == Dep::Or; ++D); + break; + } + if (itsFine == false && (D->Type == pkgCache::Dep::PreDepends || D->Type == pkgCache::Dep::Depends)) + { + // undo all changes which aren't lead to a solution + for (std::list<std::pair<pkgCache::VerIterator, pkgCache::VerIterator> >::const_iterator c = ++newChanged; + c != Changed.end(); ++c) + SetCandidateVersion(c->first); + Changed.erase(newChanged, Changed.end()); + return false; + } + } + return true; +} + /*}}}*/ +// DepCache::MarkAuto - set the Auto flag for a package /*{{{*/ +// --------------------------------------------------------------------- +/* */ void pkgDepCache::MarkAuto(const PkgIterator &Pkg, bool Auto) { StateCache &state = PkgState[Pkg->ID]; @@ -1752,10 +1919,11 @@ void pkgDepCache::MarkPackage(const pkgCache::PkgIterator &pkg, return; VerIterator const currver = pkg.CurrentVer(); - VerIterator const candver = state.CandidateVerIter(*this); VerIterator const instver = state.InstVerIter(*this); #if 0 + VerIterator const candver = state.CandidateVerIter(*this); + // If a package was garbage-collected but is now being marked, we // should re-select it // For cases when a pkg is set to upgrade and this trigger the diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h index 2d3dbdf77..dba3e22dc 100644 --- a/apt-pkg/depcache.h +++ b/apt-pkg/depcache.h @@ -396,6 +396,25 @@ class pkgDepCache : protected pkgCache::Namespace void SetReInstall(PkgIterator const &Pkg,bool To); void SetCandidateVersion(VerIterator TargetVer, bool const &Pseudo = true); + bool SetCandidateRelease(pkgCache::VerIterator TargetVer, + std::string const &TargetRel); + /** Set the candidate version for dependencies too if needed. + * + * Sets not only the candidate version as SetCandidateVersion does, + * but walks also down the dependency tree and checks if it is required + * to set the candidate of the dependency to a version from the given + * release, too. + * + * \param TargetVer new candidate version of the package + * \param TargetRel try to switch to this release if needed + * \param[out] Changed a list of pairs consisting of the \b old + * version of the changed package and the version which + * required the switch of this dependency + * \return \b true if the switch was successful, \b false otherwise + */ + bool SetCandidateRelease(pkgCache::VerIterator TargetVer, + std::string const &TargetRel, + std::list<std::pair<pkgCache::VerIterator, pkgCache::VerIterator> > &Changed); /** Set the "is automatically installed" flag of Pkg. */ void MarkAuto(const PkgIterator &Pkg, bool Auto); diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc index f0bad78df..734f5b2c4 100644 --- a/apt-pkg/init.cc +++ b/apt-pkg/init.cc @@ -94,10 +94,10 @@ bool pkgInitConfig(Configuration &Cnf) const char *Cfg = getenv("APT_CONFIG"); if (Cfg != 0) { - if (FileExists(Cfg) == true) + if (RealFileExists(Cfg) == true) Res &= ReadConfigFile(Cnf,Cfg); else - _error->WarningE("FileExists",_("Unable to read %s"),Cfg); + _error->WarningE("RealFileExists",_("Unable to read %s"),Cfg); } // Read the configuration parts dir @@ -109,7 +109,7 @@ bool pkgInitConfig(Configuration &Cnf) // Read the main config file string FName = Cnf.FindFile("Dir::Etc::main"); - if (FileExists(FName) == true) + if (RealFileExists(FName) == true) Res &= ReadConfigFile(Cnf,FName); if (Res == false) diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc index 4f9d56775..f05b6ca49 100644 --- a/apt-pkg/policy.cc +++ b/apt-pkg/policy.cc @@ -328,7 +328,7 @@ bool ReadPinFile(pkgPolicy &Plcy,string File) if (File.empty() == true) File = _config->FindFile("Dir::Etc::Preferences"); - if (FileExists(File) == false) + if (RealFileExists(File) == false) return true; FileFd Fd(File,FileFd::ReadOnly); diff --git a/apt-pkg/sourcelist.cc b/apt-pkg/sourcelist.cc index c3ec9865a..851eefdfe 100644 --- a/apt-pkg/sourcelist.cc +++ b/apt-pkg/sourcelist.cc @@ -197,7 +197,7 @@ bool pkgSourceList::ReadMainList() string Main = _config->FindFile("Dir::Etc::sourcelist"); string Parts = _config->FindDir("Dir::Etc::sourceparts"); - if (FileExists(Main) == true) + if (RealFileExists(Main) == true) Res &= ReadAppend(Main); else if (DirectoryExists(Parts) == false) // Only warn if there are no sources.list.d. @@ -205,9 +205,9 @@ bool pkgSourceList::ReadMainList() if (DirectoryExists(Parts) == true) Res &= ReadSourceDir(Parts); - else if (FileExists(Main) == false) + else if (RealFileExists(Main) == false) // Only warn if there is no sources.list file. - _error->WarningE("FileExists", _("Unable to read %s"), Main.c_str()); + _error->WarningE("RealFileExists", _("Unable to read %s"), Main.c_str()); return Res; } diff --git a/apt-pkg/vendorlist.cc b/apt-pkg/vendorlist.cc index 589997081..92ff38894 100644 --- a/apt-pkg/vendorlist.cc +++ b/apt-pkg/vendorlist.cc @@ -21,11 +21,11 @@ bool pkgVendorList::ReadMainList() Configuration Cnf; string CnfFile = _config->FindDir("Dir::Etc::vendorparts"); - if (FileExists(CnfFile) == true) + if (DirectoryExists(CnfFile) == true) if (ReadConfigDir(Cnf,CnfFile,true) == false) return false; CnfFile = _config->FindFile("Dir::Etc::vendorlist"); - if (FileExists(CnfFile) == true) + if (RealFileExists(CnfFile) == true) if (ReadConfigFile(Cnf,CnfFile,true) == false) return false; diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index 8efcd0e2e..0a22fd42b 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -538,7 +538,9 @@ bool ShowEssential(ostream &out,CacheFile &Cache) //VersionsList += string(Cache[I].CurVersion) + "\n"; ??? } } - + else + continue; + if (I->CurrentVer == 0) continue; @@ -626,6 +628,8 @@ class CacheSetHelperAPTGet : public APT::CacheSetHelper { APT::PackageSet virtualPkgs; public: + std::list<std::pair<pkgCache::VerIterator, std::string> > selectedByRelease; + CacheSetHelperAPTGet(std::ostream &out) : APT::CacheSetHelper(true), out(out) { explicitlyNamed = true; } @@ -644,9 +648,9 @@ public: } virtual void showSelectedVersion(pkgCache::PkgIterator const &Pkg, pkgCache::VerIterator const Ver, string const &ver, bool const &verIsRel) { - if (ver != Ver.VerStr()) - ioprintf(out, _("Selected version '%s' (%s) for '%s'\n"), - Ver.VerStr(), Ver.RelStr().c_str(), Pkg.FullName(true).c_str()); + if (ver == Ver.VerStr()) + return; + selectedByRelease.push_back(make_pair(Ver, ver)); } bool showVirtualPackageErrors(pkgCacheFile &Cache) { @@ -827,6 +831,37 @@ struct TryToInstall { } } + bool propergateReleaseCandiateSwitching(std::list<std::pair<pkgCache::VerIterator, std::string> > start, std::ostream &out) + { + for (std::list<std::pair<pkgCache::VerIterator, std::string> >::const_iterator s = start.begin(); + s != start.end(); ++s) + Cache->GetDepCache()->SetCandidateVersion(s->first); + + bool Success = true; + std::list<std::pair<pkgCache::VerIterator, pkgCache::VerIterator> > Changed; + for (std::list<std::pair<pkgCache::VerIterator, std::string> >::const_iterator s = start.begin(); + s != start.end(); ++s) + { + Changed.push_back(std::make_pair(s->first, pkgCache::VerIterator(*Cache))); + // We continue here even if it failed to enhance the ShowBroken output + Success &= Cache->GetDepCache()->SetCandidateRelease(s->first, s->second, Changed); + } + for (std::list<std::pair<pkgCache::VerIterator, pkgCache::VerIterator> >::const_iterator c = Changed.begin(); + c != Changed.end(); ++c) + { + if (c->second.end() == true) + ioprintf(out, _("Selected version '%s' (%s) for '%s'\n"), + c->first.VerStr(), c->first.RelStr().c_str(), c->first.ParentPkg().FullName(true).c_str()); + else if (c->first.ParentPkg()->Group != c->second.ParentPkg()->Group) + { + pkgCache::VerIterator V = (*Cache)[c->first.ParentPkg()].CandidateVerIter(*Cache); + ioprintf(out, _("Selected version '%s' (%s) for '%s' because of '%s'\n"), V.VerStr(), + V.RelStr().c_str(), V.ParentPkg().FullName(true).c_str(), c->second.ParentPkg().FullName(true).c_str()); + } + } + return Success; + } + void doAutoInstall() { for (APT::PackageSet::const_iterator P = doAutoInstallLater.begin(); P != doAutoInstallLater.end(); ++P) { @@ -1077,8 +1112,6 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true, { // force a hashsum for compatibility reasons _config->CndSet("Acquire::ForceHash", "md5sum"); - if (Fetcher.Setup(&Stat, "") == false) - return false; } else if (Fetcher.Setup(&Stat, _config->FindDir("Dir::Cache::Archives")) == false) return false; @@ -1608,10 +1641,6 @@ bool DoAutomaticRemove(CacheFile &Cache) if(Debug) std::cout << "DoAutomaticRemove()" << std::endl; - // we don't want to autoremove and we don't want to see it, so why calculating? - if (doAutoRemove == false && hideAutoRemove == true) - return true; - if (doAutoRemove == true && _config->FindB("APT::Get::Remove",true) == false) { @@ -1622,7 +1651,7 @@ bool DoAutomaticRemove(CacheFile &Cache) bool purgePkgs = _config->FindB("APT::Get::Purge", false); bool smallList = (hideAutoRemove == false && - strcasecmp(_config->Find("APT::Get::HideAutoRemove","").c_str(),"small") == 0); + strcasecmp(_config->Find("APT::Get::HideAutoRemove","").c_str(),"small") == 0); string autoremovelist, autoremoveversions; unsigned long autoRemoveCount = 0; @@ -1645,8 +1674,12 @@ bool DoAutomaticRemove(CacheFile &Cache) } else { + // if the package is a new install and already garbage we don't need to + // install it in the first place, so nuke it instead of show it + if (Cache[Pkg].Install() == true && Pkg.CurrentVer() == 0) + Cache->MarkDelete(Pkg, false); // only show stuff in the list that is not yet marked for removal - if(Cache[Pkg].Delete() == false) + else if(hideAutoRemove == false && Cache[Pkg].Delete() == false) { ++autoRemoveCount; // we don't need to fill the strings if we don't need them @@ -1659,6 +1692,20 @@ bool DoAutomaticRemove(CacheFile &Cache) } } } + + // Now see if we had destroyed anything (if we had done anything) + if (Cache->BrokenCount() != 0) + { + c1out << _("Hmm, seems like the AutoRemover destroyed something which really\n" + "shouldn't happen. Please file a bug report against apt.") << endl; + c1out << endl; + c1out << _("The following information may help to resolve the situation:") << endl; + c1out << endl; + ShowBroken(c1out,Cache,false); + + return _error->Error(_("Internal Error, AutoRemover broke stuff")); + } + // if we don't remove them, we should show them! if (doAutoRemove == false && (autoremovelist.empty() == false || autoRemoveCount != 0)) { @@ -1671,18 +1718,6 @@ bool DoAutomaticRemove(CacheFile &Cache) "%lu packages were automatically installed and are no longer required.\n", autoRemoveCount), autoRemoveCount); c1out << _("Use 'apt-get autoremove' to remove them.") << std::endl; } - // Now see if we had destroyed anything (if we had done anything) - else if (Cache->BrokenCount() != 0) - { - c1out << _("Hmm, seems like the AutoRemover destroyed something which really\n" - "shouldn't happen. Please file a bug report against apt.") << endl; - c1out << endl; - c1out << _("The following information may help to resolve the situation:") << endl; - c1out << endl; - ShowBroken(c1out,Cache,false); - - return _error->Error(_("Internal Error, AutoRemover broke stuff")); - } return true; } /*}}}*/ @@ -1775,6 +1810,7 @@ bool DoInstall(CommandLine &CmdL) { if (order[i] == MOD_INSTALL) { InstallAction = std::for_each(verset[MOD_INSTALL].begin(), verset[MOD_INSTALL].end(), InstallAction); + InstallAction.propergateReleaseCandiateSwitching(helper.selectedByRelease, c0out); InstallAction.doAutoInstall(); } else if (order[i] == MOD_REMOVE) @@ -1839,16 +1875,15 @@ bool DoInstall(CommandLine &CmdL) pkgCache::PkgIterator I(Cache,Cache.List[J]); if ((*Cache)[I].Install() == false) continue; + pkgCache::VerIterator Cand = Cache[I].CandidateVerIter(Cache); + if (Cand.Pseudo() == true) + continue; - const char **J; - for (J = CmdL.FileList + 1; *J != 0; J++) - if (strcmp(*J,I.Name()) == 0) - break; - - if (*J == 0) { - List += I.FullName(true) + " "; - VersionsList += string(Cache[I].CandVersion) + "\n"; - } + if (verset[MOD_INSTALL].find(Cand) != verset[MOD_INSTALL].end()) + continue; + + List += I.FullName(true) + " "; + VersionsList += string(Cache[I].CandVersion) + "\n"; } ShowList(c1out,_("The following extra packages will be installed:"),List,VersionsList); diff --git a/debian/NEWS b/debian/NEWS index 775dc9458..c90cff6b2 100644 --- a/debian/NEWS +++ b/debian/NEWS @@ -1,3 +1,12 @@ +apt (0.8.11+wheezy) UNRELEASED; urgency=low + + * apt-get install pkg/experimental will now not only switch the + candidate of package pkg to the version from the release experimental + but also of all dependencies of pkg if the current candidate can't + satisfy a versioned dependency. + + -- David Kalnischkies <kalnischkies@gmail.com> Fri, 03 Dez 2010 14:09:12 +0100 + apt (0.7.26~exp3) experimental; urgency=low * apt-ftparchive now reads the standard configuration files in diff --git a/debian/changelog b/debian/changelog index 96a2bd15b..3a59ac171 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,40 @@ +apt (0.8.11+wheezy) unstable; urgency=low + + * apt-pkg/depcache.cc: + - add SetCandidateRelease() to set a candidate version and + the candidates of dependencies if needed to a specified + release (Closes: #572709) + * cmdline/apt-get.cc: + - if --print-uris is used don't setup downloader as we don't need + progress, lock nor the directories it would create otherwise + - show dependencies of essential packages which are going to remove + only if they cause the remove of this essential (Closes: #601961) + - keep not installed garbage packages uninstalled instead of showing + in the autoremove section and installing those (Closes: #604222) + - change pkg/release behavior to use the new SetCandidateRelease + so installing packages from experimental or backports is easier + - really do not show packages in the extra section if they were + requested on the commandline, e.g. with a modifier + * debian/control: + - add Vcs-Browser now that loggerhead works again (Closes: #511168) + * apt-pkg/contrib/fileutl.cc: + - add a RealFileExists method and check that your configuration files + are real files to avoid endless loops if not (Closes: #604401) + * apt-pkg/contrib/weakptr.h: + - include stddefs.h to fix compile error (undefined NULL) with gcc-4.6 + * methods/https.cc: + - fix CURLOPT_SSL_VERIFYHOST by really passing 2 to it if enabled + * deb/dpkgpm.cc: + - fix popen/fclose mismatch reported by cppcheck. Thanks to Petter + Reinholdtsen for report and patch! (Closes: #607803) + * doc/apt.conf.5.xml: + - fix multipl{y,e} spelling error reported by Jakub Wilk (Closes: #607636) + * apt-inst/contrib/extracttar.cc: + - let apt-utils work with encoded tar headers if uid/gid are large. + Thanks to Nobuhiro Hayashi for the patch! (Closes: #330162) + + -- David Kalnischkies <kalnischkies@gmail.com> Thu, 13 Jan 2011 00:25:32 +0100 + apt (0.8.10) unstable; urgency=low [ Programs translations ] diff --git a/debian/control b/debian/control index 87e885f6a..c4dedd496 100644 --- a/debian/control +++ b/debian/control @@ -9,6 +9,7 @@ Standards-Version: 3.9.0 Build-Depends: debhelper (>= 5.0), libdb-dev, gettext (>= 0.12), libcurl4-gnutls-dev (>= 7.19.0), zlib1g-dev | libz-dev, debiandoc-sgml, xsltproc, docbook-xsl, docbook-xml, po4a (>= 0.34-2), autotools-dev, autoconf, automake, doxygen Build-Conflicts: autoconf2.13, automake1.4 Vcs-Bzr: http://bzr.debian.org/apt/debian-sid/ +Vcs-Browser: http://bzr.debian.org/loggerhead/apt/debian-sid/ Package: apt Architecture: any diff --git a/debian/rules b/debian/rules index 8bfcaf385..ea8f0daa0 100755 --- a/debian/rules +++ b/debian/rules @@ -2,17 +2,6 @@ # Made with the aid of dh_make, by Craig Small # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. # Some lines taken from debmake, by Christoph Lameter. -# $Id: rules,v 1.68 2004/05/30 18:21:43 mdz Exp $ - -# LD_LIBRARY_PATH=pwd/debian/apt/usr/lib dh_shlibdeps -papt -# dpkg: /home/jgg/work/apt2/debian/apt/usr/lib/libapt-pkg.so.2.9 not found. - -# For the deb builder, you can run 'debian/rules cvs-build', which does all -# steps nescessary to produce a proper source tarball with the CVS/ removed. -# It builds in debian/cvs-build/apt-<VER>/, and places files in -# debian/cvs-build/. Optionally, you can run 'debian/rules cvs-mkul' to -# create ../upload-<VER>, with all the files needed to be uploaded placed -# in it. export DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) export DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) @@ -139,7 +128,7 @@ binary-indep: apt-doc libapt-pkg-doc libapt-pkg-doc: build-doc debian/shlibs.local dh_testdir -p$@ dh_testroot -p$@ - dh_clean -p$@ -k + dh_prep -p$@ dh_installdirs -p$@ # # libapt-pkg-doc install @@ -165,7 +154,7 @@ libapt-pkg-doc: build-doc debian/shlibs.local apt-doc: build-doc dh_testdir -p$@ dh_testroot -p$@ - dh_clean -p$@ -k + dh_prep -p$@ # # apt-doc install # @@ -191,7 +180,7 @@ apt_MANPAGES = apt-cache apt-cdrom apt-config apt-get apt-key apt-mark apt-secur apt: build build-doc debian/shlibs.local dh_testdir -p$@ dh_testroot -p$@ - dh_clean -p$@ -k + dh_prep -p$@ dh_installdirs -p$@ # # apt install @@ -247,7 +236,7 @@ apt: build build-doc debian/shlibs.local libapt-pkg-dev: build debian/shlibs.local dh_testdir -p$@ dh_testroot -p$@ - dh_clean -p$@ -k + dh_prep -p$@ dh_installdirs -p$@ # # libapt-pkg-dev install @@ -272,7 +261,7 @@ apt-utils_MANPAGES = apt-sortpkgs apt-ftparchive apt-extracttemplates apt-utils: build debian/shlibs.local dh_testdir -p$@ dh_testroot -p$@ - dh_clean -p$@ -k + dh_prep -p$@ dh_installdirs -p$@ # install the shared libs @@ -300,7 +289,7 @@ apt-utils: build debian/shlibs.local apt-transport-https: build debian/shlibs.local libapt-pkg-dev dh_testdir -p$@ dh_testroot -p$@ - dh_clean -p$@ -k + dh_prep -p$@ dh_installdirs -p$@ # install the method diff --git a/doc/apt.conf.5.xml b/doc/apt.conf.5.xml index f00baacea..a19d85dbc 100644 --- a/doc/apt.conf.5.xml +++ b/doc/apt.conf.5.xml @@ -618,7 +618,7 @@ DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt";}; <refsect2><title>dpkg trigger usage (and related options)</title> <para>APT can call dpkg in a way so it can make aggressive use of triggers over - multiply calls of dpkg. Without further options dpkg will use triggers only in between his + multiple calls of dpkg. Without further options dpkg will use triggers only in between his own run. Activating these options can therefore decrease the time needed to perform the install / upgrade. Note that it is intended to activate these options per default in the future, but as it changes the way APT calling dpkg drastically it needs a lot more testing. diff --git a/doc/examples/configure-index b/doc/examples/configure-index index c4c2acb64..6c078d75f 100644 --- a/doc/examples/configure-index +++ b/doc/examples/configure-index @@ -17,6 +17,7 @@ */ quiet "0"; +quiet::NoUpdate "true"; // never update progress information - included in -q=1 // Options for APT in general APT diff --git a/methods/https.cc b/methods/https.cc index aa6786aa8..fc649d6c2 100644 --- a/methods/https.cc +++ b/methods/https.cc @@ -143,13 +143,11 @@ bool HttpsMethod::Fetch(FetchItem *Itm) curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, peer_verify); // ... and hostname against cert CN or subjectAltName - int default_verify = 2; bool verify = _config->FindB("Acquire::https::Verify-Host",true); knob = "Acquire::https::"+remotehost+"::Verify-Host"; verify = _config->FindB(knob.c_str(),verify); - if (!verify) - default_verify = 0; - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, verify); + int const default_verify = (verify == true) ? 2 : 0; + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, default_verify); // Also enforce issuer of server certificate using its cert string issuercert = _config->Find("Acquire::https::IssuerCert",""); diff --git a/po/apt-all.pot b/po/apt-all.pot index 757f685da..71e212509 100644 --- a/po/apt-all.pot +++ b/po/apt-all.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-09-28 17:23+0200\n" +"POT-Creation-Date: 2011-01-12 17:42+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -149,7 +149,7 @@ msgstr "" #: cmdline/apt-cache.cc:1738 cmdline/apt-cdrom.cc:197 cmdline/apt-config.cc:70 #: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:589 -#: cmdline/apt-get.cc:2758 cmdline/apt-sortpkgs.cc:144 +#: cmdline/apt-get.cc:2793 cmdline/apt-sortpkgs.cc:144 #, c-format msgid "%s %s for %s compiled on %s %s\n" msgstr "" @@ -616,75 +616,70 @@ msgstr "" msgid "The following held packages will be changed:" msgstr "" -#: cmdline/apt-get.cc:561 +#: cmdline/apt-get.cc:563 #, c-format msgid "%s (due to %s) " msgstr "" -#: cmdline/apt-get.cc:569 +#: cmdline/apt-get.cc:571 msgid "" "WARNING: The following essential packages will be removed.\n" "This should NOT be done unless you know exactly what you are doing!" msgstr "" -#: cmdline/apt-get.cc:603 +#: cmdline/apt-get.cc:605 #, c-format msgid "%lu upgraded, %lu newly installed, " msgstr "" -#: cmdline/apt-get.cc:607 +#: cmdline/apt-get.cc:609 #, c-format msgid "%lu reinstalled, " msgstr "" -#: cmdline/apt-get.cc:609 +#: cmdline/apt-get.cc:611 #, c-format msgid "%lu downgraded, " msgstr "" -#: cmdline/apt-get.cc:611 +#: cmdline/apt-get.cc:613 #, c-format msgid "%lu to remove and %lu not upgraded.\n" msgstr "" -#: cmdline/apt-get.cc:615 +#: cmdline/apt-get.cc:617 #, c-format msgid "%lu not fully installed or removed.\n" msgstr "" -#: cmdline/apt-get.cc:635 +#: cmdline/apt-get.cc:639 #, c-format msgid "Note, selecting '%s' for task '%s'\n" msgstr "" -#: cmdline/apt-get.cc:641 +#: cmdline/apt-get.cc:645 #, c-format msgid "Note, selecting '%s' for regex '%s'\n" msgstr "" -#: cmdline/apt-get.cc:648 -#, c-format -msgid "Selected version '%s' (%s) for '%s'\n" -msgstr "" - -#: cmdline/apt-get.cc:658 +#: cmdline/apt-get.cc:662 #, c-format msgid "Package %s is a virtual package provided by:\n" msgstr "" -#: cmdline/apt-get.cc:669 +#: cmdline/apt-get.cc:673 msgid " [Installed]" msgstr "" -#: cmdline/apt-get.cc:678 +#: cmdline/apt-get.cc:682 msgid " [Not candidate version]" msgstr "" -#: cmdline/apt-get.cc:680 +#: cmdline/apt-get.cc:684 msgid "You should explicitly select one to install." msgstr "" -#: cmdline/apt-get.cc:683 +#: cmdline/apt-get.cc:687 #, c-format msgid "" "Package %s is not available, but is referred to by another package.\n" @@ -692,167 +687,177 @@ msgid "" "is only available from another source\n" msgstr "" -#: cmdline/apt-get.cc:701 +#: cmdline/apt-get.cc:705 msgid "However the following packages replace it:" msgstr "" -#: cmdline/apt-get.cc:713 +#: cmdline/apt-get.cc:717 #, c-format msgid "Package '%s' has no installation candidate" msgstr "" -#: cmdline/apt-get.cc:724 +#: cmdline/apt-get.cc:728 #, c-format msgid "Virtual packages like '%s' can't be removed\n" msgstr "" -#: cmdline/apt-get.cc:755 +#: cmdline/apt-get.cc:759 #, c-format msgid "Note, selecting '%s' instead of '%s'\n" msgstr "" -#: cmdline/apt-get.cc:785 +#: cmdline/apt-get.cc:789 #, c-format msgid "Skipping %s, it is already installed and upgrade is not set.\n" msgstr "" -#: cmdline/apt-get.cc:789 +#: cmdline/apt-get.cc:793 #, c-format msgid "Skipping %s, it is not installed and only upgrades are requested.\n" msgstr "" -#: cmdline/apt-get.cc:799 +#: cmdline/apt-get.cc:803 #, c-format msgid "Reinstallation of %s is not possible, it cannot be downloaded.\n" msgstr "" -#: cmdline/apt-get.cc:804 +#: cmdline/apt-get.cc:808 #, c-format msgid "%s is already the newest version.\n" msgstr "" -#: cmdline/apt-get.cc:823 cmdline/apt-get.cc:1992 +#: cmdline/apt-get.cc:827 cmdline/apt-get.cc:2027 #, c-format msgid "%s set to manually installed.\n" msgstr "" -#: cmdline/apt-get.cc:863 +#: cmdline/apt-get.cc:853 +#, c-format +msgid "Selected version '%s' (%s) for '%s'\n" +msgstr "" + +#: cmdline/apt-get.cc:858 +#, c-format +msgid "Selected version '%s' (%s) for '%s' because of '%s'\n" +msgstr "" + +#: cmdline/apt-get.cc:898 #, c-format msgid "Package %s is not installed, so not removed\n" msgstr "" -#: cmdline/apt-get.cc:938 +#: cmdline/apt-get.cc:973 msgid "Correcting dependencies..." msgstr "" -#: cmdline/apt-get.cc:941 +#: cmdline/apt-get.cc:976 msgid " failed." msgstr "" -#: cmdline/apt-get.cc:944 +#: cmdline/apt-get.cc:979 msgid "Unable to correct dependencies" msgstr "" -#: cmdline/apt-get.cc:947 +#: cmdline/apt-get.cc:982 msgid "Unable to minimize the upgrade set" msgstr "" -#: cmdline/apt-get.cc:949 +#: cmdline/apt-get.cc:984 msgid " Done" msgstr "" -#: cmdline/apt-get.cc:953 +#: cmdline/apt-get.cc:988 msgid "You might want to run 'apt-get -f install' to correct these." msgstr "" -#: cmdline/apt-get.cc:956 +#: cmdline/apt-get.cc:991 msgid "Unmet dependencies. Try using -f." msgstr "" -#: cmdline/apt-get.cc:981 +#: cmdline/apt-get.cc:1016 msgid "WARNING: The following packages cannot be authenticated!" msgstr "" -#: cmdline/apt-get.cc:985 +#: cmdline/apt-get.cc:1020 msgid "Authentication warning overridden.\n" msgstr "" -#: cmdline/apt-get.cc:992 +#: cmdline/apt-get.cc:1027 msgid "Install these packages without verification [y/N]? " msgstr "" -#: cmdline/apt-get.cc:994 +#: cmdline/apt-get.cc:1029 msgid "Some packages could not be authenticated" msgstr "" -#: cmdline/apt-get.cc:1003 cmdline/apt-get.cc:1166 +#: cmdline/apt-get.cc:1038 cmdline/apt-get.cc:1199 msgid "There are problems and -y was used without --force-yes" msgstr "" -#: cmdline/apt-get.cc:1044 +#: cmdline/apt-get.cc:1079 msgid "Internal error, InstallPackages was called with broken packages!" msgstr "" -#: cmdline/apt-get.cc:1053 +#: cmdline/apt-get.cc:1088 msgid "Packages need to be removed but remove is disabled." msgstr "" -#: cmdline/apt-get.cc:1064 +#: cmdline/apt-get.cc:1099 msgid "Internal error, Ordering didn't finish" msgstr "" -#: cmdline/apt-get.cc:1104 +#: cmdline/apt-get.cc:1137 msgid "How odd.. The sizes didn't match, email apt@packages.debian.org" msgstr "" #. TRANSLATOR: The required space between number and unit is already included #. in the replacement strings, so %sB will be correctly translate in e.g. 1,5 MB -#: cmdline/apt-get.cc:1111 +#: cmdline/apt-get.cc:1144 #, c-format msgid "Need to get %sB/%sB of archives.\n" msgstr "" #. TRANSLATOR: The required space between number and unit is already included #. in the replacement string, so %sB will be correctly translate in e.g. 1,5 MB -#: cmdline/apt-get.cc:1116 +#: cmdline/apt-get.cc:1149 #, c-format msgid "Need to get %sB of archives.\n" msgstr "" #. TRANSLATOR: The required space between number and unit is already included #. in the replacement string, so %sB will be correctly translate in e.g. 1,5 MB -#: cmdline/apt-get.cc:1123 +#: cmdline/apt-get.cc:1156 #, c-format msgid "After this operation, %sB of additional disk space will be used.\n" msgstr "" #. TRANSLATOR: The required space between number and unit is already included #. in the replacement string, so %sB will be correctly translate in e.g. 1,5 MB -#: cmdline/apt-get.cc:1128 +#: cmdline/apt-get.cc:1161 #, c-format msgid "After this operation, %sB disk space will be freed.\n" msgstr "" -#: cmdline/apt-get.cc:1143 cmdline/apt-get.cc:1146 cmdline/apt-get.cc:2332 -#: cmdline/apt-get.cc:2335 +#: cmdline/apt-get.cc:1176 cmdline/apt-get.cc:1179 cmdline/apt-get.cc:2367 +#: cmdline/apt-get.cc:2370 #, c-format msgid "Couldn't determine free space in %s" msgstr "" -#: cmdline/apt-get.cc:1156 +#: cmdline/apt-get.cc:1189 #, c-format msgid "You don't have enough free space in %s." msgstr "" -#: cmdline/apt-get.cc:1172 cmdline/apt-get.cc:1192 +#: cmdline/apt-get.cc:1205 cmdline/apt-get.cc:1225 msgid "Trivial Only specified but this is not a trivial operation." msgstr "" -#: cmdline/apt-get.cc:1174 +#: cmdline/apt-get.cc:1207 msgid "Yes, do as I say!" msgstr "" -#: cmdline/apt-get.cc:1176 +#: cmdline/apt-get.cc:1209 #, c-format msgid "" "You are about to do something potentially harmful.\n" @@ -860,46 +865,46 @@ msgid "" " ?] " msgstr "" -#: cmdline/apt-get.cc:1182 cmdline/apt-get.cc:1201 +#: cmdline/apt-get.cc:1215 cmdline/apt-get.cc:1234 msgid "Abort." msgstr "" -#: cmdline/apt-get.cc:1197 +#: cmdline/apt-get.cc:1230 msgid "Do you want to continue [Y/n]? " msgstr "" -#: cmdline/apt-get.cc:1269 cmdline/apt-get.cc:2392 apt-pkg/algorithms.cc:1462 +#: cmdline/apt-get.cc:1302 cmdline/apt-get.cc:2427 apt-pkg/algorithms.cc:1470 #, c-format msgid "Failed to fetch %s %s\n" msgstr "" -#: cmdline/apt-get.cc:1287 +#: cmdline/apt-get.cc:1320 msgid "Some files failed to download" msgstr "" -#: cmdline/apt-get.cc:1288 cmdline/apt-get.cc:2401 +#: cmdline/apt-get.cc:1321 cmdline/apt-get.cc:2436 msgid "Download complete and in download only mode" msgstr "" -#: cmdline/apt-get.cc:1294 +#: cmdline/apt-get.cc:1327 msgid "" "Unable to fetch some archives, maybe run apt-get update or try with --fix-" "missing?" msgstr "" -#: cmdline/apt-get.cc:1298 +#: cmdline/apt-get.cc:1331 msgid "--fix-missing and media swapping is not currently supported" msgstr "" -#: cmdline/apt-get.cc:1303 +#: cmdline/apt-get.cc:1336 msgid "Unable to correct missing packages." msgstr "" -#: cmdline/apt-get.cc:1304 +#: cmdline/apt-get.cc:1337 msgid "Aborting install." msgstr "" -#: cmdline/apt-get.cc:1332 +#: cmdline/apt-get.cc:1365 msgid "" "The following package disappeared from your system as\n" "all files have been overwritten by other packages:" @@ -909,56 +914,35 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: cmdline/apt-get.cc:1336 +#: cmdline/apt-get.cc:1369 msgid "Note: This is done automatic and on purpose by dpkg." msgstr "" -#: cmdline/apt-get.cc:1466 +#: cmdline/apt-get.cc:1499 #, c-format msgid "Ignore unavailable target release '%s' of package '%s'" msgstr "" -#: cmdline/apt-get.cc:1498 +#: cmdline/apt-get.cc:1531 #, c-format msgid "Picking '%s' as source package instead of '%s'\n" msgstr "" #. if (VerTag.empty() == false && Last == 0) -#: cmdline/apt-get.cc:1536 +#: cmdline/apt-get.cc:1569 #, c-format msgid "Ignore unavailable version '%s' of package '%s'" msgstr "" -#: cmdline/apt-get.cc:1552 +#: cmdline/apt-get.cc:1585 msgid "The update command takes no arguments" msgstr "" -#: cmdline/apt-get.cc:1618 +#: cmdline/apt-get.cc:1647 msgid "We are not supposed to delete stuff, can't start AutoRemover" msgstr "" -#: cmdline/apt-get.cc:1666 -msgid "" -"The following package was automatically installed and is no longer required:" -msgid_plural "" -"The following packages were automatically installed and are no longer " -"required:" -msgstr[0] "" -msgstr[1] "" - -#: cmdline/apt-get.cc:1670 -#, c-format -msgid "%lu package was automatically installed and is no longer required.\n" -msgid_plural "" -"%lu packages were automatically installed and are no longer required.\n" -msgstr[0] "" -msgstr[1] "" - -#: cmdline/apt-get.cc:1672 -msgid "Use 'apt-get autoremove' to remove them." -msgstr "" - -#: cmdline/apt-get.cc:1677 +#: cmdline/apt-get.cc:1699 msgid "" "Hmm, seems like the AutoRemover destroyed something which really\n" "shouldn't happen. Please file a bug report against apt." @@ -974,29 +958,50 @@ msgstr "" #. "that package should be filed.") << endl; #. } #. -#: cmdline/apt-get.cc:1680 cmdline/apt-get.cc:1822 +#: cmdline/apt-get.cc:1702 cmdline/apt-get.cc:1858 msgid "The following information may help to resolve the situation:" msgstr "" -#: cmdline/apt-get.cc:1684 +#: cmdline/apt-get.cc:1706 msgid "Internal Error, AutoRemover broke stuff" msgstr "" -#: cmdline/apt-get.cc:1703 +#: cmdline/apt-get.cc:1713 +msgid "" +"The following package was automatically installed and is no longer required:" +msgid_plural "" +"The following packages were automatically installed and are no longer " +"required:" +msgstr[0] "" +msgstr[1] "" + +#: cmdline/apt-get.cc:1717 +#, c-format +msgid "%lu package was automatically installed and is no longer required.\n" +msgid_plural "" +"%lu packages were automatically installed and are no longer required.\n" +msgstr[0] "" +msgstr[1] "" + +#: cmdline/apt-get.cc:1719 +msgid "Use 'apt-get autoremove' to remove them." +msgstr "" + +#: cmdline/apt-get.cc:1738 msgid "Internal error, AllUpgrade broke stuff" msgstr "" -#: cmdline/apt-get.cc:1792 +#: cmdline/apt-get.cc:1828 msgid "You might want to run 'apt-get -f install' to correct these:" msgstr "" -#: cmdline/apt-get.cc:1795 +#: cmdline/apt-get.cc:1831 msgid "" "Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a " "solution)." msgstr "" -#: cmdline/apt-get.cc:1807 +#: cmdline/apt-get.cc:1843 msgid "" "Some packages could not be installed. This may mean that you have\n" "requested an impossible situation or if you are using the unstable\n" @@ -1004,69 +1009,69 @@ msgid "" "or been moved out of Incoming." msgstr "" -#: cmdline/apt-get.cc:1825 +#: cmdline/apt-get.cc:1861 msgid "Broken packages" msgstr "" -#: cmdline/apt-get.cc:1854 +#: cmdline/apt-get.cc:1889 msgid "The following extra packages will be installed:" msgstr "" -#: cmdline/apt-get.cc:1944 +#: cmdline/apt-get.cc:1979 msgid "Suggested packages:" msgstr "" -#: cmdline/apt-get.cc:1945 +#: cmdline/apt-get.cc:1980 msgid "Recommended packages:" msgstr "" -#: cmdline/apt-get.cc:1987 +#: cmdline/apt-get.cc:2022 #, c-format msgid "Couldn't find package %s" msgstr "" -#: cmdline/apt-get.cc:1994 +#: cmdline/apt-get.cc:2029 #, c-format msgid "%s set to automatically installed.\n" msgstr "" -#: cmdline/apt-get.cc:2015 +#: cmdline/apt-get.cc:2050 msgid "Calculating upgrade... " msgstr "" -#: cmdline/apt-get.cc:2018 methods/ftp.cc:707 methods/connect.cc:111 +#: cmdline/apt-get.cc:2053 methods/ftp.cc:707 methods/connect.cc:111 msgid "Failed" msgstr "" -#: cmdline/apt-get.cc:2023 +#: cmdline/apt-get.cc:2058 msgid "Done" msgstr "" -#: cmdline/apt-get.cc:2090 cmdline/apt-get.cc:2098 +#: cmdline/apt-get.cc:2125 cmdline/apt-get.cc:2133 msgid "Internal error, problem resolver broke stuff" msgstr "" -#: cmdline/apt-get.cc:2122 cmdline/apt-get.cc:2155 +#: cmdline/apt-get.cc:2157 cmdline/apt-get.cc:2190 msgid "Unable to lock the download directory" msgstr "" -#: cmdline/apt-get.cc:2198 +#: cmdline/apt-get.cc:2233 msgid "Must specify at least one package to fetch source for" msgstr "" -#: cmdline/apt-get.cc:2238 cmdline/apt-get.cc:2519 +#: cmdline/apt-get.cc:2273 cmdline/apt-get.cc:2554 #, c-format msgid "Unable to find a source package for %s" msgstr "" -#: cmdline/apt-get.cc:2254 +#: cmdline/apt-get.cc:2289 #, c-format msgid "" "NOTICE: '%s' packaging is maintained in the '%s' version control system at:\n" "%s\n" msgstr "" -#: cmdline/apt-get.cc:2259 +#: cmdline/apt-get.cc:2294 #, c-format msgid "" "Please use:\n" @@ -1074,115 +1079,115 @@ msgid "" "to retrieve the latest (possibly unreleased) updates to the package.\n" msgstr "" -#: cmdline/apt-get.cc:2310 +#: cmdline/apt-get.cc:2345 #, c-format msgid "Skipping already downloaded file '%s'\n" msgstr "" -#: cmdline/apt-get.cc:2345 +#: cmdline/apt-get.cc:2380 #, c-format msgid "You don't have enough free space in %s" msgstr "" #. TRANSLATOR: The required space between number and unit is already included #. in the replacement strings, so %sB will be correctly translate in e.g. 1,5 MB -#: cmdline/apt-get.cc:2353 +#: cmdline/apt-get.cc:2388 #, c-format msgid "Need to get %sB/%sB of source archives.\n" msgstr "" #. TRANSLATOR: The required space between number and unit is already included #. in the replacement string, so %sB will be correctly translate in e.g. 1,5 MB -#: cmdline/apt-get.cc:2358 +#: cmdline/apt-get.cc:2393 #, c-format msgid "Need to get %sB of source archives.\n" msgstr "" -#: cmdline/apt-get.cc:2364 +#: cmdline/apt-get.cc:2399 #, c-format msgid "Fetch source %s\n" msgstr "" -#: cmdline/apt-get.cc:2397 +#: cmdline/apt-get.cc:2432 msgid "Failed to fetch some archives." msgstr "" -#: cmdline/apt-get.cc:2427 +#: cmdline/apt-get.cc:2462 #, c-format msgid "Skipping unpack of already unpacked source in %s\n" msgstr "" -#: cmdline/apt-get.cc:2439 +#: cmdline/apt-get.cc:2474 #, c-format msgid "Unpack command '%s' failed.\n" msgstr "" -#: cmdline/apt-get.cc:2440 +#: cmdline/apt-get.cc:2475 #, c-format msgid "Check if the 'dpkg-dev' package is installed.\n" msgstr "" -#: cmdline/apt-get.cc:2457 +#: cmdline/apt-get.cc:2492 #, c-format msgid "Build command '%s' failed.\n" msgstr "" -#: cmdline/apt-get.cc:2477 +#: cmdline/apt-get.cc:2512 msgid "Child process failed" msgstr "" -#: cmdline/apt-get.cc:2493 +#: cmdline/apt-get.cc:2528 msgid "Must specify at least one package to check builddeps for" msgstr "" -#: cmdline/apt-get.cc:2524 +#: cmdline/apt-get.cc:2559 #, c-format msgid "Unable to get build-dependency information for %s" msgstr "" -#: cmdline/apt-get.cc:2544 +#: cmdline/apt-get.cc:2579 #, c-format msgid "%s has no build depends.\n" msgstr "" -#: cmdline/apt-get.cc:2595 +#: cmdline/apt-get.cc:2630 #, c-format msgid "" "%s dependency for %s cannot be satisfied because the package %s cannot be " "found" msgstr "" -#: cmdline/apt-get.cc:2648 +#: cmdline/apt-get.cc:2683 #, c-format msgid "" "%s dependency for %s cannot be satisfied because no available versions of " "package %s can satisfy version requirements" msgstr "" -#: cmdline/apt-get.cc:2684 +#: cmdline/apt-get.cc:2719 #, c-format msgid "Failed to satisfy %s dependency for %s: Installed package %s is too new" msgstr "" -#: cmdline/apt-get.cc:2711 +#: cmdline/apt-get.cc:2746 #, c-format msgid "Failed to satisfy %s dependency for %s: %s" msgstr "" -#: cmdline/apt-get.cc:2727 +#: cmdline/apt-get.cc:2762 #, c-format msgid "Build-dependencies for %s could not be satisfied." msgstr "" -#: cmdline/apt-get.cc:2732 +#: cmdline/apt-get.cc:2767 msgid "Failed to process build dependencies" msgstr "" -#: cmdline/apt-get.cc:2763 +#: cmdline/apt-get.cc:2798 msgid "Supported modules:" msgstr "" -#: cmdline/apt-get.cc:2804 +#: cmdline/apt-get.cc:2839 msgid "" "Usage: apt-get [options] command\n" " apt-get [options] install|remove pkg1 [pkg2 ...]\n" @@ -1228,7 +1233,7 @@ msgid "" " This APT has Super Cow Powers.\n" msgstr "" -#: cmdline/apt-get.cc:2960 +#: cmdline/apt-get.cc:2995 msgid "" "NOTE: This is only a simulation!\n" " apt-get needs root privileges for real execution.\n" @@ -1236,33 +1241,33 @@ msgid "" " so don't depend on the relevance to the real current situation!" msgstr "" -#: cmdline/acqprogress.cc:55 +#: cmdline/acqprogress.cc:57 msgid "Hit " msgstr "" -#: cmdline/acqprogress.cc:79 +#: cmdline/acqprogress.cc:81 msgid "Get:" msgstr "" -#: cmdline/acqprogress.cc:110 +#: cmdline/acqprogress.cc:112 msgid "Ign " msgstr "" -#: cmdline/acqprogress.cc:114 +#: cmdline/acqprogress.cc:116 msgid "Err " msgstr "" -#: cmdline/acqprogress.cc:135 +#: cmdline/acqprogress.cc:137 #, c-format msgid "Fetched %sB in %s (%sB/s)\n" msgstr "" -#: cmdline/acqprogress.cc:225 +#: cmdline/acqprogress.cc:227 #, c-format msgid " [Working]" msgstr "" -#: cmdline/acqprogress.cc:271 +#: cmdline/acqprogress.cc:283 #, c-format msgid "" "Media change: please insert the disc labeled\n" @@ -1459,7 +1464,7 @@ msgstr "" #. Only warn if there are no sources.list.d. #. Only warn if there is no sources.list file. #: apt-inst/extract.cc:464 apt-pkg/contrib/cdromutl.cc:179 -#: apt-pkg/contrib/fileutl.cc:311 apt-pkg/sourcelist.cc:204 +#: apt-pkg/contrib/fileutl.cc:329 apt-pkg/sourcelist.cc:204 #: apt-pkg/sourcelist.cc:210 apt-pkg/acquire.cc:450 apt-pkg/init.cc:100 #: apt-pkg/init.cc:108 apt-pkg/clean.cc:33 apt-pkg/policy.cc:307 #: methods/mirror.cc:87 @@ -1698,7 +1703,7 @@ msgstr "" msgid "Server closed the connection" msgstr "" -#: methods/ftp.cc:344 apt-pkg/contrib/fileutl.cc:784 methods/rsh.cc:190 +#: methods/ftp.cc:344 apt-pkg/contrib/fileutl.cc:802 methods/rsh.cc:190 msgid "Read error" msgstr "" @@ -1710,7 +1715,7 @@ msgstr "" msgid "Protocol corruption" msgstr "" -#: methods/ftp.cc:452 apt-pkg/contrib/fileutl.cc:826 methods/rsh.cc:232 +#: methods/ftp.cc:452 apt-pkg/contrib/fileutl.cc:844 methods/rsh.cc:232 msgid "Write error" msgstr "" @@ -2175,72 +2180,77 @@ msgstr "" msgid "Could not get lock %s" msgstr "" -#: apt-pkg/contrib/fileutl.cc:643 +#: apt-pkg/contrib/fileutl.cc:321 +#, c-format +msgid "List of files can't be created as '%s' is not a directory" +msgstr "" + +#: apt-pkg/contrib/fileutl.cc:661 #, c-format msgid "Waited for %s but it wasn't there" msgstr "" -#: apt-pkg/contrib/fileutl.cc:655 +#: apt-pkg/contrib/fileutl.cc:673 #, c-format msgid "Sub-process %s received a segmentation fault." msgstr "" -#: apt-pkg/contrib/fileutl.cc:657 +#: apt-pkg/contrib/fileutl.cc:675 #, c-format msgid "Sub-process %s received signal %u." msgstr "" -#: apt-pkg/contrib/fileutl.cc:661 +#: apt-pkg/contrib/fileutl.cc:679 #, c-format msgid "Sub-process %s returned an error code (%u)" msgstr "" -#: apt-pkg/contrib/fileutl.cc:663 +#: apt-pkg/contrib/fileutl.cc:681 #, c-format msgid "Sub-process %s exited unexpectedly" msgstr "" -#: apt-pkg/contrib/fileutl.cc:728 +#: apt-pkg/contrib/fileutl.cc:746 #, c-format msgid "Could not open file %s" msgstr "" -#: apt-pkg/contrib/fileutl.cc:745 +#: apt-pkg/contrib/fileutl.cc:763 #, c-format msgid "Could not open file descriptor %d" msgstr "" -#: apt-pkg/contrib/fileutl.cc:805 +#: apt-pkg/contrib/fileutl.cc:823 #, c-format msgid "read, still have %lu to read but none left" msgstr "" -#: apt-pkg/contrib/fileutl.cc:838 +#: apt-pkg/contrib/fileutl.cc:856 #, c-format msgid "write, still have %lu to write but couldn't" msgstr "" -#: apt-pkg/contrib/fileutl.cc:937 +#: apt-pkg/contrib/fileutl.cc:985 #, c-format msgid "Problem closing the gzip file %s" msgstr "" -#: apt-pkg/contrib/fileutl.cc:940 +#: apt-pkg/contrib/fileutl.cc:988 #, c-format msgid "Problem closing the file %s" msgstr "" -#: apt-pkg/contrib/fileutl.cc:945 +#: apt-pkg/contrib/fileutl.cc:993 #, c-format msgid "Problem renaming the file %s to %s" msgstr "" -#: apt-pkg/contrib/fileutl.cc:956 +#: apt-pkg/contrib/fileutl.cc:1004 #, c-format msgid "Problem unlinking the file %s" msgstr "" -#: apt-pkg/contrib/fileutl.cc:969 +#: apt-pkg/contrib/fileutl.cc:1017 msgid "Problem syncing the file" msgstr "" @@ -2321,33 +2331,33 @@ msgstr "" msgid "extra" msgstr "" -#: apt-pkg/depcache.cc:124 apt-pkg/depcache.cc:153 +#: apt-pkg/depcache.cc:125 apt-pkg/depcache.cc:154 msgid "Building dependency tree" msgstr "" -#: apt-pkg/depcache.cc:125 +#: apt-pkg/depcache.cc:126 msgid "Candidate versions" msgstr "" -#: apt-pkg/depcache.cc:154 +#: apt-pkg/depcache.cc:155 msgid "Dependency generation" msgstr "" -#: apt-pkg/depcache.cc:174 apt-pkg/depcache.cc:207 apt-pkg/depcache.cc:211 +#: apt-pkg/depcache.cc:175 apt-pkg/depcache.cc:208 apt-pkg/depcache.cc:212 msgid "Reading state information" msgstr "" -#: apt-pkg/depcache.cc:236 +#: apt-pkg/depcache.cc:237 #, c-format msgid "Failed to open StateFile %s" msgstr "" -#: apt-pkg/depcache.cc:242 +#: apt-pkg/depcache.cc:243 #, c-format msgid "Failed to write temporary StateFile %s" msgstr "" -#: apt-pkg/depcache.cc:921 +#: apt-pkg/depcache.cc:922 #, c-format msgid "Internal error, group '%s' has no installable pseudo package" msgstr "" @@ -2465,17 +2475,17 @@ msgid "" "The package %s needs to be reinstalled, but I can't find an archive for it." msgstr "" -#: apt-pkg/algorithms.cc:1210 +#: apt-pkg/algorithms.cc:1218 msgid "" "Error, pkgProblemResolver::Resolve generated breaks, this may be caused by " "held packages." msgstr "" -#: apt-pkg/algorithms.cc:1212 +#: apt-pkg/algorithms.cc:1220 msgid "Unable to correct problems, you have held broken packages." msgstr "" -#: apt-pkg/algorithms.cc:1488 apt-pkg/algorithms.cc:1490 +#: apt-pkg/algorithms.cc:1496 apt-pkg/algorithms.cc:1498 msgid "" "Some index files failed to download, they have been ignored, or old ones " "used instead." @@ -2923,12 +2933,12 @@ msgstr "" msgid "Installing %s" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:53 apt-pkg/deb/dpkgpm.cc:822 +#: apt-pkg/deb/dpkgpm.cc:53 apt-pkg/deb/dpkgpm.cc:823 #, c-format msgid "Configuring %s" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:54 apt-pkg/deb/dpkgpm.cc:829 +#: apt-pkg/deb/dpkgpm.cc:54 apt-pkg/deb/dpkgpm.cc:830 #, c-format msgid "Removing %s" msgstr "" @@ -2954,87 +2964,87 @@ msgstr "" msgid "Directory '%s' missing" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:661 apt-pkg/deb/dpkgpm.cc:674 +#: apt-pkg/deb/dpkgpm.cc:661 apt-pkg/deb/dpkgpm.cc:675 #, c-format msgid "Could not open file '%s'" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:815 +#: apt-pkg/deb/dpkgpm.cc:816 #, c-format msgid "Preparing %s" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:816 +#: apt-pkg/deb/dpkgpm.cc:817 #, c-format msgid "Unpacking %s" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:821 +#: apt-pkg/deb/dpkgpm.cc:822 #, c-format msgid "Preparing to configure %s" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:823 +#: apt-pkg/deb/dpkgpm.cc:824 #, c-format msgid "Installed %s" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:828 +#: apt-pkg/deb/dpkgpm.cc:829 #, c-format msgid "Preparing for removal of %s" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:830 +#: apt-pkg/deb/dpkgpm.cc:831 #, c-format msgid "Removed %s" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:835 +#: apt-pkg/deb/dpkgpm.cc:836 #, c-format msgid "Preparing to completely remove %s" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:836 +#: apt-pkg/deb/dpkgpm.cc:837 #, c-format msgid "Completely removed %s" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:1042 +#: apt-pkg/deb/dpkgpm.cc:1043 msgid "Can not write log, openpty() failed (/dev/pts not mounted?)\n" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:1073 +#: apt-pkg/deb/dpkgpm.cc:1074 msgid "Running dpkg" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:1276 +#: apt-pkg/deb/dpkgpm.cc:1277 msgid "No apport report written because MaxReports is reached already" msgstr "" #. check if its not a follow up error -#: apt-pkg/deb/dpkgpm.cc:1281 +#: apt-pkg/deb/dpkgpm.cc:1282 msgid "dependency problems - leaving unconfigured" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:1283 +#: apt-pkg/deb/dpkgpm.cc:1284 msgid "" "No apport report written because the error message indicates its a followup " "error from a previous failure." msgstr "" -#: apt-pkg/deb/dpkgpm.cc:1289 +#: apt-pkg/deb/dpkgpm.cc:1290 msgid "" "No apport report written because the error message indicates a disk full " "error" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:1295 +#: apt-pkg/deb/dpkgpm.cc:1296 msgid "" "No apport report written because the error message indicates a out of memory " "error" msgstr "" -#: apt-pkg/deb/dpkgpm.cc:1302 +#: apt-pkg/deb/dpkgpm.cc:1303 msgid "" "No apport report written because the error message indicates a dpkg I/O error" msgstr "" diff --git a/test/integration/Packages-bug-593360-modifiers-in-names b/test/integration/Packages-bug-593360-modifiers-in-names new file mode 100644 index 000000000..d2ac8d4e1 --- /dev/null +++ b/test/integration/Packages-bug-593360-modifiers-in-names @@ -0,0 +1,42 @@ +Package: g++ +Priority: optional +Section: devel +Installed-Size: 40 +Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org> +Architecture: i386 +Source: gcc-defaults (1.96) +Version: 4:4.4.5-1 +Filename: pool/main/g/gcc-defaults/g++_4.4.5-1_i386.deb +Size: 1372 +MD5sum: 37e129a4b130e8b96a9b9d5b26a3fffa +SHA1: d98768d1547389a563e60433268143f42578c3e6 +SHA256: 18d933972392d233127bdd766cfcaaaa2e35f57de47c7af678d599be9613d562 +Description: The GNU C++ compiler + +Package: apt +Priority: important +Section: admin +Installed-Size: 5984 +Maintainer: APT Development Team <deity@lists.debian.org> +Architecture: all +Version: 0.8.8 +Filename: pool/main/a/apt/apt_0.8.8_i386.deb +Size: 2140632 +MD5sum: 4283aa3bb751253faf1b2204e0229e4f +SHA1: 59d432f56901faa86e814a436b8da010ee1c7b8a +SHA256: 072dcf4359dce9698aeaa54366eb20513f860c2bb6d44a95973c0b2ad413bfab +Description: Advanced front-end for dpkg + +Package: apt+ +Priority: important +Section: admin +Installed-Size: 5984 +Maintainer: APT Development Team <deity@lists.debian.org> +Architecture: all +Version: 0.8.8 +Filename: pool/main/a/apt/apt_0.8.8_i386.deb +Size: 2140632 +MD5sum: 4283aa3bb751253faf1b2204e0229e4f +SHA1: 59d432f56901faa86e814a436b8da010ee1c7b8a +SHA256: 072dcf4359dce9698aeaa54366eb20513f860c2bb6d44a95973c0b2ad413bfab +Description: Advanced front-end for dpkg diff --git a/test/integration/Packages-bug-604222-new-and-autoremove b/test/integration/Packages-bug-604222-new-and-autoremove new file mode 100644 index 000000000..fdff9d702 --- /dev/null +++ b/test/integration/Packages-bug-604222-new-and-autoremove @@ -0,0 +1,68 @@ +Package: dummy-archive +Priority: extra +Section: admin +Installed-Size: 5984 +Maintainer: APT Development Team <deity@lists.debian.org> +Architecture: i386 +Version: 0.invalid.0 +Source: dummy-archive +Depends: libavcodec52, libvtk5-dev | libopenal-dev +Filename: pool/main/d/dummy/dummy_5.4.2-8_i386.deb +Size: 2280898 +MD5sum: 569719746f7ec4b96209a6152af20c00 +Description: some dummy package + +Package: libvtk5-dev +Priority: optional +Section: libdevel +Installed-Size: 13812 +Maintainer: A. Maitland Bottoms <bottoms@debian.org> +Architecture: i386 +Source: vtk +Version: 5.4.2-8 +Depends: libvtk5.4 (= 5.4.2-8) +Filename: pool/main/v/vtk/libvtk5-dev_5.4.2-8_i386.deb +Size: 2280898 +MD5sum: 569719746f7ec4b96209a6152af20c00 +Description: VTK header files for building C++ code + +Package: libvtk5.4 +Priority: optional +Section: libs +Installed-Size: 39372 +Maintainer: A. Maitland Bottoms <bottoms@debian.org> +Architecture: i386 +Source: vtk +Version: 5.4.2-8 +Depends: libavcodec52 (>= 4:0.5.1-1) +Filename: pool/main/v/vtk/libvtk5.4_5.4.2-8_i386.deb +Size: 13070848 +MD5sum: 3ba7abc3d58ec44e35ae71879406563d +Description: Visualization Toolkit - A high level 3D visualization library + +Package: libopenal-dev +Priority: optional +Section: libdevel +Installed-Size: 140 +Maintainer: Debian Games Team <pkg-games-devel@lists.alioth.debian.org> +Architecture: i386 +Source: openal-soft +Version: 1:1.12.854-2 +Filename: pool/main/o/openal-soft/libopenal-dev_1.12.854-2_i386.deb +Size: 21014 +MD5sum: e0bda4fbf5a3d38ef510a23a1642587f +Description-de: Software-Implementierung der OpenAL-API (Entwicklungsdateien) + +Package: libavcodec52 +Priority: optional +Section: libs +Installed-Size: 10772 +Maintainer: Debian multimedia packages maintainers <pkg-multimedia-maintainers@lists.alioth.debian.org> +Architecture: i386 +Source: ffmpeg +Version: 4:0.5.2-6 +Conflicts: libvtk5-dev +Filename: pool/main/f/ffmpeg/libavcodec52_0.5.2-6_i386.deb +Size: 4001600 +MD5sum: a50aae4c8e8b9dd29612407e61bedc22 +Description-de: Ffmpeg-Codec-Bibliothek diff --git a/test/integration/create-test-data b/test/integration/create-test-data index ff9405502..581b62910 100755 --- a/test/integration/create-test-data +++ b/test/integration/create-test-data @@ -1,6 +1,11 @@ #!/bin/sh set +e # its okay to fail in these script, most of the time the apt* stuff will generate errors +if [ -z "$1" -o -z "$2" ]; then + echo "Usage: $0 file codename pkg…" + exit 1 +fi + local TESTDIR=$(readlink -f $(dirname $0)) . $TESTDIR/framework BUILDDIRECTORY="${TESTDIR}/../../build/bin" @@ -16,7 +21,12 @@ TMPGEN=$WORKDIR/Packages export LANG=C LISTOFPKGS=$(aptget install $* -t $CODENAME -so Dir::state::status=$WORKDIR/status -o Dir::Cache::archives=$WORKDIR -o pkgCacheGen::Essential=none -o APT::Immediate-Configure=0 2> /dev/null | awk '/^Inst/ {print $2}' | sed -e "s#\$#/$CODENAME#") -aptcache show $LISTOFPKGS --no-all-versions 2> /dev/null > $TMPGEN +if [ -z "$LISTOFPKGS" ]; then + echo "List of packages is empty: run apt-get install command again for you now" + aptget install $* -t $CODENAME -so Dir::state::status=$WORKDIR/status -o Dir::Cache::archives=$WORKDIR -o pkgCacheGen::Essential=none -o APT::Immediate-Configure=0 + exit 1 +fi +aptcache show $LISTOFPKGS --no-all-versions 2> $WORKDIR/error.lst > $TMPGEN sed -i $TMPGEN \ -e '/^ / d' \ -e '/^SHA1: / d' -e '/^SHA256: / d' \ @@ -24,6 +34,10 @@ sed -i $TMPGEN \ -e '/^Xul-Appid: / d' \ -e '/^Status: / d' +if [ "$CODENAME" = "experimental" ]; then + aptcache show $(cat $WORKDIR/error.lst | cut -d"'" -f 4 | sed -e 's#$#/sid#') --no-all-versions 2> /dev/null >> $TMPGEN +fi + if echo "$GENERATE" | grep '^status-' > /dev/null; then sed -i $TMPGEN -e '/^Package: / a\ Status: install ok installed' \ diff --git a/test/integration/deb-bug-330162-encoded-tar-header.deb b/test/integration/deb-bug-330162-encoded-tar-header.deb Binary files differnew file mode 100644 index 000000000..f38b1aa70 --- /dev/null +++ b/test/integration/deb-bug-330162-encoded-tar-header.deb diff --git a/test/integration/framework b/test/integration/framework index 2422f0886..4bbe1b408 100644 --- a/test/integration/framework +++ b/test/integration/framework @@ -78,6 +78,15 @@ aptkey() { runapt apt-key $*; } dpkg() { $(which dpkg) --root=${TMPWORKINGDIRECTORY}/rootdir --force-not-root --force-bad-path --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log $* } +aptitude() { + if [ -f ./aptconfig.conf ]; then + APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} $(which aptitude) $* + elif [ -f ../aptconfig.conf ]; then + APT_CONFIG=../aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} $(which aptitude) $* + else + LD_LIBRARY_PATH=${BUILDDIRECTORY} $(which aptitude) $* + fi +} setupenvironment() { TMPWORKINGDIRECTORY=$(mktemp -d) @@ -107,8 +116,10 @@ setupenvironment() { local PACKAGESFILE=$(echo "$(basename $0)" | sed -e 's/^test-/Packages-/' -e 's/^skip-/Packages-/') if [ -f "${TESTDIR}/${PACKAGESFILE}" ]; then cp "${TESTDIR}/${PACKAGESFILE}" aptarchive/Packages - else - touch aptarchive/Packages + fi + local SOURCESSFILE=$(echo "$(basename $0)" | sed -e 's/^test-/Sources-/' -e 's/^skip-/Sources-/') + if [ -f "${TESTDIR}/${SOURCESSFILE}" ]; then + cp "${TESTDIR}/${SOURCESSFILE}" aptarchive/Sources fi cp $(find $TESTDIR -name '*.pub' -o -name '*.sec') keys/ ln -s ${TMPWORKINGDIRECTORY}/keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg @@ -116,12 +127,14 @@ setupenvironment() { echo "Dir::state::status \"${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status\";" >> aptconfig.conf echo "Debug::NoLocking \"true\";" >> aptconfig.conf echo "APT::Get::Show-User-Simulation-Note \"false\";" >> aptconfig.conf + echo "Dir::Bin::Methods \"${BUILDDIRECTORY}/methods\";" >> aptconfig.conf echo "Dir::Bin::dpkg \"fakeroot\";" >> aptconfig.conf echo "DPKG::options:: \"dpkg\";" >> aptconfig.conf echo "DPKG::options:: \"--root=${TMPWORKINGDIRECTORY}/rootdir\";" >> aptconfig.conf echo "DPKG::options:: \"--force-not-root\";" >> aptconfig.conf echo "DPKG::options:: \"--force-bad-path\";" >> aptconfig.conf echo "DPKG::options:: \"--log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log\";" >> aptconfig.conf + echo 'quiet::NoUpdate "true";' >> aptconfig.conf export LC_ALL=C msgdone "info" } @@ -307,6 +320,38 @@ buildaptftparchivedirectorystructure() { done } +insertpackage() { + local RELEASE="$1" + local NAME="$2" + local ARCH="$3" + local VERSION="$4" + local DEPENDENCIES="$5" + local ARCHS="$ARCH" + if [ "$ARCHS" = "all" ]; then + ARCHS="$(aptconfig dump | grep APT::Architecture | cut -d'"' -f 2 | sed '/^$/ d' | sort | uniq | tr '\n' ' ')" + fi + for BUILDARCH in $ARCHS; do + local PPATH="aptarchive/dists/${RELEASE}/main/binary-${BUILDARCH}" + mkdir -p $PPATH aptarchive/dists/${RELEASE}/main/source + touch aptarchive/dists/${RELEASE}/main/source/Sources + local FILE="${PPATH}/Packages" + echo "Package: $NAME +Priority: optional +Section: other +Installed-Size: 42 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: $ARCH +Version: $VERSION +Filename: pool/main/${NAME}/${NAME}_${VERSION}_${ARCH}.deb" >> $FILE + test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE + echo "Description: an autogenerated dummy ${NAME}=${VERSION}/${RELEASE} + If you find such a package installed on your system, + YOU did something horribly wrong! They are autogenerated + und used only by testcases for APT and surf no other propose… +" >> $FILE + done +} + buildaptarchivefromincoming() { msginfo "Build APT archive for ${CCMD}$(basename $0)${CINFO} based on incoming packages…" cd aptarchive @@ -315,36 +360,38 @@ buildaptarchivefromincoming() { [ -e dists ] || buildaptftparchivedirectorystructure msgninfo "\tGenerate Packages, Sources and Contents files… " aptftparchive -qq generate ftparchive.conf - msgdone "info" - msgninfo "\tGenerate Release files… " - for dir in $(find ./dists -mindepth 1 -maxdepth 1 -type d); do - aptftparchive -qq release $dir -o APT::FTPArchive::Release::Codename="$(echo "$dir" | cut -d'/' -f 3)" | sed -e '/0 Release$/ d' > $dir/Release # remove the self reference - done cd - > /dev/null msgdone "info" + generatereleasefiles } buildaptarchivefromfiles() { msginfo "Build APT archive for ${CCMD}$(basename $0)${CINFO} based on prebuild files…" - cd aptarchive - if [ -f Packages ]; then - msgninfo "\tPackages file… " - cat Packages | gzip > Packages.gz - cat Packages | bzip2 > Packages.bz2 - cat Packages | lzma > Packages.lzma - msgdone "info" - fi - if [ -f Sources ]; then - msgninfo "\tSources file… " - cat Sources | gzip > Sources.gz - cat Sources | bzip2 > Sources.bz2 - cat Sources | lzma > Sources.lzma + find aptarchive -name 'Packages' -o -name 'Sources' | while read line; do + msgninfo "\t${line} file… " + cat ${line} | gzip > ${line}.gz + cat ${line} | bzip2 > ${line}.bz2 + cat ${line} | lzma > ${line}.lzma msgdone "info" + done + generatereleasefiles +} + +generatereleasefiles() { + msgninfo "\tGenerate Release files… " + if [ -e aptarchive/dists ]; then + for dir in $(find ./aptarchive/dists -mindepth 1 -maxdepth 1 -type d); do + local CODENAME="$(echo "$dir" | cut -d'/' -f 4)" + aptftparchive -qq release $dir -o APT::FTPArchive::Release::Suite="${CODENAME}" -o APT::FTPArchive::Release::Codename="${CODENAME}" | sed -e '/0 Release$/ d' > $dir/Release # remove the self reference + if [ "$CODENAME" = "experimental" -o "$CODENAME" = "experimental2" ]; then + sed -i '/^Date: / a\ +NotAutomatic: yes' $dir/Release + fi + done + else + aptftparchive -qq release ./aptarchive | sed -e '/0 Release$/ d' > aptarchive/Release # remove the self reference fi - msgninfo "\tRelease file… " - aptftparchive -qq release . | sed -e '/0 Release$/ d' > Release # remove the self reference msgdone "info" - cd .. } setupdistsaptarchive() { @@ -411,7 +458,7 @@ signreleasefiles() { changetowebserver() { if which weborf > /dev/null; then weborf -xb aptarchive/ 2>&1 > /dev/null & - CURRENTTRAP="kill $(ps | grep weborf | sed -e 's#^[ ]*##' | cut -d' ' -f 1); $CURRENTTRAP" + CURRENTTRAP="kill $!; $CURRENTTRAP" trap "$CURRENTTRAP" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM local APTARCHIVE="file://$(readlink -f ./aptarchive)" for LIST in $(find rootdir/etc/apt/sources.list.d/ -name 'apt-test-*.list'); do diff --git a/test/integration/status-bug-601961-install-info b/test/integration/status-bug-601961-install-info new file mode 100644 index 000000000..c43cffab7 --- /dev/null +++ b/test/integration/status-bug-601961-install-info @@ -0,0 +1,42 @@ +Package: dpkg +Status: install ok installed +Essential: yes +Priority: required +Section: admin +Installed-Size: 6432 +Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org> +Architecture: i386 +Version: 1.15.8.5 +Description: Debian package management system + +Package: findutils +Status: install ok installed +Essential: yes +Priority: required +Section: utils +Installed-Size: 1704 +Maintainer: Andreas Metzler <ametzler@debian.org> +Architecture: i386 +Version: 4.4.2-1+b1 +Depends: dpkg (>= 1.15.4) | install-info, essentialpkg +Description: utilities for finding files--find, xargs + +Package: install-info +Status: install ok installed +Priority: important +Section: doc +Installed-Size: 256 +Maintainer: Debian TeX maintainers <debian-tex-maint@lists.debian.org> +Architecture: i386 +Version: 4.13a.dfsg.1-6 +Description: Manage installed documentation in info format + +Package: essentialpkg +Status: install ok installed +Priority: important +Section: other +Installed-Size: 256 +Maintainer: Joe Sixpack <joe@example.org> +Architecture: i386 +Version: 4.13a.dfsg.1-6 +Description: ultra hypercool important package diff --git a/test/integration/status-bug-604222-new-and-autoremove b/test/integration/status-bug-604222-new-and-autoremove new file mode 100644 index 000000000..03cf4d307 --- /dev/null +++ b/test/integration/status-bug-604222-new-and-autoremove @@ -0,0 +1,10 @@ +Package: libvtk5.4 +Status: install ok installed +Priority: optional +Section: libs +Installed-Size: 39372 +Maintainer: A. Maitland Bottoms <bottoms@debian.org> +Architecture: i386 +Source: vtk +Version: 5.4.2-7 +Description: Visualization Toolkit - A high level 3D visualization library diff --git a/test/integration/test-bug-330162-encoded-tar-header b/test/integration/test-bug-330162-encoded-tar-header new file mode 100755 index 000000000..fa01e0379 --- /dev/null +++ b/test/integration/test-bug-330162-encoded-tar-header @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +local TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture "i386" + +msgtest 'Test apt-ftparchive with encoded tar header package' +cp $TESTDIR/deb-bug-330162-encoded-tar-header.deb aptarchive/ +test -z "$(aptftparchive packages aptarchive/ 2>&1 | grep 'E:')" && msgpass || msgfail diff --git a/test/integration/test-bug-593360-modifiers-in-names b/test/integration/test-bug-593360-modifiers-in-names new file mode 100755 index 000000000..c12503b0d --- /dev/null +++ b/test/integration/test-bug-593360-modifiers-in-names @@ -0,0 +1,64 @@ +#!/bin/sh +set -e + +local TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture "i386" +setupaptarchive + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + g++ +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst g++ (4:4.4.5-1 localhost [i386]) +Conf g++ (4:4.4.5-1 localhost [i386])' aptget install g++ -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + g++ +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst g++ (4:4.4.5-1 localhost [i386]) +Conf g++ (4:4.4.5-1 localhost [i386])' aptget install g+++ -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + g++ +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst g++ (4:4.4.5-1 localhost [i386]) +Conf g++ (4:4.4.5-1 localhost [i386])' aptget purge g+++ -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + apt +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst apt (0.8.8 localhost [all]) +Conf apt (0.8.8 localhost [all])' aptget install apt -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + apt+ +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst apt+ (0.8.8 localhost [all]) +Conf apt+ (0.8.8 localhost [all])' aptget install apt+ -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + apt+ +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst apt+ (0.8.8 localhost [all]) +Conf apt+ (0.8.8 localhost [all])' aptget install apt++ -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + apt+ +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst apt+ (0.8.8 localhost [all]) +Conf apt+ (0.8.8 localhost [all])' aptget purge apt++ -s diff --git a/test/integration/test-bug-595691-empty-and-broken-archive-files b/test/integration/test-bug-595691-empty-and-broken-archive-files index 11a5025d2..66792899a 100755 --- a/test/integration/test-bug-595691-empty-and-broken-archive-files +++ b/test/integration/test-bug-595691-empty-and-broken-archive-files @@ -7,6 +7,7 @@ setupenvironment configarchitecture "i386" buildaptarchive +touch aptarchive/Packages setupflataptarchive testaptgetupdate() { diff --git a/test/integration/test-bug-601961-install-info b/test/integration/test-bug-601961-install-info new file mode 100755 index 000000000..b91bf3615 --- /dev/null +++ b/test/integration/test-bug-601961-install-info @@ -0,0 +1,38 @@ +#!/bin/sh +set -e + +local TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture "i386" +setupaptarchive + +testequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + findutils +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + findutils +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +After this operation, 1745 kB disk space will be freed. +E: Trivial Only specified but this is not a trivial operation.' aptget remove findutils --trivial-only + +testequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + install-info +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +After this operation, 262 kB disk space will be freed. +E: Trivial Only specified but this is not a trivial operation.' aptget remove install-info --trivial-only + +testequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + essentialpkg findutils +WARNING: The following essential packages will be removed. +This should NOT be done unless you know exactly what you are doing! + findutils essentialpkg (due to findutils) +0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded. +After this operation, 2007 kB disk space will be freed. +E: Trivial Only specified but this is not a trivial operation.' aptget remove essentialpkg --trivial-only diff --git a/test/integration/test-bug-604222-new-and-autoremove b/test/integration/test-bug-604222-new-and-autoremove new file mode 100755 index 000000000..fa6dcdc70 --- /dev/null +++ b/test/integration/test-bug-604222-new-and-autoremove @@ -0,0 +1,66 @@ +#!/bin/sh +set -e + +local TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture "i386" +setupaptarchive + +echo 'Package: libvtk5.4 +Auto-Installed: 1 +Architecture: i386' > rootdir/var/lib/apt/extended_states + +testequal "Reading package lists... +Building dependency tree... +Reading state information... +The following package was automatically installed and is no longer required: + libvtk5.4 +Use 'apt-get autoremove' to remove them. +The following NEW packages will be installed: + libavcodec52 +0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded. +Inst libavcodec52 (4:0.5.2-6 localhost [i386]) +Conf libavcodec52 (4:0.5.2-6 localhost [i386])" aptget install libavcodec52 -s + +testequal "Reading package lists... +Building dependency tree... +Reading state information... +The following package was automatically installed and is no longer required: + libvtk5.4 +Use 'apt-get autoremove' to remove them. +The following extra packages will be installed: + libavcodec52 libopenal-dev libvtk5.4 +The following NEW packages will be installed: + dummy-archive libavcodec52 libopenal-dev +The following packages will be upgraded: + libvtk5.4 +1 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. +Need to get 0 B/19.4 MB of archives. +After this operation, 17.3 MB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install dummy-archive --trivial-only + +echo -n > rootdir/var/lib/dpkg/status +rm rootdir/var/lib/apt/extended_states + +CONFLICTING='Reading package lists... +Building dependency tree... + MarkInstall dummy-archive [ i386 ] < none -> 0.invalid.0 > ( admin ) FU=1 + MarkInstall libavcodec52 [ i386 ] < none -> 4:0.5.2-6 > ( libs ) FU=0 + MarkInstall libvtk5-dev [ i386 ] < none -> 5.4.2-8 > ( libdevel ) FU=0 + MarkInstall libvtk5.4 [ i386 ] < none -> 5.4.2-8 > ( libs ) FU=0 + MarkKeep libvtk5-dev [ i386 ] < none -> 5.4.2-8 > ( libdevel ) FU=0 + MarkKeep libvtk5-dev [ i386 ] < none -> 5.4.2-8 > ( libdevel ) FU=0 + MarkDelete libvtk5.4 [ i386 ] < none -> 5.4.2-8 > ( libs ) FU=1 +The following extra packages will be installed: + libavcodec52 libopenal-dev +The following NEW packages will be installed: + dummy-archive libavcodec52 libopenal-dev +0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. +Need to get 0 B/6304 kB of archives. +After this operation, 17.3 MB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation.' + +testequal "$CONFLICTING" aptget install dummy-archive --trivial-only -o Debug::pkgDepCache::Marker=1 -o APT::Get::HideAutoRemove=0 +testequal "$CONFLICTING" aptget install dummy-archive --trivial-only -o Debug::pkgDepCache::Marker=1 -o APT::Get::HideAutoRemove=1 +testequal "$CONFLICTING" aptget install dummy-archive --trivial-only -o Debug::pkgDepCache::Marker=1 -o APT::Get::HideAutoRemove=small diff --git a/test/integration/test-bug-604401-files-are-directories b/test/integration/test-bug-604401-files-are-directories new file mode 100755 index 000000000..917fb106f --- /dev/null +++ b/test/integration/test-bug-604401-files-are-directories @@ -0,0 +1,66 @@ +#!/bin/sh +set -e + +local TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture "i386" +setupaptarchive + +test ! -e rootdir/etc/apt/apt.conf || mv rootdir/etc/apt/apt.conf rootdir/etc/apt/apt.conf.d/000move-away-apt.conf + +msgtest "Directory instead of a file as apt.conf ignored" +mkdir -p rootdir/etc/apt/apt.conf +aptconfig dump > /dev/null && msgpass || msgfail +rmdir rootdir/etc/apt/apt.conf + +msgtest "Good link instead of a file as apt.conf ignored" +echo 'Test::APT::Link "good";' > rootdir/etc/apt/good-link.conf +ln -s rootdir/etc/apt/good-link.conf rootdir/etc/apt/apt.conf +test -n "$(aptconfig shell TestLink 'Test::APT::Link')" && msgfail || msgpass +rm rootdir/etc/apt/apt.conf + +msgtest "Broken link instead of a file as apt.conf ignored" +ln -s /tmp/doesnt-exist rootdir/etc/apt/apt.conf +aptconfig dump > /dev/null && msgpass || msgfail +rm rootdir/etc/apt/apt.conf + + +test ! -e rootdir/etc/apt/sources.list || mv rootdir/etc/apt/sources.list rootdir/etc/apt/sources.list.d/000move-away-sources.list + +msgtest "Directory instead of a file as sources.list ignored" +mkdir -p rootdir/etc/apt/sources.list +aptget update --print-uris 2> /dev/null && msgpass || msgfail +rmdir rootdir/etc/apt/sources.list + +msgtest "Good link instead of a file as sources.list ignored" +echo 'deb file:///tmp/debian sid main' > rootdir/etc/apt/good-link.list +ln -s rootdir/etc/apt/good-link.list rootdir/etc/apt/sources.list +test -n "$(aptget update --print-uris)" && msgfail || msgpass +rm rootdir/etc/apt/sources.list + +msgtest "Broken link instead of a file as sources.list ignored" +ln -s /tmp/doesnt-exist rootdir/etc/apt/sources.list +test -n "$(aptget update --print-uris)" && msgfail || msgpass +rm rootdir/etc/apt/sources.list + + +test ! -e rootdir/etc/apt/preferences || mv rootdir/etc/apt/preferences rootdir/etc/apt/preferences.d/000move-away-preferences + +msgtest "Directory instead of a file as preferences ignored" +mkdir -p rootdir/etc/apt/preferences +aptcache policy > /dev/null 2> /dev/null && msgpass || msgfail +rmdir rootdir/etc/apt/preferences + +msgtest "Good link instead of a file as preferences ignored" +echo 'Package: apt +Pin: release a=now +Pin-Value: 1000' > rootdir/etc/apt/good-link.pref +ln -s rootdir/etc/apt/good-link.pref rootdir/etc/apt/preferences +test -n "$(aptcache policy | grep 1000)" && msgfail || msgpass +rm rootdir/etc/apt/preferences + +msgtest "Broken link instead of a file as preferences ignored" +ln -s /tmp/doesnt-exist rootdir/etc/apt/preferences +aptcache policy > /dev/null 2> /dev/null && msgpass || msgfail +rm rootdir/etc/apt/preferences diff --git a/test/integration/test-release-candidate-switching b/test/integration/test-release-candidate-switching new file mode 100755 index 000000000..5736945ab --- /dev/null +++ b/test/integration/test-release-candidate-switching @@ -0,0 +1,419 @@ +#!/bin/sh +set -e + +local TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'libc6' 'i386' '2.11.2-7+sid' +insertpackage 'unstable' 'phonon-backend-xine' 'i386' '4:4.6.0really4.4.2-1+sid' 'Provides: phonon-backend' +insertpackage 'unstable' 'phonon-backend-xine2' 'i386' '4:4.6.0really4.4.2-1+sid' +insertpackage 'unstable' 'phonon-backend-xine3' 'i386' '4:4.6.0really4.4.2-1+sid' +insertpackage 'unstable' 'phonon-backend-xine4' 'i386' '4:4.6.0really4.4.2-1+sid' +insertpackage 'unstable' 'phonon-backend-null' 'i386' '4:4.20.0+sid' 'Provides: phonon-backend' +insertpackage 'unstable' 'intermediatepkg' 'all' '1.0' + +insertpackage 'unstable' 'amarok-common' 'all' '2.3.1-1+sid' +insertpackage 'unstable' 'amarok-utils' 'i386' '2.3.1-1+sid' +insertpackage 'unstable' 'libmtp8' 'i386' '0.3.1+sid' +insertpackage 'unstable' 'amarok' 'i386' '2.3.1-1+sid' 'Depends: amarok-common (= 2.3.1-1+sid), amarok-utils (= 2.3.1-1+sid), phonon-backend-xine | phonon-backend, libmtp8 (>= 0.3.1), libc6' + +insertpackage 'experimental' 'amarok-common' 'all' '2.3.2-2+exp' +insertpackage 'experimental' 'amarok-utils' 'i386' '2.3.2-2+exp' +insertpackage 'experimental' 'libmtp8' 'i386' '0.3.3+exp' +insertpackage 'experimental' 'phonon-backend-xine' 'i386' '5:4.6.0+exp' 'Provides: phonon-backend' +insertpackage 'experimental' 'phonon-backend-xine2' 'i386' '5:4.6.0+exp' 'Depends: uninstallablepkg +Provides: phonon-backend-broken' +insertpackage 'experimental' 'phonon-backend-xine3' 'i386' '5:4.6.0+exp' 'Depends: intermediatepkg (>= 1.5)' +insertpackage 'experimental' 'phonon-backend-xine4' 'i386' '5:4.6.0+exp' 'Depends: intermediateuninstallablepkg (= 2.0) +Provides: phonon-backend-broken' +insertpackage 'experimental' 'intermediatepkg' 'all' '2.0' 'Depends: libc6' +insertpackage 'experimental' 'intermediateuninstallablepkg' 'all' '2.0' 'Depends: uninstallablepkg' +insertpackage 'experimental' 'phonon-backend-null' 'i386' '5:4.20.0+exp' 'Provides: phonon-backend' +insertpackage 'experimental' 'amarok' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), amarok-utils (= 2.3.2-2+exp), phonon-backend-xine | phonon-backend, libmtp8 (>= 0.3.1), libc6' + +insertpackage 'experimental2' 'phonon-backend-xine' 'i386' '5:4.00.0+exp' 'Provides: phonon-backend' +insertpackage 'experimental2' 'amarok-less' 'i386' '2.3.2-2+exp' 'Depends: amarok-common, phonon-backend-xine (>= 5:4.00.0+exp), libmtp8, libc6, amarok-utils' +insertpackage 'experimental' 'amarok-higher' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-xine (>= 5:4.6.0+exp), libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' + +insertpackage 'experimental' 'amarok-null' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-xine (= 1:1.0-1) | phonon-backend, libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' +insertpackage 'experimental' 'amarok-null2' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-null (= 1:1.0-1) | phonon-backend, libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' +insertpackage 'experimental' 'amarok-xine' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-xine (= 5:4.6.0+exp) | phonon-backend-null (= 5:4.20.0+exp), libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' +insertpackage 'experimental' 'amarok-xine2' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-xine2 (= 5:4.6.0+exp) | phonon-backend-null (= 5:4.20.0+exp), libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' +insertpackage 'experimental' 'amarok-xine3' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-xine3 (= 5:4.6.0+exp) | phonon-backend-null (= 5:4.20.0+exp), libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' +insertpackage 'experimental' 'amarok-xine4' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-xine4 (= 5:4.6.0+exp) | phonon-backend-null (= 5:4.20.0+exp), libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' +insertpackage 'experimental' 'amarok-broken' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp), phonon-backend-broken | phonon-backend-null (= 5:4.20.0+exp), libmtp8 (>= 0.3.1), libc6, amarok-utils (= 2.3.2-2+exp)' + +insertpackage 'experimental' 'amarok-recommends' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp) +Recommends: amarok-utils (= 2.3.2-2+exp), phonon-backend-xine | phonon-backend, libmtp8 (>= 0.3.1), libc6' +insertpackage 'experimental' 'amarok-recommends2' 'i386' '2.3.2-2+exp' 'Depends: amarok-common (= 2.3.2-2+exp) +Recommends: amarok-utils (= 2.30.2-2+exp), phonon-backend-xine | phonon-backend, libmtp8 (>= 0.3.1), libc6' + +insertpackage 'experimental' 'uninstallablepkg' 'all' '1.0' 'Depends: libmtp8 (>= 10:0.20.1), amarok-utils (= 2.3.2-2+exp)' + +setupaptarchive + +testequal "Reading package lists... +Building dependency tree... +The following extra packages will be installed: + amarok-common (2.3.1-1+sid) + amarok-utils (2.3.1-1+sid) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0really4.4.2-1+sid) +The following NEW packages will be installed: + amarok (2.3.1-1+sid) + amarok-common (2.3.1-1+sid) + amarok-utils (2.3.1-1+sid) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0really4.4.2-1+sid) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok --trivial-only -V -q=0 + +testequal "Reading package lists... +Building dependency tree... +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.3+exp) + phonon-backend-xine (4.6.0+exp) +The following NEW packages will be installed: + amarok (2.3.2-2+exp) + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.3+exp) + phonon-backend-xine (4.6.0+exp) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok -t experimental --trivial-only -V -q=0 + +testequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok' +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0really4.4.2-1+sid) +The following NEW packages will be installed: + amarok (2.3.2-2+exp) + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0really4.4.2-1+sid) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok/experimental --trivial-only -V -q=0 + +testequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-null' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-null' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-null' +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4.20.0+sid) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-null (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4.20.0+sid) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-null/experimental --trivial-only -V -q=0 + +# do not select the same version multiple times +testequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-null' +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0really4.4.2-1+sid) +The following NEW packages will be installed: + amarok (2.3.2-2+exp) + amarok-common (2.3.2-2+exp) + amarok-null (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0really4.4.2-1+sid) +0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded. +After this operation, 301 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok/experimental amarok-null/experimental --trivial-only -V -q=0 + +# … but thighten the version if needed +# in theory, the second line is wrong, but printing the right version is too much of a hassle +# (we have to check if later in the Changed list is another change and if so use this version +# instead of the current candidate) - and it wouldn't be (really) useful anyway… +testequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental2 [i386]) for 'amarok-less' +Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine' because of 'amarok-less' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-higher' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-higher' +Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine' because of 'amarok-higher' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-higher' +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0+exp) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-higher (2.3.2-2+exp) + amarok-less (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0+exp) +0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded. +After this operation, 301 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-less/experimental2 amarok-higher/experimental --trivial-only -V -q=0 + +# phonon-backend-null can't be used directly, but as it provides it is still fine… +testequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-null2' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-null2' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-null2' +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4.20.0+sid) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-null2 (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4.20.0+sid) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-null2/experimental --trivial-only -V -q=0 + +# if an or-group satisfier is already found, do not set others +testequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-xine' +Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine' because of 'amarok-xine' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine' +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0+exp) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + amarok-xine (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0+exp) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-xine/experimental --trivial-only -V -q=0 + +# … but proceed testing if the first doesn't work out +testequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine2' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-xine2' +Selected version '5:4.20.0+exp' (experimental [i386]) for 'phonon-backend-null' because of 'amarok-xine2' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine2' +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4.20.0+exp) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + amarok-xine2 (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4.20.0+exp) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-xine2/experimental --trivial-only -V -q=0 + +# sometimes, the second level need to be corrected, too +testequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine3' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-xine3' +Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine3' because of 'amarok-xine3' +Selected version '2.0' (experimental [all]) for 'intermediatepkg' because of 'phonon-backend-xine3' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine3' +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + intermediatepkg (2.0) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine3 (4.6.0+exp) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + amarok-xine3 (2.3.2-2+exp) + intermediatepkg (2.0) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine3 (4.6.0+exp) +0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded. +After this operation, 301 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-xine3/experimental --trivial-only -V -q=0 + +# … but proceed testing if the first doesn't work out even in second deep +testequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine4' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-xine4' +Selected version '5:4.20.0+exp' (experimental [i386]) for 'phonon-backend-null' because of 'amarok-xine4' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine4' +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4.20.0+exp) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + amarok-xine4 (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4.20.0+exp) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-xine4/experimental --trivial-only -V -q=0 + +# providers can be broken, too +testequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-broken' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-broken' +Selected version '5:4.20.0+exp' (experimental [i386]) for 'phonon-backend-null' because of 'amarok-broken' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-broken' +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4.20.0+exp) +The following NEW packages will be installed: + amarok-broken (2.3.2-2+exp) + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-null (4.20.0+exp) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-broken/experimental --trivial-only -V -q=0 + +# switch the candidate for recommends too if they should be installed +testequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-recommends' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-recommends' +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-recommends' +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0really4.4.2-1+sid) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-recommends (2.3.2-2+exp) + amarok-utils (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0really4.4.2-1+sid) +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +After this operation, 258 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-recommends/experimental --trivial-only -V -q=0 -o APT::Install-Recommends=1 + +# … or not if not +testequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-recommends' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-recommends' +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) +Recommended packages: + amarok-utils (2.3.1-1+sid) + phonon-backend-xine (4.6.0really4.4.2-1+sid) + phonon-backend () + libmtp8 (0.3.1+sid) + libc6 (2.11.2-7+sid) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-recommends (2.3.2-2+exp) +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +After this operation, 86.0 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-recommends/experimental --trivial-only -V -q=0 -o APT::Install-Recommends=0 + +# but broken recommends are not the end of the world +# FIXME: the version output for recommend packages is a bit strange… but what would be better? +testequal "Reading package lists... +Building dependency tree... +Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-recommends2' +Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-recommends2' +The following extra packages will be installed: + amarok-common (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0really4.4.2-1+sid) +Recommended packages: + amarok-utils (2.3.1-1+sid) +The following NEW packages will be installed: + amarok-common (2.3.2-2+exp) + amarok-recommends2 (2.3.2-2+exp) + libc6 (2.11.2-7+sid) + libmtp8 (0.3.1+sid) + phonon-backend-xine (4.6.0really4.4.2-1+sid) +0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded. +After this operation, 215 kB of additional disk space will be used. +E: Trivial Only specified but this is not a trivial operation." aptget install amarok-recommends2/experimental --trivial-only -V -q=0 -o APT::Install-Recommends=1 + +# if one depends doesn't work, we don't need to look deeper… +testequal "Reading package lists... +Building dependency tree... +Selected version '1.0' (experimental [all]) for 'uninstallablepkg' +Some packages could not be installed. This may mean that you have +requested an impossible situation or if you are using the unstable +distribution that some required packages have not yet been created +or been moved out of Incoming. +The following information may help to resolve the situation: + +The following packages have unmet dependencies: + uninstallablepkg : Depends: libmtp8 (>= 10:0.20.1) but it is not going to be installed + Depends: amarok-utils (= 2.3.2-2+exp) but 2.3.1-1+sid is to be installed +E: Broken packages" aptget install uninstallablepkg/experimental --trivial-only -V -q=0 |