diff --git a/source/dub/dependency.d b/source/dub/dependency.d index d8daee7..0f31bbe 100644 --- a/source/dub/dependency.d +++ b/source/dub/dependency.d @@ -117,6 +117,12 @@ m_versB = ver; } + this(Path path) + { + this(ANY_IDENT); + m_path = path; + } + @property void path(Path value) { m_path = value; } @property Path path() const { return m_path; } @property bool optional() const { return m_optional; } diff --git a/source/dub/dub.d b/source/dub/dub.d index ce6e56f..e4403c0 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -589,7 +589,7 @@ } class DependencyVersionResolver : DependencyResolver!(Dependency, Dependency) { - private { + protected { Dub m_dub; UpdateOptions m_options; Dependency[][string] m_packageVersions; diff --git a/source/dub/project.d b/source/dub/project.d index d701bd0..8070218 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -763,9 +763,9 @@ return ret.data; } -class SelectedVersions { +final class SelectedVersions { private struct Selected { - Version version_; + Dependency dep; //Dependency[string] packages; } private { @@ -777,6 +777,11 @@ this() {} + this(Json data) + { + deserialize(data); + } + this(Path path) { auto json = jsonFromFile(path); @@ -795,7 +800,12 @@ void selectVersion(string packageId, Version version_) { - m_selectedVersions[packageId] = Selected(version_/*, issuer*/); + m_selectedVersions[packageId] = Selected(Dependency(version_)/*, issuer*/); + } + + void selectVersion(string package_id, Path path) + { + m_selectedVersions[package_id] = Selected(Dependency(path)); } void deselectVersion(string package_id) @@ -811,7 +821,7 @@ Dependency selectedVersion(string packageId) const { enforce(hasSelectedVersion(packageId)); - return Dependency(m_selectedVersions[packageId].version_); + return m_selectedVersions[packageId].dep; } void save(Path path) @@ -822,14 +832,16 @@ file.writePrettyJsonString(json); } - private Json serialize() + Json serialize() const { Json json = serializeToJson(m_selectedVersions); Json serialized = Json.emptyObject; serialized.fileVersion = FileVersion; serialized.versions = Json.emptyObject; - foreach (p, v; m_selectedVersions) - serialized.versions[p] = v.version_.toString(); + foreach (p, v; m_selectedVersions) { + if (v.dep.path.empty) serialized.versions[p] = v.dep.version_.toString(); + else serialized.versions[p] = serializeToJson(["path": v.dep.path.toString()]); + } return serialized; } @@ -838,7 +850,12 @@ enforce(cast(int)json["fileVersion"] == FileVersion, "Mismatched dub.select.json version: " ~ to!string(cast(int)json["fileVersion"]) ~ "vs. " ~to!string(FileVersion)); clean(); scope(failure) clean(); - foreach (string p, v; json.versions) - m_selectedVersions[p] = Selected(Version(v.get!string)); + foreach (string p, v; json.versions) { + if (v.type == Json.Type.string) + m_selectedVersions[p] = Selected(Dependency(Version(v.get!string))); + else if (v.type == Json.Type.object) + m_selectedVersions[p] = Selected(Dependency(Path(v.path.get!string()))); + else throw new Exception("Unexpected type for dependency %s: %s", p, v.type); + } } }