diff --git a/source/dub/dependency.d b/source/dub/dependency.d index 6ff7dbd..0fedb97 100644 --- a/source/dub/dependency.d +++ b/source/dub/dependency.d @@ -475,11 +475,11 @@ /** Tests if the specification matches a specific version. */ - bool matches(string vers) const { return matches(Version(vers)); } + bool matches(string vers, VersionMatchMode mode = VersionMatchMode.standard) const { return matches(Version(vers), mode); } /// ditto - bool matches(const(Version) v) const { return matches(v); } + bool matches(const(Version) v, VersionMatchMode mode = VersionMatchMode.standard) const { return matches(v, mode); } /// ditto - bool matches(ref const(Version) v) const { + bool matches(ref const(Version) v, VersionMatchMode mode = VersionMatchMode.standard) const { if (this.matchesAny) return true; if (this.isSCM) return true; //logDebug(" try match: %s with: %s", v, this); @@ -494,6 +494,9 @@ return false; if( !doCmp(m_inclusiveB, v, m_versB) ) return false; + if (this.isExactVersion && mode == VersionMatchMode.strict + && this.version_.toString != v.toString) + return false; return true; } @@ -713,6 +716,13 @@ assert(a.merge(b) == b); assert(b.merge(a) == b); + assert(Dependency("1.0.0").matches(Version("1.0.0+foo"))); + assert(Dependency("1.0.0").matches(Version("1.0.0+foo"), VersionMatchMode.standard)); + assert(!Dependency("1.0.0").matches(Version("1.0.0+foo"), VersionMatchMode.strict)); + assert(Dependency("1.0.0+foo").matches(Version("1.0.0+foo"), VersionMatchMode.strict)); + assert(Dependency("~>1.0.0+foo").matches(Version("1.0.0+foo"), VersionMatchMode.strict)); + assert(Dependency("~>1.0.0").matches(Version("1.0.0+foo"), VersionMatchMode.strict)); + logDebug("Dependency unittest success."); } diff --git a/source/dub/packagemanager.d b/source/dub/packagemanager.d index c0a9533..fdcfa4b 100644 --- a/source/dub/packagemanager.d +++ b/source/dub/packagemanager.d @@ -316,9 +316,11 @@ Package getBestPackage(string name, Dependency version_spec, bool enable_overrides = true) { Package ret; - foreach (p; getPackageIterator(name)) - if (version_spec.matches(p.version_) && (!ret || p.version_ > ret.version_)) + foreach (p; getPackageIterator(name)) { + auto vmm = isManagedPackage(p) ? VersionMatchMode.strict : VersionMatchMode.standard; + if (version_spec.matches(p.version_, vmm) && (!ret || p.version_ > ret.version_)) ret = p; + } if (enable_overrides && ret) { if (auto ovr = getPackage(name, ret.version_))