From 3990b13ccfe139862289ccb3e549210059c7dc49 Mon Sep 17 00:00:00 2001 From: jovnc <95868357+jovnc@users.noreply.github.com> Date: Tue, 6 Jan 2026 23:36:53 +0800 Subject: [PATCH 1/2] [branch-bender] Fix verify logic to allow retries --- branch_bender/verify.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/branch_bender/verify.py b/branch_bender/verify.py index 3a5af5f2..fe9eaf4d 100644 --- a/branch_bender/verify.py +++ b/branch_bender/verify.py @@ -41,26 +41,28 @@ def verify(exercise: GitAutograderExercise) -> GitAutograderOutput: if len(merge_order) < 3: raise exercise.wrong_answer([MISSING_MERGES]) - if merge_order[0] != "feature/login": + # Use negative indexing to check the last 3 merges (most recent) + # This allows users to undo mistakes (e.g., reset --hard after accidental ff) and redo properly + if merge_order[-3] != "feature/login": raise exercise.wrong_answer([FEATURE_LOGIN_MERGE_MISSING, RESET_MESSAGE]) - if messages[0] == "Fast-forward": + if messages[-3] == "Fast-forward": raise exercise.wrong_answer( [NO_FAST_FORWARDING.format(branch_name="feature/login"), RESET_MESSAGE] ) - if merge_order[1] != "feature/dashboard": + if merge_order[-2] != "feature/dashboard": raise exercise.wrong_answer([FEATURE_DASHBOARD_MERGE_MISSING, RESET_MESSAGE]) - if messages[1] == "Fast-forward": + if messages[-2] == "Fast-forward": raise exercise.wrong_answer( [NO_FAST_FORWARDING.format(branch_name="feature/dashboard"), RESET_MESSAGE] ) - if merge_order[2] != "feature/payments": + if merge_order[-1] != "feature/payments": raise exercise.wrong_answer([FEATURE_PAYMENTS_MERGE_MISSING, RESET_MESSAGE]) - if messages[2] == "Fast-forward": + if messages[-1] == "Fast-forward": raise exercise.wrong_answer( [NO_FAST_FORWARDING.format(branch_name="feature/payments"), RESET_MESSAGE] ) From a8cd87fbc2d72c6780ed4de2db26ff64557af78a Mon Sep 17 00:00:00 2001 From: jovnc <95868357+jovnc@users.noreply.github.com> Date: Tue, 6 Jan 2026 23:45:57 +0800 Subject: [PATCH 2/2] [branch-bender] Add reposmith test for special case of undo --- branch_bender/test_verify.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/branch_bender/test_verify.py b/branch_bender/test_verify.py index 36cff525..2a658dec 100644 --- a/branch_bender/test_verify.py +++ b/branch_bender/test_verify.py @@ -59,6 +59,18 @@ def test_base(): assert_output(output, GitAutograderStatus.SUCCESSFUL) +def test_merge_undo_succeeds(): + with base_setup() as (test, rs): + rs.git.merge("feature/login", no_ff=False) + rs.git.reset("HEAD~1", hard=True) + rs.git.merge("feature/login", no_ff=True) + rs.git.merge("feature/dashboard", no_ff=True) + rs.git.merge("feature/payments", no_ff=True) + + output = test.run() + assert_output(output, GitAutograderStatus.SUCCESSFUL) + + def test_ff_fails(): with base_setup() as (test, rs): rs.git.merge("feature/login")