diff options
author | David Kalnischkies <kalnischkies@gmail.com> | 2009-05-07 12:04:21 +0200 |
---|---|---|
committer | David Kalnischkies <kalnischkies@gmail.com> | 2009-05-07 12:04:21 +0200 |
commit | efc487fbd46905f5f3efc4f31d7df15625bcbecf (patch) | |
tree | 97babac94cfdc1b9006aa493d96706ed904ae13c /apt-pkg | |
parent | 0365a8b90cd13a4010006c9cf087657dcf6dac7a (diff) |
[apt-pkg] allow also codenames for specifying a release
* MatchType::Release checks first for archive than for codename equality
* new n= option in apt_preference to be able to pin based on a codeName
Diffstat (limited to 'apt-pkg')
-rw-r--r-- | apt-pkg/cacheiterators.h | 1 | ||||
-rw-r--r-- | apt-pkg/deb/deblistparser.cc | 2 | ||||
-rw-r--r-- | apt-pkg/pkgcache.cc | 2 | ||||
-rw-r--r-- | apt-pkg/pkgcache.h | 1 | ||||
-rw-r--r-- | apt-pkg/versionmatch.cc | 37 | ||||
-rw-r--r-- | apt-pkg/versionmatch.h | 21 |
6 files changed, 43 insertions, 21 deletions
diff --git a/apt-pkg/cacheiterators.h b/apt-pkg/cacheiterators.h index 08eafca0f..63f9de8fc 100644 --- a/apt-pkg/cacheiterators.h +++ b/apt-pkg/cacheiterators.h @@ -333,6 +333,7 @@ class pkgCache::PkgFileIterator inline const char *Component() const {return File->Component == 0?0:Owner->StrP + File->Component;}; inline const char *Version() const {return File->Version == 0?0:Owner->StrP + File->Version;}; inline const char *Origin() const {return File->Origin == 0?0:Owner->StrP + File->Origin;}; + inline const char *Codename() const {return File->Codename ==0?0:Owner->StrP + File->Codename;}; inline const char *Label() const {return File->Label == 0?0:Owner->StrP + File->Label;}; inline const char *Site() const {return File->Site == 0?0:Owner->StrP + File->Site;}; inline const char *Architecture() const {return File->Architecture == 0?0:Owner->StrP + File->Architecture;}; diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc index 896d4d6d8..d8be66cba 100644 --- a/apt-pkg/deb/deblistparser.cc +++ b/apt-pkg/deb/deblistparser.cc @@ -637,6 +637,8 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator FileI, FileI->Version = WriteUniqString(Start,Stop - Start); if (Section.Find("Origin",Start,Stop) == true) FileI->Origin = WriteUniqString(Start,Stop - Start); + if (Section.Find("Codename",Start,Stop) == true) + FileI->Codename = WriteUniqString(Start,Stop - Start); if (Section.Find("Label",Start,Stop) == true) FileI->Label = WriteUniqString(Start,Stop - Start); if (Section.Find("Architecture",Start,Stop) == true) diff --git a/apt-pkg/pkgcache.cc b/apt-pkg/pkgcache.cc index 4fbf42c4b..f5303682c 100644 --- a/apt-pkg/pkgcache.cc +++ b/apt-pkg/pkgcache.cc @@ -607,6 +607,8 @@ string pkgCache::PkgFileIterator::RelStr() Res = Res + (Res.empty() == true?"o=":",o=") + Origin(); if (Archive() != 0) Res = Res + (Res.empty() == true?"a=":",a=") + Archive(); + if (Codename() != 0) + Res = Res + (Res.empty() == true?"n=":",n=") + Codename(); if (Label() != 0) Res = Res + (Res.empty() == true?"l=":",l=") + Label(); if (Component() != 0) diff --git a/apt-pkg/pkgcache.h b/apt-pkg/pkgcache.h index 759e9a225..af63443a6 100644 --- a/apt-pkg/pkgcache.h +++ b/apt-pkg/pkgcache.h @@ -223,6 +223,7 @@ struct pkgCache::PackageFile // Names map_ptrloc FileName; // Stringtable map_ptrloc Archive; // Stringtable + map_ptrloc Codename; // Stringtable map_ptrloc Component; // Stringtable map_ptrloc Version; // Stringtable map_ptrloc Origin; // Stringtable diff --git a/apt-pkg/versionmatch.cc b/apt-pkg/versionmatch.cc index 5c25c2f7b..b4d1d4696 100644 --- a/apt-pkg/versionmatch.cc +++ b/apt-pkg/versionmatch.cc @@ -63,8 +63,8 @@ pkgVersionMatch::pkgVersionMatch(string Data,MatchType Type) : Type(Type) if (isdigit(Data[0])) RelVerStr = Data; else - RelArchive = Data; - + RelRelease = Data; + if (RelVerStr.length() > 0 && RelVerStr.end()[-1] == '*') { RelVerPrefixMatch = true; @@ -87,19 +87,21 @@ pkgVersionMatch::pkgVersionMatch(string Data,MatchType Type) : Type(Type) { if (strlen(Fragments[J]) < 3) continue; - + if (stringcasecmp(Fragments[J],Fragments[J]+2,"v=") == 0) RelVerStr = Fragments[J]+2; else if (stringcasecmp(Fragments[J],Fragments[J]+2,"o=") == 0) RelOrigin = Fragments[J]+2; else if (stringcasecmp(Fragments[J],Fragments[J]+2,"a=") == 0) RelArchive = Fragments[J]+2; + else if (stringcasecmp(Fragments[J],Fragments[J]+2,"n=") == 0) + RelCodename = Fragments[J]+2; else if (stringcasecmp(Fragments[J],Fragments[J]+2,"l=") == 0) RelLabel = Fragments[J]+2; else if (stringcasecmp(Fragments[J],Fragments[J]+2,"c=") == 0) RelComponent = Fragments[J]+2; } - + if (RelVerStr.end()[-1] == '*') { RelVerPrefixMatch = true; @@ -169,15 +171,16 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File) { if (MatchAll == true) return true; - + /* cout << RelVerStr << ',' << RelOrigin << ',' << RelArchive << ',' << RelLabel << endl; cout << File.Version() << ',' << File.Origin() << ',' << File.Archive() << ',' << File.Label() << endl;*/ - + if (RelVerStr.empty() == true && RelOrigin.empty() == true && RelArchive.empty() == true && RelLabel.empty() == true && + RelRelease.empty() == true && RelCodename.empty() == true && RelComponent.empty() == true) return false; - + if (RelVerStr.empty() == false) if (File->Version == 0 || MatchVer(File.Version(),RelVerStr,RelVerPrefixMatch) == false) @@ -187,11 +190,19 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File) stringcasecmp(RelOrigin,File.Origin()) != 0) return false; if (RelArchive.empty() == false) - { - if (File->Archive == 0 || + if (File->Archive == 0 || stringcasecmp(RelArchive,File.Archive()) != 0) - return false; - } + return false; + if (RelCodename.empty() == false) + if (File->Codename == 0 || + stringcasecmp(RelCodename,File.Codename()) != 0) + return false; + if (RelRelease.empty() == false) + if ((File->Archive == 0 || + stringcasecmp(RelRelease,File.Archive()) != 0) && + (File->Codename == 0 || + stringcasecmp(RelRelease,File.Codename()) != 0)) + return false; if (RelLabel.empty() == false) if (File->Label == 0 || stringcasecmp(RelLabel,File.Label()) != 0) @@ -202,7 +213,7 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File) return false; return true; } - + if (Type == Origin) { if (OrSite.empty() == false) { @@ -213,7 +224,7 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File) return false; return (OrSite == File.Site()); /* both strings match */ } - + return false; } /*}}}*/ diff --git a/apt-pkg/versionmatch.h b/apt-pkg/versionmatch.h index fe264aa46..a8f3c84ac 100644 --- a/apt-pkg/versionmatch.h +++ b/apt-pkg/versionmatch.h @@ -3,29 +3,32 @@ // $Id: versionmatch.h,v 1.4 2001/05/29 03:07:12 jgg Exp $ /* ###################################################################### - Version Matching - + Version Matching + This module takes a matching string and a type and locates the version record that satisfies the constraint described by the matching string. Version: 1.2* Release: o=Debian,v=2.1*,c=main Release: v=2.1* + Release: a=testing + Release: n=squeeze Release: * Origin: ftp.debian.org - + Release may be a complex type that can specify matches for any of: Version (v= with prefix) Origin (o=) - Archive (a=) + Archive (a=) eg, unstable, testing, stable + Codename (n=) e.g. etch, lenny, squeeze, sid Label (l=) Component (c=) If there are no equals signs in the string then it is scanned in short - form - if it starts with a number it is Version otherwise it is an - Archive. - + form - if it starts with a number it is Version otherwise it is an + Archive or a Codename. + Release may be a '*' to match all releases. - + ##################################################################### */ /*}}}*/ #ifndef PKGLIB_VERSIONMATCH_H @@ -47,6 +50,8 @@ class pkgVersionMatch string RelVerStr; bool RelVerPrefixMatch; string RelOrigin; + string RelRelease; + string RelCodename; string RelArchive; string RelLabel; string RelComponent; |