diff options
author | 2023-02-09 00:37:14 +0200 | |
---|---|---|
committer | 2023-02-08 14:37:14 -0800 | |
commit | 18807cef03ac83a6a3dabded7a9735b87792f52e (patch) | |
tree | d40b8968840d16a7e1a96695b46e5415b3c4176a /src/install/bin.zig | |
parent | cbc28afd51547f7a90161741cf826ee7f1485ae6 (diff) | |
download | bun-18807cef03ac83a6a3dabded7a9735b87792f52e.tar.gz bun-18807cef03ac83a6a3dabded7a9735b87792f52e.tar.zst bun-18807cef03ac83a6a3dabded7a9735b87792f52e.zip |
[install] assorted fixes & improvements (#2011)
- take `peerDependencies` into account during package placement
- do not recursively resolve `workspaces` (matches `npm`)
- link binaries to non-root packages correctly
- prune empty nodes during dependency tree construction
- support non-standard `workspace:` specifier
Diffstat (limited to 'src/install/bin.zig')
-rw-r--r-- | src/install/bin.zig | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/src/install/bin.zig b/src/install/bin.zig index 09b7201d5..2d1113556 100644 --- a/src/install/bin.zig +++ b/src/install/bin.zig @@ -257,6 +257,7 @@ pub const Bin = extern struct { pub const Linker = struct { bin: Bin, + package_installed_path: stringZ = "", package_installed_node_modules: std.os.fd_t = std.math.maxInt(std.os.fd_t), root_node_modules_folder: std.os.fd_t = std.math.maxInt(std.os.fd_t), @@ -320,15 +321,19 @@ pub const Bin = extern struct { if (!link_global) { target_buf[0..".bin/".len].* = ".bin/".*; from_remain = target_buf[".bin/".len..]; - dest_buf[0.."../".len].* = "../".*; - remain = dest_buf["../".len..]; + dest_buf[0.."..".len].* = "..".*; + remain = dest_buf["..".len..]; + std.mem.copy(u8, remain, this.package_installed_path); + remain = remain[this.package_installed_path.len..]; + remain[0] = std.fs.path.sep; + remain = remain[1..]; } else { if (this.global_bin_dir.fd >= std.math.maxInt(std.os.fd_t)) { this.err = error.MissingGlobalBinDir; return; } - @memcpy(&target_buf, this.global_bin_path.ptr, this.global_bin_path.len); + std.mem.copy(u8, &target_buf, this.global_bin_path); from_remain = target_buf[this.global_bin_path.len..]; from_remain[0] = std.fs.path.sep; from_remain = from_remain[1..]; @@ -362,8 +367,8 @@ pub const Bin = extern struct { .file => { var target = this.bin.value.file.slice(this.string_buf); - if (strings.hasPrefix(target, "./")) { - target = target[2..]; + if (strings.hasPrefixComptime(target, "./")) { + target = target["./".len..]; } std.mem.copy(u8, remain, target); remain = remain[target.len..]; @@ -384,8 +389,8 @@ pub const Bin = extern struct { }, .named_file => { var target = this.bin.value.named_file[1].slice(this.string_buf); - if (strings.hasPrefix(target, "./")) { - target = target[2..]; + if (strings.hasPrefixComptime(target, "./")) { + target = target["./".len..]; } std.mem.copy(u8, remain, target); remain = remain[target.len..]; @@ -414,8 +419,8 @@ pub const Bin = extern struct { const name_in_filesystem = this.extern_string_buf[extern_string_i + 1]; var target = name_in_filesystem.slice(this.string_buf); - if (strings.hasPrefix(target, "./")) { - target = target[2..]; + if (strings.hasPrefixComptime(target, "./")) { + target = target["./".len..]; } std.mem.copy(u8, remain, target); remain = remain[target.len..]; @@ -435,8 +440,8 @@ pub const Bin = extern struct { }, .dir => { var target = this.bin.value.dir.slice(this.string_buf); - if (strings.hasPrefix(target, "./")) { - target = target[2..]; + if (strings.hasPrefixComptime(target, "./")) { + target = target["./".len..]; } var parts = [_][]const u8{ name, target }; |