Browse Source

Ensure the patches are up-to-date and consistent

Add the update-patches.py tool.

Update all the patches, so that the files are up-to-date and use the
same patch file format.
Manlio Perillo 2 years ago
parent
commit
c7697a4282

+ 1 - 1
patches/patches/026_hello2.patch

@@ -1,4 +1,4 @@
-22c22
+26c26
 <     stdout.print("Hello world!\n", .{});
 ---
 >     try stdout.print("Hello world!\n", .{});

+ 1 - 1
patches/patches/029_errdefer.patch

@@ -1,4 +1,4 @@
-35c34
+35c35
 <     std.debug.print("failed!\n", .{});
 ---
 >     errdefer std.debug.print("failed!\n", .{});

+ 1 - 1
patches/patches/040_pointers2.patch

@@ -1,4 +1,4 @@
-24c24
+26c26
 <     const b: *u8 = &a; // fix this!
 ---
 >     const b: *const u8 = &a; // fix this!

+ 2 - 2
patches/patches/046_optionals2.patch

@@ -1,8 +1,8 @@
-24c12
+24c24
 <     tail: *Elephant = null, // Hmm... tail needs something...
 ---
 >     tail: ?*Elephant = null, // <---- make this optional!
-54c42
+54c54
 <         if (e.tail == null) ???;
 ---
 >         if (e.tail == null) break;

+ 1 - 1
patches/patches/050_no_value.patch

@@ -6,7 +6,7 @@
 <     var first_line2: Err!*const [21]u8 = ???;
 ---
 >     var first_line2: Err!*const [21]u8 = Err.Cthulhu;
