Skip to content

Commit fd844eb

Browse files
authored
Various code simplification around dub.selections.json (dlang#2311)
* Deprecate unused Json constructor * Trivial: Fix import order in dub.project * Simplify DependencyResolver filtering DependencyResolver is only instantiated from one place, and never re-used. It makes more sense to set those variables in the constructor, and avoid repeatedly calling a single function. * Move file format to dub.selections.json to its own struct Our goal is to replace the handcrafted JSON code with configy.
1 parent 9ca1fa9 commit fd844eb

File tree

4 files changed

+57
-43
lines changed

4 files changed

+57
-43
lines changed

build-files.txt

+1
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,5 @@ source/dub/internal/vibecompat/inet/url.d
5151
source/dub/recipe/io.d
5252
source/dub/recipe/json.d
5353
source/dub/recipe/packagerecipe.d
54+
source/dub/recipe/selection.d
5455
source/dub/recipe/sdl.d

source/dub/dub.d

+11-15
Original file line numberDiff line numberDiff line change
@@ -549,11 +549,9 @@ class Dub {
549549
}
550550
}
551551

552-
Dependency[string] versions;
553-
auto resolver = new DependencyVersionResolver(this, options);
554-
foreach (p; packages_to_upgrade)
555-
resolver.addPackageToUpgrade(p);
556-
versions = resolver.resolve(m_project.rootPackage, m_project.selections);
552+
auto resolver = new DependencyVersionResolver(
553+
this, options, m_project.rootPackage, m_project.selections);
554+
Dependency[string] versions = resolver.resolve(packages_to_upgrade);
557555

