|
68 | 68 |
|
69 | 69 | TEARDOWN="$ROOT/bin/fm-teardown.sh" |
70 | 70 | PR_CHECK="$ROOT/bin/fm-pr-check.sh" |
| 71 | +# shellcheck source=bin/fm-checkout-lock-lib.sh disable=SC1091 |
| 72 | +. "$ROOT/bin/fm-checkout-lock-lib.sh" |
71 | 73 | TMP_ROOT=$(fm_test_tmproot fm-teardown-tests) |
72 | 74 | REAL_GIT_FOR_TEST=$(command -v git) |
73 | 75 | export REAL_GIT_FOR_TEST |
@@ -2733,30 +2735,28 @@ SH |
2733 | 2735 | } |
2734 | 2736 |
|
2735 | 2737 | test_forced_secondmate_retains_child_on_treehouse_failure() { |
2736 | | - local case_dir child_worktree child_id lock child_pid_file child_ready_file child_pid term_marker rc |
| 2738 | + local case_dir child_worktree child_id lock child_pid_file child_ready_file child_pid rc |
2737 | 2739 | child_id=child-return-failure-x6 |
2738 | 2740 | setup_forced_secondmate_child_case secondmate-child-return-failure "$child_id" |
2739 | 2741 | case_dir=$FORCED_CHILD_CASE_DIR |
2740 | 2742 | child_worktree=$FORCED_CHILD_WORKTREE |
2741 | 2743 | lock=$(checkout_lock_path "$child_worktree" "$case_dir/checkout-locks") |
2742 | 2744 | child_pid_file="$case_dir/treehouse-child.pid" |
2743 | 2745 | child_ready_file="$case_dir/treehouse-child.ready" |
2744 | | - term_marker="$case_dir/treehouse-child-terminated-under-lock" |
2745 | 2746 | cat > "$case_dir/fakebin/treehouse" <<'SH' |
2746 | 2747 | #!/usr/bin/env bash |
2747 | 2748 | if [ "${1:-}" = return ]; then |
2748 | | - ( |
2749 | | - trap ' |
2750 | | - if [ -e "$FM_EXPECT_CHECKOUT_LOCK" ] || [ -L "$FM_EXPECT_CHECKOUT_LOCK" ]; then |
2751 | | - : > "$TREEHOUSE_RETURN_CHILD_TERM_MARKER" |
2752 | | - fi |
2753 | | - exit 0 |
2754 | | - ' TERM |
2755 | | - : > "$TREEHOUSE_RETURN_CHILD_READY_FILE" |
2756 | | - while :; do |
2757 | | - sleep 1 |
2758 | | - done |
2759 | | - ) & |
| 2749 | + python3 -c ' |
| 2750 | +import os |
| 2751 | +import signal |
| 2752 | +
|
| 2753 | +def terminate(_signum, _frame): |
| 2754 | + raise SystemExit(0) |
| 2755 | +
|
| 2756 | +signal.signal(signal.SIGTERM, terminate) |
| 2757 | +open(os.environ["TREEHOUSE_RETURN_CHILD_READY_FILE"], "w").close() |
| 2758 | +signal.pause() |
| 2759 | +' & |
2760 | 2760 | child=$! |
2761 | 2761 | printf '%s\n' "$child" > "$TREEHOUSE_RETURN_CHILD_PID_FILE" |
2762 | 2762 | while [ ! -f "$TREEHOUSE_RETURN_CHILD_READY_FILE" ]; do |
|
2773 | 2773 | FM_EXPECT_CHECKOUT_LOCK="$lock" \ |
2774 | 2774 | TREEHOUSE_RETURN_CHILD_PID_FILE="$child_pid_file" \ |
2775 | 2775 | TREEHOUSE_RETURN_CHILD_READY_FILE="$child_ready_file" \ |
2776 | | - TREEHOUSE_RETURN_CHILD_TERM_MARKER="$term_marker" \ |
2777 | 2776 | run_teardown "$case_dir" --force > "$case_dir/stdout" 2> "$case_dir/stderr" |
2778 | 2777 | rc=$? |
2779 | 2778 | set -e |
|
2784 | 2783 | child_pid=$(cat "$child_pid_file") |
2785 | 2784 | ! kill -0 "$child_pid" 2>/dev/null \ |
2786 | 2785 | || fail "failed Treehouse return left descendant $child_pid alive" |
2787 | | - assert_present "$term_marker" "failed Treehouse return released the checkout lock before terminating descendants" |
2788 | 2786 | assert_absent "$lock" "failed Treehouse return left the checkout lock held" |
2789 | 2787 | assert_present "$child_worktree" "failed Treehouse return deleted the child worktree" |
2790 | 2788 | assert_present "$case_dir/wt/state/$child_id.meta" "failed Treehouse return removed child retry metadata" |
|
0 commit comments