[devel] [PATCH] apt virtual packages
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Вс Дек 17 16:43:40 MSK 2006
On Fri, Dec 15, 2006 at 04:25:03AM +0300, Alexey Tourbin wrote:
> On Fri, Dec 15, 2006 at 02:40:38AM +0300, Alexey Tourbin wrote:
> > Т.е. 2.4.4-alt2.1 в этом месте не видно вообще.
> > Соответственно, дальше, вероятно, стоит ковырять pkgVersionMatch::Find.
>
> Вот фикс, с которым будет выбираться не первая попавшаяся, а последняя
> попавшаяся версия. install python-devel=2.4 теперь работает (в том
> смысле, что установить можно только 2.4.4-alt2.1).
>
> --- apt-pkg/versionmatch.cc- 2006-12-15 01:11:52 +0000
> +++ apt-pkg/versionmatch.cc 2006-12-15 01:15:17 +0000
> @@ -205,10 +205,10 @@ pkgCache::VerIterator pkgVersionMatch::F
> if (VerPrefixMatch || (HasRelease && strchr(PrvVerStr, '-') == NULL))
> {
> if (MatchVer(PrvVerStr,VerStr,VerPrefixMatch) == true)
> - return Prv.OwnerVer();
> + Ver = Prv.OwnerVer();
> } else {
> if (VS->CheckDep(PrvVerStr,VerOp,VerStr.c_str()) == true)
> - return Prv.OwnerVer();
> + Ver = Prv.OwnerVer();
> }
> }
> }
>
> Впрочем install python-base=2.4.4-alt2 python-devel=2.4
> не работает ни так ни сяк.
Этот патч был неправильным, потому что версии в ProvidesList на самом
деле не отсортированы. Вот правильный вариант патча (прицеплен).
----------- следующая часть -----------
--- apt-0.5.15lorg2/apt-pkg/versionmatch.h- 2006-06-17 22:00:13 +0400
+++ apt-0.5.15lorg2/apt-pkg/versionmatch.h 2006-12-17 15:49:08 +0300
@@ -36,6 +36,7 @@
#endif
#include <string>
+#include <list>
#include <apt-pkg/pkgcache.h>
using std::string;
@@ -70,6 +71,7 @@
// CNC:2003-11-05
pkgVersionMatch(string Data,MatchType Type,int Op=pkgCache::Dep::Equals);
+ std::list<pkgCache::VerIterator> FindAll(pkgCache::PkgIterator Pkg);
};
#endif
--- apt-0.5.15lorg2/apt-pkg/versionmatch.cc- 2006-12-15 04:11:52 +0300
+++ apt-0.5.15lorg2/apt-pkg/versionmatch.cc 2006-12-17 16:38:44 +0300
@@ -164,11 +164,17 @@
// VersionMatch::Find - Locate the best match for the select type /*{{{*/
// ---------------------------------------------------------------------
/* */
-pkgCache::VerIterator pkgVersionMatch::Find(pkgCache::PkgIterator Pkg)
+static inline bool
+vercmpOrder(const pkgCache::VerIterator &a, const pkgCache::VerIterator &b)
+{
+ return a.CompareVer(b) < 0;
+}
+std::list<pkgCache::VerIterator> pkgVersionMatch::FindAll(pkgCache::PkgIterator Pkg)
{
// CNC:2003-11-05
pkgVersioningSystem *VS = Pkg.Cache()->VS;
pkgCache::VerIterator Ver = Pkg.VersionList();
+ std::list<pkgCache::VerIterator> found;
for (; Ver.end() == false; Ver++)
{
@@ -178,10 +184,10 @@
if (VerPrefixMatch)
{
if (MatchVer(Ver.VerStr(),VerStr,VerPrefixMatch) == true)
- return Ver;
+ found.push_back(Ver);
} else {
if (VS->CheckDep(Ver.VerStr(),VerOp,VerStr.c_str()) == true)
- return Ver;
+ found.push_back(Ver);
}
continue;
@@ -189,8 +195,11 @@
for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; VF++)
if (FileMatch(VF.File()) == true)
- return Ver;
+ found.push_back(Ver);
}
+
+ if (found.size() > 0)
+ goto done;
// CNC:2003-11-11 - Virtual package handling.
if (Type == Version)
@@ -205,15 +214,32 @@
if (VerPrefixMatch || (HasRelease && strchr(PrvVerStr, '-') == NULL))
{
if (MatchVer(PrvVerStr,VerStr,VerPrefixMatch) == true)
- return Prv.OwnerVer();
+ found.push_back(Prv.OwnerVer());
} else {
if (VS->CheckDep(PrvVerStr,VerOp,VerStr.c_str()) == true)
- return Prv.OwnerVer();
+ found.push_back(Prv.OwnerVer());
}
}
}
- // This will be Ended by now.
+done:
+ // best versions go first
+ found.sort(vercmpOrder);
+ found.unique();
+ found.reverse();
+ return found;
+}
+
+pkgCache::VerIterator pkgVersionMatch::Find(pkgCache::PkgIterator Pkg)
+{
+ std::list<pkgCache::VerIterator> found = FindAll(Pkg);
+ if (found.size() > 0)
+ return found.front();
+
+ // return "empty" iterator at its end
+ pkgCache::VerIterator Ver = Pkg.VersionList();
+ while (Ver.end() == false)
+ Ver++;
return Ver;
}
/*}}}*/
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20061217/03d4ce29/attachment-0001.bin>
Подробная информация о списке рассылки Devel