Compare commits

..

No commits in common. "01d77ca6cb089da1360e540865f7d035c95aa199" and "c86fa26bedab90b9a250e22f66759c0c50699f15" have entirely different histories.

10 changed files with 137 additions and 251 deletions

View File

@ -17,8 +17,6 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
- name: Use git-auto-commit-action - name: Use git-auto-commit-action
id: "auto-commit-action" id: "auto-commit-action"

View File

@ -27,7 +27,7 @@ jobs:
latest-version: ${{ github.event.release.name }} latest-version: ${{ github.event.release.name }}
- name: Commit updated CHANGELOG - name: Commit updated CHANGELOG
uses: stefanzweifel/git-auto-commit-action@v6 uses: stefanzweifel/git-auto-commit-action@v5
with: with:
branch: master branch: master
commit_message: Update CHANGELOG commit_message: Update CHANGELOG

View File

@ -5,41 +5,10 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## [Unreleased](https://github.com/stefanzweifel/git-auto-commit-action/compare/v6.0.1...HEAD) ## [Unreleased](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5.1.0...HEAD)
> TBD > TBD
## [v6.0.1](https://github.com/stefanzweifel/git-auto-commit-action/compare/v6.0.0...v6.0.1) - 2025-06-11
### Fixed
- Disable Check if Repo is in Detached State ([#379](https://github.com/stefanzweifel/git-auto-commit-action/pull/379)) [@stefanzweifel](https://github.com/@stefanzweifel)
## [v6.0.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5.2.0...v6.0.0) - 2025-06-10
### Added
- Throw error early if repository is in a detached state ([#357](https://github.com/stefanzweifel/git-auto-commit-action/pull/357))
### Fixed
- Fix PAT instructions with Dependabot ([#376](https://github.com/stefanzweifel/git-auto-commit-action/pull/376)) [@Dreamsorcerer](https://github.com/@Dreamsorcerer)
### Removed
- Remove support for `create_branch`, `skip_checkout`, `skip_Fetch` ([#314](https://github.com/stefanzweifel/git-auto-commit-action/pull/314))
## [v5.2.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5.1.0...v5.2.0) - 2025-04-19
### Added
- Add `create_git_tag_only` option to skip commiting and always create a git-tag. ([#364](https://github.com/stefanzweifel/git-auto-commit-action/pull/364)) [@zMynxx](https://github.com/@zMynxx)
- Add Test for `create_git_tag_only` feature ([#367](https://github.com/stefanzweifel/git-auto-commit-action/pull/367)) [@stefanzweifel](https://github.com/@stefanzweifel)
### Fixed
- docs: Update README.md per #354 ([#361](https://github.com/stefanzweifel/git-auto-commit-action/pull/361)) [@rasa](https://github.com/@rasa)
## [v5.1.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5.0.1...v5.1.0) - 2025-01-11 ## [v5.1.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5.0.1...v5.1.0) - 2025-01-11
### Changed ### Changed

View File

@ -19,7 +19,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. 2. Add the following step at the end of your job, after other steps that might add or change files.
```yaml ```yaml
- uses: stefanzweifel/git-auto-commit-action@v6 - uses: stefanzweifel/git-auto-commit-action@v5
``` ```
Your Workflow should look similar to this example. Your Workflow should look similar to this example.
@ -47,7 +47,7 @@ jobs:
# … # …
# Commit all changed files back to the repository # Commit all changed files back to the repository
- uses: stefanzweifel/git-auto-commit-action@v6 - uses: stefanzweifel/git-auto-commit-action@v5
``` ```
> [!NOTE] > [!NOTE]
@ -56,14 +56,15 @@ jobs:
The following is an extended example with all available options. The following is an extended example with all available options.
```yaml ```yaml
- uses: stefanzweifel/git-auto-commit-action@v6 - uses: stefanzweifel/git-auto-commit-action@v5
with: with:
# Optional. Commit message for the created commit. # Optional. Commit message for the created commit.
# Defaults to "Apply automatic changes" # Defaults to "Apply automatic changes"
commit_message: Automated Change commit_message: Automated Change
# Optional. Remote branch name where commit is going to be pushed to. # Optional. Local and remote branch name where commit is going to be pushed
# Defaults to the current branch. # to. Defaults to the current branch.
# You might need to set `create_branch: true` if the branch does not exist.
branch: feature-123 branch: feature-123
# Optional. Options used by `git-commit`. # Optional. Options used by `git-commit`.
@ -84,7 +85,7 @@ The following is an extended example with all available options.
# Optional commit user and author settings # Optional commit user and author settings
commit_user_name: My GitHub Actions Bot # defaults to "github-actions[bot]" 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_user_email: my-github-actions-bot@example.org # defaults to "41898282+github-actions[bot]@users.noreply.github.com"
commit_author: Author <actions@github.com> # defaults to "username <numeric_id+username@users.noreply.github.com>", where "numeric_id" and "username" belong to the author of the commit that triggered the run commit_author: Author <actions@github.com> # defaults to "username <username@users.noreply.github.com>", where "username" belongs to the author of the commit that triggered the run
# Optional. Tag name being created in the local repository and # Optional. Tag name being created in the local repository and
# pushed to remote repository and defined branch. # pushed to remote repository and defined branch.
@ -105,13 +106,18 @@ The following is an extended example with all available options.
# Optional. Disable dirty check and always try to create a commit and push # Optional. Disable dirty check and always try to create a commit and push
skip_dirty_check: true 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. # Optional. Prevents the shell from expanding filenames.
# Details: https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html # Details: https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html
disable_globbing: true disable_globbing: true
# Optional. Creates a new tag and pushes it to remote without creating a commit. # Optional. Create given branch name in local and remote repository.
# Skips dirty check and changed files. Must be used with `tagging_message`. create_branch: true
create_git_tag_only: false
``` ```
Please note that the Action depends on `bash`. If you're using the Action in a job in combination with a custom Docker container, make sure that `bash` is installed. Please note that the Action depends on `bash`. If you're using the Action in a job in combination with a custom Docker container, make sure that `bash` is installed.
@ -148,7 +154,7 @@ jobs:
- name: Run php-cs-fixer - name: Run php-cs-fixer
uses: docker://oskarstark/php-cs-fixer-ga uses: docker://oskarstark/php-cs-fixer-ga
- uses: stefanzweifel/git-auto-commit-action@v6 - uses: stefanzweifel/git-auto-commit-action@v5
with: with:
commit_message: Apply php-cs-fixer changes commit_message: Apply php-cs-fixer changes
``` ```
@ -163,14 +169,13 @@ You can use these outputs to trigger other Actions in your Workflow run based on
- `changes_detected`: Returns either "true" or "false" if the repository was dirty and files have changed. - `changes_detected`: Returns either "true" or "false" if the repository was dirty and files have changed.
- `commit_hash`: Returns the full hash of the commit if one was created. - `commit_hash`: Returns the full hash of the commit if one was created.
- `create_git_tag_only`: Returns either "true" or "false" if a tag was created, when `create_git_tag_only` was used.
**⚠️ When using outputs, the step needs to be given an id. See example below.** **⚠️ When using outputs, the step needs to be given an id. See example below.**
### Example ### Example
```yaml ```yaml
- uses: stefanzweifel/git-auto-commit-action@v6 - uses: stefanzweifel/git-auto-commit-action@v5
id: auto-commit-action #mandatory for the output to show up in ${{ steps }} id: auto-commit-action #mandatory for the output to show up in ${{ steps }}
with: with:
commit_message: Apply php-cs-fixer changes commit_message: Apply php-cs-fixer changes
@ -270,7 +275,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 # Quick and dirty step to get rid of the temporary file holding the commit message
- run: rm -rf commitmessage.txt - run: rm -rf commitmessage.txt
- uses: stefanzweifel/git-auto-commit-action@v6 - uses: stefanzweifel/git-auto-commit-action@v5
id: commit id: commit
with: with:
commit_message: ${{ steps.commit_message_step.outputs.commit_message }} commit_message: ${{ steps.commit_message_step.outputs.commit_message }}
@ -294,7 +299,7 @@ As git-auto-commit by default does not use **your** username and email when crea
git_commit_gpgsign: true git_commit_gpgsign: true
- name: "Commit and push changes" - name: "Commit and push changes"
uses: stefanzweifel/git-auto-commit-action@v6 uses: stefanzweifel/git-auto-commit-action@v5
with: with:
commit_author: "${{ steps.import-gpg.outputs.name }} <${{ steps.import-gpg.outputs.email }}>" commit_author: "${{ steps.import-gpg.outputs.name }} <${{ steps.import-gpg.outputs.email }}>"
commit_user_name: ${{ steps.import-gpg.outputs.name }} commit_user_name: ${{ steps.import-gpg.outputs.name }}
@ -371,7 +376,7 @@ jobs:
- name: Run php-cs-fixer - name: Run php-cs-fixer
uses: docker://oskarstark/php-cs-fixer-ga uses: docker://oskarstark/php-cs-fixer-ga
- uses: stefanzweifel/git-auto-commit-action@v6 - uses: stefanzweifel/git-auto-commit-action@v5
``` ```
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/). 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/).
@ -406,12 +411,13 @@ The steps in your workflow might look like this:
echo "message=$(git log -1 --pretty=%s)" >> $GITHUB_OUTPUT echo "message=$(git log -1 --pretty=%s)" >> $GITHUB_OUTPUT
echo "author=$(git log -1 --pretty=\"%an <%ae>\")" >> $GITHUB_OUTPUT echo "author=$(git log -1 --pretty=\"%an <%ae>\")" >> $GITHUB_OUTPUT
- uses: stefanzweifel/git-auto-commit-action@v6 - uses: stefanzweifel/git-auto-commit-action@v5
with: with:
commit_author: ${{ steps.last-commit.outputs.author }} commit_author: ${{ steps.last-commit.outputs.author }}
commit_message: ${{ steps.last-commit.outputs.message }} commit_message: ${{ steps.last-commit.outputs.message }}
commit_options: '--amend --no-edit' commit_options: '--amend --no-edit'
push_options: '--force' push_options: '--force'
skip_fetch: true
``` ```
See discussion in [#159](https://github.com/stefanzweifel/git-auto-commit-action/issues/159#issuecomment-845347950) for details. See discussion in [#159](https://github.com/stefanzweifel/git-auto-commit-action/issues/159#issuecomment-845347950) for details.
@ -450,19 +456,17 @@ If you create a fine-grained personal access token, apply the `Contents`-permiss
```yaml ```yaml
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: 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 }}
token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }}
``` ```
You can learn more about Personal Access Token in the [GitHub documentation](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token). You can learn more about Personal Access Token in the [GitHub documentation](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token).
> [!TIP] > [!TIP]
> If you're working in an organisation, and you don't want to create the PAT from your personal account, we recommend using a bot-account for such tokens. > If you're working in an organisation, and you don't want to create the PAT from your personal account, we recommend using a bot-account for such tokens.
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. 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 ```yaml
- uses: stefanzweifel/git-auto-commit-action@v6 - uses: stefanzweifel/git-auto-commit-action@v5
with: with:
commit_message: Apply php-cs-fixer changes commit_message: Apply php-cs-fixer changes
push_options: --force push_options: --force
@ -492,7 +496,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. To fix this add `disable_globbing: true` to your Workflow.
```yaml ```yaml
- uses: stefanzweifel/git-auto-commit-action@v6 - uses: stefanzweifel/git-auto-commit-action@v5
with: with:
file_pattern: '*.md' file_pattern: '*.md'
disable_globbing: true disable_globbing: true
@ -520,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/stefanzweifel/git-auto-commit-action/tags). We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/stefanzweifel/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 `stefanzweifel/git-auto-commit-action@v6` 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 `stefanzweifel/git-auto-commit-action@v5` 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).) (More information about this [here](https://help.github.com/en/actions/building-actions/about-actions#versioning-your-action).)
## Credits ## Credits

View File

@ -1,10 +0,0 @@
# Upgrading
## From v5 to v6
The following options have been removed from git-auto-commit and can be removed from your workflows.
- `create_branch` (git-auto-commit no longer switches branches locally during a workflow run)
- `skip_fetch`
- `skip_checkout`

View File

@ -56,36 +56,29 @@ inputs:
description: Skip the check if the git repository is dirty and always try to create a commit. description: Skip the check if the git repository is dirty and always try to create a commit.
required: false required: false
default: 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: disable_globbing:
description: Stop the shell from expanding filenames (https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html) description: Stop the shell from expanding filenames (https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html)
default: false default: false
create_git_tag_only: create_branch:
description: Perform a clean git tag and push, without commiting anything description: Create new branch with the name of `branch`-input in local and remote repository, if it doesn't exist yet.
required: false
default: false default: false
internal_git_binary: internal_git_binary:
description: Internal use only! Path to git binary used to check if git is available. (Don't change this!) description: Internal use only! Path to git binary used to check if git is available. (Don't change this!)
default: git 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: outputs:
changes_detected: changes_detected:
description: Value is "true", if the repository was dirty and file changes have been detected. Value is "false", if no changes have been detected. description: Value is "true", if the repository was dirty and file changes have been detected. Value is "false", if no changes have been detected.
commit_hash: commit_hash:
description: Full hash of the created commit. Only present if the "changes_detected" output is "true". description: Full hash of the created commit. Only present if the "changes_detected" output is "true".
create_git_tag_only:
description: Value is "true", if a git tag was created using the `create_git_tag_only`-input.
runs: runs:
using: 'node20' using: 'node20'

View File

@ -27,35 +27,16 @@ _log() {
} }
_main() { _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 _check_if_git_is_available
_switch_to_repository _switch_to_repository
_check_if_is_git_repository if _git_is_dirty || "$INPUT_SKIP_DIRTY_CHECK"; then
# _check_if_repository_is_in_detached_state
if "$INPUT_CREATE_GIT_TAG_ONLY"; then
_log "debug" "Create git tag only";
_set_github_output "create_git_tag_only" "true"
_tag_commit
_push_to_github
elif _git_is_dirty || "$INPUT_SKIP_DIRTY_CHECK"; then
_set_github_output "changes_detected" "true" _set_github_output "changes_detected" "true"
_switch_to_branch
_add_files _add_files
# Check dirty state of repo again using git-diff. # Check dirty state of repo again using git-diff.
@ -105,25 +86,36 @@ _git_is_dirty() {
gitStatusMessage="$((git status -s $INPUT_STATUS_OPTIONS -- ${INPUT_FILE_PATTERN_EXPANDED:+${INPUT_FILE_PATTERN_EXPANDED[@]}} >/dev/null ) 2>&1)"; gitStatusMessage="$((git status -s $INPUT_STATUS_OPTIONS -- ${INPUT_FILE_PATTERN_EXPANDED:+${INPUT_FILE_PATTERN_EXPANDED[@]}} >/dev/null ) 2>&1)";
# shellcheck disable=SC2086 # shellcheck disable=SC2086
gitStatus="$(git status -s $INPUT_STATUS_OPTIONS -- ${INPUT_FILE_PATTERN_EXPANDED:+${INPUT_FILE_PATTERN_EXPANDED[@]}})"; gitStatus="$(git status -s $INPUT_STATUS_OPTIONS -- ${INPUT_FILE_PATTERN_EXPANDED:+${INPUT_FILE_PATTERN_EXPANDED[@]}})";
if [ $? -ne 0 ]; then
_log "error" "git-status failed with:<$gitStatusMessage>";
exit 1;
fi
[ -n "$gitStatus" ] [ -n "$gitStatus" ]
} }
_check_if_is_git_repository() { _switch_to_branch() {
if [ -d ".git" ]; then echo "INPUT_BRANCH value: $INPUT_BRANCH";
_log "debug" "Repository found.";
else
_log "error" "Not a git repository. Please make sure to run this action in a git repository. Adjust the `repository` input if necessary.";
exit 1;
fi
}
_check_if_repository_is_in_detached_state() { # Fetch remote to make sure that repo can be switched to the right branch.
if [ -z "$(git symbolic-ref HEAD)" ] if "$INPUT_SKIP_FETCH"; then
then _log "debug" "git-fetch will not be executed.";
_log "error" "Repository is in detached HEAD state. Please make sure you check out a branch. Adjust the `ref` input accordingly.";
exit 1;
else else
_log "debug" "Repository is on a branch."; 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 fi
} }
@ -172,8 +164,6 @@ _tag_commit() {
_push_to_github() { _push_to_github() {
echo "INPUT_BRANCH value: $INPUT_BRANCH";
echo "INPUT_PUSH_OPTIONS: ${INPUT_PUSH_OPTIONS}"; echo "INPUT_PUSH_OPTIONS: ${INPUT_PUSH_OPTIONS}";
_log "debug" "Apply push options ${INPUT_PUSH_OPTIONS}"; _log "debug" "Apply push options ${INPUT_PUSH_OPTIONS}";

6
package-lock.json generated
View File

@ -5,15 +5,13 @@
"packages": { "packages": {
"": { "": {
"devDependencies": { "devDependencies": {
"bats": "^1.12.0", "bats": "^1.11.1",
"bats-assert": "ztombol/bats-assert", "bats-assert": "ztombol/bats-assert",
"bats-support": "ztombol/bats-support" "bats-support": "ztombol/bats-support"
} }
}, },
"node_modules/bats": { "node_modules/bats": {
"version": "1.12.0", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/bats/-/bats-1.12.0.tgz",
"integrity": "sha512-1HTv2n+fjn3bmY9SNDgmzS6bjoKtVlSK2pIHON5aSA2xaqGkZFoCCWP46/G6jm9zZ7MCi84mD+3Byw4t3KGwBg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"bin": { "bin": {

View File

@ -1,6 +1,6 @@
{ {
"devDependencies": { "devDependencies": {
"bats": "^1.12.0", "bats": "^1.11.1",
"bats-assert": "ztombol/bats-assert", "bats-assert": "ztombol/bats-assert",
"bats-support": "ztombol/bats-support" "bats-support": "ztombol/bats-support"
}, },

View File

@ -21,7 +21,6 @@ setup() {
export FAKE_DEFAULT_BRANCH=$(git config init.defaultBranch) export FAKE_DEFAULT_BRANCH=$(git config init.defaultBranch)
# Set default INPUT variables used by the GitHub Action # Set default INPUT variables used by the GitHub Action
export INPUT_CREATE_GIT_TAG_ONLY=false
export INPUT_REPOSITORY="${FAKE_LOCAL_REPOSITORY}" export INPUT_REPOSITORY="${FAKE_LOCAL_REPOSITORY}"
export INPUT_COMMIT_MESSAGE="Commit Message" export INPUT_COMMIT_MESSAGE="Commit Message"
export INPUT_BRANCH="${FAKE_DEFAULT_BRANCH}" export INPUT_BRANCH="${FAKE_DEFAULT_BRANCH}"
@ -35,13 +34,11 @@ setup() {
export INPUT_TAGGING_MESSAGE="" export INPUT_TAGGING_MESSAGE=""
export INPUT_PUSH_OPTIONS="" export INPUT_PUSH_OPTIONS=""
export INPUT_SKIP_DIRTY_CHECK=false 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_FETCH=false
export INPUT_SKIP_CHECKOUT=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 # Set GitHub environment variables used by the GitHub Action
temp_github_output_file=$(mktemp -t github_output_test.XXXXX) temp_github_output_file=$(mktemp -t github_output_test.XXXXX)
@ -195,6 +192,7 @@ cat_github_output() {
assert_failure assert_failure
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "INPUT_BRANCH value: ${FAKE_DEFAULT_BRANCH}"
assert_line "INPUT_FILE_PATTERN: ." assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: " assert_line "INPUT_COMMIT_OPTIONS: "
assert_line "::debug::Apply commit options " assert_line "::debug::Apply commit options "
@ -411,6 +409,32 @@ cat_github_output() {
assert_output --partial refs/tags/v2.0.0 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" { @test "It pushes generated commit and tag to remote and actually updates the commit shas" {
INPUT_BRANCH="" INPUT_BRANCH=""
INPUT_TAGGING_MESSAGE="v2.0.0" 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" { @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_BRANCH="a-new-branch"
INPUT_TAGGING_MESSAGE="v2.0.0" INPUT_TAGGING_MESSAGE="v2.0.0"
@ -463,7 +491,7 @@ cat_github_output() {
assert_output --partial refs/tags/v2.0.0 assert_output --partial refs/tags/v2.0.0
# Assert that branch "a-new-branch" was updated on remote # 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)" remote_sha="$(git rev-parse --verify --short origin/a-new-branch)"
assert_equal $current_sha $remote_sha 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" { @test "it does not throw an error if not changes are detected and SKIP_DIRTY_CHECK is false" {
INPUT_FILE_PATTERN="." INPUT_FILE_PATTERN="."
INPUT_SKIP_DIRTY_CHECK=false INPUT_SKIP_DIRTY_CHECK=false
INPUT_SKIP_FETCH=false
run git_auto_commit run git_auto_commit
@ -549,8 +578,9 @@ cat_github_output() {
assert_line "changes_detected=true" assert_line "changes_detected=true"
} }
@test "It pushes commit to new branch that does not exist yet" { @test "script fails to push commit to new branch that does not exist yet" {
INPUT_BRANCH="not-existend-branch" INPUT_BRANCH="not-existend-branch"
INPUT_CREATE_BRANCH=false
run git branch run git branch
refute_line --partial "not-existend-branch" refute_line --partial "not-existend-branch"
@ -562,24 +592,25 @@ cat_github_output() {
run git_auto_commit run git_auto_commit
assert_success assert_failure
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "INPUT_BRANCH value: not-existend-branch" assert_line "INPUT_BRANCH value: not-existend-branch"
assert_line "fatal: invalid reference: not-existend-branch"
run git branch run git branch
assert_line --partial ${FAKE_DEFAULT_BRANCH}
refute_line --partial "not-existend-branch" refute_line --partial "not-existend-branch"
run git branch -r run git branch -r
assert_line --partial "origin/not-existend-branch" refute_line --partial "origin/not-existend-branch"
run cat_github_output run cat_github_output
assert_line "changes_detected=true" assert_line "changes_detected=true"
} }
@test "It does not create new local branch and pushes the commit to a new branch on remote" { @test "It creates new local branch and pushes the new branch to remote" {
INPUT_BRANCH="not-existend-branch" INPUT_BRANCH="not-existend-branch"
INPUT_CREATE_BRANCH=true
run git branch run git branch
refute_line --partial "not-existend-branch" refute_line --partial "not-existend-branch"
@ -604,12 +635,9 @@ cat_github_output() {
assert_line "::debug::Apply push options " assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch not-existend-branch" assert_line "::debug::Push commit to remote branch not-existend-branch"
# Assert that local repo is still on default branch and not on new branch.
run git branch run git branch
assert_line --partial ${FAKE_DEFAULT_BRANCH} assert_line --partial "not-existend-branch"
refute_line --partial "not-existend-branch"
# Assert branch has been created on remote
run git branch -r run git branch -r
assert_line --partial "origin/not-existend-branch" assert_line --partial "origin/not-existend-branch"
@ -618,11 +646,13 @@ cat_github_output() {
assert_line -e "commit_hash=[0-9a-f]{40}$" assert_line -e "commit_hash=[0-9a-f]{40}$"
} }
@test "It does not create new local branch if local branch already exists" { @test "it does not create new local branch if local branch already exists" {
git checkout -b not-existend-remote-branch git checkout -b not-existend-remote-branch
git checkout ${FAKE_DEFAULT_BRANCH} git checkout ${FAKE_DEFAULT_BRANCH}
INPUT_BRANCH="not-existend-remote-branch" INPUT_BRANCH="not-existend-remote-branch"
INPUT_CREATE_BRANCH=true
run git branch run git branch
assert_line --partial "not-existend-remote-branch" assert_line --partial "not-existend-remote-branch"
@ -647,11 +677,6 @@ cat_github_output() {
assert_line "::debug::Apply push options " assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch not-existend-remote-branch" 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 run git branch
assert_line --partial "not-existend-remote-branch" assert_line --partial "not-existend-remote-branch"
@ -663,7 +688,8 @@ cat_github_output() {
assert_line -e "commit_hash=[0-9a-f]{40}$" 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" { @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 # Create `existing-remote-branch` on remote with changes the local repository does not yet have
cd $FAKE_TEMP_LOCAL_REPOSITORY cd $FAKE_TEMP_LOCAL_REPOSITORY
git checkout -b "existing-remote-branch" git checkout -b "existing-remote-branch"
@ -680,6 +706,7 @@ cat_github_output() {
cd $FAKE_LOCAL_REPOSITORY cd $FAKE_LOCAL_REPOSITORY
INPUT_BRANCH="existing-remote-branch" INPUT_BRANCH="existing-remote-branch"
INPUT_CREATE_BRANCH=true
run git branch run git branch
refute_line --partial "existing-remote-branch" refute_line --partial "existing-remote-branch"
@ -707,14 +734,13 @@ cat_github_output() {
assert_line "::debug::Push commit to remote branch existing-remote-branch" assert_line "::debug::Push commit to remote branch existing-remote-branch"
run git branch run git branch
assert_line --partial ${FAKE_DEFAULT_BRANCH} assert_line --partial "existing-remote-branch"
refute_line --partial "existing-remote-branch"
run git branch -r run git branch -r
assert_line --partial "origin/existing-remote-branch" assert_line --partial "origin/existing-remote-branch"
# Assert that branch "existing-remote-branch" was updated on remote # Assert that branch "existing-remote-branch" was updated on remote
current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})" current_sha="$(git rev-parse --verify --short existing-remote-branch)"
remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)" remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)"
assert_equal $current_sha $remote_sha assert_equal $current_sha $remote_sha
@ -724,7 +750,7 @@ cat_github_output() {
assert_line -e "commit_hash=[0-9a-f]{40}$" 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 "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 # Create `existing-remote-branch` on remote with changes the local repository does not yet have
cd $FAKE_TEMP_LOCAL_REPOSITORY cd $FAKE_TEMP_LOCAL_REPOSITORY
git checkout -b "existing-remote-branch" git checkout -b "existing-remote-branch"
@ -741,6 +767,7 @@ cat_github_output() {
cd $FAKE_LOCAL_REPOSITORY cd $FAKE_LOCAL_REPOSITORY
INPUT_BRANCH="existing-remote-branch" INPUT_BRANCH="existing-remote-branch"
INPUT_CREATE_BRANCH=true
run git branch run git branch
refute_line --partial "existing-remote-branch" refute_line --partial "existing-remote-branch"
@ -755,24 +782,23 @@ cat_github_output() {
assert_failure assert_failure
assert_line "hint: Updates were rejected because a pushed branch tip is behind its remote" assert_line "hint: Updates were rejected because the tip of your current branch is behind"
# Assert that branch exists locally and on remote # Assert that branch exists locally and on remote
run git branch run git branch
assert_line --partial ${FAKE_DEFAULT_BRANCH} assert_line --partial "existing-remote-branch"
refute_line --partial "existing-remote-branch"
run git branch -r run git branch -r
assert_line --partial "origin/existing-remote-branch" assert_line --partial "origin/existing-remote-branch"
# Assert that branch "existing-remote-branch" was not updated on remote # Assert that branch "existing-remote-branch" was not updated on remote
current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})" current_sha="$(git rev-parse --verify --short existing-remote-branch)"
remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)" remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)"
refute [assert_equal $current_sha $remote_sha] 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 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 # Create `new-branch` on remote with changes the local repository does not yet have
cd $FAKE_TEMP_LOCAL_REPOSITORY cd $FAKE_TEMP_LOCAL_REPOSITORY
@ -792,7 +818,7 @@ cat_github_output() {
INPUT_BRANCH="new-branch" INPUT_BRANCH="new-branch"
# Assert that local remote does not have a "new-branch"-branch nor does # Assert that local remote does not know have "new-branch" locally nor does
# know about the remote branch. # know about the remote branch.
run git branch run git branch
refute_line --partial "new-branch" refute_line --partial "new-branch"
@ -804,13 +830,16 @@ cat_github_output() {
run git_auto_commit run git_auto_commit
assert_failure assert_success
assert_line "INPUT_BRANCH value: new-branch" assert_line "INPUT_BRANCH value: new-branch"
assert_line --partial "::debug::Push commit to remote branch 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 that branch "new-branch" was updated on remote
assert_line --partial "This is usually caused by another repository pushing" 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
} }
@test "throws fatal error if file pattern includes files that do not exist" { @test "throws fatal error if file pattern includes files that do not exist" {
@ -975,7 +1004,7 @@ cat_github_output() {
assert_line --partial "Working tree clean. Nothing to commit." assert_line --partial "Working tree clean. Nothing to commit."
assert_line --partial "new-file-2.txt" assert_line --partial "new-file-2.txt"
# assert_line --partial "new-file-3.txt" assert_line --partial "new-file-3.txt"
# Changes are not detected # Changes are not detected
run cat_github_output run cat_github_output
@ -1009,7 +1038,7 @@ cat_github_output() {
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 "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-2.txt"
# assert_line --partial "new-file-3.txt" assert_line --partial "new-file-3.txt"
# Changes are detected # Changes are detected
run cat_github_output run cat_github_output
@ -1094,90 +1123,5 @@ END
run git_auto_commit run git_auto_commit
assert_failure; assert_failure;
assert_line "::error::Not a git repository. Please make sure to run this action in a git repository. Adjust the `repository` input if necessary." assert_line "::error::git-status failed with:<fatal: not a git repository (or any of the parent directories): .git>"
}
@test "It detects if the repository is in a detached state and exits with an error" {
skip
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
run git_auto_commit
assert_success
# Bring local repository into a detached state
prev_commit=$(git rev-parse HEAD~1);
git checkout "$prev_commit";
touch "${FAKE_TEMP_LOCAL_REPOSITORY}"/remote-files{4,5,6}.txt
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."
}
@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
run git_auto_commit
assert_success
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::Apply push options "
assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}"
run cat_github_output
assert_line "create_git_tag_only=true"
refute_line "changes_detected=false"
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 ls-remote --tags --refs
assert_output --partial refs/tags/v1.0.0
}
@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_TAGGING_MESSAGE=""
run git_auto_commit
assert_success
assert_line "INPUT_TAGGING_MESSAGE: "
assert_line "No tagging message supplied. No tag will be added."
assert_line "::debug::Create git tag only"
run cat_github_output
assert_line "create_git_tag_only=true"
refute_line "changes_detected=false"
refute_line -e "commit_hash=[0-9a-f]{40}$"
# Assert no tag has been created
run git tag
assert_output ""
}
@test "it shows warning message if any deprecated options are used" {
INPUT_SKIP_FETCH=true
INPUT_SKIP_CHECKOUT=true
INPUT_CREATE_BRANCH=true
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."
} }