558556
if (options & UpgradeOptions.dryRun) {
559557
bool any = false;
@@ -1509,22 +1507,20 @@ private class DependencyVersionResolver : DependencyResolver!(Dependency, Depend
15091507
}
15101508

15111509

1512-
this(Dub dub, UpgradeOptions options)
1510+
this(Dub dub, UpgradeOptions options, Package root, SelectedVersions selected_versions)
15131511
{
15141512
m_dub = dub;
15151513
m_options = options;
1514+
m_rootPackage = root;
1515+
m_selectedVersions = selected_versions;
15161516
}
15171517

1518-
void addPackageToUpgrade(string name)
1519-
{
1520-
m_packagesToUpgrade[name] = true;
1521-
}
1522-
1523-
Dependency[string] resolve(Package root, SelectedVersions selected_versions)
1518+
Dependency[string] resolve(string[] filter)
15241519
{
1525-
m_rootPackage = root;
1526-
m_selectedVersions = selected_versions;
1527-
return super.resolve(TreeNode(root.name, Dependency(root.version_)), (m_options & UpgradeOptions.printUpgradesOnly) == 0);
1520+
foreach (name; filter)
1521+
m_packagesToUpgrade[name] = true;
1522+
return super.resolve(TreeNode(m_rootPackage.name, Dependency(m_rootPackage.version_)),
1523+
(m_options & UpgradeOptions.printUpgradesOnly) == 0);
15281524
}
15291525

15301526
protected bool isFixedPackage(string pack)

source/dub/project.d

+30-28
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,23 @@ module dub.project;
1010
import dub.compilers.compiler;
1111
import dub.dependency;
1212
import dub.description;
13+
import dub.generators.generator;
1314
import dub.internal.utils;
1415
import dub.internal.vibecompat.core.file;
1516
import dub.internal.vibecompat.core.log;
1617
import dub.internal.vibecompat.data.json;
1718
import dub.internal.vibecompat.inet.path;
1819
import dub.package_;
1920
import dub.packagemanager;
20-
import dub.generators.generator;
21+
import dub.recipe.selection;
2122

2223
import std.algorithm;
2324
import std.array;
2425
import std.conv : to;
2526
import std.datetime;
27+
import std.encoding : sanitize;
2628
import std.exception : enforce;
2729
import std.string;
28-
import std.encoding : sanitize;
2930

3031
/**
3132
Represents a full project, a root package with its dependencies and package
@@ -1680,13 +1681,9 @@ unittest
16801681
"dub.selections.json" within a package's directory.
16811682
*/
16821683
final class SelectedVersions {
1683-
private struct Selected {
1684-
Dependency dep;
1685-
//Dependency[string] packages;
1686-
}
16871684
private {
16881685
enum FileVersion = 1;
1689-
Selected[string] m_selections;
1686+
Selected m_selections;
16901687
bool m_dirty = false; // has changes since last save
16911688
bool m_bare = true;
16921689
}
@@ -1695,13 +1692,17 @@ final class SelectedVersions {
16951692
enum defaultFile = "dub.selections.json";
16961693

16971694
/// Constructs a new empty version selection.
1698-
this() {}
1695+
public this(Selected data = Selected(FileVersion)) @safe pure nothrow @nogc
1696+
{
1697+
this.m_selections = data;
1698+
}
16991699

17001700
/** Constructs a new version selection from JSON data.
17011701
17021702
The structure of the JSON document must match the contents of the
17031703
"dub.selections.json" file.
17041704
*/
1705+
deprecated("Pass a `dub.recipe.selection : Selected` directly")
17051706
this(Json data)
17061707
{
17071708
deserialize(data);
@@ -1719,7 +1720,7 @@ final class SelectedVersions {
17191720
}
17201721

17211722
/// Returns a list of names for all packages that have a version selection.
1722-
@property string[] selectedPackages() const { return m_selections.keys; }
1723+
@property string[] selectedPackages() const { return m_selections.versions.keys; }
17231724

17241725
/// Determines if any changes have been made after loading the selections from a file.
17251726
@property bool dirty() const { return m_dirty; }
@@ -1730,48 +1731,49 @@ final class SelectedVersions {
17301731
/// Removes all selections.
17311732
void clear()
17321733
{
1733-
m_selections = null;
1734+
m_selections.versions = null;
17341735
m_dirty = true;
17351736
}
17361737

17371738
/// Duplicates the set of selected versions from another instance.
17381739
void set(SelectedVersions versions)
17391740
{
1740-
m_selections = versions.m_selections.dup;
1741+
m_selections.fileVersion = versions.m_selections.fileVersion;
1742+
m_selections.versions = versions.m_selections.versions.dup;
17411743
m_dirty = true;
17421744
}
17431745

17441746
/// Selects a certain version for a specific package.
17451747
void selectVersion(string package_id, Version version_)
17461748
{
1747-
if (auto ps = package_id in m_selections) {
1748-
if (ps.dep == Dependency(version_))
1749+
if (auto pdep = package_id in m_selections.versions) {
1750+
if (*pdep == Dependency(version_))
17491751
return;
17501752
}
1751-
m_selections[package_id] = Selected(Dependency(version_)/*, issuer*/);
1753+
m_selections.versions[package_id] = Dependency(version_);
17521754
m_dirty = true;
17531755
}
17541756

17551757
/// Selects a certain path for a specific package.
17561758
void selectVersion(string package_id, NativePath path)
17571759
{
1758-
if (auto ps = package_id in m_selections) {
1759-
if (ps.dep == Dependency(path))
1760+
if (auto pdep = package_id in m_selections.versions) {
1761+
if (*pdep == Dependency(path))
17601762
return;
17611763
}
1762-
m_selections[package_id] = Selected(Dependency(path));
1764+
m_selections.versions[package_id] = Dependency(path);
17631765
m_dirty = true;
17641766
}
17651767

17661768
/// Selects a certain Git reference for a specific package.
17671769
void selectVersionWithRepository(string package_id, Repository repository)
17681770
{
17691771
const dependency = Dependency(repository);
1770-
if (auto ps = package_id in m_selections) {
1771-
if (ps.dep == dependency)
1772+
if (auto pdep = package_id in m_selections.versions) {
1773+
if (*pdep == dependency)
17721774
return;
17731775
}
1774-
m_selections[package_id] = Selected(dependency);
1776+
m_selections.versions[package_id] = dependency;
17751777
m_dirty = true;
17761778
}
17771779

@@ -1784,14 +1786,14 @@ final class SelectedVersions {
17841786
/// Removes the selection for a particular package.
17851787
void deselectVersion(string package_id)
17861788
{
1787-
m_selections.remove(package_id);
1789+
m_selections.versions.remove(package_id);
17881790
m_dirty = true;
17891791
}
17901792

17911793
/// Determines if a particular package has a selection set.
17921794
bool hasSelectedVersion(string packageId)
17931795
const {
1794-
return (packageId in m_selections) !is null;
1796+
return (packageId in m_selections.versions) !is null;
17951797
}
17961798

17971799
/** Returns the selection for a particular package.
@@ -1804,7 +1806,7 @@ final class SelectedVersions {
18041806
Dependency getSelectedVersion(string packageId)
18051807
const {
18061808
enforce(hasSelectedVersion(packageId));
1807-
return m_selections[packageId].dep;
1809+
return m_selections.versions[packageId];
18081810
}
18091811

18101812
/** Stores the selections to disk.
@@ -1868,10 +1870,10 @@ final class SelectedVersions {
18681870
const {
18691871
Json json = serializeToJson(m_selections);
18701872
Json serialized = Json.emptyObject;
1871-
serialized["fileVersion"] = FileVersion;
1873+
serialized["fileVersion"] = m_selections.fileVersion;
18721874
serialized["versions"] = Json.emptyObject;
1873-
foreach (p, v; m_selections)
1874-
serialized["versions"][p] = dependencyToJson(v.dep);
1875+
foreach (p, dep; m_selections.versions)
1876+
serialized["versions"][p] = dependencyToJson(dep);
18751877
return serialized;
18761878
}
18771879

@@ -1880,7 +1882,7 @@ final class SelectedVersions {
18801882
enforce(cast(int)json["fileVersion"] == FileVersion, "Mismatched dub.select.json version: " ~ to!string(cast(int)json["fileVersion"]) ~ "vs. " ~to!string(FileVersion));
18811883
clear();
18821884
scope(failure) clear();
1883-
foreach (string p, v; json["versions"])
1884-
m_selections[p] = Selected(dependencyFromJson(v));
1885+
foreach (string p, dep; json["versions"])
1886+
m_selections.versions[p] = dependencyFromJson(dep);
18851887
}
18861888
}

source/dub/recipe/selection.d

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/**
2+
* Contains type definition for `dub.selections.json`
3+
*/
4+
module dub.recipe.selection;
5+
6+
import dub.dependency;
7+
8+
public struct Selected
9+
{
10+
/// The current version of the file format
11+
public uint fileVersion;
12+
13+
/// The selected package and their matching versions
14+
public Dependency[string] versions;
15+
}

0 commit comments

Comments
 (0)