Skip to content

Commit

Permalink
fix detection of build.zig file inside packages
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewrk committed Oct 7, 2023
1 parent 31b899f commit 68127cd
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 6 deletions.
10 changes: 10 additions & 0 deletions src/Package.zig
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,16 @@ pub const Path = struct {
return p.root_dir.handle.atomicFile(joined_path, options);
}

pub fn access(p: Path, sub_path: []const u8, flags: fs.File.OpenFlags) !void {
var buf: [fs.MAX_PATH_BYTES]u8 = undefined;
const joined_path = if (p.sub_path.len == 0) sub_path else p: {
break :p std.fmt.bufPrint(&buf, "{s}" ++ fs.path.sep_str ++ "{s}", .{
p.sub_path, sub_path,
}) catch return error.NameTooLong;
};
return p.root_dir.handle.access(joined_path, flags);
}

pub fn format(
self: Path,
comptime fmt_string: []const u8,
Expand Down
36 changes: 30 additions & 6 deletions src/Package/Fetch.zig
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ pub fn run(f: *Fetch) RunError!void {
);
f.package_root = try f.parent_package_root.join(arena, sub_path);
try loadManifest(f, f.package_root);
try checkBuildFileExistence(f);
if (!f.job_queue.recursive) return;
// Package hashes are used as unique identifiers for packages, so
// we still need one for relative paths.
Expand Down Expand Up @@ -279,17 +280,18 @@ pub fn run(f: *Fetch) RunError!void {
if (cache_root.handle.access(pkg_sub_path, .{})) |_| {
f.package_root = .{
.root_dir = cache_root,
.sub_path = pkg_sub_path,
.sub_path = try arena.dupe(u8, pkg_sub_path),
};
try loadManifest(f, f.package_root);
try checkBuildFileExistence(f);
if (!f.job_queue.recursive) return;
return queueJobsForDeps(f, expected_hash);
} else |err| switch (err) {
error.FileNotFound => {},
else => |e| {
try eb.addRootErrorMessage(.{
.msg = try eb.printString("unable to open global package cache directory '{s}': {s}", .{
try cache_root.join(arena, &.{pkg_sub_path}), @errorName(e),
.msg = try eb.printString("unable to open global package cache directory '{}{s}': {s}", .{
cache_root, pkg_sub_path, @errorName(e),
}),
});
return error.FetchFailed;
Expand Down Expand Up @@ -381,10 +383,13 @@ fn runResource(
// by the system. This is done even if the hash is invalid, in case the
// package with the different hash is used in the future.

const dest_pkg_sub_path = "p" ++ s ++ Manifest.hexDigest(f.actual_hash);
renameTmpIntoCache(cache_root.handle, tmp_dir_sub_path, dest_pkg_sub_path) catch |err| {
f.package_root = .{
.root_dir = cache_root,
.sub_path = try arena.dupe(u8, "p" ++ s ++ Manifest.hexDigest(f.actual_hash)),
};
renameTmpIntoCache(cache_root.handle, tmp_dir_sub_path, f.package_root.sub_path) catch |err| {
const src = try cache_root.join(arena, &.{tmp_dir_sub_path});
const dest = try cache_root.join(arena, &.{dest_pkg_sub_path});
const dest = try cache_root.join(arena, &.{f.package_root.sub_path});
try eb.addRootErrorMessage(.{ .msg = try eb.printString(
"unable to rename temporary directory '{s}' into package cache directory '{s}': {s}",
.{ src, dest, @errorName(err) },
Expand Down Expand Up @@ -423,6 +428,25 @@ fn runResource(
return queueJobsForDeps(f, actual_hex);
}

/// `computeHash` gets a free check for the existence of `build.zig`, but when
/// not computing a hash, we need to do a syscall to check for it.
fn checkBuildFileExistence(f: *Fetch) RunError!void {
const eb = &f.error_bundle;
if (f.package_root.access(Package.build_zig_basename, .{})) |_| {
f.has_build_zig = true;
} else |err| switch (err) {
error.FileNotFound => {},
else => |e| {
try eb.addRootErrorMessage(.{
.msg = try eb.printString("unable to access '{}{s}': {s}", .{
f.package_root, Package.build_zig_basename, @errorName(e),
}),
});
return error.FetchFailed;
},
}
}

/// This function populates `f.manifest` or leaves it `null`.
fn loadManifest(f: *Fetch, pkg_root: Package.Path) RunError!void {
const eb = &f.error_bundle;
Expand Down

0 comments on commit 68127cd

Please sign in to comment.