fix: allow PowerShell CRLF line endings
This commit is contained in:
@@ -74,3 +74,61 @@ Task implementation: `ad07a75` (`build: enforce portable line endings`)
|
|||||||
None. The prescribed verifier and repository-integrity checks pass. A full Docker image build was
|
None. The prescribed verifier and repository-integrity checks pass. A full Docker image build was
|
||||||
not run because this task's required validation is the shell verifier suite; the Dockerfile change
|
not run because this task's required validation is the shell verifier suite; the Dockerfile change
|
||||||
is structurally covered by the reviewed build instruction ordering.
|
is structurally covered by the reviewed build instruction ordering.
|
||||||
|
|
||||||
|
## Fix round 1 — PowerShell CRLF policy
|
||||||
|
|
||||||
|
### Status
|
||||||
|
|
||||||
|
Complete. The verifier now applies the `.gitattributes` PowerShell exception: `*.ps1` files may
|
||||||
|
use CRLF, while CRLF remains a violation for the shell, YAML, and Dockerfile fixture inputs.
|
||||||
|
|
||||||
|
### Changed files
|
||||||
|
|
||||||
|
- `scripts/verify-line-endings.sh` — skips `.ps1` files before the CRLF rejection check.
|
||||||
|
- `scripts/test-verify-line-endings.sh` — adds a CRLF `valid.ps1` fixture and asserts it is not
|
||||||
|
reported; the fixture remains CRLF during the succeeding final verifier invocation.
|
||||||
|
|
||||||
|
### Red / green evidence
|
||||||
|
|
||||||
|
#### RED
|
||||||
|
|
||||||
|
Before the verifier change:
|
||||||
|
|
||||||
|
```text
|
||||||
|
$ bash scripts/test-verify-line-endings.sh
|
||||||
|
reported compliant CRLF PowerShell path: valid.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
The failure proves the new regression test exercised the existing incorrect behavior.
|
||||||
|
|
||||||
|
#### GREEN
|
||||||
|
|
||||||
|
After adding the `.ps1` exception:
|
||||||
|
|
||||||
|
```text
|
||||||
|
$ bash scripts/test-verify-line-endings.sh
|
||||||
|
line-ending verifier tests passed
|
||||||
|
```
|
||||||
|
|
||||||
|
The existing assertions still require `bad.sh`, `compose.yaml`, and `Dockerfile` to be reported,
|
||||||
|
while `valid.ps1` is rejected only if it is incorrectly reported. The final fixture verification
|
||||||
|
passes with `valid.ps1` still in CRLF form.
|
||||||
|
|
||||||
|
### Command and output summary
|
||||||
|
|
||||||
|
| Command | Result |
|
||||||
|
| --- | --- |
|
||||||
|
| `bash scripts/test-verify-line-endings.sh` (before change) | Exit 1: `reported compliant CRLF PowerShell path: valid.ps1`. |
|
||||||
|
| `bash scripts/test-verify-line-endings.sh` | Passed: `line-ending verifier tests passed`. |
|
||||||
|
| `bash scripts/verify-line-endings.sh` | Passed (exit 0; no output) for tracked repository files. |
|
||||||
|
| `git diff --check` | Passed (exit 0; no output). |
|
||||||
|
|
||||||
|
### Scope and self-review
|
||||||
|
|
||||||
|
The change is limited to the Important finding. It matches the existing lowercase `*.ps1`
|
||||||
|
pattern in `.gitattributes`, leaves the CRLF detection for every other file untouched, and does
|
||||||
|
not address either deferred Minor finding.
|
||||||
|
|
||||||
|
### Concerns
|
||||||
|
|
||||||
|
None.
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ printf '#!/bin/sh\nexit 0\n' > "$fixture_root/ok.sh"
|
|||||||
printf '#!/bin/sh\r\nexit 0\r\n' > "$fixture_root/bad.sh"
|
printf '#!/bin/sh\r\nexit 0\r\n' > "$fixture_root/bad.sh"
|
||||||
printf 'services:\r\n app:\r\n image: example\r\n' > "$fixture_root/compose.yaml"
|
printf 'services:\r\n app:\r\n image: example\r\n' > "$fixture_root/compose.yaml"
|
||||||
printf 'FROM scratch\r\n' > "$fixture_root/Dockerfile"
|
printf 'FROM scratch\r\n' > "$fixture_root/Dockerfile"
|
||||||
|
printf 'Write-Output "ok"\r\n' > "$fixture_root/valid.ps1"
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
output="$("$repo_root/scripts/verify-line-endings.sh" "$fixture_root" 2>&1)"
|
output="$("$repo_root/scripts/verify-line-endings.sh" "$fixture_root" 2>&1)"
|
||||||
@@ -32,6 +33,11 @@ if grep -Fq 'ok.sh' <<< "$output"; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if grep -Fq 'valid.ps1' <<< "$output"; then
|
||||||
|
echo "reported compliant CRLF PowerShell path: valid.ps1" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
printf '#!/bin/sh\nexit 0\n' > "$fixture_root/bad.sh"
|
printf '#!/bin/sh\nexit 0\n' > "$fixture_root/bad.sh"
|
||||||
printf 'services:\n app:\n image: example\n' > "$fixture_root/compose.yaml"
|
printf 'services:\n app:\n image: example\n' > "$fixture_root/compose.yaml"
|
||||||
printf 'FROM scratch\n' > "$fixture_root/Dockerfile"
|
printf 'FROM scratch\n' > "$fixture_root/Dockerfile"
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ root="$(cd "$root" && pwd)"
|
|||||||
offenders=()
|
offenders=()
|
||||||
|
|
||||||
while IFS= read -r -d '' file; do
|
while IFS= read -r -d '' file; do
|
||||||
|
case "$file" in
|
||||||
|
*.ps1) continue ;;
|
||||||
|
esac
|
||||||
|
|
||||||
if LC_ALL=C grep -Il $'\r' "$file" >/dev/null; then
|
if LC_ALL=C grep -Il $'\r' "$file" >/dev/null; then
|
||||||
offenders+=("${file#"$root"/}")
|
offenders+=("${file#"$root"/}")
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user