diff --git a/source/dub/commandline.d b/source/dub/commandline.d index 3286105..0f7e1dc 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -559,17 +559,9 @@ p.copyright = input("Copyright string", copyrightString); while (true) { - auto depname = input("Add dependency (leave empty to skip)", null); - if (!depname.length) break; - try { - auto ver = dub.getLatestVersion(depname); - auto dep = ver.isBranch ? Dependency(ver) : Dependency("~>" ~ ver.toString()); - p.buildSettings.dependencies[depname] = dep; - logInfo("Added dependency %s %s", depname, dep.versionSpec); - } catch (Exception e) { - logError("Could not find package '%s'.", depname); - logDebug("Full error: %s", e.toString().sanitize); - } + auto depspec = input("Add dependency (leave empty to skip)", null); + if (!depspec.length) break; + addDependency(dub, p, depspec); } } @@ -1173,32 +1165,14 @@ enforceUsage(free_args.length != 0, "Expected one or more arguments."); enforceUsage(app_args.length == 0, "Unexpected application arguments."); - string filetype = existsFile(dub.rootPath ~ "dub.json") ? "json" : "sdl"; - foreach (depname; free_args) { - try { - Dependency dep; - auto parts = depname.findSplit("="); - if (!parts[1].empty) - { - depname = parts[0]; - dep = Dependency(parts[2]); - } - else - { - auto ver = dub.getLatestVersion(depname); - dep = ver.isBranch ? Dependency(ver) : Dependency("~>" ~ ver.toString()); - } - auto pkg = readPackageRecipe(dub.rootPath ~ ("dub." ~ filetype)); + if (!loadCwdPackage(dub, true)) return 1; + auto recipe = dub.project.rootPackage.rawRecipe.clone; - pkg.buildSettings.dependencies[depname] = dep; - writePackageRecipe(dub.rootPath ~ ("dub." ~ filetype), pkg); - - logInfo("Added dependency %s %s", depname, dep.versionSpec); - } catch (Exception e) { - logError("Could not find package '%s'.", depname); - logDebug("Full error: %s", e.toString().sanitize); - } + foreach (depspec; free_args) { + if (!addDependency(dub, recipe, depspec)) + return 1; } + writePackageRecipe(dub.project.rootPackage.recipePath, recipe); return 0; } @@ -2161,3 +2135,27 @@ { logWarn("The '%s' Command was renamed to '%s'. Please update your scripts.", prev, curr); } + +private bool addDependency(Dub dub, ref PackageRecipe recipe, string depspec) +{ + Dependency dep; + // split = + auto parts = depspec.findSplit("="); + auto depname = parts[0]; + if (!parts[1].empty) + dep = Dependency(parts[2]); + else + { + try { + auto ver = dub.getLatestVersion(depname); + dep = ver.isBranch ? Dependency(ver) : Dependency("~>" ~ ver.toString()); + } catch (Exception e) { + logError("Could not find package '%s'.", depname); + logDebug("Full error: %s", e.toString().sanitize); + return false; + } + } + recipe.buildSettings.dependencies[depname] = dep; + logInfo("Adding dependency %s %s", depname, dep.versionSpec); + return true; +} diff --git a/test/issue1574-addcommand.sh b/test/issue1574-addcommand.sh index 647a0fd..002acb1 100755 --- a/test/issue1574-addcommand.sh +++ b/test/issue1574-addcommand.sh @@ -28,3 +28,9 @@ $DUB add gitcompatibledubpackage=1.0.2 non-existing-issue1574-pkg='~>9.8.7' --skip-registry=all grep -q '"gitcompatibledubpackage"\s*:\s*"1\.0\.2"' dub.json grep -q '"non-existing-issue1574-pkg"\s*:\s*"~>9\.8\.7"' dub.json +if $DUB add foo=1.2.3 gitcompatibledubpackage='~>a.b.c' --skip-registry=all; then + die $LINENO 'Adding non-semver spec should error' +fi +if grep -q '"foo"' dub.json; then + die $LINENO 'Failing add command should not write recipe file' +fi