Commit 29156de120

Andrew Kelley <andrew@ziglang.org>
2023-10-08 20:23:20
CLI: fix only_core_functionality logic
1 parent a605bd9
Changed files (2)
src
src/Package/Fetch.zig
@@ -105,13 +105,13 @@ pub const JobQueue = struct {
         }
     }
 
-    /// Creates the dependencies.zig file and corresponding `Module` for the
-    /// build runner to obtain via `@import("@dependencies")`.
-    pub fn createDependenciesModule(jq: *JobQueue, buf: *std.ArrayList(u8)) Allocator.Error!void {
+    /// Creates the dependencies.zig source code for the build runner to obtain
+    /// via `@import("@dependencies")`.
+    pub fn createDependenciesSource(jq: *JobQueue, buf: *std.ArrayList(u8)) Allocator.Error!void {
         const keys = jq.table.keys();
 
         if (keys.len == 0)
-            return createEmptyDependenciesModule(buf);
+            return createEmptyDependenciesSource(buf);
 
         try buf.appendSlice("pub const packages = struct {\n");
 
@@ -188,7 +188,7 @@ pub const JobQueue = struct {
         try buf.appendSlice("};\n");
     }
 
-    pub fn createEmptyDependenciesModule(buf: *std.ArrayList(u8)) Allocator.Error!void {
+    pub fn createEmptyDependenciesSource(buf: *std.ArrayList(u8)) Allocator.Error!void {
         try buf.appendSlice(
             \\pub const packages = struct {};
             \\pub const root_deps: []const struct { []const u8, []const u8 } = &.{};
src/main.zig
@@ -4831,10 +4831,8 @@ pub fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !voi
             .root = .{ .root_dir = build_root },
             .root_src_path = build_zig_basename,
         };
-        var dependencies_zig_src = std.ArrayList(u8).init(gpa);
-        defer dependencies_zig_src.deinit();
         if (build_options.only_core_functionality) {
-            try Package.Fetch.createEmptyDependenciesModule(&dependencies_zig_src);
+            try createEmptyDependenciesModule(arena, &main_mod, local_cache_directory);
         } else {
             var http_client: std.http.Client = .{ .allocator = gpa };
             defer http_client.deinit();
@@ -4890,40 +4888,16 @@ pub fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !voi
 
             if (fetch_only) return cleanExit();
 
-            try job_queue.createDependenciesModule(&dependencies_zig_src);
-
-            const deps_mod = m: {
-                // Atomically create the file in a directory named after the hash of its contents.
-                const basename = "dependencies.zig";
-                const rand_int = std.crypto.random.int(u64);
-                const tmp_dir_sub_path = "tmp" ++ fs.path.sep_str ++
-                    Package.Manifest.hex64(rand_int);
-                {
-                    var tmp_dir = try local_cache_directory.handle.makeOpenPath(tmp_dir_sub_path, .{});
-                    defer tmp_dir.close();
-                    try tmp_dir.writeFile(basename, dependencies_zig_src.items);
-                }
+            var source_buf = std.ArrayList(u8).init(gpa);
+            defer source_buf.deinit();
+            try job_queue.createDependenciesSource(&source_buf);
+            const deps_mod = try createDependenciesModule(
+                arena,
+                source_buf.items,
+                &main_mod,
+                local_cache_directory,
+            );
 
-                var hh: Cache.HashHelper = .{};
-                hh.addBytes(build_options.version);
-                hh.addBytes(dependencies_zig_src.items);
-                const hex_digest = hh.final();
-
-                const o_dir_sub_path = try arena.dupe(u8, "o" ++ fs.path.sep_str ++ hex_digest);
-                try Package.Fetch.renameTmpIntoCache(
-                    local_cache_directory.handle,
-                    tmp_dir_sub_path,
-                    o_dir_sub_path,
-                );
-
-                break :m try Package.Module.create(arena, .{
-                    .root = .{
-                        .root_dir = local_cache_directory,
-                        .sub_path = o_dir_sub_path,
-                    },
-                    .root_src_path = basename,
-                });
-            };
             {
                 // We need a Module for each package's build.zig.
                 const hashes = job_queue.table.keys();
@@ -4944,7 +4918,6 @@ pub fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !voi
                     deps_mod.deps.putAssumeCapacityNoClobber(hash_cloned, m);
                 }
             }
-            try main_mod.deps.put(arena, "@dependencies", deps_mod);
         }
 
         try main_mod.deps.put(arena, "@build", &build_mod);
@@ -6795,3 +6768,55 @@ fn cmdFetch(
 
     return cleanExit();
 }
+
+fn createEmptyDependenciesModule(
+    arena: Allocator,
+    main_mod: *Package.Module,
+    local_cache_directory: Cache.Directory,
+) !void {
+    var source = std.ArrayList(u8).init(arena);
+    try Package.Fetch.JobQueue.createEmptyDependenciesSource(&source);
+    _ = try createDependenciesModule(arena, source.items, main_mod, local_cache_directory);
+}
+
+/// Creates the dependencies.zig file and corresponding `Package.Module` for the
+/// build runner to obtain via `@import("@dependencies")`.
+fn createDependenciesModule(
+    arena: Allocator,
+    source: []const u8,
+    main_mod: *Package.Module,
+    local_cache_directory: Cache.Directory,
+) !*Package.Module {
+    // Atomically create the file in a directory named after the hash of its contents.
+    const basename = "dependencies.zig";
+    const rand_int = std.crypto.random.int(u64);
+    const tmp_dir_sub_path = "tmp" ++ fs.path.sep_str ++
+        Package.Manifest.hex64(rand_int);
+    {
+        var tmp_dir = try local_cache_directory.handle.makeOpenPath(tmp_dir_sub_path, .{});
+        defer tmp_dir.close();
+        try tmp_dir.writeFile(basename, source);
+    }
+
+    var hh: Cache.HashHelper = .{};
+    hh.addBytes(build_options.version);
+    hh.addBytes(source);
+    const hex_digest = hh.final();
+
+    const o_dir_sub_path = try arena.dupe(u8, "o" ++ fs.path.sep_str ++ hex_digest);
+    try Package.Fetch.renameTmpIntoCache(
+        local_cache_directory.handle,
+        tmp_dir_sub_path,
+        o_dir_sub_path,
+    );
+
+    const deps_mod = try Package.Module.create(arena, .{
+        .root = .{
+            .root_dir = local_cache_directory,
+            .sub_path = o_dir_sub_path,
+        },
+        .root_src_path = basename,
+    });
+    try main_mod.deps.put(arena, "@dependencies", deps_mod);
+    return deps_mod;
+}