about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/main.zig20
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);