aboutsummaryrefslogtreecommitdiff
path: root/src/install/bin.zig
diff options
context:
space:
mode:
authorGravatar Alex Lam S.L <alexlamsl@gmail.com> 2023-02-09 00:37:14 +0200
committerGravatar GitHub <noreply@github.com> 2023-02-08 14:37:14 -0800
commit18807cef03ac83a6a3dabded7a9735b87792f52e (patch)
treed40b8968840d16a7e1a96695b46e5415b3c4176a /src/install/bin.zig
parentcbc28afd51547f7a90161741cf826ee7f1485ae6 (diff)
downloadbun-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.zig27
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 };