diff --git a/changelog/add-ability-for-specify-version-range-for-commandline-commands.dd b/changelog/add-ability-for-specify-version-range-for-commandline-commands.dd new file mode 100644 index 0000000..72ca62a --- /dev/null +++ b/changelog/add-ability-for-specify-version-range-for-commandline-commands.dd @@ -0,0 +1,10 @@ +All commands now accept a version specification + +Before this release dub could only get an exact version for some commands +(`describe`, `generate`, `fetch`, etc...). All commands now accept a version specification, +such as can be found in `dub.json` / `dub.sdl`: + + dub fetch 'foo@>0.2.0' + dub describe foo@'>=0.3.0 <1.0.0' + +Note that commands such as `describe` will still not fetch from the network. diff --git a/source/dub/commandline.d b/source/dub/commandline.d index f827eff..04f5d69 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -991,11 +991,10 @@ protected void setupVersionPackage(Dub dub, string str_package_info, string default_build_type = "debug") { PackageAndVersion package_info = splitPackageName(str_package_info); - Version ver = package_info.version_.length ? Version(package_info.version_) : Version.unknown; - setupPackage(dub, package_info.name, default_build_type, ver); + setupPackage(dub, package_info.name, default_build_type, package_info.version_); } - protected void setupPackage(Dub dub, string package_name, string default_build_type = "debug", Version ver = Version.unknown) + protected void setupPackage(Dub dub, string package_name, string default_build_type = "debug", string ver = "") { if (!m_compilerName.length) m_compilerName = dub.defaultCompiler; if (!m_arch.length) m_arch = dub.defaultArchitecture; @@ -1039,7 +1038,7 @@ } } - private bool loadSpecificPackage(Dub dub, string package_name, Version ver) + private bool loadSpecificPackage(Dub dub, string package_name, string ver) { if (m_single) { enforce(package_name.length, "Missing file name of single-file package."); @@ -1061,12 +1060,12 @@ enforce(package_name.length, "No valid root package found - aborting."); - auto pack = ver.isUnknown + auto pack = ver == "" ? dub.packageManager.getLatestPackage(package_name) - : dub.packageManager.getPackage(package_name, ver); + : dub.packageManager.getBestPackage(package_name, ver); enforce(pack, format!"Failed to find a package named '%s%s' locally."(package_name, - ver.isUnknown ? "" : "@" ~ ver.toString() + ver == "" ? "" : ("@" ~ ver) )); logInfo("Building package %s in %s", pack.name, pack.path.toNativeString()); dub.loadPackage(pack); diff --git a/test/version-spec.sh b/test/version-spec.sh index 154b168..8d0677f 100755 --- a/test/version-spec.sh +++ b/test/version-spec.sh @@ -9,6 +9,13 @@ [[ $($DUB describe foo@1.0.0 | grep path | head -n 1) == *"/newfoo/"* ]] [[ $($DUB describe foo@0.1.0 | grep path | head -n 1) == *"/oldfoo/"* ]] +[[ $($DUB describe foo@'<1.0.0' | grep path | head -n 1) == *"/oldfoo/"* ]] +[[ $($DUB describe foo@'>0.1.0' | grep path | head -n 1) == *"/newfoo/"* ]] +[[ $($DUB describe foo@'>0.2.0' | grep path | head -n 1) == *"/newfoo/"* ]] +[[ $($DUB describe foo@'<=0.2.0' | grep path | head -n 1) == *"/oldfoo/"* ]] +[[ $($DUB describe foo@'*' | grep path | head -n 1) == *"/newfoo/"* ]] +[[ $($DUB describe foo@'>0.0.1 <2.0.0' | grep path | head -n 1) == *"/newfoo/"* ]] + [[ $($DUB test foo | head -n 1) == *"/newfoo/" ]] [[ $($DUB test foo@1.0.0 | head -n 1) == *"/newfoo/" ]] [[ $($DUB test foo@0.1.0 | head -n 1) == *"/oldfoo/" ]]