diff options
author | 2021-12-07 19:09:19 -0800 | |
---|---|---|
committer | 2021-12-16 19:18:51 -0800 | |
commit | 6382bb53334baf0b72d28111630f93f631d2ecdb (patch) | |
tree | f44b6855e4daba185314c662d119cd60e7efc4f4 | |
parent | 41c60fb8483d012c6c874ba4e1ab70c91b227595 (diff) | |
download | bun-6382bb53334baf0b72d28111630f93f631d2ecdb.tar.gz bun-6382bb53334baf0b72d28111630f93f631d2ecdb.tar.zst bun-6382bb53334baf0b72d28111630f93f631d2ecdb.zip |
[bun install] Start add/remove command
-rw-r--r-- | src/bundler.zig | 10 | ||||
-rw-r--r-- | src/cli.zig | 182 | ||||
-rw-r--r-- | src/cli/add_command.zig | 8 | ||||
-rw-r--r-- | src/cli/install_command.zig | 36 | ||||
-rw-r--r-- | src/cli/remove_command.zig | 8 | ||||
-rw-r--r-- | src/install/install.zig | 89 | ||||
-rw-r--r-- | src/install/npm.zig | 12 | ||||
-rw-r--r-- | src/install/semver.zig | 1 |
8 files changed, 191 insertions, 155 deletions
diff --git a/src/bundler.zig b/src/bundler.zig index 9d074366a..54b007c06 100644 --- a/src/bundler.zig +++ b/src/bundler.zig @@ -255,10 +255,12 @@ pub const Bundler = struct { } } - if (this.env.map.get("CI")) |IS_CI| { - if (strings.eqlComptime(IS_CI, "true")) { - Analytics.is_ci = true; - } + if (this.env.map.get("CI") orelse + this.env.map.get("TDDIUM") orelse + this.env.map.get("JENKINS_URL") orelse + this.env.map.get("bamboo.buildKey")) |IS_CI| + { + Analytics.is_ci = true; } Analytics.disabled = Analytics.disabled or this.env.map.get("HYPERFINE_RANDOMIZED_ENVIRONMENT_OFFSET") != null; diff --git a/src/cli.zig b/src/cli.zig index 691975a3d..79f10049f 100644 --- a/src/cli.zig +++ b/src/cli.zig @@ -38,6 +38,8 @@ const CreateListExamplesCommand = @import("./cli/create_command.zig").CreateList const RunCommand = @import("./cli/run_command.zig").RunCommand; const UpgradeCommand = @import("./cli/upgrade_command.zig").UpgradeCommand; const InstallCommand = @import("./cli/install_command.zig").InstallCommand; +const AddCommand = @import("./cli/add_command.zig").AddCommand; +const RemoveCommand = @import("./cli/remove_command.zig").RemoveCommand; const InstallCompletionsCommand = @import("./cli/install_completions_command.zig").InstallCompletionsCommand; const ShellCompletions = @import("./cli/shell_completions.zig"); @@ -153,11 +155,6 @@ pub const Arguments = struct { clap.parseParam("-u, --origin <STR> Rewrite import URLs to start with --origin. Default: \"\"") catch unreachable, clap.parseParam("-p, --port <STR> Port to serve Bun's dev server on. Default: \"3000\"") catch unreachable, clap.parseParam("--silent Don't repeat the command for bun run") catch unreachable, - - // clap.parseParam("-o, --outdir <STR> Save output to directory (default: \"out\" if none provided and multiple entry points passed)") catch unreachable, - // clap.parseParam("-r, --resolve <STR> Determine import/require behavior. \"disable\" ignores. \"dev\" bundles node_modules and builds everything else as independent entry points") catch unreachable, - // clap.parseParam("-r, --resolve <STR> Determine import/require behavior. \"disable\" ignores. \"dev\" bundles node_modules and builds everything else as independent entry points") catch unreachable, - clap.parseParam("<POS>... ") catch unreachable, }; @@ -457,47 +454,68 @@ const HelpCommand = struct { invalid_command, }; + // someone will get mad at me for this + const packages_to_remove_filler = [_]string{ + "moment", + "underscore", + "jquery", + "backbone", + "redux", + "browserify", + "webpack", + "babel-core", + }; + + const packages_to_add_filler = [_]string{ + "astro", + "react", + "next@^12", + "tailwindcss", + "wrangler@beta", + "@compiled/react", + "@remix-run/dev", + }; + pub fn printWithReason(comptime reason: Reason) void { var cwd_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined; const cwd = std.os.getcwd(&cwd_buf) catch unreachable; const dirname = std.fs.path.basename(cwd); - if (FeatureFlags.dev_only) { - const fmt = - \\> <r> <b><green>dev <r><d> ./a.ts ./b.jsx<r> Start a Bun Dev Server - \\> <r> <b><magenta>bun <r><d> ./a.ts ./b.jsx<r> Bundle dependencies of input files into a <r><magenta>.bun<r> - \\> <r> <b><green>run <r><d> test <r> Run a package.json script or executable<r> - \\> <r> <b><green>install<r> Install dependencies for a package.json<r> - \\> <r> <b><cyan>create <r><d>next ./app<r> Start a new project from a template <d>(shorthand: c)<r> - \\> <r> <b><blue>upgrade <r> Get the latest version of Bun - \\> <r> <b><d>completions<r> Install shell completions for tab-completion - \\> <r> <b><d>discord <r> Open Bun's Discord server - \\> <r> <b><d>help <r> Print this help menu - \\ - ; - - switch (reason) { - .explicit => Output.pretty("<r><b><magenta>Bun<r>: a fast bundler, transpiler and task runner for web software.\n\n" ++ fmt, .{}), - .invalid_command => Output.prettyError("<r><red>Uh-oh<r> not sure what to do with that command.\n\n" ++ fmt, .{}), - } - } else { - const fmt = - \\> <r> <b><white>init<r> Setup Bun in \"{s}\" - \\> <r> <b><green>dev <r><d> ./a.ts ./b.jsx<r> Start a Bun Dev Server - \\<d>*<r> <b><cyan>build <r><d> ./a.ts ./b.jsx<r> Make JavaScript-like code runnable & bundle CSS - \\> <r> <b><cyan>create<r><d> next ./app<r> Start a new project from a template<r> - \\> <r> <b><magenta>bun <r><d> ./a.ts ./b.jsx<r> Bundle dependencies of input files into a <r><magenta>.bun<r> - \\> <r> <green>run <r><d> ./a.ts <r> Run a JavaScript-like file with Bun.js - \\> <r> <b><blue>discord<r> Open Bun's Discord server - \\> <r> <b><blue>upgrade <r> Get the latest version of Bun - \\> <r> <b><green>install<r> Install dependencies for a package.json<r> - \\> <r> <b><d>help <r> Print this help menu - \\ - ; - - switch (reason) { - .explicit => Output.pretty("<r><b><magenta>Bun<r>: a fast bundler, transpiler and task runner for web software.\n\n" ++ fmt, .{dirname}), - .invalid_command => Output.prettyError("<r><red>Uh-oh<r> not sure what to do with that command.\n\n" ++ fmt, .{dirname}), - } + + const fmt = + \\> <r> <b><green>dev <r><d> ./a.ts ./b.jsx<r> Start a Bun Dev Server + \\> <r> <b><magenta>bun <r><d> ./a.ts ./b.jsx<r> Bundle dependencies of input files into a <r><magenta>.bun<r> + \\ + \\> <r> <b><cyan>create <r><d>next ./app<r> Start a new project from a template <d>(bun c)<r> + \\> <r> <b><magenta>run <r><d> test <r> Run a package.json script or executable<r> + \\> <r> <b><green>install<r> Install dependencies for a package.json <d>(bun i)<r> + \\> <r> <b><blue>add <r><d> {s:<16}<r> Add a dependency to package.json <d>(bun a)<r> + \\> <r> remove <r><d> {s:<16}<r> Remove a dependency from package.json <d>(bun rm)<r> + \\ + \\> <r> <b><blue>upgrade <r> Get the latest version of Bun + \\> <r> <b><d>completions<r> Install shell completions for tab-completion + \\> <r> <b><d>discord <r> Open Bun's Discord server + \\> <r> <b><d>help <r> Print this help menu + \\ + ; + + var rand = std.rand.DefaultPrng.init(@intCast(u64, @maximum(std.time.milliTimestamp(), 0))); + const package_add_i = rand.random.uintAtMost(usize, packages_to_add_filler.len - 1); + const package_remove_i = rand.random.uintAtMost(usize, packages_to_remove_filler.len - 1); + + const args = .{ + packages_to_add_filler[package_add_i], + packages_to_remove_filler[package_remove_i], + }; + + switch (reason) { + .explicit => Output.pretty( + "<r><b><magenta>Bun<r>: a fast bundler, transpiler, JavaScript Runtime and package manager for web software.\n\n" ++ fmt, + args, + ), + .invalid_command => Output.prettyError( + "<r><red>Uh-oh<r> not sure what to do with that command.\n\n" ++ fmt, + args, + ), } Output.flush(); @@ -561,7 +579,7 @@ pub const Command = struct { .allocator = allocator, }; - if (comptime command != Command.Tag.CreateCommand) { + if (comptime Command.Tag.uses_global_options.get(command)) { ctx.args = try Arguments.parse(allocator, &ctx, command); } @@ -586,41 +604,34 @@ pub const Command = struct { const first_arg_name = std.mem.span(next_arg); const RootCommandMatcher = strings.ExactSizeMatcher(16); - if (comptime FeatureFlags.dev_only) { - return switch (RootCommandMatcher.match(first_arg_name)) { - RootCommandMatcher.case("init") => .InitCommand, - RootCommandMatcher.case("bun") => .BunCommand, - RootCommandMatcher.case("discord") => .DiscordCommand, - RootCommandMatcher.case("upgrade") => .UpgradeCommand, - RootCommandMatcher.case("completions") => .InstallCompletionsCommand, - RootCommandMatcher.case("getcompletes") => .GetCompletionsCommand, - RootCommandMatcher.case("i"), RootCommandMatcher.case("install") => .InstallCommand, - RootCommandMatcher.case("c"), RootCommandMatcher.case("create") => .CreateCommand, - - RootCommandMatcher.case("b"), RootCommandMatcher.case("build") => .BuildCommand, - RootCommandMatcher.case("r"), RootCommandMatcher.case("run") => .RunCommand, - RootCommandMatcher.case("d"), RootCommandMatcher.case("dev") => .DevCommand, - - RootCommandMatcher.case("help") => .HelpCommand, - else => .AutoCommand, - }; - } else { - return switch (RootCommandMatcher.match(first_arg_name)) { - RootCommandMatcher.case("init") => .InitCommand, - RootCommandMatcher.case("bun") => .BunCommand, - RootCommandMatcher.case("discord") => .DiscordCommand, - RootCommandMatcher.case("d"), RootCommandMatcher.case("dev") => .DevCommand, - RootCommandMatcher.case("c"), RootCommandMatcher.case("create") => .CreateCommand, - RootCommandMatcher.case("upgrade") => .UpgradeCommand, - - RootCommandMatcher.case("help") => .HelpCommand, - else => .AutoCommand, - }; - } + return switch (RootCommandMatcher.match(first_arg_name)) { + RootCommandMatcher.case("init") => .InitCommand, + RootCommandMatcher.case("bun") => .BunCommand, + RootCommandMatcher.case("discord") => .DiscordCommand, + RootCommandMatcher.case("upgrade") => .UpgradeCommand, + RootCommandMatcher.case("completions") => .InstallCompletionsCommand, + RootCommandMatcher.case("getcompletes") => .GetCompletionsCommand, + + RootCommandMatcher.case("i"), RootCommandMatcher.case("install") => .InstallCommand, + RootCommandMatcher.case("c"), RootCommandMatcher.case("create") => .CreateCommand, + + RootCommandMatcher.case("add"), RootCommandMatcher.case("update"), RootCommandMatcher.case("a") => .AddCommand, + RootCommandMatcher.case("remove"), RootCommandMatcher.case("rm") => .RemoveCommand, + + RootCommandMatcher.case("b"), RootCommandMatcher.case("build") => .BuildCommand, + RootCommandMatcher.case("run") => .RunCommand, + RootCommandMatcher.case("d"), RootCommandMatcher.case("dev") => .DevCommand, + + RootCommandMatcher.case("help") => .HelpCommand, + else => .AutoCommand, + }; } const default_completions_list = [_]string{ // "build", + "install", + "add", + "remove", "run", "dev", "install", @@ -666,11 +677,23 @@ pub const Command = struct { return; }, .InstallCommand => { - const ctx = try Command.Context.create(allocator, log, .BuildCommand); + const ctx = try Command.Context.create(allocator, log, .InstallCommand); try InstallCommand.exec(ctx); return; }, + .AddCommand => { + const ctx = try Command.Context.create(allocator, log, .AddCommand); + + try AddCommand.exec(ctx); + return; + }, + .RemoveCommand => { + const ctx = try Command.Context.create(allocator, log, .RemoveCommand); + + try RemoveCommand.exec(ctx); + return; + }, .GetCompletionsCommand => { const ctx = try Command.Context.create(allocator, log, .GetCompletionsCommand); var filter = ctx.positionals; @@ -806,8 +829,17 @@ pub const Command = struct { HelpCommand, InitCommand, InstallCommand, + AddCommand, + RemoveCommand, InstallCompletionsCommand, RunCommand, UpgradeCommand, + + pub const uses_global_options: std.EnumArray(Tag, bool) = std.EnumArray(Tag, bool).initDefault(true, .{ + .CreateCommand = false, + .InstallCommand = false, + .AddCommand = false, + .RemoveCommand = false, + }); }; }; diff --git a/src/cli/add_command.zig b/src/cli/add_command.zig new file mode 100644 index 000000000..f16b6cca1 --- /dev/null +++ b/src/cli/add_command.zig @@ -0,0 +1,8 @@ +const Command = @import("../cli.zig").Command; +const PackageManager = @import("../install/install.zig").PackageManager; + +pub const AddCommand = struct { + pub fn exec(ctx: Command.Context) !void { + try PackageManager.add(ctx); + } +}; diff --git a/src/cli/install_command.zig b/src/cli/install_command.zig index f3d25e055..6c441b859 100644 --- a/src/cli/install_command.zig +++ b/src/cli/install_command.zig @@ -1,40 +1,6 @@ -usingnamespace @import("../global.zig"); -const std = @import("std"); - -const lex = @import("../js_lexer.zig"); -const logger = @import("../logger.zig"); -const alloc = @import("../alloc.zig"); -const options = @import("../options.zig"); -const js_parser = @import("../js_parser.zig"); -const json_parser = @import("../json_parser.zig"); -const js_printer = @import("../js_printer.zig"); -const js_ast = @import("../js_ast.zig"); -const linker = @import("../linker.zig"); -usingnamespace @import("../ast/base.zig"); -usingnamespace @import("../defines.zig"); -const panicky = @import("../panic_handler.zig"); -const sync = @import("../sync.zig"); -const Api = @import("../api/schema.zig").Api; -const resolve_path = @import("../resolver/resolve_path.zig"); -const configureTransformOptionsForBun = @import("../javascript/jsc/config.zig").configureTransformOptionsForBun; const Command = @import("../cli.zig").Command; -const bundler = @import("../bundler.zig"); -const NodeModuleBundle = @import("../node_module_bundle.zig").NodeModuleBundle; -const DotEnv = @import("../env_loader.zig"); -const which = @import("../which.zig").which; -const Run = @import("../bun_js.zig").Run; -var path_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined; -var path_buf2: [std.fs.MAX_PATH_BYTES]u8 = undefined; -const NpmArgs = struct { - // https://github.com/npm/rfcs/blob/main/implemented/0021-reduce-lifecycle-script-environment.md#detailed-explanation - pub const package_name: string = "npm_package_name"; - pub const package_version: string = "npm_package_version"; -}; - -const yarn_commands: []u64 = @import("./list-of-yarn-commands.zig").all_yarn_commands; - -const ShellCompletions = @import("./shell_completions.zig"); const PackageManager = @import("../install/install.zig").PackageManager; + pub const InstallCommand = struct { pub fn exec(ctx: Command.Context) !void { try PackageManager.install(ctx); diff --git a/src/cli/remove_command.zig b/src/cli/remove_command.zig new file mode 100644 index 000000000..eec924d8d --- /dev/null +++ b/src/cli/remove_command.zig @@ -0,0 +1,8 @@ +const Command = @import("../cli.zig").Command; +const PackageManager = @import("../install/install.zig").PackageManager; + +pub const RemoveCommand = struct { + pub fn exec(ctx: Command.Context) !void { + try PackageManager.remove(ctx); + } +}; diff --git a/src/install/install.zig b/src/install/install.zig index ba2724a76..a9dc2251c 100644 --- a/src/install/install.zig +++ b/src/install/install.zig @@ -44,7 +44,7 @@ threadlocal var initialized_store = false; // so we just make it repeat bun bun bun bun bun bun bun bun bun // because why not const alignment_bytes_to_repeat = "bun"; -const alignment_bytes_to_repeat_buffer = "bunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbun"; +const alignment_bytes_to_repeat_buffer = "bunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbun"; const JSAst = @import("../js_ast.zig"); @@ -73,6 +73,7 @@ const StructBuilder = @import("../builder.zig"); const Bin = @import("./bin.zig").Bin; const Dependency = @import("./dependency.zig"); const Behavior = @import("./dependency.zig").Behavior; + pub const ExternalStringBuilder = StructBuilder.Builder(ExternalString); pub const SmallExternalStringList = ExternalSlice(String); @@ -413,38 +414,6 @@ pub const Lockfile = struct { const PackageIDQueue = std.fifo.LinearFifo(PackageID, .Dynamic); - const InstallTree = struct {}; - - const Cleaner = struct { - to: *Lockfile, - from: *Lockfile, - visited: *std.DynamicBitSetUnmanaged, - has_duplicate_names: *std.DynamicBitSetUnmanaged, - queue: *PackageIDQueue, - - // old id -> new id - mapping: []PackageID, - - pub fn enqueueDependencyList( - this: Cleaner, - // safe because we do not reallocate these slices - package: *const Lockfile.Package, - list: []const Dependency, - resolutions: []const PackageID, - ) !void { - for (list) |dependency, i| { - const id = resolutions[i]; - std.debug.assert(id < this.from.packages.len); - if (id > this.from.packages.len) continue; - - if (!this.visited.get(id)) { - this.visited.set(id); - try this.queue.writeItem(id); - } - } - } - }; - pub const InstallResult = struct { lockfile: *Lockfile, summary: PackageInstall.Summary, @@ -3719,6 +3688,7 @@ pub const PackageManager = struct { lockfile_path: stringZ = Lockfile.default_filename, save_lockfile_path: stringZ = Lockfile.default_filename, registry_url: URL = URL.parse("https://registry.npmjs.org/"), + registries: Npm.Registry.Map = Npm.Registry.Map{}, cache_directory: string = "", enable: Enable = .{}, do: Do = .{}, @@ -3756,11 +3726,11 @@ pub const PackageManager = struct { this.save_lockfile_path = try allocator.dupeZ(u8, save_lockfile_path); } - if (env_loader.map.get("BUN_CONFIG_DISABLE_CLONEFILE") != null) { + if (env_loader.map.get("BUN_CONFIG_NO_CLONEFILE") != null) { this.enable.clonefile = false; } - if (env_loader.map.get("BUN_CONFIG_DISABLE_DEDUPLICATE") != null) { + if (env_loader.map.get("BUN_CONFIG_NO_DEDUPLICATE") != null) { this.enable.deduplicate_packages = false; } @@ -3785,6 +3755,9 @@ pub const PackageManager = struct { }; fn init(ctx: Command.Context) !*PackageManager { + // assume that spawning a thread will take a lil so we do that asap + try NetworkThread.init(); + var fs = try Fs.FileSystem.init1(ctx.allocator, null); var original_cwd = std.mem.trimRight(u8, fs.top_level_dir, "/"); @@ -3813,6 +3786,11 @@ pub const PackageManager = struct { }; } + std.mem.copy(u8, &cwd_buf, original_cwd); + cwd_buf[original_cwd.len] = 0; + var real_cwd = cwd_buf[0..original_cwd.len :0]; + std.os.chdirZ(real_cwd) catch {}; + return error.MissingPackageJSON; }; }; @@ -3868,8 +3846,6 @@ pub const PackageManager = struct { } else |err| {} } - try NetworkThread.init(); - var manager = &instance; // var progress = std.Progress{}; // var node = progress.start(name: []const u8, estimated_total_items: usize) @@ -3931,7 +3907,32 @@ pub const PackageManager = struct { ctx: Command.Context, ) !void {} - pub const ParamType = clap.Param(clap.Help); + const ParamType = clap.Param(clap.Help); + pub const install_params = [_]ParamType{ + clap.parseParam("--registry, -R <STR> Change default registry (default: $BUN_CONFIG_REGISTRY || $npm_config_registry)") catch unreachable, + clap.parseParam("--token, -T <STR> Authentication token used for npm registry requests (default: $npm_config_token)") catch unreachable, + clap.parseParam("--yarn, -Y Write a yarn.lock file (yarn v1)") catch unreachable, + clap.parseParam("--production, --prod Don't install devDependencies and throw if the package.json doesn't match the lockfile") catch unreachable, + clap.parseParam("--no-save Don't save a lockfile") catch unreachable, + clap.parseParam("--dry-run Don't install anything") catch unreachable, + clap.parseParam("--lockfile <STR> Store & load a lockfile at a specific filepath") catch unreachable, + clap.parseParam("--force, -F Always request the latest versions from the registry & reinstall all dependenices") catch unreachable, + clap.parseParam("--cache-dir <STR> Store & load cached data from a specific directory path") catch unreachable, + clap.parseParam("--no-dedupe Disable automatic downgrading of dependencies that would otherwise cause unnecessary duplicate package versions ($BUN_CONFIG_NO_DEDUPLICATE)") catch unreachable, + clap.parseParam("--no-cache Ignore manifest cache entirely") catch unreachable, + clap.parseParam("--silent Don't log anything") catch unreachable, + clap.parseParam("--verbose Excessively verbose logging") catch unreachable, + clap.parseParam("--cwd <STR> Set a specific cwd") catch unreachable, + clap.parseParam("--backend <STR> Platform-specific optimizations for installing dependencies. For macOS, \"clonefile\" (default), \"copyfile\"") catch unreachable, + }; + + pub const add_params = install_params ++ [_]ParamType{ + clap.parseParam("<POS> ... \"name\" or \"name@version\" of packages to install") catch unreachable, + }; + + pub const remove_params = install_params ++ [_]ParamType{ + clap.parseParam("<POS> ... \"name\" of packages to remove") catch unreachable, + }; fn updatePackageJSONAndInstall( ctx: Command.Context, @@ -3939,7 +3940,9 @@ pub const PackageManager = struct { ) !void { var manager = PackageManager.init(ctx) catch |err| { switch (err) { - error.MissingPackageJSON => {}, + error.MissingPackageJSON => { + if (op == .add or op == .update) {} + }, else => return err, } }; @@ -3947,10 +3950,14 @@ pub const PackageManager = struct { var cwd_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined; var package_json_cwd_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined; - pub fn install( + + pub inline fn install( ctx: Command.Context, ) !void { - var manager = try PackageManager.init(ctx); + try installWithManager(ctx, try PackageManager.init(ctx)); + } + + fn installWithManager(ctx: Command.Context, manager: *PackageManager) !void { var load_lockfile_result: Lockfile.LoadFromDiskResult = if (manager.options.do.load_lockfile) manager.lockfile.loadFromDisk( ctx.allocator, diff --git a/src/install/npm.zig b/src/install/npm.zig index 3c56d5f80..4fdd2189d 100644 --- a/src/install/npm.zig +++ b/src/install/npm.zig @@ -78,6 +78,14 @@ pub const Registry = struct { url: URL = URL.parse("https://registry.npmjs.org/"), pub const BodyPool = ObjectPool(MutableString, MutableString.init2048, true); + pub const Scope = struct { + name: string, + url: URL, + token: string = "", + }; + + pub const Map = std.HashMapUnmanaged(u64, Scope, IdentityContext(u64), 80); + const PackageVersionResponse = union(Tag) { pub const Tag = enum { cached, @@ -338,6 +346,10 @@ pub const PackageVersion = extern struct { man_dir: ExternalString = ExternalString{}, + /// can be empty! + /// When empty, it means that the tarball URL can be inferred + tarball_url: ExternalString = ExternalString{}, + unpacked_size: u32 = 0, file_count: u32 = 0, diff --git a/src/install/semver.zig b/src/install/semver.zig index f3150f6d3..c6f4189d8 100644 --- a/src/install/semver.zig +++ b/src/install/semver.zig @@ -1203,6 +1203,7 @@ pub const Query = struct { return Range.initWildcard(version, .minor); } + // This feels like it needs to be tested more. var right_version = version; right_version.minor += 1; right_version.patch = 0; |