Skip to content

Commit a9a568d

Browse files
committed
Dependency: Move spec / git ref inside of Repository
The `Dependency` struct is logically acting as an `enum`, with 3 discrete possibilities. However, some of the logic is piggybacking on the (original) version logic. `Repository` is one of them, and by separating things, we can make stronger assumptions in `Version` and `Dependency`.
1 parent e73d759 commit a9a568d

File tree

4 files changed

+66
-23
lines changed

4 files changed

+66
-23
lines changed

source/dub/dependency.d

+51-14
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,20 @@ struct Dependency {
9898
/** Constructs a new dependency specification that matches a specific
9999
Git reference.
100100
*/
101-
this(Repository repository, string spec) {
102-
this.versionSpec = spec;
101+
this(Repository repository)
102+
{
103103
this.repository = repository;
104+
// Set for backward compatibility
105+
auto ver = Version(repository.m_ref);
106+
this.m_range = VersionRange(ver, ver, true, true);
107+
}
108+
109+
deprecated("Instantiate the `Repository` struct with the string directy")
110+
this(Repository repository, string spec)
111+
{
112+
assert(repository.m_ref is null);
113+
repository.m_ref = spec;
114+
this(repository);
104115
}
105116

106117
/// If set, overrides any version based dependency selection.
@@ -112,6 +123,9 @@ struct Dependency {
112123
@property void repository(Repository value)
113124
{
114125
m_repository = value;
126+
// Set for backward compatibility
127+
auto ver = Version(value.m_ref);
128+
this.m_range = VersionRange(ver, ver, true, true);
115129
}
116130

117131
/// ditto
@@ -246,7 +260,7 @@ struct Dependency {
246260
}
247261

248262
@trusted unittest {
249-
Dependency dependency = Dependency(Repository("git+http://localhost"), "1.0.0");
263+
Dependency dependency = Dependency(Repository("git+http://localhost", "1.0.0"));
250264
Json expected = Json([
251265
"repository": Json("git+http://localhost"),
252266
"version": Json("1.0.0")
@@ -272,8 +286,8 @@ struct Dependency {
272286
enforce("version" in verspec, "No version field specified!");
273287
enforce(repository.length > 0, "No repository field specified!");
274288

275-
dep = Dependency(Repository(repository.get!string),
276-
verspec["version"].get!string);
289+
dep = Dependency(Repository(
290+
repository.get!string, verspec["version"].get!string));
277291
} else {
278292
enforce("version" in verspec, "No version field specified!");
279293
auto ver = verspec["version"].get!string;
@@ -606,6 +620,7 @@ unittest {
606620
struct Repository
607621
{
608622
private string m_remote;
623+
private string m_ref;
609624

610625
private Kind m_kind;
611626

@@ -617,18 +632,28 @@ struct Repository
617632
/**
618633
Params:
619634
remote = Repository remote.
635+
ref_ = Reference to use (SHA1, tag, branch name...)
620636
*/
637+
this(string remote, string ref_)
638+
{
639+
enforce(remote.startsWith("git+"), "Unsupported repository type");
640+
641+
m_remote = remote["git+".length .. $];
642+
m_kind = Kind.git;
643+
m_ref = ref_;
644+
assert(m_remote.length);
645+
assert(m_ref.length);
646+
}
647+
648+
/// Ditto
649+
deprecated("Use the constructor accepting a second parameter named `ref_`")
621650
this(string remote)
622651
{
623-
if (remote.startsWith("git+"))
624-
{
625-
m_remote = remote["git+".length .. $];
626-
m_kind = Kind.git;
627-
}
628-
else
629-
{
630-
throw new Exception("Unsupported repository type");
631-
}
652+
enforce(remote.startsWith("git+"), "Unsupported repository type");
653+
654+
m_remote = remote["git+".length .. $];
655+
m_kind = Kind.git;
656+
assert(m_remote.length);
632657
}
633658

634659
string toString() nothrow pure @safe
@@ -655,6 +680,18 @@ struct Repository
655680
return m_remote;
656681
}
657682

683+
/**
684+
Returns:
685+
The reference (commit hash, branch name, tag) we are targeting
686+
*/
687+
@property string ref_() @nogc nothrow pure @safe
688+
in { assert(m_remote !is null); }
689+
in { assert(m_ref !is null); }
690+
do
691+
{
692+
return m_ref;
693+
}
694+
658695
/**
659696
Returns:
660697
Repository type.

source/dub/dub.d

+1-1
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@ class Dub {
612612
if (!pack) fetch(p, ver, defaultPlacementLocation, fetchOpts, "getting selected version");
613613
if ((options & UpgradeOptions.select) && p != m_project.rootPackage.name) {
614614
if (!ver.repository.empty) {
615-
m_project.selections.selectVersionWithRepository(p, ver.repository, ver.versionSpec);
615+
m_project.selections.selectVersionWithRepository(p, ver.repository);
616616
} else if (ver.path.empty) {
617617
m_project.selections.selectVersion(p, ver.version_);
618618
} else {

source/dub/project.d

+10-4
Original file line numberDiff line numberDiff line change
@@ -1764,9 +1764,9 @@ final class SelectedVersions {
17641764
}
17651765

17661766
/// Selects a certain Git reference for a specific package.
1767-
void selectVersionWithRepository(string package_id, Repository repository, string spec)
1767+
void selectVersionWithRepository(string package_id, Repository repository)
17681768
{
1769-
const dependency = Dependency(repository, spec);
1769+
const dependency = Dependency(repository);
17701770
if (auto ps = package_id in m_selections) {
17711771
if (ps.dep == dependency)
17721772
return;
@@ -1775,6 +1775,12 @@ final class SelectedVersions {
17751775
m_dirty = true;
17761776
}
17771777

1778+
deprecated("Move `spec` inside of the `repository` parameter")
1779+
void selectVersionWithRepository(string package_id, Repository repository, string spec)
1780+
{
1781+
this.selectVersionWithRepository(package_id, Repository(repository.remote(), spec));
1782+
}
1783+
17781784
/// Removes the selection for a particular package.
17791785
void deselectVersion(string package_id)
17801786
{
@@ -1853,8 +1859,8 @@ final class SelectedVersions {
18531859
else if (j.type == Json.Type.object && "path" in j)
18541860
return Dependency(NativePath(j["path"].get!string));
18551861
else if (j.type == Json.Type.object && "repository" in j)
1856-
return Dependency(Repository(j["repository"].get!string),
1857-
enforce("version" in j, "Expected \"version\" field in repository version object").get!string);
1862+
return Dependency(Repository(j["repository"].get!string,
1863+
enforce("version" in j, "Expected \"version\" field in repository version object").get!string));
18581864
else throw new Exception(format("Unexpected type for dependency: %s", j));
18591865
}
18601866

source/dub/recipe/sdl.d

+4-4
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,8 @@ private void parseDependency(Tag t, ref BuildSettingsTemplate bs, string package
194194
} else if ("repository" in attrs) {
195195
enforceSDL("version" in attrs, "Missing version specification.", t);
196196

197-
dep.repository = Repository(attrs["repository"][0].value.get!string);
198-
dep.versionSpec = attrs["version"][0].value.get!string;
197+
dep.repository = Repository(attrs["repository"][0].value.get!string,
198+
attrs["version"][0].value.get!string);
199199
} else {
200200
enforceSDL("version" in attrs, "Missing version specification.", t);
201201
dep.versionSpec = attrs["version"][0].value.get!string;
@@ -672,8 +672,8 @@ unittest {
672672
PackageRecipe p;
673673
p.name = "test";
674674

675-
auto repository = Repository("git+https://some.url");
676-
p.buildSettings.dependencies["package"] = Dependency(repository, "12345678");
675+
auto repository = Repository("git+https://some.url", "12345678");
676+
p.buildSettings.dependencies["package"] = Dependency(repository);
677677
auto sdl = toSDL(p).toSDLDocument();
678678
assert(sdl ==
679679
`name "test"

0 commit comments

Comments
 (0)