From 7d7f7a5ae445910e191f44f91f00f3574b66b604 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:18:52 +0000 Subject: [PATCH 01/20] Restore skip_fetch, skip_checkout, create_branch --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 18fdc87..50a8640 100644 --- a/README.md +++ b/README.md @@ -102,10 +102,19 @@ The following is an extended example with all available options. # Optional. Disable dirty check and always try to create a commit and push skip_dirty_check: true + # Optional. Skip internal call to `git fetch` + skip_fetch: true + + # Optional. Skip internal call to `git checkout` + skip_checkout: true + # Optional. Prevents the shell from expanding filenames. # Details: https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html disable_globbing: true + # Optional. Create given branch name in local and remote repository. + create_branch: true + # Optional. Creates a new tag and pushes it to remote without creating a commit. # Skips dirty check and changed files. Must be used with `tagging_message`. create_git_tag_only: false @@ -406,6 +415,7 @@ The steps in your workflow might look like this: commit_message: ${{ steps.last-commit.outputs.message }} commit_options: '--amend --no-edit' push_options: '--force' + skip_fetch: true ``` From 13f3837a27a1ba83471d66eb998d28a7c9dde1f6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:18:52 +0000 Subject: [PATCH 02/20] Restore skip_fetch, skip_checkout, create_branch --- action.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/action.yml b/action.yml index 9454944..9c70566 100644 --- a/action.yml +++ b/action.yml @@ -56,9 +56,20 @@ inputs: description: Skip the check if the git repository is dirty and always try to create a commit. required: false default: false + skip_fetch: + description: Skip the call to git-fetch. + required: false + default: false + skip_checkout: + description: Skip the call to git-checkout. + required: false + default: false disable_globbing: description: Stop the shell from expanding filenames (https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html) default: false + create_branch: + description: Create new branch with the name of `branch`-input in local and remote repository, if it doesn't exist yet. + default: false create_git_tag_only: description: Perform a clean git tag and push, without commiting anything required: false @@ -66,17 +77,6 @@ inputs: internal_git_binary: description: Internal use only! Path to git binary used to check if git is available. (Don't change this!) default: git - skip_fetch: - description: "Deprecated: skip_fetch has been removed in v6. It does not have any effect anymore." - required: false - default: false - skip_checkout: - description: "Deprecated: skip_checkout has been removed in v6. It does not have any effect anymore." - required: false - default: false - create_branch: - description: "Deprecated: create_branch has been removed in v6. It does not have any effect anymore." - default: false outputs: From 71c42e530fdc9f3c940fcd7096df72999641c136 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:18:53 +0000 Subject: [PATCH 03/20] Restore skip_fetch, skip_checkout, create_branch --- entrypoint.sh | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/entrypoint.sh b/entrypoint.sh index b55b351..a3885d9 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -56,6 +56,8 @@ _main() { _set_github_output "changes_detected" "true" + _switch_to_branch + _add_files # Check dirty state of repo again using git-diff. @@ -127,6 +129,32 @@ _check_if_repository_is_in_detached_state() { fi } +_switch_to_branch() { + echo "INPUT_BRANCH value: $INPUT_BRANCH"; + + # Fetch remote to make sure that repo can be switched to the right branch. + if "$INPUT_SKIP_FETCH"; then + _log "debug" "git-fetch will not be executed."; + else + git fetch --depth=1; + fi + + # If `skip_checkout`-input is true, skip the entire checkout step. + if "$INPUT_SKIP_CHECKOUT"; then + _log "debug" "git-checkout will not be executed."; + else + # Create new local branch if `create_branch`-input is true + if "$INPUT_CREATE_BRANCH"; then + # shellcheck disable=SC2086 + git checkout -B $INPUT_BRANCH --; + else + # Switch to branch from current Workflow run + # shellcheck disable=SC2086 + git checkout $INPUT_BRANCH --; + fi + fi +} + _add_files() { echo "INPUT_ADD_OPTIONS: ${INPUT_ADD_OPTIONS}"; _log "debug" "Apply add options ${INPUT_ADD_OPTIONS}"; From b60f71e52c54a2cfb2a3d619947f759a776bd069 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:18:55 +0000 Subject: [PATCH 04/20] Restore Tests --- tests/git-auto-commit.bats | 41 ++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/tests/git-auto-commit.bats b/tests/git-auto-commit.bats index c64bf19..c0b1532 100644 --- a/tests/git-auto-commit.bats +++ b/tests/git-auto-commit.bats @@ -35,13 +35,11 @@ setup() { export INPUT_TAGGING_MESSAGE="" export INPUT_PUSH_OPTIONS="" export INPUT_SKIP_DIRTY_CHECK=false - export INPUT_DISABLE_GLOBBING=false - export INPUT_INTERNAL_GIT_BINARY=git - - # Deprecated variables. Will be removed in future versions - export INPUT_CREATE_BRANCH=false export INPUT_SKIP_FETCH=false export INPUT_SKIP_CHECKOUT=false + export INPUT_DISABLE_GLOBBING=false + export INPUT_CREATE_BRANCH=false + export INPUT_INTERNAL_GIT_BINARY=git # Set GitHub environment variables used by the GitHub Action temp_github_output_file=$(mktemp -t github_output_test.XXXXX) @@ -411,6 +409,32 @@ cat_github_output() { assert_output --partial refs/tags/v2.0.0 } +@test "If SKIP_FETCH is true git-fetch will not be called" { + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + INPUT_SKIP_FETCH=true + + run git_auto_commit + + assert_success + + assert_line "::debug::git-fetch will not be executed." +} + +@test "If SKIP_CHECKOUT is true git-checkout will not be called" { + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + INPUT_SKIP_CHECKOUT=true + + run git_auto_commit + + assert_success + + assert_line "::debug::git-checkout will not be executed." +} + @test "It pushes generated commit and tag to remote and actually updates the commit shas" { INPUT_BRANCH="" INPUT_TAGGING_MESSAGE="v2.0.0" @@ -441,6 +465,10 @@ cat_github_output() { } @test "It pushes generated commit and tag to remote branch and updates commit sha" { + # Create "a-new-branch"-branch and then immediately switch back to ${FAKE_DEFAULT_BRANCH} + git checkout -b a-new-branch + git checkout ${FAKE_DEFAULT_BRANCH} + INPUT_BRANCH="a-new-branch" INPUT_TAGGING_MESSAGE="v2.0.0" @@ -463,7 +491,7 @@ cat_github_output() { assert_output --partial refs/tags/v2.0.0 # Assert that branch "a-new-branch" was updated on remote - current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})" + current_sha="$(git rev-parse --verify --short a-new-branch)" remote_sha="$(git rev-parse --verify --short origin/a-new-branch)" assert_equal $current_sha $remote_sha @@ -507,6 +535,7 @@ cat_github_output() { @test "it does not throw an error if not changes are detected and SKIP_DIRTY_CHECK is false" { INPUT_FILE_PATTERN="." INPUT_SKIP_DIRTY_CHECK=false + INPUT_SKIP_FETCH=false run git_auto_commit From 4da6e96c91695128cf9bdbec909dedaaa466368f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:18:56 +0000 Subject: [PATCH 05/20] Remove warnings of deprecated inputs --- entrypoint.sh | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/entrypoint.sh b/entrypoint.sh index a3885d9..5fcc448 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -27,18 +27,6 @@ _log() { } _main() { - if "$INPUT_SKIP_FETCH"; then - _log "warning" "git-auto-commit: skip_fetch has been removed in v6. It does not have any effect anymore."; - fi - - if "$INPUT_SKIP_CHECKOUT"; then - _log "warning" "git-auto-commit: skip_checkout has been removed in v6. It does not have any effect anymore."; - fi - - if "$INPUT_CREATE_BRANCH"; then - _log "warning" "git-auto-commit: create_branch has been removed in v6. It does not have any effect anymore."; - fi - _check_if_git_is_available _switch_to_repository From 9e09bdac2242af13edec3cbe6631143762bba072 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:18:57 +0000 Subject: [PATCH 06/20] Update Tests --- entrypoint.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/entrypoint.sh b/entrypoint.sh index 5fcc448..e873470 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -124,6 +124,7 @@ _switch_to_branch() { if "$INPUT_SKIP_FETCH"; then _log "debug" "git-fetch will not be executed."; else + _log "debug" "git-fetch will be executed."; git fetch --depth=1; fi @@ -131,6 +132,7 @@ _switch_to_branch() { if "$INPUT_SKIP_CHECKOUT"; then _log "debug" "git-checkout will not be executed."; else + _log "debug" "git-checkout will be executed."; # Create new local branch if `create_branch`-input is true if "$INPUT_CREATE_BRANCH"; then # shellcheck disable=SC2086 From 80356708e08ea4a24a4c50805b74675b102446cc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:18:58 +0000 Subject: [PATCH 07/20] Update Tests --- tests/git-auto-commit.bats | 323 ++++++++++++++++++++++++++++++------- 1 file changed, 269 insertions(+), 54 deletions(-) diff --git a/tests/git-auto-commit.bats b/tests/git-auto-commit.bats index c0b1532..c3f2a7d 100644 --- a/tests/git-auto-commit.bats +++ b/tests/git-auto-commit.bats @@ -589,6 +589,8 @@ cat_github_output() { touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + INPUT_SKIP_CHECKOUT=true + run git_auto_commit assert_success @@ -618,6 +620,8 @@ cat_github_output() { touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + INPUT_SKIP_CHECKOUT=true + run git_auto_commit assert_success @@ -647,51 +651,6 @@ cat_github_output() { assert_line -e "commit_hash=[0-9a-f]{40}$" } -@test "It does not create new local branch if local branch already exists" { - git checkout -b not-existend-remote-branch - git checkout ${FAKE_DEFAULT_BRANCH} - - INPUT_BRANCH="not-existend-remote-branch" - - run git branch - assert_line --partial "not-existend-remote-branch" - - run git branch -r - refute_line --partial "origin/not-existend-remote-branch" - - touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt - - run git_auto_commit - - assert_success - - assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" - assert_line "INPUT_BRANCH value: not-existend-remote-branch" - assert_line "INPUT_FILE_PATTERN: ." - assert_line "INPUT_COMMIT_OPTIONS: " - assert_line "::debug::Apply commit options " - assert_line "INPUT_TAGGING_MESSAGE: " - assert_line "No tagging message supplied. No tag will be added." - assert_line "INPUT_PUSH_OPTIONS: " - assert_line "::debug::Apply push options " - assert_line "::debug::Push commit to remote branch not-existend-remote-branch" - - # Assert checked out branch is still the same. - run git rev-parse --abbrev-ref HEAD - assert_line --partial ${FAKE_DEFAULT_BRANCH} - refute_line --partial "not-existend-remote-branch" - - run git branch - assert_line --partial "not-existend-remote-branch" - - run git branch -r - assert_line --partial "origin/not-existend-remote-branch" - - run cat_github_output - assert_line "changes_detected=true" - assert_line -e "commit_hash=[0-9a-f]{40}$" -} - @test "It creates new local branch and pushes branch to remote even if the remote branch already exists" { # Create `existing-remote-branch` on remote with changes the local repository does not yet have cd $FAKE_TEMP_LOCAL_REPOSITORY @@ -709,6 +668,7 @@ cat_github_output() { cd $FAKE_LOCAL_REPOSITORY INPUT_BRANCH="existing-remote-branch" + INPUT_SKIP_CHECKOUT=true run git branch refute_line --partial "existing-remote-branch" @@ -753,7 +713,7 @@ cat_github_output() { assert_line -e "commit_hash=[0-9a-f]{40}$" } -@test "It fails if local branch is behind remote and when remote has newer commits" { +@test "It fails if local branch is behind remote and when remote has newer commits and skip_checkout is set to true" { # Create `existing-remote-branch` on remote with changes the local repository does not yet have cd $FAKE_TEMP_LOCAL_REPOSITORY git checkout -b "existing-remote-branch" @@ -770,6 +730,7 @@ cat_github_output() { cd $FAKE_LOCAL_REPOSITORY INPUT_BRANCH="existing-remote-branch" + INPUT_SKIP_CHECKOUT=true run git branch refute_line --partial "existing-remote-branch" @@ -801,7 +762,7 @@ cat_github_output() { refute [assert_equal $current_sha $remote_sha] } -@test "It fails to push commit to remote if branch already exists and local repo is behind its remote counterpart" { +@test "It fails to push commit to remote if branch already exists and local repo is behind its remote counterpart and SKIP_CHECKOUT is used" { # Create `new-branch` on remote with changes the local repository does not yet have cd $FAKE_TEMP_LOCAL_REPOSITORY @@ -820,6 +781,7 @@ cat_github_output() { cd $FAKE_LOCAL_REPOSITORY INPUT_BRANCH="new-branch" + INPUT_SKIP_CHECKOUT=true # Assert that local remote does not have a "new-branch"-branch nor does # know about the remote branch. @@ -838,8 +800,7 @@ cat_github_output() { assert_line "INPUT_BRANCH value: new-branch" assert_line --partial "::debug::Push commit to remote branch new-branch" - assert_line --partial "Updates were rejected because the remote contains work that you do" - assert_line --partial "This is usually caused by another repository pushing" + assert_line --partial "Updates were rejected because a pushed branch tip is behind its remote" } @test "throws fatal error if file pattern includes files that do not exist" { @@ -1197,16 +1158,270 @@ END assert_output "" } -@test "it shows warning message if any deprecated options are used" { - INPUT_SKIP_FETCH=true +@test "script fails to push commit to new branch that does not exist yet" { + INPUT_BRANCH="not-existend-branch" + INPUT_CREATE_BRANCH=false + + run git branch + refute_line --partial "not-existend-branch" + + run git branch -r + refute_line --partial "origin/not-existend-branch" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_failure + + assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" + assert_line "INPUT_BRANCH value: not-existend-branch" + assert_line "fatal: invalid reference: not-existend-branch" + + run git branch + refute_line --partial "not-existend-branch" + + run git branch -r + refute_line --partial "origin/not-existend-branch" + + run cat_github_output + assert_line "changes_detected=true" +} + +@test "It creates new local branch and pushes the new branch to remote" { + INPUT_BRANCH="not-existend-branch" + INPUT_CREATE_BRANCH=true + + run git branch + refute_line --partial "not-existend-branch" + + run git branch -r + refute_line --partial "origin/not-existend-branch" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_success + + assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" + assert_line "INPUT_BRANCH value: not-existend-branch" + assert_line "INPUT_FILE_PATTERN: ." + assert_line "INPUT_COMMIT_OPTIONS: " + assert_line "::debug::Apply commit options " + assert_line "INPUT_TAGGING_MESSAGE: " + assert_line "No tagging message supplied. No tag will be added." + assert_line "INPUT_PUSH_OPTIONS: " + assert_line "::debug::Apply push options " + assert_line "::debug::Push commit to remote branch not-existend-branch" + + run git branch + assert_line --partial "not-existend-branch" + + run git branch -r + assert_line --partial "origin/not-existend-branch" + + run cat_github_output + assert_line "changes_detected=true" + assert_line -e "commit_hash=[0-9a-f]{40}$" +} + +@test "It does not create new local branch if local branch already exists and SKIP_CHECKOUT is true" { + git checkout -b not-existend-remote-branch + git checkout ${FAKE_DEFAULT_BRANCH} + + INPUT_BRANCH="not-existend-remote-branch" INPUT_SKIP_CHECKOUT=true + + run git branch + assert_line --partial "not-existend-remote-branch" + + run git branch -r + refute_line --partial "origin/not-existend-remote-branch" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_success + + assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" + assert_line "INPUT_BRANCH value: not-existend-remote-branch" + assert_line "INPUT_FILE_PATTERN: ." + assert_line "INPUT_COMMIT_OPTIONS: " + assert_line "::debug::Apply commit options " + assert_line "INPUT_TAGGING_MESSAGE: " + assert_line "No tagging message supplied. No tag will be added." + assert_line "INPUT_PUSH_OPTIONS: " + assert_line "::debug::Apply push options " + assert_line "::debug::Push commit to remote branch not-existend-remote-branch" + + # Assert checked out branch is still the same. + run git rev-parse --abbrev-ref HEAD + assert_line --partial ${FAKE_DEFAULT_BRANCH} + refute_line --partial "not-existend-remote-branch" + + run git branch + assert_line --partial "not-existend-remote-branch" + + run git branch -r + assert_line --partial "origin/not-existend-remote-branch" + + run cat_github_output + assert_line "changes_detected=true" + assert_line -e "commit_hash=[0-9a-f]{40}$" +} + +@test "it creates new local branch and pushes branch to remote even if the remote branch already exists" { + + # Create `existing-remote-branch` on remote with changes the local repository does not yet have + cd $FAKE_TEMP_LOCAL_REPOSITORY + git checkout -b "existing-remote-branch" + touch new-branch-file.txt + git add new-branch-file.txt + git commit -m "Add additional file" + git push origin existing-remote-branch + + run git branch + assert_line --partial "existing-remote-branch" + + # --------- + # Switch to our regular local repository and run `git-auto-commit` + cd $FAKE_LOCAL_REPOSITORY + + INPUT_BRANCH="existing-remote-branch" INPUT_CREATE_BRANCH=true + run git branch + refute_line --partial "existing-remote-branch" + + run git fetch --all + run git pull origin existing-remote-branch + run git branch -r + assert_line --partial "origin/existing-remote-branch" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + run git_auto_commit assert_success - assert_line "::warning::git-auto-commit: skip_fetch has been removed in v6. It does not have any effect anymore." - assert_line "::warning::git-auto-commit: skip_checkout has been removed in v6. It does not have any effect anymore." - assert_line "::warning::git-auto-commit: create_branch has been removed in v6. It does not have any effect anymore." + assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" + assert_line "INPUT_BRANCH value: existing-remote-branch" + assert_line "INPUT_FILE_PATTERN: ." + assert_line "INPUT_COMMIT_OPTIONS: " + assert_line "::debug::Apply commit options " + assert_line "INPUT_TAGGING_MESSAGE: " + assert_line "No tagging message supplied. No tag will be added." + assert_line "INPUT_PUSH_OPTIONS: " + assert_line "::debug::Apply push options " + assert_line "::debug::Push commit to remote branch existing-remote-branch" + + run git branch + assert_line --partial "existing-remote-branch" + + run git branch -r + assert_line --partial "origin/existing-remote-branch" + + # Assert that branch "existing-remote-branch" was updated on remote + current_sha="$(git rev-parse --verify --short existing-remote-branch)" + remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)" + + assert_equal $current_sha $remote_sha + + run cat_github_output + assert_line "changes_detected=true" + assert_line -e "commit_hash=[0-9a-f]{40}$" +} + +@test "script fails if new local branch is checked out and push fails as remote has newer commits than local" { + # Create `existing-remote-branch` on remote with changes the local repository does not yet have + cd $FAKE_TEMP_LOCAL_REPOSITORY + git checkout -b "existing-remote-branch" + touch new-branch-file.txt + git add new-branch-file.txt + git commit -m "Add additional file" + git push origin existing-remote-branch + + run git branch + assert_line --partial "existing-remote-branch" + + # --------- + # Switch to our regular local repository and run `git-auto-commit` + cd $FAKE_LOCAL_REPOSITORY + + INPUT_BRANCH="existing-remote-branch" + INPUT_CREATE_BRANCH=true + + run git branch + refute_line --partial "existing-remote-branch" + + run git fetch --all + run git branch -r + assert_line --partial "origin/existing-remote-branch" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_failure + + assert_line "hint: Updates were rejected because the tip of your current branch is behind" + + # Assert that branch exists locally and on remote + run git branch + assert_line --partial "existing-remote-branch" + + run git branch -r + assert_line --partial "origin/existing-remote-branch" + + # Assert that branch "existing-remote-branch" was not updated on remote + current_sha="$(git rev-parse --verify --short existing-remote-branch)" + remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)" + + refute [assert_equal $current_sha $remote_sha] +} + +@test "It pushes commit to remote if branch already exists and local repo is behind its remote counterpart" { + # Create `new-branch` on remote with changes the local repository does not yet have + cd $FAKE_TEMP_LOCAL_REPOSITORY + + git checkout -b "new-branch" + touch new-branch-file.txt + git add new-branch-file.txt + + git commit --quiet -m "Add additional file" + git push origin new-branch + + run git branch -r + assert_line --partial "origin/new-branch" + + # --------- + # Switch to our regular local repository and run `git-auto-commit` + cd $FAKE_LOCAL_REPOSITORY + + INPUT_BRANCH="new-branch" + + # Assert that local remote does not know have "new-branch" locally nor does + # know about the remote branch. + run git branch + refute_line --partial "new-branch" + + run git branch -r + refute_line --partial "origin/new-branch" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_success + + assert_line "INPUT_BRANCH value: new-branch" + assert_line --partial "::debug::Push commit to remote branch new-branch" + + # Assert that branch "new-branch" was updated on remote + current_sha="$(git rev-parse --verify --short new-branch)" + remote_sha="$(git rev-parse --verify --short origin/new-branch)" + + assert_equal $current_sha $remote_sha } From 71bfc005978447eb8aff8665a14caf0c8ecb9e23 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:19:00 +0000 Subject: [PATCH 08/20] feature: allow using custom tag message Signed-off-by: Elias Boulharts --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 50a8640..010a78a 100644 --- a/README.md +++ b/README.md @@ -82,10 +82,16 @@ The following is an extended example with all available options. commit_user_name: My GitHub Actions Bot # defaults to "github-actions[bot]" commit_user_email: my-github-actions-bot@example.org # defaults to "41898282+github-actions[bot]@users.noreply.github.com" commit_author: Author # defaults to "username ", where "numeric_id" and "username" belong to the author of the commit that triggered the run + + # Optional. Tag name to be created in the local repository and + # pushed to the remote repository on the defined branch. + # If only one of `tag` or `tagging_message` is provided, the value of the provided field will be used for both tag name and message. + tag: 'v1.0.0' + + # Optional. Message to annotate the created tag with. + # If only one of `tag` or `tagging_message` is provided, the value of the provided field will be used for both tag name and message. + tagging_message: 'MyProduct v1.0.0' - # Optional. Tag name being created in the local repository and - # pushed to remote repository and defined branch. - tagging_message: 'v1.0.0' # Optional. Option used by `git-status` to determine if the repository is # dirty. See https://git-scm.com/docs/git-status#_options From dfd027acb4409ec3fb2379c7172cd4e1a17f6379 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:19:01 +0000 Subject: [PATCH 09/20] feature: allow using custom tag message Signed-off-by: Elias Boulharts --- action.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/action.yml b/action.yml index 9c70566..a8aec50 100644 --- a/action.yml +++ b/action.yml @@ -44,8 +44,12 @@ inputs: description: Value used for the commit author. Defaults to the username of whoever triggered this workflow run. required: false default: ${{ github.actor }} <${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com> + tag: + description: New git tag with the commit. Keep this empty, if no tag should be created. + required: false + default: '' tagging_message: - description: Message used to create a new git tag with the commit. Keep this empty, if no tag should be created. + description: Message used to create a new git tag with the commit. required: false default: '' push_options: From 78f7111ab48ded7b461d89414a41d04e4145798b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:19:02 +0000 Subject: [PATCH 10/20] feature: allow using custom tag message Signed-off-by: Elias Boulharts --- entrypoint.sh | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/entrypoint.sh b/entrypoint.sh index e873470..7bc7e03 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -177,14 +177,17 @@ _local_commit() { } _tag_commit() { + echo "INPUT_TAG: ${INPUT_TAG}" echo "INPUT_TAGGING_MESSAGE: ${INPUT_TAGGING_MESSAGE}" - if [ -n "$INPUT_TAGGING_MESSAGE" ] - then - _log "debug" "Create tag $INPUT_TAGGING_MESSAGE"; - git -c user.name="$INPUT_COMMIT_USER_NAME" -c user.email="$INPUT_COMMIT_USER_EMAIL" tag -a "$INPUT_TAGGING_MESSAGE" -m "$INPUT_TAGGING_MESSAGE"; + if [ -n "$INPUT_TAG" ] || [ -n "$INPUT_TAGGING_MESSAGE" ]; then + TAG=${INPUT_TAG:-$INPUT_TAGGING_MESSAGE} + MESSAGE=${INPUT_TAGGING_MESSAGE:-$INPUT_TAG} + + _log "debug" "Create tag $TAG: $MESSAGE" + git -c user.name="$INPUT_COMMIT_USER_NAME" -c user.email="$INPUT_COMMIT_USER_EMAIL" tag -a "$TAG" -m "$MESSAGE" else - echo "No tagging message supplied. No tag will be added."; + echo "Neither tag nor tag message is set. No tag will be added."; fi } @@ -200,8 +203,8 @@ _push_to_github() { if [ -z "$INPUT_BRANCH" ] then - # Only add `--tags` option, if `$INPUT_TAGGING_MESSAGE` is set - if [ -n "$INPUT_TAGGING_MESSAGE" ] + # Only add `--tags` option, if `$INPUT_TAG` or `$INPUT_TAGGING_MESSAGE` is set + if [ -n "$INPUT_TAG" ] || [ -n "$INPUT_TAGGING_MESSAGE" ] then _log "debug" "git push origin --tags"; git push origin --follow-tags --atomic ${INPUT_PUSH_OPTIONS:+"${INPUT_PUSH_OPTIONS_ARRAY[@]}"}; From 15fc56da8d87a4066e5aaf5aa9a17da62537e58a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:19:03 +0000 Subject: [PATCH 11/20] Enable Detached State Check --- entrypoint.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/entrypoint.sh b/entrypoint.sh index 7bc7e03..1c79ed6 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -33,7 +33,7 @@ _main() { _check_if_is_git_repository - # _check_if_repository_is_in_detached_state + _check_if_repository_is_in_detached_state if "$INPUT_CREATE_GIT_TAG_ONLY"; then _log "debug" "Create git tag only"; @@ -110,8 +110,7 @@ _check_if_is_git_repository() { _check_if_repository_is_in_detached_state() { if [ -z "$(git symbolic-ref HEAD)" ] then - _log "error" "Repository is in detached HEAD state. Please make sure you check out a branch. Adjust the `ref` input accordingly."; - exit 1; + _log "warning" "Repository is in a detached HEAD state. git-auto-commit will likely handle this automatically. To avoid it, check out a branch using the ref option in actions/checkout."; else _log "debug" "Repository is on a branch."; fi From 6fa56f60042d6329561f6ccaa630a63103d14634 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:19:04 +0000 Subject: [PATCH 12/20] Enable Detached State Check --- tests/git-auto-commit.bats | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/git-auto-commit.bats b/tests/git-auto-commit.bats index c3f2a7d..ea5e599 100644 --- a/tests/git-auto-commit.bats +++ b/tests/git-auto-commit.bats @@ -1087,8 +1087,7 @@ END assert_line "::error::Not a git repository. Please make sure to run this action in a git repository. Adjust the `repository` input if necessary." } -@test "It detects if the repository is in a detached state and exits with an error" { - skip +@test "It detects if the repository is in a detached state and logs a warning" { touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt run git_auto_commit @@ -1103,8 +1102,8 @@ END run git_auto_commit - assert_failure; - assert_line "::error::Repository is in detached HEAD state. Please make sure you check out a branch. Adjust the `ref` input accordingly." + assert_success; + assert_line "::warning::Repository is in a detached HEAD state. git-auto-commit will likely handle this automatically. To avoid it, check out a branch using the ref option in actions/checkout." } @test "it creates a tag if create_git_tag_only is set to true and a message has been supplied" { From f62e15dbd9c1a54daaae47504ffc2b9f720a2fcb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:19:06 +0000 Subject: [PATCH 13/20] Fix Tests --- tests/git-auto-commit.bats | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/git-auto-commit.bats b/tests/git-auto-commit.bats index ea5e599..85f1e1a 100644 --- a/tests/git-auto-commit.bats +++ b/tests/git-auto-commit.bats @@ -1209,7 +1209,7 @@ END assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " assert_line "INPUT_TAGGING_MESSAGE: " - assert_line "No tagging message supplied. No tag will be added." + assert_line "Neither tag nor tag message is set. No tag will be added." assert_line "INPUT_PUSH_OPTIONS: " assert_line "::debug::Apply push options " assert_line "::debug::Push commit to remote branch not-existend-branch" @@ -1250,7 +1250,7 @@ END assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " assert_line "INPUT_TAGGING_MESSAGE: " - assert_line "No tagging message supplied. No tag will be added." + assert_line "Neither tag nor tag message is set. No tag will be added." assert_line "INPUT_PUSH_OPTIONS: " assert_line "::debug::Apply push options " assert_line "::debug::Push commit to remote branch not-existend-remote-branch" @@ -1311,7 +1311,7 @@ END assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " assert_line "INPUT_TAGGING_MESSAGE: " - assert_line "No tagging message supplied. No tag will be added." + assert_line "Neither tag nor tag message is set. No tag will be added." assert_line "INPUT_PUSH_OPTIONS: " assert_line "::debug::Apply push options " assert_line "::debug::Push commit to remote branch existing-remote-branch" From 8655edac2e7a4ec3dacf4da94913e1ff92558592 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:19:08 +0000 Subject: [PATCH 14/20] Change internal variable names --- entrypoint.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/entrypoint.sh b/entrypoint.sh index 1c79ed6..8a894aa 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -180,11 +180,11 @@ _tag_commit() { echo "INPUT_TAGGING_MESSAGE: ${INPUT_TAGGING_MESSAGE}" if [ -n "$INPUT_TAG" ] || [ -n "$INPUT_TAGGING_MESSAGE" ]; then - TAG=${INPUT_TAG:-$INPUT_TAGGING_MESSAGE} - MESSAGE=${INPUT_TAGGING_MESSAGE:-$INPUT_TAG} + INTERNAL_TAG=${INPUT_TAG:-$INPUT_TAGGING_MESSAGE} + INTERNAL_TAGGING_MESSAGE=${INPUT_TAGGING_MESSAGE:-$INPUT_TAG} - _log "debug" "Create tag $TAG: $MESSAGE" - git -c user.name="$INPUT_COMMIT_USER_NAME" -c user.email="$INPUT_COMMIT_USER_EMAIL" tag -a "$TAG" -m "$MESSAGE" + _log "debug" "Create tag $INTERNAL_TAG: $INTERNAL_TAGGING_MESSAGE" + git -c user.name="$INPUT_COMMIT_USER_NAME" -c user.email="$INPUT_COMMIT_USER_EMAIL" tag -a "$INTERNAL_TAG" -m "$INTERNAL_TAGGING_MESSAGE" else echo "Neither tag nor tag message is set. No tag will be added."; fi From 9fd88c9e991a7dd6b6188b03cf8fd3bde2664d69 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:19:09 +0000 Subject: [PATCH 15/20] Update README --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 010a78a..b6b5798 100644 --- a/README.md +++ b/README.md @@ -90,8 +90,7 @@ The following is an extended example with all available options. # Optional. Message to annotate the created tag with. # If only one of `tag` or `tagging_message` is provided, the value of the provided field will be used for both tag name and message. - tagging_message: 'MyProduct v1.0.0' - + tagging_message: 'Codename "Sunshine"' # Optional. Option used by `git-status` to determine if the repository is # dirty. See https://git-scm.com/docs/git-status#_options @@ -122,7 +121,7 @@ The following is an extended example with all available options. create_branch: true # Optional. Creates a new tag and pushes it to remote without creating a commit. - # Skips dirty check and changed files. Must be used with `tagging_message`. + # Skips dirty check and changed files. Must be used in combination with `tag` and `tagging_message`. create_git_tag_only: false ``` From db7bfe5614a4e3a4348c9e867646c40b3e52bca3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:19:10 +0000 Subject: [PATCH 16/20] Update README --- action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/action.yml b/action.yml index a8aec50..2573951 100644 --- a/action.yml +++ b/action.yml @@ -45,11 +45,11 @@ inputs: required: false default: ${{ github.actor }} <${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com> tag: - description: New git tag with the commit. Keep this empty, if no tag should be created. + description: Tag name used for creating a new git tag with the commit. Keep this empty, if no tag should be created. required: false default: '' tagging_message: - description: Message used to create a new git tag with the commit. + description: Tagging message used for creating a new git tag with the commit. Keep this empty, if no tag should be created. required: false default: '' push_options: From c471f840df1033b557a5e02cc72c04e694f15eec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:19:12 +0000 Subject: [PATCH 17/20] Release preparations for v7 (#394) --- action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/action.yml b/action.yml index 2573951..729db57 100644 --- a/action.yml +++ b/action.yml @@ -44,7 +44,7 @@ inputs: description: Value used for the commit author. Defaults to the username of whoever triggered this workflow run. required: false default: ${{ github.actor }} <${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com> - tag: + tag_name: description: Tag name used for creating a new git tag with the commit. Keep this empty, if no tag should be created. required: false default: '' From 169184c7ea4b2e9993007cedcc38c00aee286a53 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:19:13 +0000 Subject: [PATCH 18/20] Release preparations for v7 (#394) --- entrypoint.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/entrypoint.sh b/entrypoint.sh index 8a894aa..d288a67 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -176,12 +176,12 @@ _local_commit() { } _tag_commit() { - echo "INPUT_TAG: ${INPUT_TAG}" + echo "INPUT_TAG_NAME: ${INPUT_TAG_NAME}" echo "INPUT_TAGGING_MESSAGE: ${INPUT_TAGGING_MESSAGE}" - if [ -n "$INPUT_TAG" ] || [ -n "$INPUT_TAGGING_MESSAGE" ]; then - INTERNAL_TAG=${INPUT_TAG:-$INPUT_TAGGING_MESSAGE} - INTERNAL_TAGGING_MESSAGE=${INPUT_TAGGING_MESSAGE:-$INPUT_TAG} + if [ -n "$INPUT_TAG_NAME" ] || [ -n "$INPUT_TAGGING_MESSAGE" ]; then + INTERNAL_TAG=${INPUT_TAG_NAME:-$INPUT_TAGGING_MESSAGE} + INTERNAL_TAGGING_MESSAGE=${INPUT_TAGGING_MESSAGE:-$INPUT_TAG_NAME} _log "debug" "Create tag $INTERNAL_TAG: $INTERNAL_TAGGING_MESSAGE" git -c user.name="$INPUT_COMMIT_USER_NAME" -c user.email="$INPUT_COMMIT_USER_EMAIL" tag -a "$INTERNAL_TAG" -m "$INTERNAL_TAGGING_MESSAGE" @@ -202,8 +202,8 @@ _push_to_github() { if [ -z "$INPUT_BRANCH" ] then - # Only add `--tags` option, if `$INPUT_TAG` or `$INPUT_TAGGING_MESSAGE` is set - if [ -n "$INPUT_TAG" ] || [ -n "$INPUT_TAGGING_MESSAGE" ] + # Only add `--tags` option, if `$INPUT_TAG_NAME` or `$INPUT_TAGGING_MESSAGE` is set + if [ -n "$INPUT_TAG_NAME" ] || [ -n "$INPUT_TAGGING_MESSAGE" ] then _log "debug" "git push origin --tags"; git push origin --follow-tags --atomic ${INPUT_PUSH_OPTIONS:+"${INPUT_PUSH_OPTIONS_ARRAY[@]}"}; From f526a67c389412e94c8f43c6d01b23f94b7b7dad Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 04:19:23 +0000 Subject: [PATCH 19/20] fix: apply code build script --- dist/entrypoint.sh | 64 ++++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/dist/entrypoint.sh b/dist/entrypoint.sh index b55b351..d288a67 100755 --- a/dist/entrypoint.sh +++ b/dist/entrypoint.sh @@ -27,25 +27,13 @@ _log() { } _main() { - if "$INPUT_SKIP_FETCH"; then - _log "warning" "git-auto-commit: skip_fetch has been removed in v6. It does not have any effect anymore."; - fi - - if "$INPUT_SKIP_CHECKOUT"; then - _log "warning" "git-auto-commit: skip_checkout has been removed in v6. It does not have any effect anymore."; - fi - - if "$INPUT_CREATE_BRANCH"; then - _log "warning" "git-auto-commit: create_branch has been removed in v6. It does not have any effect anymore."; - fi - _check_if_git_is_available _switch_to_repository _check_if_is_git_repository - # _check_if_repository_is_in_detached_state + _check_if_repository_is_in_detached_state if "$INPUT_CREATE_GIT_TAG_ONLY"; then _log "debug" "Create git tag only"; @@ -56,6 +44,8 @@ _main() { _set_github_output "changes_detected" "true" + _switch_to_branch + _add_files # Check dirty state of repo again using git-diff. @@ -120,13 +110,40 @@ _check_if_is_git_repository() { _check_if_repository_is_in_detached_state() { if [ -z "$(git symbolic-ref HEAD)" ] then - _log "error" "Repository is in detached HEAD state. Please make sure you check out a branch. Adjust the `ref` input accordingly."; - exit 1; + _log "warning" "Repository is in a detached HEAD state. git-auto-commit will likely handle this automatically. To avoid it, check out a branch using the ref option in actions/checkout."; else _log "debug" "Repository is on a branch."; fi } +_switch_to_branch() { + echo "INPUT_BRANCH value: $INPUT_BRANCH"; + + # Fetch remote to make sure that repo can be switched to the right branch. + if "$INPUT_SKIP_FETCH"; then + _log "debug" "git-fetch will not be executed."; + else + _log "debug" "git-fetch will be executed."; + git fetch --depth=1; + fi + + # If `skip_checkout`-input is true, skip the entire checkout step. + if "$INPUT_SKIP_CHECKOUT"; then + _log "debug" "git-checkout will not be executed."; + else + _log "debug" "git-checkout will be executed."; + # Create new local branch if `create_branch`-input is true + if "$INPUT_CREATE_BRANCH"; then + # shellcheck disable=SC2086 + git checkout -B $INPUT_BRANCH --; + else + # Switch to branch from current Workflow run + # shellcheck disable=SC2086 + git checkout $INPUT_BRANCH --; + fi + fi +} + _add_files() { echo "INPUT_ADD_OPTIONS: ${INPUT_ADD_OPTIONS}"; _log "debug" "Apply add options ${INPUT_ADD_OPTIONS}"; @@ -159,14 +176,17 @@ _local_commit() { } _tag_commit() { + echo "INPUT_TAG_NAME: ${INPUT_TAG_NAME}" echo "INPUT_TAGGING_MESSAGE: ${INPUT_TAGGING_MESSAGE}" - if [ -n "$INPUT_TAGGING_MESSAGE" ] - then - _log "debug" "Create tag $INPUT_TAGGING_MESSAGE"; - git -c user.name="$INPUT_COMMIT_USER_NAME" -c user.email="$INPUT_COMMIT_USER_EMAIL" tag -a "$INPUT_TAGGING_MESSAGE" -m "$INPUT_TAGGING_MESSAGE"; + if [ -n "$INPUT_TAG_NAME" ] || [ -n "$INPUT_TAGGING_MESSAGE" ]; then + INTERNAL_TAG=${INPUT_TAG_NAME:-$INPUT_TAGGING_MESSAGE} + INTERNAL_TAGGING_MESSAGE=${INPUT_TAGGING_MESSAGE:-$INPUT_TAG_NAME} + + _log "debug" "Create tag $INTERNAL_TAG: $INTERNAL_TAGGING_MESSAGE" + git -c user.name="$INPUT_COMMIT_USER_NAME" -c user.email="$INPUT_COMMIT_USER_EMAIL" tag -a "$INTERNAL_TAG" -m "$INTERNAL_TAGGING_MESSAGE" else - echo "No tagging message supplied. No tag will be added."; + echo "Neither tag nor tag message is set. No tag will be added."; fi } @@ -182,8 +202,8 @@ _push_to_github() { if [ -z "$INPUT_BRANCH" ] then - # Only add `--tags` option, if `$INPUT_TAGGING_MESSAGE` is set - if [ -n "$INPUT_TAGGING_MESSAGE" ] + # Only add `--tags` option, if `$INPUT_TAG_NAME` or `$INPUT_TAGGING_MESSAGE` is set + if [ -n "$INPUT_TAG_NAME" ] || [ -n "$INPUT_TAGGING_MESSAGE" ] then _log "debug" "git push origin --tags"; git push origin --follow-tags --atomic ${INPUT_PUSH_OPTIONS:+"${INPUT_PUSH_OPTIONS_ARRAY[@]}"}; From 06daf79dae6ea033615be958a8c19dd978f87ff0 Mon Sep 17 00:00:00 2001 From: Raj Kumar Panda Date: Mon, 13 Oct 2025 10:02:56 +0530 Subject: [PATCH 20/20] conflicted commits cherry picked manually --- README.md | 42 ++++++------ action.yml | 2 +- tests/git-auto-commit.bats | 130 +++++++++++++++++++++++++++++-------- 3 files changed, 126 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index b6b5798..0e17642 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Adding git-auto-commit to your Workflow only takes a couple lines of code. 2. Add the following step at the end of your job, after other steps that might add or change files. ```yaml -- uses: step-security/git-auto-commit-action@v5 +- uses: step-security/git-auto-commit-action@v7 ``` Your Workflow should look similar to this example. @@ -36,7 +36,7 @@ jobs: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: ref: ${{ github.head_ref }} @@ -44,7 +44,7 @@ jobs: # … # Commit all changed files back to the repository - - uses: step-security/git-auto-commit-action@v5 + - uses: step-security/git-auto-commit-action@v7 ``` > [!NOTE] @@ -53,7 +53,7 @@ jobs: The following is an extended example with all available options. ```yaml -- uses: step-security/git-auto-commit-action@v5 +- uses: step-security/git-auto-commit-action@v7 with: # Optional. Commit message for the created commit. # Defaults to "Apply automatic changes" @@ -85,11 +85,11 @@ The following is an extended example with all available options. # Optional. Tag name to be created in the local repository and # pushed to the remote repository on the defined branch. - # If only one of `tag` or `tagging_message` is provided, the value of the provided field will be used for both tag name and message. - tag: 'v1.0.0' + # If only one of `tag_name` or `tagging_message` is provided, the value of the provided field will be used for both tag name and message. + tag_name: 'v1.0.0' # Optional. Message to annotate the created tag with. - # If only one of `tag` or `tagging_message` is provided, the value of the provided field will be used for both tag name and message. + # If only one of `tag_name` or `tagging_message` is provided, the value of the provided field will be used for both tag name and message. tagging_message: 'Codename "Sunshine"' # Optional. Option used by `git-status` to determine if the repository is @@ -152,14 +152,14 @@ jobs: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: ref: ${{ github.head_ref }} - name: Run php-cs-fixer uses: docker://oskarstark/php-cs-fixer-ga - - uses: step-security/git-auto-commit-action@v5 + - uses: step-security/git-auto-commit-action@v7 with: commit_message: Apply php-cs-fixer changes ``` @@ -181,7 +181,7 @@ You can use these outputs to trigger other Actions in your Workflow run based on ### Example ```yaml - - uses: step-security/git-auto-commit-action@v5 + - uses: step-security/git-auto-commit-action@v7 id: auto-commit-action #mandatory for the output to show up in ${{ steps }} with: commit_message: Apply php-cs-fixer changes @@ -217,7 +217,7 @@ You must use `action/checkout@v2` or later versions to check out the repository. In non-`push` events, such as `pull_request`, make sure to specify the `ref` to check out: ```yaml -- uses: actions/checkout@v4 +- uses: actions/checkout@v5 with: ref: ${{ github.head_ref }} ``` @@ -235,7 +235,7 @@ You can change this by creating a new [Personal Access Token (PAT)](https://gith storing the token as a secret in your repository and then passing the new token to the [`actions/checkout`](https://github.com/actions/checkout#usage) Action step. ```yaml -- uses: actions/checkout@v4 +- uses: actions/checkout@v5 with: token: ${{ secrets.PAT }} ``` @@ -281,7 +281,7 @@ The example below can be used as a starting point to generate a multiline commit # Quick and dirty step to get rid of the temporary file holding the commit message - run: rm -rf commitmessage.txt - - uses: step-security/git-auto-commit-action@v5 + - uses: step-security/git-auto-commit-action@v7 id: commit with: commit_message: ${{ steps.commit_message_step.outputs.commit_message }} @@ -305,7 +305,7 @@ As git-auto-commit by default does not use **your** username and email when crea git_commit_gpgsign: true - name: "Commit and push changes" - uses: step-security/git-auto-commit-action@v5 + uses: step-security/git-auto-commit-action@v7 with: commit_author: "${{ steps.import-gpg.outputs.name }} <${{ steps.import-gpg.outputs.email }}>" commit_user_name: ${{ steps.import-gpg.outputs.name }} @@ -365,7 +365,7 @@ jobs: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Checkout the fork/head-repository and push changes to the fork. # If you skip this, the base repository will be checked out and changes @@ -379,7 +379,7 @@ jobs: - name: Run php-cs-fixer uses: docker://oskarstark/php-cs-fixer-ga - - uses: step-security/git-auto-commit-action@v5 + - uses: step-security/git-auto-commit-action@v7 ``` For more information about running Actions on forks, see [this announcement from GitHub](https://github.blog/2020-08-03-github-actions-improvements-for-fork-and-pull-request-workflows/). @@ -414,7 +414,7 @@ The steps in your workflow might look like this: echo "message=$(git log -1 --pretty=%s)" >> $GITHUB_OUTPUT echo "author=$(git log -1 --pretty=\"%an <%ae>\")" >> $GITHUB_OUTPUT -- uses: step-security/git-auto-commit-action@v5 +- uses: step-security/git-auto-commit-action@v7 with: commit_author: ${{ steps.last-commit.outputs.author }} commit_message: ${{ steps.last-commit.outputs.message }} @@ -454,7 +454,7 @@ If you create a personal access token (classic), apply the `repo` and `workflow` If you create a fine-grained personal access token, apply the `Contents`-permissions. ```yaml -- uses: actions/checkout@v4 +- uses: actions/checkout@v5 with: # We pass the "PAT" secret to the checkout action; if no PAT secret is available to the workflow runner (eg. Dependabot) we fall back to the default "GITHUB_TOKEN". token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }} @@ -468,7 +468,7 @@ You can learn more about Personal Access Token in the [GitHub documentation](htt If you go the "force pushes" route, you have to enable force pushes to a protected branch (see [documentation](https://help.github.com/en/github/administering-a-repository/enabling-force-pushes-to-a-protected-branch)) and update your Workflow to use force push like this. ```yaml - - uses: step-security/git-auto-commit-action@v5 + - uses: step-security/git-auto-commit-action@v7 with: commit_message: Apply php-cs-fixer changes push_options: --force @@ -497,7 +497,7 @@ This is due to the fact, that the `*.md`-glob is expanded before sending it to ` To fix this add `disable_globbing: true` to your Workflow. ```yaml -- uses: step-security/git-auto-commit-action@v5 +- uses: step-security/git-auto-commit-action@v7 with: file_pattern: '*.md' disable_globbing: true @@ -524,7 +524,7 @@ yarn test We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/step-security/git-auto-commit-action/tags). -We also provide major version tags to make it easier to always use the latest release of a major version. For example, you can use `step-security/git-auto-commit-action@v5` to always use the latest release of the current major version. +We also provide major version tags to make it easier to always use the latest release of a major version. For example, you can use `step-security/git-auto-commit-action@v7` to always use the latest release of the current major version. (More information about this [here](https://help.github.com/en/actions/building-actions/about-actions#versioning-your-action).) diff --git a/action.yml b/action.yml index 729db57..4dbb7df 100644 --- a/action.yml +++ b/action.yml @@ -92,7 +92,7 @@ outputs: description: Value is "true", if a git tag was created using the `create_git_tag_only`-input. runs: - using: 'node20' + using: 'node24' main: 'dist/index.js' branding: diff --git a/tests/git-auto-commit.bats b/tests/git-auto-commit.bats index 85f1e1a..d3b81df 100644 --- a/tests/git-auto-commit.bats +++ b/tests/git-auto-commit.bats @@ -32,6 +32,7 @@ setup() { export INPUT_COMMIT_USER_NAME="Test Suite" export INPUT_COMMIT_USER_EMAIL="test@github.com" export INPUT_COMMIT_AUTHOR="Test Suite " + export INPUT_TAG_NAME="" export INPUT_TAGGING_MESSAGE="" export INPUT_PUSH_OPTIONS="" export INPUT_SKIP_DIRTY_CHECK=false @@ -121,8 +122,9 @@ cat_github_output() { assert_line "INPUT_FILE_PATTERN: ." assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " + assert_line "INPUT_TAG_NAME: " assert_line "INPUT_TAGGING_MESSAGE: " - assert_line "No tagging message supplied. No tag will be added." + assert_line "Neither tag nor tag message is set. No tag will be added." assert_line "INPUT_PUSH_OPTIONS: " assert_line "::debug::Apply push options " assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}" @@ -144,8 +146,9 @@ cat_github_output() { assert_line "INPUT_FILE_PATTERN: ." assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " + assert_line "INPUT_TAG_NAME: " assert_line "INPUT_TAGGING_MESSAGE: " - assert_line "No tagging message supplied. No tag will be added." + assert_line "Neither tag nor tag message is set. No tag will be added." assert_line "INPUT_PUSH_OPTIONS: " assert_line "::debug::Apply push options " assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}" @@ -291,7 +294,8 @@ cat_github_output() { } @test "It creates a tag with the commit" { - INPUT_TAGGING_MESSAGE="v1.0.0" + INPUT_TAG_NAME="v1.0.0" + INPUT_TAGGING_MESSAGE="MyProduct v1.0.0" touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt @@ -299,13 +303,15 @@ cat_github_output() { assert_success - assert_line "INPUT_TAGGING_MESSAGE: v1.0.0" - assert_line "::debug::Create tag v1.0.0" + assert_line "INPUT_TAG_NAME: v1.0.0" + assert_line "INPUT_TAGGING_MESSAGE: MyProduct v1.0.0" + + assert_line "::debug::Create tag v1.0.0: MyProduct v1.0.0" assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}" # Assert a tag v1.0.0 has been created - run git tag - assert_output v1.0.0 + run git tag -n + assert_output 'v1.0.0 MyProduct v1.0.0' run git ls-remote --tags --refs assert_output --partial refs/tags/v1.0.0 @@ -386,9 +392,11 @@ cat_github_output() { assert_equal $current_sha $remote_sha } -@test "It uses existing branch when INPUT_BRANCH is empty and INPUT_TAGGING_MESSAGE is set" { +@test "It uses existing branch when INPUT_BRANCH is empty and INPUT_TAG is set" { INPUT_BRANCH="" - INPUT_TAGGING_MESSAGE="v2.0.0" + INPUT_TAG_NAME="v2.0.0" + INPUT_TAGGING_MESSAGE="MyProduct v2.0.0" + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt @@ -396,8 +404,8 @@ cat_github_output() { assert_success - assert_line "INPUT_TAGGING_MESSAGE: v2.0.0" - assert_line "::debug::Create tag v2.0.0" + assert_line "INPUT_TAG_NAME: v2.0.0" + assert_line "::debug::Create tag v2.0.0: MyProduct v2.0.0" assert_line "::debug::git push origin --tags" # Assert a tag v2.0.0 has been created @@ -437,7 +445,9 @@ cat_github_output() { @test "It pushes generated commit and tag to remote and actually updates the commit shas" { INPUT_BRANCH="" - INPUT_TAGGING_MESSAGE="v2.0.0" + INPUT_TAG_NAME="v2.0.0" + INPUT_TAGGING_MESSAGE="MyProduct v2.0.0" + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt @@ -445,8 +455,8 @@ cat_github_output() { assert_success - assert_line "INPUT_TAGGING_MESSAGE: v2.0.0" - assert_line "::debug::Create tag v2.0.0" + assert_line "INPUT_TAG_NAME: v2.0.0" + assert_line "::debug::Create tag v2.0.0: MyProduct v2.0.0" assert_line "::debug::git push origin --tags" # Assert a tag v2.0.0 has been created @@ -470,7 +480,9 @@ cat_github_output() { git checkout ${FAKE_DEFAULT_BRANCH} INPUT_BRANCH="a-new-branch" - INPUT_TAGGING_MESSAGE="v2.0.0" + INPUT_TAG_NAME="v2.0.0" + INPUT_TAGGING_MESSAGE="MyProduct v2.0.0" + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt @@ -478,8 +490,8 @@ cat_github_output() { assert_success - assert_line "INPUT_TAGGING_MESSAGE: v2.0.0" - assert_line "::debug::Create tag v2.0.0" + assert_line "INPUT_TAG_NAME: v2.0.0" + assert_line "::debug::Create tag v2.0.0: MyProduct v2.0.0" assert_line "::debug::Push commit to remote branch a-new-branch" # Assert a tag v2.0.0 has been created @@ -631,8 +643,9 @@ cat_github_output() { assert_line "INPUT_FILE_PATTERN: ." assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " + assert_line "INPUT_TAG_NAME: " assert_line "INPUT_TAGGING_MESSAGE: " - assert_line "No tagging message supplied. No tag will be added." + assert_line "Neither tag nor tag message is set. No tag will be added." assert_line "INPUT_PUSH_OPTIONS: " assert_line "::debug::Apply push options " assert_line "::debug::Push commit to remote branch not-existend-branch" @@ -689,8 +702,9 @@ cat_github_output() { assert_line "INPUT_FILE_PATTERN: ." assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " + assert_line "INPUT_TAG_NAME: " assert_line "INPUT_TAGGING_MESSAGE: " - assert_line "No tagging message supplied. No tag will be added." + assert_line "Neither tag nor tag message is set. No tag will be added." assert_line "INPUT_PUSH_OPTIONS: " assert_line "::debug::Apply push options " assert_line "::debug::Push commit to remote branch existing-remote-branch" @@ -1021,8 +1035,9 @@ cat_github_output() { assert_line "INPUT_FILE_PATTERN: ." assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " + assert_line "INPUT_TAG_NAME: " assert_line "INPUT_TAGGING_MESSAGE: " - assert_line "No tagging message supplied. No tag will be added." + assert_line "Neither tag nor tag message is set. No tag will be added." assert_line "INPUT_PUSH_OPTIONS: " assert_line "::debug::Apply push options " assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}" @@ -1108,7 +1123,8 @@ END @test "it creates a tag if create_git_tag_only is set to true and a message has been supplied" { INPUT_CREATE_GIT_TAG_ONLY=true - INPUT_TAGGING_MESSAGE=v1.0.0 + INPUT_TAG_NAME=v1.0.0 + INPUT_TAGGING_MESSAGE="MyProduct v1.0.0" run git_auto_commit @@ -1116,8 +1132,8 @@ END assert_line "::debug::Create git tag only" - assert_line "::debug::Create tag v1.0.0" - refute_line "No tagging message supplied. No tag will be added." + assert_line "::debug::Create tag v1.0.0: MyProduct v1.0.0" + refute_line "Neither tag nor tag message is set. No tag will be added." assert_line "::debug::Apply push options " assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}" @@ -1128,8 +1144,8 @@ END refute_line -e "commit_hash=[0-9a-f]{40}$" # Assert a tag v1.0.0 has been created - run git tag - assert_output v1.0.0 + run git tag -n + assert_output 'v1.0.0 MyProduct v1.0.0' run git ls-remote --tags --refs assert_output --partial refs/tags/v1.0.0 @@ -1137,14 +1153,16 @@ END @test "it output no tagging message supplied if no tagging message is set but create_git_tag_only is set to true" { INPUT_CREATE_GIT_TAG_ONLY=true + INPUT_TAG_NAME="" INPUT_TAGGING_MESSAGE="" run git_auto_commit assert_success + assert_line "INPUT_TAG_NAME: " assert_line "INPUT_TAGGING_MESSAGE: " - assert_line "No tagging message supplied. No tag will be added." + assert_line "Neither tag nor tag message is set. No tag will be added." assert_line "::debug::Create git tag only" run cat_github_output @@ -1424,3 +1442,63 @@ END assert_equal $current_sha $remote_sha } + +@test "Set a tag message only" { + INPUT_TAGGING_MESSAGE="v1.0.0" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_success + + assert_line "INPUT_TAG_NAME: " + assert_line "INPUT_TAGGING_MESSAGE: v1.0.0" + + assert_line "::debug::Create tag v1.0.0: v1.0.0" + assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}" + + # Assert a tag v1.0.0 has been created + run git tag -n + assert_output 'v1.0.0 v1.0.0' + + run git ls-remote --tags --refs + assert_output --partial refs/tags/v1.0.0 + + # Assert that the commit has been pushed with --force and + # sha values are equal on local and remote + current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})" + remote_sha="$(git rev-parse --verify --short origin/${FAKE_DEFAULT_BRANCH})" + + assert_equal $current_sha $remote_sha +} + +@test "Set a tag only" { + INPUT_TAG_NAME="v1.0.0" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_success + + assert_line "INPUT_TAG_NAME: v1.0.0" + assert_line "INPUT_TAGGING_MESSAGE: " + + assert_line "::debug::Create tag v1.0.0: v1.0.0" + assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}" + + # Assert a tag v1.0.0 has been created + run git tag -n + assert_output 'v1.0.0 v1.0.0' + + run git ls-remote --tags --refs + assert_output --partial refs/tags/v1.0.0 + + # Assert that the commit has been pushed with --force and + # sha values are equal on local and remote + current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})" + remote_sha="$(git rev-parse --verify --short origin/${FAKE_DEFAULT_BRANCH})" + + assert_equal $current_sha $remote_sha +} \ No newline at end of file