diff --git a/source/dub/commandline.d b/source/dub/commandline.d index 342ec69..132e7c9 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -423,20 +423,17 @@ p.copyright = input("Copyright string", p.copyright); while (true) { - auto dep = input("Add dependency (leave empty to skip)", null); - if (!dep.length) break; - auto vers = dub.listPackageVersions(dep); - if (!vers.length) { - logError("Could not find package '%s'.", dep); - continue; + 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.versionString); + } catch (Exception e) { + logError("Could not find package '%s'.", depname); + logDebug("Full error: %s", e.toString().sanitize); } - string vstr; - auto final_versions = vers.filter!(v => !v.isBranch && !v.isBranch).array; - if (final_versions.length) vstr = "~>" ~ final_versions[$-1].toString(); - else if (vers[$-1].isBranch) vstr = vers[$-1].toString(); - else vstr = "~>" ~ vers[$-1].toString(); - p.buildSettings.dependencies[dep] = Dependency(vstr); - logInfo("Added dependency %s %s", dep, vstr); } } diff --git a/source/dub/dub.d b/source/dub/dub.d index 9810643..eec2ce1 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -702,6 +702,14 @@ .filter!(t => t[1].length); } + /** Returns a list of all available versions (including branches) for a + particular package. + + The list returned is based on the registered package suppliers. Local + packages are not queried in the search for versions. + + See_also: `getLatestVersion` + */ Version[] listPackageVersions(string name) { Version[] versions; @@ -714,6 +722,29 @@ return versions.sort().uniq.array; } + /** Returns the latest available version for a particular package. + + This function returns the latest numbered version of a package. If no + numbered versions are available, it will return an available branch, + preferring "~master". + + Params: + package_name: The name of the package in question. + prefer_stable: If set to `true` (the default), returns the latest + stable version, even if there are newer pre-release versions. + + See_also: `listPackageVersions` + */ + Version getLatestVersion(string package_name, bool prefer_stable = true) + { + auto vers = listPackageVersions(package_name); + enforce(!vers.empty, "Failed to find any valid versions for a package name of '"~package_name~"'."); + auto final_versions = vers.filter!(v => !v.isBranch && !v.isPreRelease).array; + if (prefer_stable && final_versions.length) return final_versions[$-1]; + else if (vers[$-1].isBranch) return vers[$-1]; + else return vers[$-1]; + } + void createEmptyPackage(Path path, string[] deps, string type, PackageFormat format = PackageFormat.sdl, scope void delegate(ref PackageRecipe) recipe_callback = null) { if (!path.absolute) path = m_rootPath ~ path; @@ -721,15 +752,16 @@ string[string] depVers; string[] notFound; // keep track of any failed packages in here - foreach(dep; deps){ - auto vers = listPackageVersions(dep); - if (vers.length == 0) notFound ~= dep; - else { - auto v = vers[$-1]; - if (v.isBranch()) depVers[dep] = v.toString(); - else depVers[dep] = "~>" ~ v.toString(); + foreach (dep; deps) { + Version ver; + try { + ver = getLatestVersion(dep); + depVers[dep] = ver.isBranch ? ver.toString() : "~>" ~ ver.toString(); + } catch (Exception e) { + notFound ~= dep; } } + if(notFound.length > 1){ throw new Exception(.format("Couldn't find packages: %-(%s, %).", notFound)); }