Commit 3186658e60

Andrew Kelley <andrew@ziglang.org>
2023-03-10 02:10:21
std.Build.CheckFileStep: add a way to expect exact
This is done in a bit of a haphazard way. Eventually the API needs to break in favor of a "checks" system similar to how RunStep works.
1 parent 3b00e34
Changed files (1)
lib
lib/std/Build/CheckFileStep.zig
@@ -1,19 +1,19 @@
-const std = @import("../std.zig");
-const Step = std.Build.Step;
-const fs = std.fs;
-const mem = std.mem;
-
-const CheckFileStep = @This();
-
-pub const base_id = .check_file;
+//! Fail the build step if a file does not match certain checks.
+//! TODO: make this more flexible, supporting more kinds of checks.
+//! TODO: generalize the code in std.testing.expectEqualStrings and make this
+//! CheckFileStep produce those helpful diagnostics when there is not a match.
 
 step: Step,
 expected_matches: []const []const u8,
+expected_exact: ?[]const u8,
 source: std.Build.FileSource,
 max_bytes: usize = 20 * 1024 * 1024,
 
+pub const base_id = .check_file;
+
 pub const Options = struct {
-    expected_matches: []const []const u8,
+    expected_matches: []const []const u8 = &.{},
+    expected_exact: ?[]const u8 = null,
 };
 
 pub fn create(
@@ -31,6 +31,7 @@ pub fn create(
         }),
         .source = source.dupe(owner),
         .expected_matches = owner.dupeStrings(options.expected_matches),
+        .expected_exact = options.expected_exact,
     };
     self.source.addStepDependencies(&self.step);
     return self;
@@ -60,8 +61,28 @@ fn make(step: *Step, prog_node: *std.Progress.Node) !void {
                 \\{s}
                 \\========= but file does not contain it: =======
                 \\{s}
-                \\
+                \\===============================================
             , .{ expected_match, contents });
         }
     }
+
+    if (self.expected_exact) |expected_exact| {
+        if (!mem.eql(u8, expected_exact, contents)) {
+            return step.fail(
+                \\
+                \\========= expected: =====================
+                \\{s}
+                \\========= but found: ====================
+                \\{s}
+                \\========= from the following file: ======
+                \\{s}
+            , .{ expected_exact, contents, src_path });
+        }
+    }
 }
+
+const CheckFileStep = @This();
+const std = @import("../std.zig");
+const Step = std.Build.Step;
+const fs = std.fs;
+const mem = std.mem;