Compare commits

..

82 commits

Author SHA1 Message Date
Stefan Zweifel
fc84150d7c
Add alternative actions 2026-01-19 19:44:34 +01:00
Stefan Zweifel
df21a760dd
Remove Security Link from config.yml 2026-01-17 08:25:12 +01:00
Stefan Zweifel
e4b712e8e8
Add Security Policy 2026-01-17 08:24:22 +01:00
Stefan Zweifel
6739571eae
Add Note about persist-credentials to README 2026-01-03 08:53:26 +01:00
stefanzweifel
b811de3f2d Update CHANGELOG 2025-12-17 19:26:02 +00:00
dependabot[bot]
04702edda4
Bump actions/checkout from 5 to 6 (#399)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-17 20:23:57 +01:00
Koen van Zuijlen
1e49d5001f
Add skip_push input option (#401)
Co-authored-by: Stefan Zweifel <stefan@stefanzweifel.dev>
2025-12-17 20:23:26 +01:00
Gideon
65c56779c9
docs: fix typo in README.md (#400) 2025-12-03 12:10:40 +01:00
dependabot[bot]
547c1409ce
Bump bats from 1.12.0 to 1.13.0 (#398)
Bumps [bats](https://github.com/bats-core/bats-core) from 1.12.0 to 1.13.0.
- [Release notes](https://github.com/bats-core/bats-core/releases)
- [Changelog](https://github.com/bats-core/bats-core/blob/master/docs/CHANGELOG.md)
- [Commits](https://github.com/bats-core/bats-core/compare/v1.12.0...v1.13.0)

---
updated-dependencies:
- dependency-name: bats
  dependency-version: 1.13.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-10 08:08:12 +01:00
stefanzweifel
8fa7f5a3c5 Update CHANGELOG 2025-10-12 14:39:35 +00:00
Stefan Zweifel
28e16e8177
Release preparations for v7 (#394) 2025-10-12 16:31:03 +02:00
Stefan Zweifel
698fd76863
Merge pull request #391 from EliasBoulharts/custom-tag-message 2025-10-12 15:13:29 +02:00
Stefan Zweifel
c40819ab3b
Update README 2025-10-12 14:59:32 +02:00
Stefan Zweifel
d7ee275235
Change internal variable names 2025-10-12 14:37:32 +02:00
Stefan Zweifel
e8684eb0cd
Fix Tests 2025-10-12 14:27:10 +02:00
Stefan Zweifel
19497011bb
Merge branch 'master' into pr/391 2025-10-12 14:11:57 +02:00
Stefan Zweifel
a88dc49508
Merge pull request #388 from stefanzweifel/v7-next 2025-10-12 14:02:15 +02:00
Stefan Zweifel
a531deca6b
Merge pull request #386 from stefanzweifel/dependabot/github_actions/actions/checkout-5 2025-10-12 13:40:50 +02:00
Stefan Zweifel
acbe8b15bf
Merge pull request #393 from stefanzweifel/v7-warn-detached-head 2025-09-30 16:54:18 +02:00
Stefan Zweifel
d1854850ec
Enable Detached State Check 2025-09-30 16:48:49 +02:00
Elias Boulharts
e9f84b936b feature: allow using custom tag message
Signed-off-by: Elias Boulharts <elias@MacBook-Pro-de-Elias.local>
2025-09-24 12:15:10 +02:00
Stefan Zweifel
d2e5cae4c6
Merge pull request #389 from stefanzweifel/v7-node-24
Run Action on Node 24
2025-09-22 07:20:05 +02:00
Stefan Zweifel
858005f1b9
Switch to Node24 2025-09-22 07:11:49 +02:00
Stefan Zweifel
9a4902607d
Update Tests 2025-09-17 14:08:26 +02:00
Stefan Zweifel
d330c718ba
Remove warnings of deprecated inputs 2025-09-17 13:32:46 +02:00
Stefan Zweifel
5fe35a088d
Restore Tests 2025-09-17 11:48:35 +02:00
Stefan Zweifel
2da8d963b4
Restore skip_fetch, skip_checkout, create_branch 2025-09-17 11:02:55 +02:00
dependabot[bot]
7ddc571aec
Bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-18 08:56:44 +00:00
Stefan Zweifel
01d77ca6cb
Merge pull request #382 from stefanzweifel/dependabot/github_actions/stefanzweifel/git-auto-commit-action-6 2025-06-16 09:45:04 +02:00
dependabot[bot]
6371fedd09
Bump stefanzweifel/git-auto-commit-action from 5 to 6
Bumps [stefanzweifel/git-auto-commit-action](https://github.com/stefanzweifel/git-auto-commit-action) from 5 to 6.
- [Release notes](https://github.com/stefanzweifel/git-auto-commit-action/releases)
- [Changelog](https://github.com/stefanzweifel/git-auto-commit-action/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5...v6)

---
updated-dependencies:
- dependency-name: stefanzweifel/git-auto-commit-action
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-16 06:39:19 +00:00
Stefan Zweifel
f9017b24ee
Update README to use v6 in examples 2025-06-13 16:47:49 +02:00
stefanzweifel
66f124b8c2 Update CHANGELOG 2025-06-11 11:27:36 +00:00
Stefan Zweifel
778341af66
Merge pull request #379 from stefanzweifel/disable-detached-state-check 2025-06-11 13:26:39 +02:00
Stefan Zweifel
33b203d92a
Disable Check if Repo is in Detached State
Fixes #378
2025-06-11 13:22:17 +02:00
stefanzweifel
a82d80a75f Update CHANGELOG 2025-06-10 18:44:47 +00:00
Stefan Zweifel
3cc016cfc8
Merge pull request #375 from stefanzweifel/v6-next 2025-06-10 20:19:14 +02:00
Stefan Zweifel
ddb7ae4159
Merge pull request #376 from Dreamsorcerer/patch-1 2025-06-02 21:38:08 +02:00
Stefan Zweifel
b001e5f0ff
Apply suggestions from code review 2025-06-02 21:37:45 +02:00
Sam Bull
6494dc61d3
Fix PAT instructions with Dependabot 2025-05-28 15:08:30 +01:00
Stefan Zweifel
76180511d9
Add deprecated inputs to fix unbound variable issue 2025-05-28 11:37:04 +02:00
Stefan Zweifel
ae114628ea
Merge pull request #371 from stefanzweifel/dependabot/npm_and_yarn/bats-1.12.0 2025-05-19 09:43:11 +02:00
dependabot[bot]
3058f91afb
Bump bats from 1.11.1 to 1.12.0
Bumps [bats](https://github.com/bats-core/bats-core) from 1.11.1 to 1.12.0.
- [Release notes](https://github.com/bats-core/bats-core/releases)
- [Changelog](https://github.com/bats-core/bats-core/blob/master/docs/CHANGELOG.md)
- [Commits](https://github.com/bats-core/bats-core/compare/v1.11.1...v1.12.0)

---
updated-dependencies:
- dependency-name: bats
  dependency-version: 1.12.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 06:08:17 +00:00
Stefan Zweifel
8ddf02de71
Add git-auto-commit to warning text 2025-05-03 16:03:43 +02:00
Stefan Zweifel
e7955f713c
Emit warning if deprecated/removed options are used 2025-05-03 15:51:01 +02:00
Stefan Zweifel
739fd03b2d
Merge branch 'master' into v6-next 2025-05-03 10:31:03 +02:00
stefanzweifel
af302a9c63 Update CHANGELOG 2025-04-19 08:40:01 +00:00
Stefan Zweifel
b863ae1933
Merge pull request #367 from stefanzweifel/stefanzweifel/git_tag_only_changes
Add Test for create_git_tag_only feature
2025-04-19 10:33:31 +02:00
Stefan Zweifel
adb37b5a29
Update README 2025-04-19 10:32:21 +02:00
Stefan Zweifel
8480c68cbb
Add Tests 2025-04-19 10:23:52 +02:00
Stefan Zweifel
4f8f3ad16e
Rename Input and add output 2025-04-19 10:23:52 +02:00
Stefan Zweifel
11a6e5f38f
Merge pull request #364 from zmynx/master
feat: allow for clean tag pushing
2025-04-19 10:23:02 +02:00
Lior Dux
35d037abf5
Update README.md 2025-03-23 22:33:45 +02:00
Lior Dux
bf425dc136
Merge branch 'master' into master 2025-03-23 22:32:20 +02:00
Lior Dux
cfd6ac4a3b
Update git-auto-commit.bats 2025-03-23 22:14:41 +02:00
Lior Dux
19379b46c9
Update git-auto-commit.bats 2025-03-23 22:05:21 +02:00
Lior Dux
12e100dacb
Update entrypoint.sh 2025-03-23 22:05:01 +02:00
Lior Dux
2ac10431a8
Update action.yml 2025-03-23 22:02:49 +02:00
Lior Dux
4db797a961
Update entrypoint.sh 2025-03-23 22:01:31 +02:00
Stefan Zweifel
e256565ae5
Merge pull request #361 from rasa/patch-1
docs: Update README.md per #354
2025-03-13 20:29:15 +01:00
Ross Smith II
8a23be4b32
docs: Update README.md per #354
See #354
2025-03-13 08:29:02 -07:00
Stefan Zweifel
ed295bd35a
Merge pull request #357 from stefanzweifel/v6-detect-detached-state 2025-02-05 18:00:42 +01:00
Stefan Zweifel
bd434eed48
Use ref checkout properly 2025-02-05 17:34:26 +01:00
Stefan Zweifel
1666a49083
Use ref in auto-commit workflow 2025-02-05 17:27:23 +01:00
Stefan Zweifel
1d986f74dd
Improve Error Message 2025-02-05 17:17:19 +01:00
Stefan Zweifel
ad56d4eb46
Throw error if repo is in detached state 2025-02-05 17:14:02 +01:00
Stefan Zweifel
9fa4cb99cf
Merge pull request #314 from stefanzweifel/v6/remove-local-branch-switch 2025-02-05 16:01:10 +01:00
Stefan Zweifel
cec27bde37
Fix Typo 2025-02-05 15:59:51 +01:00
Stefan Zweifel
244febd79d
Add UPGRADING.md 2025-02-05 15:57:55 +01:00
Stefan Zweifel
c86fa26bed
Replace Yarn with NPM 2025-02-05 13:54:04 +01:00
stefanzweifel
e35726034b Update CHANGELOG 2025-01-11 07:12:19 +00:00
Stefan Zweifel
7f171889c8
Remove removed options from README 2023-12-20 20:20:24 +01:00
Stefan Zweifel
76f415fb30
Remove skip_fetch, skip_checkout and create_branch 2023-12-20 20:19:38 +01:00
Stefan Zweifel
3e796a0146
Update Assertion 2023-12-20 20:13:20 +01:00
Stefan Zweifel
e833d4f211
Remove _switch_to_branch function 2023-12-20 20:10:12 +01:00
Stefan Zweifel
0aca01a1ef
Remove no longer used input options from tests 2023-12-20 20:09:59 +01:00
Stefan Zweifel
03fddc470c
Temp disable assertions 2023-12-20 20:09:40 +01:00
Stefan Zweifel
ef7ed32535
Remove no longer needed tests 2023-12-20 20:03:21 +01:00
Stefan Zweifel
9062db8404
Update Tests 2023-12-19 21:00:32 +01:00
Stefan Zweifel
80052f0645
Update Tests 2023-12-19 20:45:55 +01:00
Stefan Zweifel
3b8231379d
Update Tests 2023-12-19 20:34:56 +01:00
Stefan Zweifel
d9307b5e8c
Update Test 2023-12-19 20:13:01 +01:00
Stefan Zweifel
aa2cec9c08
Don't switch local branches 2023-12-19 20:11:39 +01:00
15 changed files with 750 additions and 160 deletions

View file

@ -5,4 +5,4 @@ contact_links:
about: If you can't get something to work the way you expect, open a question in our discussion forums.
- name: Feature Request
url: https://github.com/stefanzweifel/git-auto-commit-action/discussions/new?category=ideas
about: 'Suggest any ideas you have using our discussion forums.'
about: "Suggest any ideas you have using our discussion forums."

3
.github/SECURITY.md vendored Normal file
View file

@ -0,0 +1,3 @@
# Security Policy

If you discover any security related issues, please email stefan@stefanzweifel.dev instead of using the issue tracker.

View file

@ -16,7 +16,9 @@ jobs:
contents: write

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
ref: ${{ github.head_ref }}

- name: Use git-auto-commit-action
id: "auto-commit-action"

View file

@ -9,7 +9,7 @@ jobs:

steps:
- name: Checkout Code
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Lint Code Base
uses: github/super-linter@v7

View file

@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Install testing dependencies
run: yarn install

View file

@ -16,7 +16,7 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
ref: master

@ -27,7 +27,7 @@ jobs:
latest-version: ${{ github.event.release.name }}

- name: Commit updated CHANGELOG
uses: stefanzweifel/git-auto-commit-action@v5
uses: stefanzweifel/git-auto-commit-action@v7
with:
branch: master
commit_message: Update CHANGELOG

View file

@ -5,10 +5,89 @@ 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/)
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/v5.0.1...HEAD)
## [Unreleased](https://github.com/stefanzweifel/git-auto-commit-action/compare/v7.1.0...HEAD)

> TBD

## [v7.1.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v7.0.0...v7.1.0) - 2025-12-17

### Added

- Add skip_push input option ([#401](https://github.com/stefanzweifel/git-auto-commit-action/pull/401)) [@kvanzuijlen](https://github.com/@kvanzuijlen)

### Changes

- docs: fix typo in README.md ([#400](https://github.com/stefanzweifel/git-auto-commit-action/pull/400)) [@GideonBear](https://github.com/@GideonBear)

### Dependency Updates

- Bump actions/checkout from 5 to 6 ([#399](https://github.com/stefanzweifel/git-auto-commit-action/pull/399)) [@[dependabot[bot]](https://github.com/apps/dependabot)](https://github.com/@[dependabot[bot]](https://github.com/apps/dependabot))
- Bump bats from 1.12.0 to 1.13.0 ([#398](https://github.com/stefanzweifel/git-auto-commit-action/pull/398)) [@[dependabot[bot]](https://github.com/apps/dependabot)](https://github.com/@[dependabot[bot]](https://github.com/apps/dependabot))

## [v7.0.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v6.0.1...v7.0.0) - 2025-10-12

### Added

- Restore skip_fetch, skip_checkout, create_branch ([#388](https://github.com/stefanzweifel/git-auto-commit-action/pull/388)) [@stefanzweifel](https://github.com/@stefanzweifel)
- Restore Detached State Detection ([#393](https://github.com/stefanzweifel/git-auto-commit-action/pull/393)) [@stefanzweifel](https://github.com/@stefanzweifel)
- Add Support for Tag Messages ([#391](https://github.com/stefanzweifel/git-auto-commit-action/pull/391)) [@EliasBoulharts](https://github.com/@EliasBoulharts)

### Changed

- Run Action on Node 24 ([#389](https://github.com/stefanzweifel/git-auto-commit-action/pull/389)) [@stefanzweifel](https://github.com/@stefanzweifel)

### Dependency Updates

- Bump actions/checkout from 4 to 5 ([#386](https://github.com/stefanzweifel/git-auto-commit-action/pull/386)) [@[dependabot[bot]](https://github.com/apps/dependabot)](https://github.com/@[dependabot[bot]](https://github.com/apps/dependabot))

## [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

### Changed

- Include `github.actor_id` in default `commit_author` ([#354](https://github.com/stefanzweifel/git-auto-commit-action/pull/354)) [@parkerbxyz](https://github.com/@parkerbxyz)

### Fixed

- docs(README): fix broken protected branch docs link ([#346](https://github.com/stefanzweifel/git-auto-commit-action/pull/346)) [@scarf005](https://github.com/@scarf005)
- Update README.md ([#343](https://github.com/stefanzweifel/git-auto-commit-action/pull/343)) [@Kludex](https://github.com/@Kludex)

### Dependency Updates

- Bump bats from 1.11.0 to 1.11.1 ([#353](https://github.com/stefanzweifel/git-auto-commit-action/pull/353)) [@dependabot](https://github.com/@dependabot)
- Bump github/super-linter from 6 to 7 ([#342](https://github.com/stefanzweifel/git-auto-commit-action/pull/342)) [@dependabot](https://github.com/@dependabot)
- Bump github/super-linter from 5 to 6 ([#335](https://github.com/stefanzweifel/git-auto-commit-action/pull/335)) [@dependabot](https://github.com/@dependabot)

## [v5.0.1](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5.0.0...v5.0.1) - 2024-04-12

### Fixed

View file

@ -11,6 +11,11 @@ By default, the commit is made in the name of "GitHub Actions" and co-authored b

If you want to learn more how this Action works under the hood, check out [this article](https://michaelheap.com/git-auto-commit/) by Michael Heap.

If your use case is not covered by git-auto-commit, you might want to check out the following alternative Actions:

- [planetscale/ghcommit-action](https://github.com/planetscale/ghcommit-action)
- [EndBug/add-and-commit](https://github.com/EndBug/add-and-commit)

## Usage

Adding git-auto-commit to your Workflow only takes a couple lines of code.
@ -19,7 +24,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: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v7
```

Your Workflow should look similar to this example.
@ -39,15 +44,17 @@ jobs:
contents: write

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
ref: ${{ github.head_ref }}
# Value already defaults to true, but `persist-credentials` is required to push new commits to the repository.
persist-credentials: true

# Other steps that change files in the repository go here
# …

# Commit all changed files back to the repository
- uses: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v7
```

> [!NOTE]
@ -56,15 +63,14 @@ jobs:
The following is an extended example with all available options.

```yaml
- uses: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v7
with:
# Optional. Commit message for the created commit.
# Defaults to "Apply automatic changes"
commit_message: Automated Change

# Optional. Local and remote branch name where commit is going to be pushed
# to. Defaults to the current branch.
# You might need to set `create_branch: true` if the branch does not exist.
# Optional. Remote branch name where commit is going to be pushed to.
# Defaults to the current branch.
branch: feature-123

# Optional. Options used by `git-commit`.
@ -85,11 +91,16 @@ The following is an extended example with all available options.
# Optional commit user and author settings
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 <actions@github.com> # defaults to "username <username@users.noreply.github.com>", where "username" belongs to the author of the commit that triggered the run
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
# 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_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. Tag name being created in the local repository and
# pushed to remote repository and defined branch.
tagging_message: 'v1.0.0'
# Optional. Message to annotate the created tag with.
# 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
# dirty. See https://git-scm.com/docs/git-status#_options
@ -105,12 +116,15 @@ 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
skip_fetch: true

# Optional. Skip internal call to `git checkout`
skip_checkout: true
# Optional. Skip internal call to `git push`
skip_push: true

# Optional. Prevents the shell from expanding filenames.
# Details: https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html
@ -118,6 +132,10 @@ The following is an extended example with all available options.

# 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 in combination with `tag` and `tagging_message`.
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.
@ -147,14 +165,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: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v7
with:
commit_message: Apply php-cs-fixer changes
```
@ -169,13 +187,14 @@ 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.
- `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.**

### Example

```yaml
- uses: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/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
@ -207,11 +226,11 @@ If this Action doesn't work for your workflow, check out [EndBug/add-and-commit]

### Checkout the correct branch

You must use `action/checkout@v2` or later versions to check out the repository.
You must use `actions/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 }}
```
@ -229,7 +248,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 }}
```
@ -275,7 +294,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: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v7
id: commit
with:
commit_message: ${{ steps.commit_message_step.outputs.commit_message }}
@ -299,7 +318,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: stefanzweifel/git-auto-commit-action@v5
uses: stefanzweifel/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 }}
@ -362,7 +381,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
@ -376,7 +395,7 @@ jobs:
- name: Run php-cs-fixer
uses: docker://oskarstark/php-cs-fixer-ga

- uses: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/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/).
@ -411,7 +430,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: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v7
with:
commit_author: ${{ steps.last-commit.outputs.author }}
commit_message: ${{ steps.last-commit.outputs.message }}
@ -432,7 +451,9 @@ Make sure to [checkout the correct branch](#checkout-the-correct-branch).
If your Workflow can't push the commit to the repository because of authentication issues,
please update your Workflow configuration and usage of [`actions/checkout`](https://github.com/actions/checkout#usage).

Updating the `token` value with a Personal Access Token should fix your issues.
Please note that `persist-credentials` in `actions/checkout` must be set to `true` to push new commits to the repository.

If you still can't push the commit, and you're using branch protection rules or similar features, updating the `token` value with a Personal Access Token should fix your issues.

### git-auto-commit fails to push commit that creates or updates files in `.github/workflows/`

@ -454,19 +475,21 @@ 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:
token: ${{ secrets.PAT }}
# 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 }}
```
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]
> 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.

```yaml
- uses: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v7
with:
commit_message: Apply php-cs-fixer changes
push_options: --force
@ -496,7 +519,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: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v7
with:
file_pattern: '*.md'
disable_globbing: true
@ -524,7 +547,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 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.
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@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).)

## Credits

17
UPGRADING.md Normal file
View file

@ -0,0 +1,17 @@
# Upgrading

## From v6 to v7

The previously removed options `create_branch`, `skip_fetch`, and `skip_checkout` have been reintroduced in git-auto-commit v7. If you had removed these options from your workflows when upgrading to v6, you can now add them back if needed.

Tagging a commit has been reworked. In addition to the existing `tagging_message`-option, a new `tag_name` option has been added. If you were using `tagging_message`, you can continue to do so, but if you want to specify a custom tag name and tag message, you can now use the `tag_name` and `tagging_message` option.
(Specifying a `tagging_message` without a `tag_name` will create a tag with the name and message both set to the value of `tagging_message`.)

## 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

@ -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_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: ''
tagging_message:
description: Message used to create a new git tag with the commit. Keep this empty, if no tag should be created.
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:
@ -64,24 +68,35 @@ inputs:
description: Skip the call to git-checkout.
required: false
default: false
skip_push:
description: Skip the call to git-push.
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
default: false
internal_git_binary:
description: Internal use only! Path to git binary used to check if git is available. (Don't change this!)
default: git


outputs:
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.
commit_hash:
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:
using: 'node20'
using: 'node24'
main: 'index.js'

branding:

View file

@ -31,7 +31,16 @@ _main() {

_switch_to_repository

if _git_is_dirty || "$INPUT_SKIP_DIRTY_CHECK"; then
_check_if_is_git_repository

_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"

@ -86,11 +95,25 @@ _git_is_dirty() {
gitStatusMessage="$((git status -s $INPUT_STATUS_OPTIONS -- ${INPUT_FILE_PATTERN_EXPANDED:+${INPUT_FILE_PATTERN_EXPANDED[@]}} >/dev/null ) 2>&1)";
# shellcheck disable=SC2086
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>";
[ -n "$gitStatus" ]
}

_check_if_is_git_repository() {
if [ -d ".git" ]; then
_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
[ -n "$gitStatus" ]
}

_check_if_repository_is_in_detached_state() {
if [ -z "$(git symbolic-ref HEAD)" ]
then
_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() {
@ -100,6 +123,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

@ -107,6 +131,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
@ -151,18 +176,27 @@ _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
}

_push_to_github() {
if "$INPUT_SKIP_PUSH"; then
_log "debug" "git-push will not be executed.";
return
fi

echo "INPUT_BRANCH value: $INPUT_BRANCH";

echo "INPUT_PUSH_OPTIONS: ${INPUT_PUSH_OPTIONS}";
_log "debug" "Apply push options ${INPUT_PUSH_OPTIONS}";
@ -172,8 +206,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[@]}"};

37
package-lock.json generated Normal file
View file

@ -0,0 +1,37 @@
{
"name": "git-auto-commit-action",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"devDependencies": {
"bats": "^1.13.0",
"bats-assert": "ztombol/bats-assert",
"bats-support": "ztombol/bats-support"
}
},
"node_modules/bats": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/bats/-/bats-1.13.0.tgz",
"integrity": "sha512-giSYKGTOcPZyJDbfbTtzAedLcNWdjCLbXYU3/MwPnjyvDXzu6Dgw8d2M+8jHhZXSmsCMSQqCp+YBsJ603UO4vQ==",
"dev": true,
"license": "MIT",
"bin": {
"bats": "bin/bats"
}
},
"node_modules/bats-assert": {
"version": "0.3.0",
"resolved": "git+ssh://git@github.com/ztombol/bats-assert.git#9f88b4207da750093baabc4e3f41bf68f0dd3630",
"dev": true,
"peerDependencies": {
"bats-support": "git+https://github.com/ztombol/bats-support.git#v0.2.0"
}
},
"node_modules/bats-support": {
"version": "0.3.0",
"resolved": "git+ssh://git@github.com/ztombol/bats-support.git#004e707638eedd62e0481e8cdc9223ad471f12ee",
"dev": true
}
}
}

View file

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

View file

@ -21,6 +21,7 @@ setup() {
export FAKE_DEFAULT_BRANCH=$(git config init.defaultBranch)

# Set default INPUT variables used by the GitHub Action
export INPUT_CREATE_GIT_TAG_ONLY=false
export INPUT_REPOSITORY="${FAKE_LOCAL_REPOSITORY}"
export INPUT_COMMIT_MESSAGE="Commit Message"
export INPUT_BRANCH="${FAKE_DEFAULT_BRANCH}"
@ -31,11 +32,13 @@ setup() {
export INPUT_COMMIT_USER_NAME="Test Suite"
export INPUT_COMMIT_USER_EMAIL="test@github.com"
export INPUT_COMMIT_AUTHOR="Test Suite <test@users.noreply.github.com>"
export INPUT_TAG_NAME=""
export INPUT_TAGGING_MESSAGE=""
export INPUT_PUSH_OPTIONS=""
export INPUT_SKIP_DIRTY_CHECK=false
export INPUT_SKIP_FETCH=false
export INPUT_SKIP_CHECKOUT=false
export INPUT_SKIP_PUSH=false
export INPUT_DISABLE_GLOBBING=false
export INPUT_CREATE_BRANCH=false
export INPUT_INTERNAL_GIT_BINARY=git
@ -120,8 +123,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}"
@ -143,8 +147,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}"
@ -192,7 +197,6 @@ cat_github_output() {
assert_failure

assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "INPUT_BRANCH value: ${FAKE_DEFAULT_BRANCH}"
assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: "
assert_line "::debug::Apply commit options "
@ -291,7 +295,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 +304,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
@ -346,6 +353,24 @@ cat_github_output() {
assert_equal $current_sha $remote_sha
}

@test "If SKIP_PUSH is true git-push will not be called" {
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt

INPUT_SKIP_PUSH=true

run git_auto_commit

assert_success

assert_line "::debug::git-push will not be executed."

# Assert that the sha values are not 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})"

refute [assert_equal $current_sha $remote_sha]
}

@test "It can checkout a different branch" {
# Create foo-branch and then immediately switch back to ${FAKE_DEFAULT_BRANCH}
git checkout -b foo
@ -386,9 +411,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 +423,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 +464,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 +474,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 +499,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 +509,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
@ -578,9 +609,8 @@ cat_github_output() {
assert_line "changes_detected=true"
}

@test "script fails to push commit to new branch that does not exist yet" {
@test "It pushes 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"
@ -590,27 +620,28 @@ cat_github_output() {

touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt

INPUT_SKIP_CHECKOUT=true

run git_auto_commit

assert_failure
assert_success

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
assert_line --partial ${FAKE_DEFAULT_BRANCH}
refute_line --partial "not-existend-branch"

run git branch -r
refute_line --partial "origin/not-existend-branch"
assert_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" {
@test "It does not create new local branch and pushes the commit to a new branch on remote" {
INPUT_BRANCH="not-existend-branch"
INPUT_CREATE_BRANCH=true

run git branch
refute_line --partial "not-existend-branch"
@ -620,6 +651,8 @@ cat_github_output() {

touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt

INPUT_SKIP_CHECKOUT=true

run git_auto_commit

assert_success
@ -629,15 +662,19 @@ 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"

# Assert that local repo is still on default branch and not on new branch.
run git branch
assert_line --partial "not-existend-branch"
assert_line --partial ${FAKE_DEFAULT_BRANCH}
refute_line --partial "not-existend-branch"

# Assert branch has been created on remote
run git branch -r
assert_line --partial "origin/not-existend-branch"

@ -646,50 +683,7 @@ 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"
INPUT_CREATE_BRANCH=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"

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" {

@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"
@ -706,7 +700,7 @@ cat_github_output() {
cd $FAKE_LOCAL_REPOSITORY

INPUT_BRANCH="existing-remote-branch"
INPUT_CREATE_BRANCH=true
INPUT_SKIP_CHECKOUT=true

run git branch
refute_line --partial "existing-remote-branch"
@ -727,20 +721,22 @@ 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"

run git branch
assert_line --partial "existing-remote-branch"
assert_line --partial ${FAKE_DEFAULT_BRANCH}
refute_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)"
current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})"
remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)"

assert_equal $current_sha $remote_sha
@ -750,7 +746,7 @@ cat_github_output() {
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" {
@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"
@ -767,7 +763,7 @@ cat_github_output() {
cd $FAKE_LOCAL_REPOSITORY

INPUT_BRANCH="existing-remote-branch"
INPUT_CREATE_BRANCH=true
INPUT_SKIP_CHECKOUT=true

run git branch
refute_line --partial "existing-remote-branch"
@ -782,23 +778,24 @@ cat_github_output() {

assert_failure

assert_line "hint: Updates were rejected because the tip of your current branch is behind"
assert_line "hint: Updates were rejected because a pushed branch tip is behind its remote"

# Assert that branch exists locally and on remote
run git branch
assert_line --partial "existing-remote-branch"
assert_line --partial ${FAKE_DEFAULT_BRANCH}
refute_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)"
current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_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" {
@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

@ -817,8 +814,9 @@ cat_github_output() {
cd $FAKE_LOCAL_REPOSITORY

INPUT_BRANCH="new-branch"
INPUT_SKIP_CHECKOUT=true

# Assert that local remote does not know have "new-branch" locally nor does
# Assert that local remote does not have a "new-branch"-branch nor does
# know about the remote branch.
run git branch
refute_line --partial "new-branch"
@ -830,16 +828,12 @@ cat_github_output() {

run git_auto_commit

assert_success
assert_failure

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
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" {
@ -1004,7 +998,7 @@ cat_github_output() {

assert_line --partial "Working tree clean. Nothing to commit."
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
run cat_github_output
@ -1038,7 +1032,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 "new-file-2.txt"
assert_line --partial "new-file-3.txt"
# assert_line --partial "new-file-3.txt"

# Changes are detected
run cat_github_output
@ -1060,8 +1054,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}"
@ -1123,5 +1118,406 @@ END
run git_auto_commit

assert_failure;
assert_line "::error::git-status failed with:<fatal: not a git repository (or any of the parent directories): .git>"
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 logs a warning" {
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_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" {
INPUT_CREATE_GIT_TAG_ONLY=true
INPUT_TAG_NAME=v1.0.0
INPUT_TAGGING_MESSAGE="MyProduct v1.0.0"

run git_auto_commit

assert_success

assert_line "::debug::Create git tag only"

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}"

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 -n
assert_output 'v1.0.0 MyProduct 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_TAG_NAME=""
INPUT_TAGGING_MESSAGE=""

run git_auto_commit

assert_success

assert_line "INPUT_TAG_NAME: "
assert_line "INPUT_TAGGING_MESSAGE: "
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
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 "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 "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"

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 "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"

# 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 "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 "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"

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
}

@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
}

View file

@ -1,16 +0,0 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


bats-assert@ztombol/bats-assert:
version "0.3.0"
resolved "https://codeload.github.com/ztombol/bats-assert/tar.gz/9f88b4207da750093baabc4e3f41bf68f0dd3630"

bats-support@ztombol/bats-support:
version "0.3.0"
resolved "https://codeload.github.com/ztombol/bats-support/tar.gz/004e707638eedd62e0481e8cdc9223ad471f12ee"

bats@^1.11.1:
version "1.11.1"
resolved "https://registry.yarnpkg.com/bats/-/bats-1.11.1.tgz#e87fa1161d5110ec3a685e2e233f2f2bfb26ebfd"
integrity sha512-Dh26FsiLog+wwQeTkboYo2xYj9rUaPEbibUobnYb3G3M9hva/Kby00wrAN9VB9qqGVhl/pYjjt/LVBWwjXlD2A==