-79,80c79,80
+80,81c80,81
 < fn printSecondLine() ??? {
 <     var second_line2: ?*const [18]u8 = ???;
 ---

+ 2 - 2
patches/patches/064_builtins.patch

@@ -1,8 +1,8 @@
-72c72
+67c67
 <     const expected_result: u8 = ???;
 ---
 >     const expected_result: u8 = 0b00010010;
-88c88
+82c82
 <     const tupni: u8 = @bitReverse(input, tupni);
 ---
 >     const tupni: u8 = @bitReverse(input);

+ 20 - 39
patches/patches/065_builtins2.patch

@@ -1,39 +1,20 @@
---- exercises/065_builtins2.zig
-+++ answers/065_builtins2.zig
-@@ -58,7 +58,7 @@
-     // Oops! We cannot leave the 'me' and 'myself' fields
-     // undefined. Please set them here:
-     narcissus.me = &narcissus;
--    narcissus.??? = ???;
-+    narcissus.myself = &narcissus;
- 
-     // This determines a "peer type" from three separate
-     // references (they just happen to all be the same object).
-@@ -70,7 +70,7 @@
-     //
-     // The fix for this is very subtle, but it makes a big
-     // difference!
--    const Type2 = narcissus.fetchTheMostBeautifulType();
-+    const Type2 = Narcissus.fetchTheMostBeautifulType();
- 
-     // Now we print a pithy statement about Narcissus.
-     print("A {s} loves all {s}es. ", .{
-@@ -109,15 +109,15 @@
-     // Please complete these 'if' statements so that the field
-     // name will not be printed if the field is of type 'void'
-     // (which is a zero-bit type that takes up no space at all!):
--    if (fields[0].??? != void) {
-+    if (fields[0].type != void) {
-         print(" {s}", .{@typeInfo(Narcissus).Struct.fields[0].name});
-     }
- 
--    if (fields[1].??? != void) {
-+    if (fields[1].type != void) {
-         print(" {s}", .{@typeInfo(Narcissus).Struct.fields[1].name});
-     }
- 
--    if (fields[2].??? != void) {
-+    if (fields[2].type != void) {
-         print(" {s}", .{@typeInfo(Narcissus).Struct.fields[2].name});
-     }
- 
+61c61
+<     narcissus.??? = ???;
+---
+>     narcissus.myself = &narcissus;
+73c73
+<     const Type2 = narcissus.fetchTheMostBeautifulType();
+---
+>     const Type2 = Narcissus.fetchTheMostBeautifulType();
+112c112
+<     if (fields[0].??? != void) {
+---
+>     if (fields[0].type != void) {
+116c116
+<     if (fields[1].??? != void) {
+---
+>     if (fields[1].type != void) {
+120c120
+<     if (fields[2].??? != void) {
+---
+>     if (fields[2].type != void) {

+ 1 - 1
patches/patches/066_comptime.patch

@@ -1,4 +1,4 @@
-64,65c64,65
+65,66c65,66
 <     var var_int = 12345;
 <     var var_float = 987.654;
 ---

+ 2 - 2
patches/patches/076_sentinels.patch

@@ -1,8 +1,8 @@
-85c84
+85c85
 <             for (???) |s| {
 ---
 >             for (my_seq) |s| {
-97c96
+97c97
 <             while (??? != my_sentinel) {
 ---
 >             while (my_seq[i] != my_sentinel) {

+ 8 - 18
patches/patches/080_anonymous_structs.patch

@@ -1,18 +1,8 @@
---- exercises/080_anonymous_structs.zig
-+++ answers/080_anonymous_structs.zig
-@@ -48,13 +48,13 @@
-     // * circle1 should hold i32 integers
-     // * circle2 should hold f32 floats
-     //
--    var circle1 = ??? {
-+    var circle1 = Circle(i32){
-         .center_x = 25,
-         .center_y = 70,
-         .radius = 15,
-     };
- 
--    var circle2 = ??? {
-+    var circle2 = Circle(f32){
-         .center_x = 25.234,
-         .center_y = 70.999,
-         .radius = 15.714,
+51c51
+<     var circle1 = ??? {
+---
+>     var circle1 = Circle(i32){
+57c57
+<     var circle2 = ??? {
+---
+>     var circle2 = Circle(f32){

+ 1 - 1
patches/patches/096_memory_allocation.patch

@@ -1,4 +1,4 @@
-65c65
+66c66
 <     var avg: []f64 = ???;
 ---
 >     var avg: []f64 = try allocator.alloc(f64, arr.len);

+ 1 - 1
patches/patches/097_bit_manipulation.patch

@@ -1,4 +1,4 @@
-82c82
+83c83
 <     ???;
 ---
 >     x ^= y;

+ 1 - 1
patches/patches/098_bit_manipulation2.patch

@@ -1,4 +1,4 @@
-62c62
+63c63
 <     return bits == 0x..???;
 ---
 >     return bits == 0x3ffffff;

+ 68 - 0
tools/update-patches.py

@@ -0,0 +1,68 @@
+#!/usr/bin/env python
+
+import os
+import os.path
+import subprocess
+
+
+IGNORE = subprocess.DEVNULL
+
+EXERCISES_PATH = "exercises"
+ANSWERS_PATH = "answers"
+PATCHES_PATH = "patches/patches"
+
+
+# Heals all the exercises.
+def heal():
+    maketree(ANSWERS_PATH)
+
+    with os.scandir(EXERCISES_PATH) as it:
+        for entry in it:
+            name = entry.name
+
+            original_path = entry.path
+            patch_path = os.path.join(PATCHES_PATH, patch_name(name))
+            output_path = os.path.join(ANSWERS_PATH, name)
+
+            patch(original_path, patch_path, output_path)
+
+
+def main():
+    heal()
+
+    with os.scandir(EXERCISES_PATH) as it:
+        for entry in it:
+            name = entry.name
+
+            broken_path = entry.path
+            healed_path = os.path.join(ANSWERS_PATH, name)
+            patch_path = os.path.join(PATCHES_PATH, patch_name(name))
+
+            with open(patch_path, "w") as file:
+                term = subprocess.run(
+                    ["diff", broken_path, healed_path],
+                    stdout=file,
+                    text=True,
+                )
+                assert term.returncode == 1
+
+
+def maketree(path):
+    return os.makedirs(path, exist_ok=True)
+
+
+# Returns path with the patch extension.
+def patch_name(path):
+    name, _ = os.path.splitext(path)
+
+    return name + ".patch"
+
+
+# Applies patch to original, and write the file to output.
+def patch(original, patch, output):
+    subprocess.run(
+        ["patch", "-i", patch, "-o", output, original], stdout=IGNORE, check=True
+    )
+
+
+main()