diff options
author | 2022-01-01 19:31:05 -0800 | |
---|---|---|
committer | 2022-01-01 19:31:05 -0800 | |
commit | fcfdd71c069eda8c20bdcdb9fbbdf6a086cd6fd8 (patch) | |
tree | 73bc4d3b43d01056f34ba6467443b175cdf34596 | |
parent | 73336bbc008fcd30f608ab42b7ffd7f0086d0e43 (diff) | |
download | bun-fcfdd71c069eda8c20bdcdb9fbbdf6a086cd6fd8.tar.gz bun-fcfdd71c069eda8c20bdcdb9fbbdf6a086cd6fd8.tar.zst bun-fcfdd71c069eda8c20bdcdb9fbbdf6a086cd6fd8.zip |
[bun install] FIx crash when removing only dependency in package.json
-rw-r--r-- | src/install/install.zig | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/src/install/install.zig b/src/install/install.zig index 9b7ed617e..4eaf7cc67 100644 --- a/src/install/install.zig +++ b/src/install/install.zig @@ -368,6 +368,10 @@ pub const Lockfile = struct { const Stream = std.io.FixedBufferStream([]u8); pub const default_filename = "bun.lockb"; + pub fn isEmpty(this: *const Lockfile) bool { + return this.packages.len == 0 or this.packages.len == 1 or this.packages.get(0).resolutions.len == 0; + } + pub const LoadFromDiskResult = union(Tag) { not_found: void, err: struct { @@ -848,7 +852,8 @@ pub const Lockfile = struct { ); } - try this.hoist(); + if (this.lockfile.buffers.dependencies.items.len > 0) + try this.hoist(); } fn hoist(this: *Cloner) anyerror!void { @@ -5718,9 +5723,9 @@ pub const PackageManager = struct { current_package_json.asProperty("optionalDependencies") == null and current_package_json.asProperty("peerDependencies") == null) { - Output.prettyErrorln("<red>error<r><d>:<r> package.json doesn't have dependencies, there's nothing to remove!", .{}); + Output.prettyErrorln("package.json doesn't have dependencies, there's nothing to remove!", .{}); Output.flush(); - std.os.exit(1); + std.os.exit(0); return; } } @@ -6689,20 +6694,39 @@ pub const PackageManager = struct { } if (manager.options.do.save_lockfile) { - var node: *Progress.Node = undefined; + save: { + if (manager.lockfile.isEmpty()) { + if (!manager.options.dry_run) { + std.fs.cwd().deleteFileZ(manager.options.save_lockfile_path) catch |err| brk: { + // we don't care + if (err == error.FileNotFound) { + if (had_any_diffs) break :save; + break :brk; + } - if (comptime log_level.showProgress()) { - node = try manager.progress.start(ProgressStrings.save(), 0); - node.activate(); + if (log_level != .silent) Output.prettyErrorln("\n <red>error: {s} deleting empty lockfile", .{@errorName(err)}); + break :save; + }; + } + if (log_level != .silent) Output.prettyErrorln("No packages! Deleted empty lockfile", .{}); + break :save; + } - manager.progress.refresh(); - } - manager.lockfile.saveToDisk(manager.options.save_lockfile_path); - if (comptime log_level.showProgress()) { - node.end(); - manager.progress.refresh(); - manager.progress.root.end(); - manager.progress = .{}; + var node: *Progress.Node = undefined; + + if (comptime log_level.showProgress()) { + node = try manager.progress.start(ProgressStrings.save(), 0); + node.activate(); + + manager.progress.refresh(); + } + manager.lockfile.saveToDisk(manager.options.save_lockfile_path); + if (comptime log_level.showProgress()) { + node.end(); + manager.progress.refresh(); + manager.progress.root.end(); + manager.progress = .{}; + } } } |