diff options
| author | Robert Günzler <r@gnzler.io> | 2026-09-23 13:20:24 +0200 |
|---|---|---|
| committer | Robert Günzler <r@gnzler.io> | 2026-09-23 13:20:38 +0200 |
| commit | 8e68d18cf296ec8122b57b555004acbbefb44815 (patch) | |
| tree | 3f9932ffd88988d0aa979b85d1b56087efe96e1b /src | |
| parent | c28d653764ca49ae54a9ee94b85680a5868f4296 (diff) | |
| download | site-8e68d18cf296ec8122b57b555004acbbefb44815.tar.gz | |
sort paths before writing component xattr
Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.zig | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/main.zig b/src/main.zig index 2d055db..dce7aef 100644 --- a/src/main.zig +++ b/src/main.zig @@ -181,10 +181,6 @@ const Builder = struct { fn build(self: *Builder, io: Io, gpa: Allocator) !void { log.debug("{s}: building", .{self.source.path}); - // track source - try self.parts.append(gpa, try gpa.dupe(u8, self.source.path)); - try self.dgsts.append(gpa, try self.source.digest()); - const source_stem = std.fs.path.stem(self.source.path); // handle meta pages before even creating target_path @@ -411,6 +407,10 @@ const Builder = struct { }); try writer.interface.flush(); + // track source + try self.parts.append(gpa, try gpa.dupe(u8, self.source.path)); + try self.dgsts.append(gpa, try self.source.digest()); + try self.finalize(gpa, target_fd); log.debug("{s}: done", .{self.source.path}); } @@ -489,6 +489,7 @@ fn isFullPage(source: File) !bool { } fn compositeDigest(parts: []Digest) Digest { + // sort digests before computing composite std.sort.block(Digest, parts, {}, comptime struct { pub fn inner(_: void, a: Digest, b: Digest) bool { return std.mem.lessThan(u8, &a, &b); @@ -543,7 +544,16 @@ fn getXattrSourceDigest(gpa: Allocator, fd: Io.File) !Digest { return val[0..16].*; } -fn setXattrSourceComponents(gpa: Allocator, fd: Io.File, parts: []const []const u8) !void { +fn setXattrSourceComponents(gpa: Allocator, fd: Io.File, parts: [][]const u8) !void { + if (parts.len < 1) return error.InvalidComponents; + + // sort parts before joining + std.sort.block([]const u8, parts, {}, comptime struct { + pub fn inner(_: void, a: []const u8, b: []const u8) bool { + return std.mem.lessThan(u8, a, b); + } + }.inner); + const val = try std.mem.join(gpa, ";", parts); defer gpa.free(val); return try setXattr(fd, XATTR_SOURCE_COMPONENTS, val); |