diff --git a/bin/mechanicaldiff.py b/bin/mechanicaldiff.py index 77633de..32d3b96 100755 --- a/bin/mechanicaldiff.py +++ b/bin/mechanicaldiff.py @@ -4,6 +4,16 @@ import re import sys +def trim_blank_ends(lines: list[str]) -> list[str]: + start = 0 + end = len(lines) + while start < end and lines[start] == "\n": + start += 1 + while end > start and lines[end - 1] == "\n": + end -= 1 + return lines[start:end] + + def filter_change_block( change_lines: list[str], search: str, replace: str ) -> list[str]: @@ -27,7 +37,7 @@ def filter_change_block( transformed_removed = [ re.sub(search, replace, line) for line in removed_lines ] - if transformed_removed == added_lines: + if trim_blank_ends(transformed_removed) == trim_blank_ends(added_lines): return change_lines if len(removed_lines) != len(added_lines): diff --git a/test/mechanicaldiff.bats b/test/mechanicaldiff.bats index beb4853..d5c2748 100755 --- a/test/mechanicaldiff.bats +++ b/test/mechanicaldiff.bats @@ -143,6 +143,24 @@ setup() { assert_output "$(cat "$BATS_TEST_TMPDIR/diff")" } +@test "ignores leading and trailing blank lines for comparison" { + cat >"$BATS_TEST_TMPDIR/old" <<-'EOF' + + prefix foo suffix + + EOF + cat >"$BATS_TEST_TMPDIR/new" <<-'EOF' + prefix bar suffix + EOF + + git diff --no-index "$BATS_TEST_TMPDIR/old" "$BATS_TEST_TMPDIR/new" \ + >"$BATS_TEST_TMPDIR/diff" || true + + run mechanicaldiff.py foo bar <"$BATS_TEST_TMPDIR/diff" + assert_success + assert_output "$(cat "$BATS_TEST_TMPDIR/diff")" +} + @test "keeps only matching line in a consecutive change block" { cat >"$BATS_TEST_TMPDIR/old" <<-'EOF' foo