diff --git a/changelog/overrides_deprecated.dd b/changelog/overrides_deprecated.dd new file mode 100644 index 0000000..eaafbd0 --- /dev/null +++ b/changelog/overrides_deprecated.dd @@ -0,0 +1,9 @@ +The override system is deprecated + +Dub had an "override" system, allowing a specific version or version range +to be overriden by a specific package. +This override system was developed with a purely version-based approach in mind, +however since its inception, more ways to specify dependencies have been added, +making the override approach redundant and less flexible than other approaches. +From this release, dub will warn you if it finds an override file, +or when using the `dub add-override` / `dub remove-override` commands. diff --git a/source/dub/commandline.d b/source/dub/commandline.d index 94195cf..3d93c47 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -2191,13 +2191,19 @@ bool m_system = false; } + static immutable string DeprecationMessage = + "This command is deprecated. Use path based dependency, custom cache path, " ~ + "or edit `dub.selections.json` to achieve the same results."; + + this() @safe pure nothrow { this.name = "add-override"; this.argumentsPattern = " "; this.description = "Adds a new package override."; - this.helpText = [ - ]; + + this.hidden = true; + this.helpText = [ DeprecationMessage ]; } override void prepare(scope CommandArgs args) @@ -2209,6 +2215,7 @@ override int execute(Dub dub, string[] free_args, string[] app_args) { + logWarn(DeprecationMessage); enforceUsage(app_args.length == 0, "Unexpected application arguments."); enforceUsage(free_args.length == 3, "Expected three arguments, not "~free_args.length.to!string); auto scope_ = m_system ? PlacementLocation.system : PlacementLocation.user; @@ -2217,11 +2224,11 @@ if (existsFile(NativePath(free_args[2]))) { auto target = NativePath(free_args[2]); if (!target.absolute) target = NativePath(getcwd()) ~ target; - dub.packageManager.addOverride(scope_, pack, source, target); + dub.packageManager.addOverride_(scope_, pack, source, target); logInfo("Added override %s %s => %s", pack, source, target); } else { auto target = Version(free_args[2]); - dub.packageManager.addOverride(scope_, pack, source, target); + dub.packageManager.addOverride_(scope_, pack, source, target); logInfo("Added override %s %s => %s", pack, source, target); } return 0; @@ -2238,8 +2245,9 @@ this.name = "remove-override"; this.argumentsPattern = " "; this.description = "Removes an existing package override."; - this.helpText = [ - ]; + + this.hidden = true; + this.helpText = [ AddOverrideCommand.DeprecationMessage ]; } override void prepare(scope CommandArgs args) @@ -2251,11 +2259,12 @@ override int execute(Dub dub, string[] free_args, string[] app_args) { + logWarn(AddOverrideCommand.DeprecationMessage); enforceUsage(app_args.length == 0, "Unexpected application arguments."); enforceUsage(free_args.length == 2, "Expected two arguments, not "~free_args.length.to!string); auto scope_ = m_system ? PlacementLocation.system : PlacementLocation.user; auto source = VersionRange.fromString(free_args[1]); - dub.packageManager.removeOverride(scope_, free_args[0], source); + dub.packageManager.removeOverride_(scope_, free_args[0], source); return 0; } } @@ -2266,14 +2275,16 @@ this.name = "list-overrides"; this.argumentsPattern = ""; this.description = "Prints a list of all local package overrides"; - this.helpText = [ - "Prints a list of all overridden packages added via \"dub add-override\"." - ]; + + this.hidden = true; + this.helpText = [ AddOverrideCommand.DeprecationMessage ]; } override void prepare(scope CommandArgs args) {} override int execute(Dub dub, string[] free_args, string[] app_args) { - void printList(in PackageOverride[] overrides, string caption) + logWarn(AddOverrideCommand.DeprecationMessage); + + void printList(in PackageOverride_[] overrides, string caption) { if (overrides.length == 0) return; logInfoNoTag("# %s", caption); @@ -2281,8 +2292,8 @@ ovr.target.match!( t => logInfoNoTag("%s %s => %s", ovr.package_.color(Mode.bold), ovr.version_, t)); } - printList(dub.packageManager.getOverrides(PlacementLocation.user), "User wide overrides"); - printList(dub.packageManager.getOverrides(PlacementLocation.system), "System wide overrides"); + printList(dub.packageManager.getOverrides_(PlacementLocation.user), "User wide overrides"); + printList(dub.packageManager.getOverrides_(PlacementLocation.system), "System wide overrides"); return 0; } } diff --git a/source/dub/packagemanager.d b/source/dub/packagemanager.d index 443e765..2c072a4 100644 --- a/source/dub/packagemanager.d +++ b/source/dub/packagemanager.d @@ -491,8 +491,14 @@ /** Returns a list of all package overrides for the given scope. */ + deprecated(OverrideDepMsg) const(PackageOverride)[] getOverrides(PlacementLocation scope_) const { + return cast(typeof(return)) this.getOverrides_(scope_); + } + + package(dub) const(PackageOverride_)[] getOverrides_(PlacementLocation scope_) + const { return m_repositories[scope_].overrides; } @@ -513,15 +519,28 @@ } /// Ditto + deprecated(OverrideDepMsg) void addOverride(PlacementLocation scope_, string package_, VersionRange source, Version target) { - m_repositories[scope_].overrides ~= PackageOverride(package_, source, target); - m_repositories[scope_].writeOverrides(); + this.addOverride_(scope_, package_, source, target); } /// ditto + deprecated(OverrideDepMsg) void addOverride(PlacementLocation scope_, string package_, VersionRange source, NativePath target) { - m_repositories[scope_].overrides ~= PackageOverride(package_, source, target); + this.addOverride_(scope_, package_, source, target); + } + + // Non deprecated version that is used by `commandline`. Do not use! + package(dub) void addOverride_(PlacementLocation scope_, string package_, VersionRange source, Version target) + { + m_repositories[scope_].overrides ~= PackageOverride_(package_, source, target); + m_repositories[scope_].writeOverrides(); + } + // Non deprecated version that is used by `commandline`. Do not use! + package(dub) void addOverride_(PlacementLocation scope_, string package_, VersionRange source, NativePath target) + { + m_repositories[scope_].overrides ~= PackageOverride_(package_, source, target); m_repositories[scope_].writeOverrides(); } @@ -536,8 +555,14 @@ ); } + deprecated(OverrideDepMsg) void removeOverride(PlacementLocation scope_, string package_, VersionRange src) { + this.removeOverride_(scope_, package_, src); + } + + package(dub) void removeOverride_(PlacementLocation scope_, string package_, VersionRange src) + { Location* rep = &m_repositories[scope_]; foreach (i, ovr; rep.overrides) { if (ovr.package_ != package_ || ovr.source != src) @@ -838,9 +863,11 @@ } } -struct PackageOverride { - private alias ResolvedDep = SumType!(NativePath, Version); +deprecated(OverrideDepMsg) +alias PackageOverride = PackageOverride_; +package(dub) struct PackageOverride_ { + private alias ResolvedDep = SumType!(NativePath, Version); string package_; VersionRange source; ResolvedDep target; @@ -943,7 +970,7 @@ Package[] localPackages; /// List of overrides stored at this `Location` - PackageOverride[] overrides; + PackageOverride_[] overrides; this(NativePath path) @safe pure nothrow @nogc { @@ -955,8 +982,11 @@ this.overrides = null; auto ovrfilepath = this.packagePath ~ LocalOverridesFilename; if (existsFile(ovrfilepath)) { + logWarn("Found local override file: %s", ovrfilepath); + logWarn(OverrideDepMsg); + logWarn("Replace with a path-based dependency in your project or a custom cache path"); foreach (entry; jsonFromFile(ovrfilepath)) { - PackageOverride ovr; + PackageOverride_ ovr; ovr.package_ = entry["name"].get!string; ovr.source = VersionRange.fromString(entry["version"].get!string); if (auto pv = "targetVersion" in entry) ovr.target = Version(pv.get!string); @@ -1122,3 +1152,6 @@ logDiagnostic("Failed to enumerate %s packages: %s", path.toNativeString(), e.toString()); } } + +private immutable string OverrideDepMsg = + "Overrides are deprecated as they are redundant with more fine-grained approaches";