diff --git a/source/dub/dub.d b/source/dub/dub.d index 871df0f..69518ab 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -1021,13 +1021,11 @@ { import std.zip : ZipException; - auto path = getTempFile(name.main.toString(), ".zip"); - supplier.fetchPackage(path, name.main, range, (options & FetchOptions.usePrerelease) != 0); // Q: continue on fail? - scope(exit) removeFile(path); + auto data = supplier.fetchPackage(name.main, range, (options & FetchOptions.usePrerelease) != 0); // Q: continue on fail? logDiagnostic("Placing to %s...", location.toString()); try { - return m_packageManager.store(path, location, name.main, ver); + return m_packageManager.store(data, location, name.main, ver); } catch (ZipException e) { logInfo("Failed to extract zip archive for %s@%s...", name, ver); // re-throw the exception at the end of the loop diff --git a/source/dub/packagemanager.d b/source/dub/packagemanager.d index 7428120..987b457 100644 --- a/source/dub/packagemanager.d +++ b/source/dub/packagemanager.d @@ -738,7 +738,9 @@ deprecated("Use `store(NativePath source, PlacementLocation dest, string name, Version vers)`") Package storeFetchedPackage(NativePath zip_file_path, Json package_info, NativePath destination) { - return this.store_(zip_file_path, destination, + import dub.internal.vibecompat.core.file; + + return this.store_(readFile(zip_file_path), destination, PackageName(package_info["name"].get!string), Version(package_info["version"].get!string)); } @@ -776,6 +778,16 @@ { import dub.internal.vibecompat.core.file; + auto data = readFile(src); + return this.store(data, dest, name, vers); + } + + /// Ditto + Package store(ubyte[] data, PlacementLocation dest, + in PackageName name, in Version vers) + { + import dub.internal.vibecompat.core.file; + assert(!name.sub.length, "Cannot store a subpackage, use main package instead"); NativePath dstpath = this.getPackagePath(dest, name, vers.toString()); ensureDirectory(dstpath.parentPath()); @@ -787,26 +799,25 @@ if (this.existsFile(dstpath)) { return this.getPackage(name, vers, dest); } - return this.store_(src, dstpath, name, vers); + return this.store_(data, dstpath, name, vers); } /// Backward-compatibility for deprecated overload, simplify once `storeFetchedPatch` /// is removed - private Package store_(NativePath src, NativePath destination, + private Package store_(ubyte[] data, NativePath destination, in PackageName name, in Version vers) { import dub.internal.vibecompat.core.file; import std.range : walkLength; - logDebug("Placing package '%s' version '%s' to location '%s' from file '%s'", - name, vers, destination.toNativeString(), src.toNativeString()); + logDebug("Placing package '%s' version '%s' to location '%s'", + name, vers, destination.toNativeString()); enforce(!this.existsFile(destination), "%s (%s) needs to be removed from '%s' prior placement." .format(name, vers, destination)); - logDebug("Opening file %s", src); - ZipArchive archive = new ZipArchive(readFile(src)); + ZipArchive archive = new ZipArchive(data); logDebug("Extracting from zip."); // In a GitHub zip, the actual contents are in a sub-folder diff --git a/source/dub/packagesuppliers/fallback.d b/source/dub/packagesuppliers/fallback.d index 5145173..a2009d6 100644 --- a/source/dub/packagesuppliers/fallback.d +++ b/source/dub/packagesuppliers/fallback.d @@ -29,7 +29,7 @@ // Workaround https://issues.dlang.org/show_bug.cgi?id=2525 abstract override Version[] getVersions(in PackageName name); - abstract override void fetchPackage(in NativePath path, in PackageName name, in VersionRange dep, bool pre_release); + abstract override ubyte[] fetchPackage(in PackageName name, in VersionRange dep, bool pre_release); abstract override Json fetchPackageRecipe(in PackageName name, in VersionRange dep, bool pre_release); abstract override SearchResult[] searchPackages(string query); } diff --git a/source/dub/packagesuppliers/filesystem.d b/source/dub/packagesuppliers/filesystem.d index f671abf..657f4c2 100644 --- a/source/dub/packagesuppliers/filesystem.d +++ b/source/dub/packagesuppliers/filesystem.d @@ -44,15 +44,14 @@ return ret; } - override void fetchPackage(in NativePath path, in PackageName name, + override ubyte[] fetchPackage(in PackageName name, in VersionRange dep, bool pre_release) { - import dub.internal.vibecompat.core.file : copyFile, existsFile; - enforce(path.absolute); + import dub.internal.vibecompat.core.file : readFile, existsFile; logInfo("Storing package '%s', version requirements: %s", name.main, dep); auto filename = bestPackageFile(name, dep, pre_release); enforce(existsFile(filename)); - copyFile(filename, path); + return readFile(filename); } override Json fetchPackageRecipe(in PackageName name, in VersionRange dep, diff --git a/source/dub/packagesuppliers/maven.d b/source/dub/packagesuppliers/maven.d index 18b8bba..bb0a019 100644 --- a/source/dub/packagesuppliers/maven.d +++ b/source/dub/packagesuppliers/maven.d @@ -47,21 +47,20 @@ return ret; } - override void fetchPackage(in NativePath path, in PackageName name, + override ubyte[] fetchPackage(in PackageName name, in VersionRange dep, bool pre_release) { import std.format : format; auto md = getMetadata(name.main); Json best = getBestPackage(md, name.main, dep, pre_release); if (best.type == Json.Type.null_) - return; + return null; auto vers = best["version"].get!string; auto url = m_mavenUrl ~ NativePath( "%s/%s/%s-%s.zip".format(name.main, vers, name.main, vers)); try { - retryDownload(url, path, 3, httpTimeout); - return; + return retryDownload(url, 3, httpTimeout); } catch(HTTPStatusException e) { if (e.status == 404) throw e; diff --git a/source/dub/packagesuppliers/packagesupplier.d b/source/dub/packagesuppliers/packagesupplier.d index 63d83b7..fd7e40d 100644 --- a/source/dub/packagesuppliers/packagesupplier.d +++ b/source/dub/packagesuppliers/packagesupplier.d @@ -32,17 +32,25 @@ Version[] getVersions(in PackageName name); - /** Downloads a package and stores it as a ZIP file. + /** Downloads a package and returns its binary content Params: - path = Absolute path of the target ZIP file name = Name of the package to retrieve dep = Version constraint to match against pre_release = If true, matches the latest pre-release version. Otherwise prefers stable versions. */ - void fetchPackage(in NativePath path, in PackageName name, - in VersionRange dep, bool pre_release); + ubyte[] fetchPackage(in PackageName name, in VersionRange dep, + bool pre_release); + + deprecated("Use `writeFile(path, fetchPackage(PackageName, VersionRange, bool))` instead") + final void fetchPackage(in NativePath path, in PackageName name, + in VersionRange dep, bool pre_release) + { + import dub.internal.vibecompat.core.file : writeFile; + if (auto res = this.fetchPackage(name, dep, pre_release)) + writeFile(path, res); + } deprecated("Use `fetchPackage(NativePath, PackageName, VersionRange, bool)` instead") final void fetchPackage(NativePath path, string name, Dependency dep, bool pre_release) diff --git a/source/dub/packagesuppliers/registry.d b/source/dub/packagesuppliers/registry.d index c46932e..9ba9ccc 100644 --- a/source/dub/packagesuppliers/registry.d +++ b/source/dub/packagesuppliers/registry.d @@ -66,17 +66,15 @@ return ret; } - override void fetchPackage(in NativePath path, in PackageName name, + override ubyte[] fetchPackage(in PackageName name, in VersionRange dep, bool pre_release) { import std.format : format; auto url = genPackageDownloadUrl(name, dep, pre_release); - if(url.isNull) - return; + if(url.isNull) return null; try { - retryDownload(url.get, path); - return; + return retryDownload(url.get); } catch(HTTPStatusException e) { if (e.status == 404) throw e; diff --git a/source/dub/test/base.d b/source/dub/test/base.d index c3c2eb4..17fcb6b 100644 --- a/source/dub/test/base.d +++ b/source/dub/test/base.d @@ -510,7 +510,7 @@ } /// - public override void fetchPackage(in NativePath path, in PackageName name, + public override ubyte[] fetchPackage(in PackageName name, in VersionRange dep, bool pre_release) { assert(0, "%s - fetchPackage not implemented for: %s"