From: Michael Vogt Date: Thu, 10 Dec 2009 17:07:12 +0000 (+0100) Subject: * cmdline/apt-get.cc: X-Git-Tag: 0.7.25~8^2~6 X-Git-Url: https://git.saurik.com/apt.git/commitdiff_plain/fb3dc57975989a6514577569af9171732b7c5403?hp=-c * cmdline/apt-get.cc: - source should displays his final pkg pick (Closes: #249383, #550952) - source doesn't need the complete version for match (Closes: #245250) - source ignores versions/releases if not available (Closes: #377424) --- fb3dc57975989a6514577569af9171732b7c5403 diff --combined cmdline/apt-get.cc index c32d67226,ca14f4c2b..b9f936420 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@@ -1243,137 -1243,131 +1243,143 @@@ pkgSrcRecords::Parser *FindSrc(const ch pkgSrcRecords &SrcRecs,string &Src, pkgDepCache &Cache) { - // We want to pull the version off the package specification.. - string VerTag; - string DefRel = _config->Find("APT::Default-Release"); - string TmpSrc = Name; - const size_t found = TmpSrc.find_last_of("/="); - - // extract the version/release from the pkgname - if (found != string::npos) { - if (TmpSrc[found] == '/') - DefRel = TmpSrc.substr(found+1); - else - VerTag = TmpSrc.substr(found+1); - TmpSrc = TmpSrc.substr(0,found); - } - - /* 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. */ - bool MatchSrcOnly = _config->FindB("APT::Get::Only-Source"); - const pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc); - if (MatchSrcOnly == false && Pkg.end() == false) { - if(VerTag.empty() == false || 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; - - // We match against a concrete version (or a part of this version) - if (VerTag.empty() == false && strncmp(VerTag.c_str(), Ver.VerStr(), VerTag.size()) != 0) - continue; - - // or we match against a release - if(VerTag.empty() == false || - (VF.File().Archive() != 0 && VF.File().Archive() == DefRel) || - (VF.File().Codename() != 0 && VF.File().Codename() == DefRel)) { - pkgRecords::Parser &Parse = Recs.Lookup(VF); - Src = Parse.SourcePkg(); - if (VerTag.empty() == true) - VerTag = Parse.SourceVer(); - break; - } - } - } - if (Src.empty() == true) { - if (VerTag.empty() == false) - _error->Warning(_("Ignore unavailable version '%s' of package '%s'"), VerTag.c_str(), TmpSrc.c_str()); - else - _error->Warning(_("Ignore unavailable target release '%s' of package '%s'"), DefRel.c_str(), TmpSrc.c_str()); - VerTag.clear(); - DefRel.clear(); - } - } - if (VerTag.empty() == true && DefRel.empty() == true) { - // if we don't have a version or default release, use the CandidateVer to find the Source - pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg); - if (Ver.end() == false) { - pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList()); - Src = Parse.SourcePkg(); - VerTag = Parse.SourceVer(); - } - } - } - - if (Src.empty() == true) - Src = TmpSrc; - else { - /* if we have a source pkg name, make sure to only search - for srcpkg names, otherwise apt gets confused if there - is a binary package "pkg1" and a source package "pkg1" - with the same name but that comes from different packages */ - MatchSrcOnly = true; - if (Src != TmpSrc) { - ioprintf(c1out, _("Picking '%s' as source package instead of '%s'\n"), Src.c_str(), TmpSrc.c_str()); - } - } - - // The best hit - pkgSrcRecords::Parser *Last = 0; - unsigned long Offset = 0; - string Version; - - /* Iterate over all of the hits, which includes the resulting - binary packages in the search */ - pkgSrcRecords::Parser *Parse; - while (true) { - SrcRecs.Restart(); - while ((Parse = SrcRecs.Find(Src.c_str(), MatchSrcOnly)) != 0) { - const string Ver = Parse->Version(); - - // Ignore all versions which doesn't fit - if (VerTag.empty() == false && strncmp(VerTag.c_str(), Ver.c_str(), VerTag.size()) != 0) - continue; - - // Newer version or an exact match? Save the hit - if (Last == 0 || Cache.VS().CmpVersion(Version,Ver) < 0) { - Last = Parse; - Offset = Parse->Offset(); - Version = Ver; - } - - // was the version check above an exact match? If so, we don't need to look further - if (VerTag.empty() == false && VerTag.size() == Ver.size()) - break; - } - if (Last != 0 || VerTag.empty() == true) - break; - //if (VerTag.empty() == false && Last == 0) - _error->Warning(_("Ignore unavailable version '%s' of package '%s'"), VerTag.c_str(), TmpSrc.c_str()); - VerTag.clear(); - } - - if (Last == 0 || Last->Jump(Offset) == false) - return 0; - - return Last; + string VerTag; - string DefRel; ++ string DefRel = _config->Find("APT::Default-Release"); + string TmpSrc = Name; - const size_t found = TmpSrc.find_last_of("/="); + - // honor default release - if (found != string::npos && TmpSrc[found] == '/') - { - DefRel = TmpSrc.substr(found+1); ++ // extract the version/release from the pkgname ++ const size_t found = TmpSrc.find_last_of("/="); ++ if (found != string::npos) { ++ if (TmpSrc[found] == '/') ++ DefRel = TmpSrc.substr(found+1); ++ else ++ VerTag = TmpSrc.substr(found+1); + TmpSrc = TmpSrc.substr(0,found); + } - else - DefRel = _config->Find("APT::Default-Release"); - - pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc); + - if (found != string::npos && TmpSrc[found] == '=') - { - VerTag = TmpSrc.substr(found+1); - TmpSrc = TmpSrc.substr(0,found); - } - else if(!Pkg.end() && DefRel.empty() == false) ++ /* 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. */ ++ bool MatchSrcOnly = _config->FindB("APT::Get::Only-Source"); ++ const pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc); ++ if (MatchSrcOnly == false && Pkg.end() == 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++) ++ if(VerTag.empty() == false || DefRel.empty() == false) + { - for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; - VF++) ++ // 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++) + { - /* 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; - - if((VF.File().Archive() != 0 && VF.File().Archive() == DefRel) || - (VF.File().Codename() != 0 && VF.File().Codename() == DefRel)) ++ for (pkgCache::VerFileIterator VF = Ver.FileList(); ++ VF.end() == false; VF++) + { - pkgRecords::Parser &Parse = Recs.Lookup(VF); - VerTag = Parse.SourceVer(); - if (VerTag.empty()) - VerTag = Ver.VerStr(); - break; ++ /* 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; ++ ++ // We match against a concrete version (or a part of this version) ++ if (VerTag.empty() == false && strncmp(VerTag.c_str(), Ver.VerStr(), VerTag.size()) != 0) ++ continue; ++ ++ // or we match against a release ++ if(VerTag.empty() == false || ++ (VF.File().Archive() != 0 && VF.File().Archive() == DefRel) || ++ (VF.File().Codename() != 0 && VF.File().Codename() == DefRel)) ++ { ++ pkgRecords::Parser &Parse = Recs.Lookup(VF); ++ Src = Parse.SourcePkg(); ++ if (VerTag.empty() == true) ++ VerTag = Parse.SourceVer(); ++ break; ++ } + } + } ++ if (Src.empty() == true) ++ { ++ if (VerTag.empty() == false) ++ _error->Warning(_("Ignore unavailable version '%s' of package '%s'"), VerTag.c_str(), TmpSrc.c_str()); ++ else ++ _error->Warning(_("Ignore unavailable target release '%s' of package '%s'"), DefRel.c_str(), TmpSrc.c_str()); ++ VerTag.clear(); ++ DefRel.clear(); ++ } + } - } - - /* 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. */ - bool MatchSrcOnly = _config->FindB("APT::Get::Only-Source"); - if (MatchSrcOnly == false) - { - if (Pkg.end() == false) ++ if (VerTag.empty() == true && DefRel.empty() == true) + { ++ // if we don't have a version or default release, use the CandidateVer to find the Source + pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg); - if (Ver.end() == false) ++ if (Ver.end() == false) + { + pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList()); + Src = Parse.SourcePkg(); ++ VerTag = Parse.SourceVer(); + } - } ++ } ++ } ++ ++ if (Src.empty() == true) ++ Src = TmpSrc; ++ else ++ { ++ /* if we have a source pkg name, make sure to only search ++ for srcpkg names, otherwise apt gets confused if there ++ is a binary package "pkg1" and a source package "pkg1" ++ with the same name but that comes from different packages */ ++ MatchSrcOnly = true; ++ if (Src != TmpSrc) ++ { ++ ioprintf(c1out, _("Picking '%s' as source package instead of '%s'\n"), Src.c_str(), TmpSrc.c_str()); ++ } + } + + // The best hit + pkgSrcRecords::Parser *Last = 0; + unsigned long Offset = 0; + string Version; - bool IsMatch = false; + - // No source package name.. - if (Src.empty() == true) - Src = TmpSrc; - else - // if we have a source pkg name, make sure to only search - // for srcpkg names, otherwise apt gets confused if there - // is a binary package "pkg1" and a source package "pkg1" - // with the same name but that comes from different packages - MatchSrcOnly = true; - - // If we are matching by version then we need exact matches to be happy - if (VerTag.empty() == false) - IsMatch = true; - + /* Iterate over all of the hits, which includes the resulting + binary packages in the search */ + pkgSrcRecords::Parser *Parse; - SrcRecs.Restart(); - while ((Parse = SrcRecs.Find(Src.c_str(), MatchSrcOnly)) != 0) ++ while (true) + { - string Ver = Parse->Version(); - - // show name mismatches - if (IsMatch == true && Parse->Package() != Src) - ioprintf(c1out, _("No source package '%s' picking '%s' instead\n"), Src.c_str(), Parse->Package().c_str()); - - if (VerTag.empty() == false) ++ SrcRecs.Restart(); ++ while ((Parse = SrcRecs.Find(Src.c_str(), MatchSrcOnly)) != 0) + { - /* Don't want to fall through because we are doing exact version - matching. */ - if (Cache.VS().CmpVersion(VerTag,Ver) != 0) ++ const string Ver = Parse->Version(); ++ ++ // Ignore all versions which doesn't fit ++ if (VerTag.empty() == false && strncmp(VerTag.c_str(), Ver.c_str(), VerTag.size()) != 0) + continue; - - Last = Parse; - Offset = Parse->Offset(); - break; ++ ++ // Newer version or an exact match? Save the hit ++ if (Last == 0 || Cache.VS().CmpVersion(Version,Ver) < 0) { ++ Last = Parse; ++ Offset = Parse->Offset(); ++ Version = Ver; ++ } ++ ++ // was the version check above an exact match? If so, we don't need to look further ++ if (VerTag.empty() == false && VerTag.size() == Ver.size()) ++ break; + } - - // Newer version or an exact match - if (Last == 0 || Cache.VS().CmpVersion(Version,Ver) < 0 || - (Parse->Package() == Src && IsMatch == false)) - { - IsMatch = Parse->Package() == Src; - Last = Parse; - Offset = Parse->Offset(); - Version = Ver; - } ++ if (Last != 0 || VerTag.empty() == true) ++ break; ++ //if (VerTag.empty() == false && Last == 0) ++ _error->Warning(_("Ignore unavailable version '%s' of package '%s'"), VerTag.c_str(), TmpSrc.c_str()); ++ VerTag.clear(); + } - ++ + if (Last == 0 || Last->Jump(Offset) == false) + return 0; - ++ + return Last; } /*}}}*/ // DoUpdate - Update the package lists /*{{{*/ diff --combined debian/changelog index 60893ad75,82b08619d..24b166fd6 --- a/debian/changelog +++ b/debian/changelog @@@ -11,40 -11,6 +11,40 @@@ apt (0.7.25) UNRELEASED; urgency=lo Closes: #479997 * Polish translation update by Wiktor Wandachowicz Closes: #548571 + * German translation update by Holger Wansing + Closes: #551534 + * German translation of manpages by Chris Leick + Closes: #552606 + * Italian translation update by Milo Casagrande + Closes: #555797 + * Simplified Chinese translation update by Aron Xu + Closes: #558737 + * Slovak translation update by Ivan Masár + Closes: #559277 + + [ Michael Vogt ] + * apt-pkg/packagemanager.cc: + - add output about pre-depends configuring when debug::pkgPackageManager + is used + * methods/https.cc: + - fix incorrect use of CURLOPT_TIMEOUT, closes: #497983, LP: #354972 + thanks to Brian Thomason for the patch + * merge lp:~mvo/apt/netrc branch, this adds support for a + /etc/apt/auth.conf that can be used to store username/passwords + in a "netrc" style file (with the extension that it supports "/" + in a machine definition). Based on the maemo git branch (Closes: #518473) + (thanks also to Jussi Hakala and Julian Andres Klode) + * apt-pkg/deb/dpkgpm.cc: + - add "purge" to list of known actions + + [ Brian Murray ] + * apt-pkg/depcache.cc, apt-pkg/indexcopy.cc: + - typo fix (LP: #462328) + + [ Loïc Minier ] + * cmdline/apt-key: + - Emit a warning if removed keys keyring is missing and skip associated + checks (LP: #218971) [ David Kalnischkies ] * apt-pkg/packagemanager.cc: @@@ -58,6 -24,10 +58,10 @@@ - add note about additional apt-transport-methods * doc/apt-mark.8.xml: - correct showauto synopsis, thanks Andrew Schulman (Closes: #551440) + * cmdline/apt-get.cc: + - source should displays his final pkg pick (Closes: #249383, #550952) + - source doesn't need the complete version for match (Closes: #245250) + - source ignores versions/releases if not available (Closes: #377424) [ Julian Andres Klode ] * doc/apt.conf.5.xml: @@@ -66,10 -36,9 +70,10 @@@ - Restrict option names to alphanumerical characters and "/-:._+". - Deprecate #include, we have apt.conf.d nowadays which should be sufficient. - * methods/https.cc: - - Add support for authentication using netrc (Closes: #518473), patch - by Jussi Hakala . + * ftparchive/apt-ftparchive.cc: + - Call setlocale() so translations are actually used. + * debian/apt.conf.autoremove: + - Add kfreebsd-image-* to the list (Closes: #558803) -- Michael Vogt Tue, 29 Sep 2009 15:51:34 +0200