From 026f60e2c5601c4db42220cd20af9bfe066b2d83 Mon Sep 17 00:00:00 2001 From: Michael Vogt <michael.vogt@ubuntu.com> Date: Tue, 18 Oct 2005 13:36:47 +0000 Subject: * inital support for "apt-get source -t dist" (but no downgrades yet --- cmdline/apt-get.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'cmdline/apt-get.cc') diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index a22d881b6..55681d59e 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -1194,8 +1194,16 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs, { VerTag = string(TmpSrc.begin() + Slash + 1,TmpSrc.end()); TmpSrc = string(TmpSrc.begin(),TmpSrc.begin() + Slash); + } else if(_config->Find("APT::Default-Release") != "") { + // if we have a Default-Release (-t) we want a exact match + // FIXME: we won't support downgrades + // (i.e. -t stable won't work on a unstable system + pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc); + if(Pkg.end() == false) { + pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg); + VerTag = Ver.VerStr(); + } } - /* Lookup the version of the package we would install if we were to install a version and determine the source package name, then look in the archive for a source package of the same name. In theory -- cgit v1.2.3 From aca056a93dda08ad03690b4b70295832a723a655 Mon Sep 17 00:00:00 2001 From: Michael Vogt <michael.vogt@ubuntu.com> Date: Tue, 18 Oct 2005 22:42:09 +0000 Subject: * full support for apt-get source -t now (and honor pining too) --- cmdline/apt-get.cc | 61 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 17 deletions(-) (limited to 'cmdline/apt-get.cc') diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index 55681d59e..82f202103 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -1190,35 +1190,62 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs, string VerTag; string TmpSrc = Name; string::size_type Slash = TmpSrc.rfind('='); + + // honor pining and default release + string DefRel = _config->Find("APT::Default-Release"); + + pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc); + pkgCache::VerIterator CandVer = Cache.GetCandidateVer(Pkg); + if(Pkg.end() == false) + { + VerTag = CandVer.VerStr(); + } + if (Slash != string::npos) { VerTag = string(TmpSrc.begin() + Slash + 1,TmpSrc.end()); TmpSrc = string(TmpSrc.begin(),TmpSrc.begin() + Slash); - } else if(_config->Find("APT::Default-Release") != "") { - // if we have a Default-Release (-t) we want a exact match - // FIXME: we won't support downgrades - // (i.e. -t stable won't work on a unstable system - pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc); - if(Pkg.end() == false) { - pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg); - VerTag = Ver.VerStr(); + } + else if(DefRel.empty() == false) + { + // we have a default release, try to locate the pkg. we do it like + // this because GetCandidateVer() will not "downgrade", that means + // "apt-get source -t stable apt" won't work on a unstable system + for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; + Ver++) + { + for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; + VF++) + { + /* If this is the status file, and the current version is not the + version in the status file (ie it is not installed, or somesuch) + then it is not a candidate for installation, ever. This weeds + out bogus entries that may be due to config-file states, or + other. */ + if ((VF.File()->Flags & pkgCache::Flag::NotSource) == + pkgCache::Flag::NotSource && Pkg.CurrentVer() != Ver) + continue; + + //std::cout << VF.File().Archive() << std::endl; + if(VF.File().Archive() == DefRel) + { + VerTag = Ver.VerStr(); + break; + } + } } } + /* Lookup the version of the package we would install if we were to install a version and determine the source package name, then look - in the archive for a source package of the same name. In theory - we could stash the version string as well and match that too but - today there aren't multi source versions in the archive. */ - if (_config->FindB("APT::Get::Only-Source") == false && - VerTag.empty() == true) + in the archive for a source package of the same name. */ + if (_config->FindB("APT::Get::Only-Source") == false) { - pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc); if (Pkg.end() == false) { - pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg); - if (Ver.end() == false) + if (CandVer.end() == false) { - pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList()); + pkgRecords::Parser &Parse = Recs.Lookup(CandVer.FileList()); Src = Parse.SourcePkg(); } } -- cgit v1.2.3 From d87116efb8c7382cc463f5208277470fce129d12 Mon Sep 17 00:00:00 2001 From: Michael Vogt <michael.vogt@ubuntu.com> Date: Wed, 19 Oct 2005 12:34:19 +0000 Subject: * fix segfault when there is no Archive for a VerFile --- cmdline/apt-get.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'cmdline/apt-get.cc') diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index 82f202103..3ffb740a6 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -1227,7 +1227,7 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs, continue; //std::cout << VF.File().Archive() << std::endl; - if(VF.File().Archive() == DefRel) + if(VF.File().Archive() && (VF.File().Archive() == DefRel)) { VerTag = Ver.VerStr(); break; -- cgit v1.2.3 From ce6162bed91fd2e508d751d3d88dd16f3d97c8d3 Mon Sep 17 00:00:00 2001 From: Michael Vogt <michael.vogt@ubuntu.com> Date: Wed, 19 Oct 2005 13:51:20 +0000 Subject: * don't get candidate release as version tag for FindSrc by default. because it break for bin-NMUs :/ (e.g. dpkg source is 1.13.11, but i386 version string is 1.13.11.0.1) --- cmdline/apt-get.cc | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) (limited to 'cmdline/apt-get.cc') diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index 3ffb740a6..6e17611cb 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -1191,15 +1191,9 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs, string TmpSrc = Name; string::size_type Slash = TmpSrc.rfind('='); - // honor pining and default release + // honor default release string DefRel = _config->Find("APT::Default-Release"); - pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc); - pkgCache::VerIterator CandVer = Cache.GetCandidateVer(Pkg); - if(Pkg.end() == false) - { - VerTag = CandVer.VerStr(); - } if (Slash != string::npos) { @@ -1243,9 +1237,10 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs, { if (Pkg.end() == false) { - if (CandVer.end() == false) + pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg); + if (Ver.end() == false) { - pkgRecords::Parser &Parse = Recs.Lookup(CandVer.FileList()); + pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList()); Src = Parse.SourcePkg(); } } @@ -1300,10 +1295,7 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs, } } - if (Last == 0) - return 0; - - if (Last->Jump(Offset) == false) + if (Last == 0 || Last->Jump(Offset) == false) return 0; return Last; -- cgit v1.2.3