From 3ea6ae190baf489ba007f7c92608f33ce20ef04a Mon Sep 17 00:00:00 2001 From: ZeroRin Date: Fri, 2 Dec 2022 03:47:06 +0800 Subject: [PATCH] Fix "nothing to commit" error with LF/CRLF changes #241 (#265) * fix crlf test * add diff check before commit * add dirty check flag (not sure if needed) * Update test name and add more assertions Update test name to make it clear that the Action no longer fails to detect CRLF changes. * Add Comment to explain why we use git-diff again * Add test to confirm content changes are commited * Closes #241 Co-authored-by: Stefan Zweifel --- entrypoint.sh | 23 +++++++++++++-- tests/git-auto-commit.bats | 57 ++++++++++++++++++++++++++++++++------ 2 files changed, 68 insertions(+), 12 deletions(-) diff --git a/entrypoint.sh b/entrypoint.sh index 52449a6..3c85831 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -25,11 +25,28 @@ _main() { _add_files - _local_commit + # Check dirty state of repo again using git-diff. + # (git-diff detects beter if CRLF of files changes and does NOT + # proceed, if only CRLF changes are detected. See #241 and #265 + # for more details.) + if [ -n "$(git diff --staged)" ] || "$INPUT_SKIP_DIRTY_CHECK"; then + _local_commit - _tag_commit + _tag_commit - _push_to_github + _push_to_github + else + + # Check if $GITHUB_OUTPUT is available + # (Feature detection will be removed in late December 2022) + if [ -z ${GITHUB_OUTPUT+x} ]; then + echo "::set-output name=changes_detected::false"; + else + echo "changes_detected=false" >> $GITHUB_OUTPUT; + fi + + echo "Working tree clean. Nothing to commit."; + fi else # Check if $GITHUB_OUTPUT is available diff --git a/tests/git-auto-commit.bats b/tests/git-auto-commit.bats index 92a3434..ead4db7 100644 --- a/tests/git-auto-commit.bats +++ b/tests/git-auto-commit.bats @@ -974,7 +974,7 @@ cat_github_output() { assert_line --partial "another-subdirectory/new-file-3.txt" } -@test "fails to detect crlf change in files and does not detect change or commit changes" { +@test "detects if crlf in files change and does not create commit" { # Set autocrlf to true cd "${FAKE_LOCAL_REPOSITORY}" git config core.autocrlf true @@ -982,26 +982,65 @@ cat_github_output() { assert_line "true" # Add more .txt files - touch "${FAKE_LOCAL_REPOSITORY}"/new-file-2.txt - touch "${FAKE_LOCAL_REPOSITORY}"/new-file-3.txt + echo -ne "crlf test1\r\n" > "${FAKE_LOCAL_REPOSITORY}"/new-file-2.txt + echo -ne "crlf test1\n" > "${FAKE_LOCAL_REPOSITORY}"/new-file-3.txt # Run git-auto-commit to add new files to repository run git_auto_commit # Change control characters in files - sed 's/^M$//' "${FAKE_LOCAL_REPOSITORY}"/new-file-2.txt - sed 's/$/^M/' "${FAKE_LOCAL_REPOSITORY}"/new-file-3.txt + echo -ne "crlf test1\n" > "${FAKE_LOCAL_REPOSITORY}"/new-file-2.txt + echo -ne "crlf test1\r\n" > "${FAKE_LOCAL_REPOSITORY}"/new-file-3.txt # Run git-auto-commit to commit the 2 changes files run git_auto_commit assert_success - # Changes are not detected - assert_line --partial "Working tree clean. Nothing to commit." + refute_line --partial "2 files changed, 2 insertions(+), 2 deletions(-)" + assert_line --partial "warning: in the working copy of 'new-file-2.txt', LF will be replaced by CRLF the next time Git touches it" - refute_line --partial "new-file-2.txt" - refute_line --partial "new-file-3.txt" + assert_line --partial "Working tree clean. Nothing to commit." + assert_line --partial "new-file-2.txt" + assert_line --partial "new-file-3.txt" + + # Changes are not detected + run cat_github_output + assert_line "changes_detected=false" +} + +@test "detects if crlf in files change and creates commit if the actual content of the files change" { + # Set autocrlf to true + cd "${FAKE_LOCAL_REPOSITORY}" + git config core.autocrlf true + run git config --get-all core.autocrlf + assert_line "true" + + # Add more .txt files + echo -ne "crlf test1\r\n" > "${FAKE_LOCAL_REPOSITORY}"/new-file-2.txt + echo -ne "crlf test1\n" > "${FAKE_LOCAL_REPOSITORY}"/new-file-3.txt + + # Run git-auto-commit to add new files to repository + run git_auto_commit + + # Change control characters in files + echo -ne "crlf test2\n" > "${FAKE_LOCAL_REPOSITORY}"/new-file-2.txt + echo -ne "crlf test2\r\n" > "${FAKE_LOCAL_REPOSITORY}"/new-file-3.txt + + # Run git-auto-commit to commit the 2 changes files + run git_auto_commit + + assert_success + + assert_line --partial "2 files changed, 2 insertions(+), 2 deletions(-)" + assert_line --partial "warning: in the working copy of 'new-file-2.txt', LF will be replaced by CRLF the next time Git touches it" + + assert_line --partial "new-file-2.txt" + assert_line --partial "new-file-3.txt" + + # Changes are detected + run cat_github_output + assert_line "changes_detected=true" }