From 67070389f3752f6f23d1fb0c06bd963464aa8bca Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Thu, 22 Aug 2024 16:10:58 +0200 Subject: Implement 'Pin: source-version ' As wondered about by Paride some minutes ago. --- apt-pkg/policy.cc | 2 ++ apt-pkg/versionmatch.cc | 10 +++++++++- apt-pkg/versionmatch.h | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc index b1d8e7223..5d361af1a 100644 --- a/apt-pkg/policy.cc +++ b/apt-pkg/policy.cc @@ -452,6 +452,8 @@ bool ReadPinFile(pkgPolicy &Plcy,string File) pkgVersionMatch::MatchType Type; if (stringcasecmp(Start,Word,"version") == 0 && Name.empty() == false) Type = pkgVersionMatch::Version; + else if (stringcasecmp(Start,Word,"source-version") == 0 && Name.empty() == false) + Type = pkgVersionMatch::SourceVersion; else if (stringcasecmp(Start,Word,"release") == 0) Type = pkgVersionMatch::Release; else if (stringcasecmp(Start,Word,"origin") == 0) diff --git a/apt-pkg/versionmatch.cc b/apt-pkg/versionmatch.cc index f95232ac3..3af51e40c 100644 --- a/apt-pkg/versionmatch.cc +++ b/apt-pkg/versionmatch.cc @@ -42,7 +42,7 @@ pkgVersionMatch::pkgVersionMatch(string Data,MatchType Type) : Type(Type) return; // Cut up the version representation - if (Type == Version) + if (Type == Version || Type == SourceVersion) { if (Data.end()[-1] == '*') { @@ -177,6 +177,14 @@ pkgCache::VerIterator pkgVersionMatch::Find(pkgCache::PkgIterator Pkg) /* */ bool pkgVersionMatch::VersionMatches(pkgCache::VerIterator Ver) { + if (Type == SourceVersion) + { + if (MatchVer(Ver.SourceVerStr(),VerStr,VerPrefixMatch) == true) + return true; + if (ExpressionMatches(VerStr, Ver.SourceVerStr()) == true) + return true; + return false; + } if (Type == Version) { if (MatchVer(Ver.VerStr(),VerStr,VerPrefixMatch) == true) diff --git a/apt-pkg/versionmatch.h b/apt-pkg/versionmatch.h index faf1fd436..abaec08d6 100644 --- a/apt-pkg/versionmatch.h +++ b/apt-pkg/versionmatch.h @@ -62,7 +62,7 @@ class APT_PUBLIC pkgVersionMatch public: - enum MatchType {None = 0,Version,Release,Origin} Type; + enum MatchType {None = 0,Version,Release,Origin, SourceVersion} Type; bool MatchVer(const char *A,std::string B,bool Prefix) APT_PURE; static bool ExpressionMatches(const char *pattern, const char *string); -- cgit v1.2.3-70-g09d2