From 4ac1d70f93eeaf6e724823329a3a25585bdf2b24 Mon Sep 17 00:00:00 2001 From: Zendril <kenneth.s.brooks@gmail.com> Date: Tue, 4 Feb 2025 15:35:14 -0500 Subject: [PATCH 01/10] reset and completed exercise tracking wired in --- build.zig | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/build.zig b/build.zig index e528552..c701efd 100644 --- a/build.zig +++ b/build.zig @@ -162,6 +162,8 @@ pub fn build(b: *Build) !void { const exno: ?usize = b.option(usize, "n", "Select exercise"); const rand: ?bool = b.option(bool, "random", "Select random exercise"); const start: ?usize = b.option(usize, "s", "Start at exercise"); + // flag to reset the exercise progress + const reset: ?bool = b.option(bool, "reset", "Reset exercise progress"); const sep = std.fs.path.sep_str; const healed_path = if (override_healed_path) |path| @@ -242,13 +244,34 @@ pub fn build(b: *Build) !void { return; } + if (reset) |_| { + + const progress_file = ".progress.txt"; + + std.fs.cwd().deleteFile(progress_file) catch |err| { + switch (err) { + std.fs.Dir.DeleteFileError.FileNotFound => {}, + else => { + print("Unable to remove progress file, Error: {}\n", .{err}); + return err; + }, + } + }; + + print("Progress reset, .progress.txt removed.\n", .{}); + std.process.exit(0); + } + // Normal build mode: verifies all exercises according to the recommended // order. const ziglings_step = b.step("ziglings", "Check all ziglings"); b.default_step = ziglings_step; var prev_step = &header_step.step; + // read the file to find the latest complete, use that in the for loop + // for (exercises[(s - 1)..]) |ex| { for (exercises) |ex| { + // print("here {s}\n", .{ex.main_file}); const verify_stepn = ZiglingStep.create(b, ex, work_path, .normal); verify_stepn.step.dependOn(prev_step); @@ -403,6 +426,18 @@ const ZiglingStep = struct { , .{ red, reset, exercise_output, red, reset, output, red, reset }); } + const progress = try std.fmt.allocPrint(b.allocator, "{d}", .{self.exercise.number()}); + defer b.allocator.free(progress); + + const file = try std.fs.cwd().createFile( + ".progress.txt", + .{ .read = true, .truncate = true }, + ); + defer file.close(); + + try file.writeAll(progress); + try file.sync(); + print("{s}PASSED:\n{s}{s}\n\n", .{ green_text, output, reset_text }); } From e54b30f3d3a4b05d7eb35f066efd3a00c86a4b4f Mon Sep 17 00:00:00 2001 From: Zendril <kenneth.s.brooks@gmail.com> Date: Tue, 4 Feb 2025 15:37:01 -0500 Subject: [PATCH 02/10] fmt --- build.zig | 1 - 1 file changed, 1 deletion(-) diff --git a/build.zig b/build.zig index c701efd..ccb16ac 100644 --- a/build.zig +++ b/build.zig @@ -245,7 +245,6 @@ pub fn build(b: *Build) !void { } if (reset) |_| { - const progress_file = ".progress.txt"; std.fs.cwd().deleteFile(progress_file) catch |err| { From 8e6a52d5a6c9d0de356113494390a9d888d8ee1a Mon Sep 17 00:00:00 2001 From: Zendril <kenneth.s.brooks@gmail.com> Date: Tue, 4 Feb 2025 21:13:33 -0500 Subject: [PATCH 03/10] tracking, skipping and reset all wired in --- build.zig | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/build.zig b/build.zig index ccb16ac..2bc948b 100644 --- a/build.zig +++ b/build.zig @@ -267,10 +267,33 @@ pub fn build(b: *Build) !void { b.default_step = ziglings_step; var prev_step = &header_step.step; - // read the file to find the latest complete, use that in the for loop - // for (exercises[(s - 1)..]) |ex| { - for (exercises) |ex| { - // print("here {s}\n", .{ex.main_file}); + + var starting_exercise: u32 = 0; + + if (std.fs.cwd().openFile(".progress.txt", .{})) |progress_file| { + defer progress_file.close(); + + const progress_file_size = try progress_file.getEndPos(); + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + defer _ = gpa.deinit(); + const allocator = gpa.allocator(); + const contents = try progress_file.readToEndAlloc(allocator, progress_file_size); + defer allocator.free(contents); + + starting_exercise = try std.fmt.parseInt(u32, contents, 10); + } else |err| { + switch (err) { + // This is fine, may be the first time tests are run or progress have been reset + std.fs.File.OpenError.FileNotFound => {}, + else => { + print("Unable to open progress file, Error: {}\n", .{err}); + return err; + }, + } + } + + for (exercises[starting_exercise..]) |ex| { const verify_stepn = ZiglingStep.create(b, ex, work_path, .normal); verify_stepn.step.dependOn(prev_step); From 0903c5927b58f0ca166ee86c458de44fcf4234d6 Mon Sep 17 00:00:00 2001 From: Zendril <kenneth.s.brooks@gmail.com> Date: Tue, 4 Feb 2025 21:14:41 -0500 Subject: [PATCH 04/10] cleanup for PR --- build.zig | 1 - 1 file changed, 1 deletion(-) diff --git a/build.zig b/build.zig index 2bc948b..40a2d47 100644 --- a/build.zig +++ b/build.zig @@ -162,7 +162,6 @@ pub fn build(b: *Build) !void { const exno: ?usize = b.option(usize, "n", "Select exercise"); const rand: ?bool = b.option(bool, "random", "Select random exercise"); const start: ?usize = b.option(usize, "s", "Start at exercise"); - // flag to reset the exercise progress const reset: ?bool = b.option(bool, "reset", "Reset exercise progress"); const sep = std.fs.path.sep_str; From 92c723536242b31ecf222ec1f00586ebf46ea994 Mon Sep 17 00:00:00 2001 From: Zendril <kenneth.s.brooks@gmail.com> Date: Tue, 4 Feb 2025 21:29:46 -0500 Subject: [PATCH 05/10] cleanup for PR --- build.zig | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/build.zig b/build.zig index 40a2d47..335a415 100644 --- a/build.zig +++ b/build.zig @@ -120,6 +120,8 @@ pub const logo = \\ ; +const progress_filename = ".progress.txt"; + pub fn build(b: *Build) !void { if (!validate_exercises()) std.process.exit(2); @@ -244,9 +246,7 @@ pub fn build(b: *Build) !void { } if (reset) |_| { - const progress_file = ".progress.txt"; - - std.fs.cwd().deleteFile(progress_file) catch |err| { + std.fs.cwd().deleteFile(progress_filename) catch |err| { switch (err) { std.fs.Dir.DeleteFileError.FileNotFound => {}, else => { @@ -256,7 +256,7 @@ pub fn build(b: *Build) !void { } }; - print("Progress reset, .progress.txt removed.\n", .{}); + print("Progress reset, {s} removed.\n", .{progress_filename}); std.process.exit(0); } @@ -269,7 +269,7 @@ pub fn build(b: *Build) !void { var starting_exercise: u32 = 0; - if (std.fs.cwd().openFile(".progress.txt", .{})) |progress_file| { + if (std.fs.cwd().openFile(progress_filename, .{})) |progress_file| { defer progress_file.close(); const progress_file_size = try progress_file.getEndPos(); @@ -283,10 +283,12 @@ pub fn build(b: *Build) !void { starting_exercise = try std.fmt.parseInt(u32, contents, 10); } else |err| { switch (err) { - // This is fine, may be the first time tests are run or progress have been reset - std.fs.File.OpenError.FileNotFound => {}, + + std.fs.File.OpenError.FileNotFound => { + // This is fine, may be the first time tests are run or progress have been reset + }, else => { - print("Unable to open progress file, Error: {}\n", .{err}); + print("Unable to open {s}: {}\n", .{progress_filename, err}); return err; }, } @@ -451,7 +453,7 @@ const ZiglingStep = struct { defer b.allocator.free(progress); const file = try std.fs.cwd().createFile( - ".progress.txt", + progress_filename, .{ .read = true, .truncate = true }, ); defer file.close(); From e09c11a16a12dde4f88b4abbd867626008734a23 Mon Sep 17 00:00:00 2001 From: Zendril <kenneth.s.brooks@gmail.com> Date: Tue, 4 Feb 2025 21:29:56 -0500 Subject: [PATCH 06/10] cleanup for PR --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index f478944..c884f21 100644 --- a/README.md +++ b/README.md @@ -173,6 +173,11 @@ zig build -Dn=19 -l ... ``` +To reset the progress (have it run all the exercises that have already been completed): +``` +zig build -Dreset +``` + ## What's Covered The primary goal for Ziglings is to cover the core Zig language. From a9487c246fc35346bc4646af28341a2bb6a83209 Mon Sep 17 00:00:00 2001 From: Zendril <kenneth.s.brooks@gmail.com> Date: Tue, 4 Feb 2025 22:24:52 -0500 Subject: [PATCH 07/10] cleanup for PR --- build.zig | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/build.zig b/build.zig index 335a415..fd72881 100644 --- a/build.zig +++ b/build.zig @@ -294,11 +294,13 @@ pub fn build(b: *Build) !void { } } - for (exercises[starting_exercise..]) |ex| { - const verify_stepn = ZiglingStep.create(b, ex, work_path, .normal); - verify_stepn.step.dependOn(prev_step); + for (exercises) |ex| { + if (starting_exercise < ex.number()) { + const verify_stepn = ZiglingStep.create(b, ex, work_path, .normal); + verify_stepn.step.dependOn(prev_step); - prev_step = &verify_stepn.step; + prev_step = &verify_stepn.step; + } } ziglings_step.dependOn(prev_step); From b38d70002a36f684698a4e54f8fcf4fa1b56a2d4 Mon Sep 17 00:00:00 2001 From: Chris Boesch <chrboesch@noreply.codeberg.org> Date: Sun, 9 Feb 2025 16:34:56 +0100 Subject: [PATCH 08/10] Skip 74, the compiler corrects this now. --- build.zig | 1 + 1 file changed, 1 insertion(+) diff --git a/build.zig b/build.zig index e528552..858e43d 100644 --- a/build.zig +++ b/build.zig @@ -970,6 +970,7 @@ const exercises = [_]Exercise{ .{ .main_file = "074_comptime9.zig", .output = "My llama value is 2.", + .skip = true, }, .{ .main_file = "075_quiz8.zig", From c02e6ead16eb05fddc5f890fa96226857e42d67e Mon Sep 17 00:00:00 2001 From: Chris Boesch <chrboesch@noreply.codeberg.org> Date: Sun, 9 Feb 2025 21:31:07 +0100 Subject: [PATCH 09/10] Added deletion of progress.txt for eowyn --- .gitignore | 1 + patches/eowyn.sh | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/.gitignore b/.gitignore index 53a6184..0fa4230 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ /answers/ /patches/healed/ /output/ +.progress.txt # Leave this in here for older zig versions /zig-cache/ diff --git a/patches/eowyn.sh b/patches/eowyn.sh index 8cac450..4eb35b6 100755 --- a/patches/eowyn.sh +++ b/patches/eowyn.sh @@ -26,6 +26,13 @@ echo "Zig version" $(zig version) echo "Eowyn version 23.10.5.1, let's try our magic power." echo "" +# Remove progress file +progress_file=".progress.txt" +if [ -f $progress_file ]; then + rm $progress_file +fi + + # Create directory of healing if it doesn't already exist. mkdir -p patches/healed From c1777f47d5478cde0f08dafc6937b0f38464d787 Mon Sep 17 00:00:00 2001 From: Chris Boesch <chrboesch@noreply.codeberg.org> Date: Sun, 9 Feb 2025 21:42:31 +0100 Subject: [PATCH 10/10] Added delte_progress additional to the end of eowyn --- patches/eowyn.sh | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/patches/eowyn.sh b/patches/eowyn.sh index 4eb35b6..afc2732 100755 --- a/patches/eowyn.sh +++ b/patches/eowyn.sh @@ -12,6 +12,12 @@ # using the patches in this directory and convey them # to convalesce in the healed directory. # +delete_progress() { + progress_file=".progress.txt" + if [ -f $progress_file ]; then + rm $progress_file + fi +} set -e # We check ourselves before we wreck ourselves. @@ -23,15 +29,11 @@ fi # Which version we have? echo "Zig version" $(zig version) -echo "Eowyn version 23.10.5.1, let's try our magic power." +echo "Eowyn version 25.1.9, let's try our magic power." echo "" # Remove progress file -progress_file=".progress.txt" -if [ -f $progress_file ]; then - rm $progress_file -fi - +delete_progress # Create directory of healing if it doesn't already exist. mkdir -p patches/healed @@ -61,3 +63,6 @@ zig fmt --check patches/healed # Test the healed exercises. May the compiler have mercy upon us. zig build -Dhealed + +# Remove progress file again +delete_progress