script/install: stop on a repo's own script of the same name
check / check (push) Successful in 26s

script/install replaced any tracked script/install or
script/update-policy in the target, including a repo's own unrelated
script. It now stops when such a file has a line the canonical file
has never held. An older shared copy is still replaced.

The padded file in the self-replacement test is now an earlier
canonical version, so the new stop does not catch it.

Model: opus-5-5
This commit is contained in:
clawbot committed 2026-11-09 18:49:16 +00:00
1 parent 454f3410a1
commit f4275b9ac0
3 files changed
+43 -2

No files matched your search

+2 -1
View File
@@ -221,7 +221,8 @@ with your task.
anything, naming the file and the entry. It stops the same way on a line
in `.golangci.yml` that the canonical file has never held, apart from
comments and the repo's entries in the `deny` list of the `test-support`
rule.
rule. It also stops on a repo's own `script/install` or
`script/update-policy`.
- [ ] README has an **Entrypoints** section documenting the `script/`
entrypoints and linking the standard
- [ ] `script/lint` and `script/test` each run
+16
View File
@@ -174,6 +174,19 @@ $own"
fi
}
# stop_on_own_script <fetched> <local>: stop if the local script has a
# line the canonical file has never held, unless it is blank or a
# comment: the repo wrote that script itself, and replacing it would
# delete it. A repo without the script is fine.
stop_on_own_script() {
[ -e "$2" ] || return 0
own="$(local_only_lines "$1" "$2")"
if [ -n "$own" ]; then
die "$2 has lines the canonical file has never held; rename the repo's own script to keep it:
$own"
fi
}
main() {
[ "$#" -le 1 ] || die "usage: script/install [path of a repo clone]"
@@ -221,6 +234,9 @@ main() {
.golangci.yml)
keep_deny_entries "$tmp/$path" "$path"
;;
script/*)
stop_on_own_script "$tmp/$path" "$path"
;;
esac
done
+25 -1
View File
@@ -415,7 +415,8 @@ test_target_lacking_install_gets_both_scripts() {
# The shell reads a script in blocks, so the padding makes it read the
# last line only after main has returned. It finds that line only if
# script/install left the old file in place under a new name.
# script/install left the old file in place under a new name. The old
# file is an earlier canonical version, so script/install replaces it.
test_update_policy_replaces_itself() {
start_scenario "script/update-policy replaces its own file and still exits 0"
{
@@ -427,6 +428,10 @@ test_update_policy_replaces_itself() {
done
echo "echo 'the old file ran to its end'"
} > "$dir/merged"
cp "$dir/merged" "$dir/canonical/script/update-policy"
commit_canonical
cp "$UPDATE_POLICY" "$dir/canonical/script/update-policy"
commit_canonical
mv "$dir/merged" "$dir/repo/script/update-policy"
chmod 755 "$dir/repo/script/update-policy"
commit_and_push_fixture
@@ -575,6 +580,17 @@ EOF
expect_no_commit
}
test_own_script_stops() {
start_scenario "a tracked script/install with a line the canonical file has never held stops"
echo "echo our own installer" >> "$dir/repo/script/install"
commit_and_push_fixture .prettierrc
run_update_policy
expect_failure
expect_output "script/install has lines"
expect_output "echo our own installer"
expect_nothing_written
}
test_gitignore_lacks_canonical_last_line() {
start_scenario ".gitignore lacking the canonical last line stops"
printf '*.log\n/myapp\n' > "$dir/repo/.gitignore"
@@ -688,6 +704,12 @@ test_former_canonical_gitignore_line_replaced() {
expect_former_canonical_line_replaced .gitignore "*.old"
}
test_former_canonical_script_line_replaced() {
start_scenario "a script/install line an earlier canonical commit held is replaced"
expect_former_canonical_line_replaced script/install "echo an older install"
expect_same_as_canonical script/install
}
# A line another file's history removed does not count as held by this
# one.
test_line_removed_from_another_file_still_stops() {
@@ -722,6 +744,7 @@ main() {
test_own_entry_above_closing_comment
test_uncommitted_change_stops
test_untracked_script_stops
test_own_script_stops
test_gitignore_lacks_canonical_last_line
test_fetched_golangci_without_deny_list
test_own_golangci_setting_stops
@@ -730,6 +753,7 @@ main() {
test_update_policy_takes_no_argument
test_former_canonical_golangci_line_replaced
test_former_canonical_gitignore_line_replaced
test_former_canonical_script_line_replaced
test_line_removed_from_another_file_still_stops
echo "update-policy tests passed"
}