const Output = @import("../global.zig").Output; const strings = @import("../string_immutable.zig"); const string = @import("../string_types.zig").string; const Resolution = @import("./resolution.zig").Resolution; const FileSystem = @import("../fs.zig").FileSystem; const Semver = @import("./semver.zig"); const Integrity = @import("./integrity.zig").Integrity; const PackageID = @import("./install.zig").PackageID; const PackageManager = @import("./install.zig").PackageManager; const std = @import("std"); const Npm = @import("./npm.zig"); const ExtractTarball = @This(); const default_allocator = @import("../global.zig").default_allocator; const Global = @import("../global.zig").Global; name: strings.StringOrTinyString, resolution: Resolution, registry: string, cache_dir: string, package_id: PackageID, extracted_file_count: usize = 0, skip_verify: bool = false, integrity: Integrity = Integrity{}, pub inline fn run(this: ExtractTarball, bytes: []const u8) !string { if (!this.skip_verify and this.integrity.tag.isSupported()) { if (!this.integrity.verify(bytes)) { Output.prettyErrorln("Integrity check failed for tarball: {s}", .{this.name.slice()}); Output.flush(); return error.IntegrityCheckFailed; } } return this.extract(bytes); } pub fn buildURL( registry_: string, full_name_: strings.StringOrTinyString, version: Semver.Version, string_buf: []const u8, ) !string { return try buildURLWithPrinter( registry_, full_name_, version, string_buf, @TypeOf(FileSystem.instance.dirname_store), string, anyerror, FileSystem.instance.dirname_store, FileSystem.DirnameStore.print, ); } pub fn buildURLWithWriter( comptime Writer: type, writer: Writer, registry_: string, full_name_: strings.StringOrTinyString, version: Semver.Version, string_buf: []const u8, ) !void { const Printer = struct { writer: Writer, pub fn print(this: @This(), comptime fmt: string, args: anytype) Writer.Error!void { return try std.fmt.format(this.writer, fmt, args); } }; return try buildURLWithPrinter( registry_, full_name_, version, string_buf, Printer, void, Writer.Error, Printer{ .writer = writer, }, Printer.print, ); } pub fn buildURLWithPrinter( registry_: string, full_name_: strings.StringOrTinyString, version: Semver.Version, string_buf: []const u8, comptime PrinterContext: type, comptime ReturnType: type, comptime ErrorType: type, printer: PrinterContext, comptime print: fn (ctx: PrinterContext, comptime str: string, args: anytype) ErrorType!ReturnType, ) ErrorType!ReturnType { const registry = std.mem.trimRight(u8, registry_, "/"); const full_name = full_name_.slice(); var name = full_name; if (name[0] == '@') { if (std.mem.indexOfScalar(u8, name, '/')) |i| { name = name[i + 1 ..]; } } const default_format = "{s}/{s}/-/"; if (!version.tag.hasPre() and !version.tag.hasBuild()) { const args = .{ registry, full_name, name, version.major, version.minor, version.patch }; return try print( printer, default_format ++ "{s}-{d}.{d}.{d}.tgz", args, ); } else if (version.tag.hasPre() and version.tag.hasBuild()) { const args = .{ registry, full_name, name, version.major, version.minor, version.patch, version.tag.pre.slice(string_buf), version.tag.build.slice(string_buf) }; return try print( printer, default_format ++ "{s}-{d}.{d}.{d}-{s}+{s}.tgz", args, ); } else if (version.tag.hasPre()) { const args = .{ registry, full_name, name, version.major, version.minor, version.patch, version.tag.pre.slice(string_buf) }; return try print( printer, default_format ++ "{s}-{d}.{d}.{d}-{s}.tgz", args, ); } else if (version.tag.hasBuild()) { const args = .{ registry, full_name, name, version.major, version.minor, version.patch, version.tag.build.slice(string_buf) }; return try print( printer, default_format ++ "{s}-{d}.{d}.{d}+{s}.tgz", args, ); } else { unreachable; } } threadlocal var abs_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined; threadlocal var abs_buf2: [std.fs.MAX_PATH_BYTES]u8 = undefined; fn extract(this: *const ExtractTarball, tgz_bytes: []const u8) !string { var tmpdir = FileSystem.instance.tmpdir(); var tmpname_buf: [128]u8 = undefined; const name = this.name.slice(); var basename = this.name.slice(); if (basename[0] == '@') { if (std.mem.indexOfScalar(u8, basename, '/')) |i| { basename = basename[i + 1 ..]; } } var tmpname = try FileSystem.instance.tmpname(basename, &tmpname_buf, tgz_bytes.len); var cache_dir = tmpdir.makeOpenPath(std.mem.span(tmpname), .{ .iterate = true }) catch |err| { Output.panic("err: {s} when create temporary directory named {s} (while extracting {s})", .{ @errorName(err), tmpname, name }); }; var temp_destination = std.os.getFdPath(cache_dir.fd, &abs_buf) catch |err| { Output.panic("err: {s} when resolve path for temporary directory named {s} (while extracting {s})", .{ @errorName(err), tmpname, name }); }; cache_dir.close(); if (PackageManager.verbose_install) { Output.prettyErrorln("[{s}] Start extracting {s}", .{ name, tmpname }); Output.flush(); } const Archive = @import("../libarchive/libarchive.zig").Archive; const Zlib = @import("../zlib.zig"); var zlib_pool = Npm.Registry.BodyPool.get(default_allocator); zlib_pool.data.reset(); defer Npm.Registry.BodyPool.release(zlib_pool); var zlib_entry = try Zlib.ZlibReaderArrayList.init(tgz_bytes, &zlib_pool.data.list, default_allocator); zlib_entry.readAll() catch |err| { Output.prettyErrorln( "Error {s} decompressing {s}", .{ @errorName(err), name, }, ); Output.flush(); Global.crash(); }; const extracted_file_count = if (PackageManager.verbose_install) try Archive.extractToDisk( zlib_pool.data.list.items, temp_destination, null, void, void{}, // for npm packages, the root dir is always "package" 1, true, true, ) else try Archive.extractToDisk( zlib_pool.data.list.items, temp_destination, null, void, void{}, // for npm packages, the root dir is always "package" 1, true, false, ); if (PackageManager.verbose_install) { Output.prettyErrorln( "[{s}] Extracted", .{ name, }, ); Output.flush(); } var folder_name = PackageManager.cachedNPMPackageFolderNamePrint(&abs_buf2, name, this.resolution.value.npm); if (folder_name.len == 0 or (folder_name.len == 1 and folder_name[0] == '/')) @panic("Tried to delete root and stopped it"); PackageManager.instance.cache_directory.deleteTree(folder_name) catch {}; // e.g. @next // if it's a namespace package, we need to make sure the @name folder exists if (basename.len != name.len) { PackageManager.instance.cache_directory.makeDir(std.mem.trim(u8, name[0 .. name.len - basename.len], "/")) catch {}; } // Now that we've extracted the archive, we rename. std.os.renameatZ(tmpdir.fd, tmpname, PackageManager.instance.cache_directory.fd, folder_name) catch |err| { Output.prettyErrorln( "Error {s} moving {s} to cache dir:\n From: {s} To: {s}", .{ @errorName(err), name, tmpname, folder_name, }, ); Output.flush(); Global.crash(); }; // We return a resolved absolute absolute file path to the cache dir. // To get that directory, we open the directory again. var final_dir = PackageManager.instance.cache_directory.openDirZ(folder_name, .{ .iterate = true }) catch |err| { Output.prettyErrorln( "Error {s} failed to verify cache dir for {s}", .{ @errorName(err), name, }, ); Output.flush(); Global.crash(); }; defer final_dir.close(); // and get the fd path var final_path = std.os.getFdPath( final_dir.fd, &abs_buf, ) catch |err| { Output.prettyErrorln( "Error {s} failed to verify cache dir for {s}", .{ @errorName(err), name, }, ); Output.flush(); Global.crash(); }; return try FileSystem.instance.dirname_store.append(@TypeOf(final_path), final_path); } ion value='jarred/postgresql'>jarred/postgresql Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
ar/00688f51043d06a73ecdd71c723bc9b8?s=13&d=retro' width='13' height='13' alt='Gravatar' /> Ben Holmes
AgeCommit message (Expand)AuthorFilesLines
2023-03-02Ensure prettier knows where to lookGravatar Jarred Sumner 6-5/+24
2023-03-02add tests for scoped dependency aliasing (#2271)Gravatar Alex Lam S.L 3-15/+111
2023-03-02fix tmp dir in fetch.tests.js (#2270)Gravatar Ciro Spaciari 1-1/+2
2023-03-02Remake typings for FFI dlopen/linkSymbols + introduce Pointer type (#2227)Gravatar u9g 4-28/+222
2023-03-02put AbortSignal in WebCore namespace (#2267)Gravatar Ciro Spaciari 9-69/+70
2023-03-02only free sink after promises solves (#2268)Gravatar Ciro Spaciari 2-10/+10
2023-03-02Fix `Bun.sleepSync` to actually use milliseconds (#2242)Gravatar Justin Whear 3-5/+57
2023-03-01fix(bindings): mark `JSCInitialize` (#2265)Gravatar Derrick Farris 1-0/+1
2023-03-01Add page descriptions (#2260)Gravatar Colin McDonnell 1-46/+132
2023-03-01fix bun server segfault with abortsignal (#2261)Gravatar Ciro Spaciari 3-133/+79
2023-03-01fix(node:http): match Node `http.request()` GET/HEAD w/ body (#2262)Gravatar Derrick Farris 2-2/+31
2023-03-01Add a test for https request in node:httpGravatar Jarred Sumner 2-17/+28
2023-03-01fix(node:http/https): fix passing `URL` objs to `http.request`(#2253) (#2258)Gravatar Derrick Farris 2-43/+63
2023-03-01Revert "Update clap (#2238)"Gravatar Jarred Sumner 16-290/+1840
2023-03-01Revert "Add `-D`, `--dev` flags for bun install (#2240)"Gravatar Jarred Sumner 1-9/+9
2023-03-01Use GitHub action ID instead of SHA for test workflowGravatar Ashcon Partovi 1-1/+1
2023-03-01avoids segfault after aborted onReject in Bun.serve streams (#2256)Gravatar Ciro Spaciari 1-7/+8
2023-03-01Run tests in CI for bun-linux-aarch64Gravatar Ashcon Partovi 2-1/+30
2023-03-01Revert spawnSync changeGravatar Jarred Sumner 1-1/+2
2023-03-01Update bindings.zigGravatar Jarred Sumner 1-1/+3
2023-03-01fix deinit behavior when connection is aborted using ResponseStream and abort...Gravatar Ciro Spaciari 3-34/+174
2023-03-01fix Bun.file.arrayBuffer() segmentation fault on empty file #2248 (#2249)Gravatar Ciro Spaciari 3-7/+23
2023-03-01Fix async in sqliteGravatar Colin McDonnell 1-2/+2
2023-02-28Forces a specific libdir for c-ares (#2241)Gravatar Justin Whear 1-1/+5
2023-02-28Make Bun.gc(true) more aggressiveGravatar Jarred Sumner 1-0/+3
2023-02-28Expose JSC::Options via `BUN_JSC_` prefixGravatar Jarred Sumner 6-8/+47
2023-02-28fixupGravatar Jarred Sumner 1-1/+1
2023-02-28Fix typecheckGravatar Colin McDonnell 2-1/+4
2023-02-28Fix incorrect Bun version in docs (#2236)Gravatar Derrick Farris 1-1/+1
2023-02-28just some comments fix (#2237)Gravatar Ciro Spaciari 1-4/+2
2023-02-28Add `-D`, `--dev` flags for bun install (#2240)Gravatar Justin Whear 1-9/+9
2023-02-28Document punningGravatar Colin McDonnell 1-1/+18
2-13/+21
2024-11-08fix(actions): better runtime check for invalid usages (#12402)Gravatar Emanuele Stoppa 8-5/+47
2024-11-08fix: error overlay message escape (#12305)Gravatar Florian Lefebvre 3-0/+28
2024-11-06[ci] release (beta) (#12370)create-astro@4.11.0-beta.0astro@5.0.0-beta.7@astrojs/svelte@6.0.0-beta.2Gravatar Houston (Bot) 31-55/+84
2024-11-06Add svelte changesetGravatar bluwy 5-39/+51
2024-11-06[ci] release (#12369)astro@4.16.10@astrojs/svelte@5.7.3Gravatar Houston (Bot) 34-81/+74
2024-11-06Update to Vite 6.0.0-beta.6 (#12323)Gravatar Bjorn Lu 15-100/+123
2024-11-06[ci] formatGravatar Bjorn Lu 2-18/+17
2024-11-06Add support for Svelte 5 @render syntax (#12390)Gravatar Bjorn Lu 3-0/+30
2024-11-06fix(deps): update all non-major dependencies (#12366)Gravatar renovate[bot] 29-533/+552