mirror of
https://github.com/stefanzweifel/git-auto-commit-action.git
synced 2026-01-11 12:08:25 +00:00
Compare commits
68 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c6996c9a1 | ||
|
|
66f124b8c2 | ||
|
|
778341af66 | ||
|
|
33b203d92a | ||
|
|
a82d80a75f | ||
|
|
3cc016cfc8 | ||
|
|
ddb7ae4159 | ||
|
|
b001e5f0ff | ||
|
|
6494dc61d3 | ||
|
|
76180511d9 | ||
|
|
ae114628ea | ||
|
|
3058f91afb | ||
|
|
8ddf02de71 | ||
|
|
e7955f713c | ||
|
|
739fd03b2d | ||
|
|
af302a9c63 | ||
|
|
b863ae1933 | ||
|
|
adb37b5a29 | ||
|
|
8480c68cbb | ||
|
|
4f8f3ad16e | ||
|
|
11a6e5f38f | ||
|
|
35d037abf5 | ||
|
|
bf425dc136 | ||
|
|
cfd6ac4a3b | ||
|
|
19379b46c9 | ||
|
|
12e100dacb | ||
|
|
2ac10431a8 | ||
|
|
4db797a961 | ||
|
|
e256565ae5 | ||
|
|
8a23be4b32 | ||
|
|
ed295bd35a | ||
|
|
bd434eed48 | ||
|
|
1666a49083 | ||
|
|
1d986f74dd | ||
|
|
ad56d4eb46 | ||
|
|
9fa4cb99cf | ||
|
|
cec27bde37 | ||
|
|
244febd79d | ||
|
|
c86fa26bed | ||
|
|
e35726034b | ||
|
|
e348103e90 | ||
|
|
032ffbefae | ||
|
|
0b492c0d95 | ||
|
|
050015d406 | ||
|
|
573710f3d0 | ||
|
|
e961da7576 | ||
|
|
ac8823709a | ||
|
|
be823a7e51 | ||
|
|
55a82ca24f | ||
|
|
18157e6f3b | ||
|
|
7d779d0067 | ||
|
|
efd424db0f | ||
|
|
5f3fa8aed3 | ||
|
|
ee5525316d | ||
|
|
4b8a201e31 | ||
|
|
896cc0d225 | ||
|
|
7f171889c8 | ||
|
|
76f415fb30 | ||
|
|
3e796a0146 | ||
|
|
e833d4f211 | ||
|
|
0aca01a1ef | ||
|
|
03fddc470c | ||
|
|
ef7ed32535 | ||
|
|
9062db8404 | ||
|
|
80052f0645 | ||
|
|
3b8231379d | ||
|
|
d9307b5e8c | ||
|
|
aa2cec9c08 |
13
.github/ISSUE_TEMPLATE/bug.yaml
vendored
13
.github/ISSUE_TEMPLATE/bug.yaml
vendored
@@ -5,7 +5,7 @@ body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Before opening a bug report, please search for the behaviour in the existing issues.
|
||||
Before opening a bug report, please search for the behaviour in existing issues or discussions.
|
||||
|
||||
---
|
||||
|
||||
@@ -33,7 +33,7 @@ body:
|
||||
id: bug-description
|
||||
attributes:
|
||||
label: Bug description
|
||||
description: What exactly happened?
|
||||
description: What exactly happened? Please describe your problem in detail.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
@@ -52,7 +52,7 @@ body:
|
||||
id: example-workflow
|
||||
attributes:
|
||||
label: Example Workflow
|
||||
description: Please share your GitHub Actions workflow which causes the bug. We use this to reproduce the error. No need for backticks here.
|
||||
description: Please share the YAML-code of your GitHub Actions workflow which causes the bug. We use this to reproduce the error. If the workflow is in a private repostory, please provide a minimal example. (No need for backticks here, the pasted code will be correctly formatted.)
|
||||
render: yaml
|
||||
validations:
|
||||
required: true
|
||||
@@ -60,5 +60,10 @@ body:
|
||||
id: logs
|
||||
attributes:
|
||||
label: Relevant log output
|
||||
description: If applicable, provide relevant log output. No need for backticks here.
|
||||
description: If applicable, provide relevant log output. Please copy and paste the output here, and make sure to remove any sensitive information. (No need for backticks here, the pasted code will be correctly formatted.)
|
||||
render: shell
|
||||
- type: input
|
||||
id: repository-url
|
||||
attributes:
|
||||
label: Repository
|
||||
description: If applicable, please provide the repository where the bug occurred.
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -4,5 +4,5 @@ contact_links:
|
||||
url: https://github.com/stefanzweifel/git-auto-commit-action/discussions/new?category=help
|
||||
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/tailwindlabs/tailwindcss/discussions/new?category=ideas
|
||||
url: https://github.com/stefanzweifel/git-auto-commit-action/discussions/new?category=ideas
|
||||
about: 'Suggest any ideas you have using our discussion forums.'
|
||||
|
||||
2
.github/workflows/git-auto-commit.yml
vendored
2
.github/workflows/git-auto-commit.yml
vendored
@@ -17,6 +17,8 @@ jobs:
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.head_ref }}
|
||||
|
||||
- name: Use git-auto-commit-action
|
||||
id: "auto-commit-action"
|
||||
|
||||
242
.github/workflows/hook-examples.yml
vendored
Normal file
242
.github/workflows/hook-examples.yml
vendored
Normal file
@@ -0,0 +1,242 @@
|
||||
name: Hook Examples
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
# Example 1: Use pre_status_hook to unshallow repository
|
||||
unshallow-example:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1 # Create shallow clone
|
||||
|
||||
- name: Make some changes
|
||||
run: |
|
||||
echo "$(date): Updated by workflow" >> updates.log
|
||||
|
||||
- name: Commit with unshallow hook
|
||||
uses: ./
|
||||
with:
|
||||
commit_message: "Update logs with unshallow support"
|
||||
pre_status_hook: |
|
||||
echo "Checking if repository is shallow..."
|
||||
if git rev-parse --is-shallow-repository 2>/dev/null | grep -q true; then
|
||||
echo "Repository is shallow, running git fetch --unshallow"
|
||||
git fetch --unshallow
|
||||
else
|
||||
echo "Repository is not shallow"
|
||||
fi
|
||||
|
||||
# Example 2: Use pre_commit_hook for validation
|
||||
validation-example:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Make changes to JavaScript files
|
||||
run: |
|
||||
echo "console.log('Hello World');" > example.js
|
||||
|
||||
- name: Commit with validation hook
|
||||
uses: ./
|
||||
with:
|
||||
commit_message: "Add example JavaScript file"
|
||||
pre_commit_hook: |
|
||||
echo "Running pre-commit validation..."
|
||||
# Validate JavaScript syntax
|
||||
find . -name "*.js" -not -path "./node_modules/*" -exec node -c {} \;
|
||||
echo "JavaScript validation passed!"
|
||||
|
||||
# Run tests if they exist
|
||||
if [ -f "package.json" ] && npm run test --if-present; then
|
||||
echo "Tests passed!"
|
||||
fi
|
||||
|
||||
# Example 3: Use pre_commit_hook to generate additional files
|
||||
file-generation-example:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Make some changes
|
||||
run: |
|
||||
echo "New feature added" > feature.txt
|
||||
|
||||
- name: Commit with file generation hook
|
||||
uses: ./
|
||||
with:
|
||||
commit_message: "Add feature with generated manifest"
|
||||
pre_commit_hook: |
|
||||
echo "Generating build manifest..."
|
||||
|
||||
# Create build info file
|
||||
cat > build-info.json << EOF
|
||||
{
|
||||
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
||||
"commit": "$GITHUB_SHA",
|
||||
"workflow": "$GITHUB_WORKFLOW",
|
||||
"run_id": "$GITHUB_RUN_ID",
|
||||
"actor": "$GITHUB_ACTOR"
|
||||
}
|
||||
EOF
|
||||
|
||||
echo "Generated build-info.json"
|
||||
cat build-info.json
|
||||
|
||||
# Example 4: Use pre_push_hook for final validation
|
||||
pre-push-validation-example:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Make changes
|
||||
run: |
|
||||
echo "Important data: $(date)" > important-file.txt
|
||||
|
||||
- name: Commit with pre-push validation
|
||||
uses: ./
|
||||
with:
|
||||
commit_message: "Add important file with validation"
|
||||
pre_push_hook: |
|
||||
echo "Running final validation before push..."
|
||||
|
||||
# Check if important file exists and has content
|
||||
if [ ! -f "important-file.txt" ] || [ ! -s "important-file.txt" ]; then
|
||||
echo "ERROR: important-file.txt is missing or empty!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check git log for the commit we're about to push
|
||||
echo "Latest commit details:"
|
||||
git log -1 --oneline
|
||||
|
||||
echo "Pre-push validation passed!"
|
||||
|
||||
# Example 5: Use post_push_hook for notifications
|
||||
notification-example:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Update documentation
|
||||
run: |
|
||||
echo "# Documentation Updated" > README.md
|
||||
echo "Last updated: $(date)" >> README.md
|
||||
|
||||
- name: Commit with notification hook
|
||||
uses: ./
|
||||
with:
|
||||
commit_message: "Update documentation"
|
||||
post_push_hook: |
|
||||
echo "Changes successfully pushed!"
|
||||
|
||||
# Get the commit hash that was just pushed
|
||||
COMMIT_HASH=$(git rev-parse HEAD)
|
||||
echo "Pushed commit: $COMMIT_HASH"
|
||||
|
||||
# Create a summary
|
||||
echo "📝 Documentation updated successfully" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- Commit: \`$COMMIT_HASH\`" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- Time: $(date)" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
# In a real scenario, you might send notifications to Slack, Discord, etc.
|
||||
echo "This is where you would send notifications to your team!"
|
||||
|
||||
# Example 6: Multiple hooks working together
|
||||
comprehensive-example:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup environment
|
||||
run: |
|
||||
echo "Setting up project..."
|
||||
mkdir -p logs
|
||||
|
||||
- name: Make changes
|
||||
run: |
|
||||
echo "Feature implementation" > feature.txt
|
||||
echo "$(date): Feature added" > logs/changes.log
|
||||
|
||||
- name: Commit with all hooks
|
||||
uses: ./
|
||||
with:
|
||||
commit_message: "Add comprehensive feature"
|
||||
pre_status_hook: |
|
||||
echo "🔍 Pre-status: Preparing repository..."
|
||||
git status --porcelain
|
||||
|
||||
pre_commit_hook: |
|
||||
echo "🛠️ Pre-commit: Generating metadata..."
|
||||
|
||||
# Generate changelog entry
|
||||
echo "## $(date +%Y-%m-%d)" > CHANGELOG_ENTRY.md
|
||||
echo "- Added comprehensive feature" >> CHANGELOG_ENTRY.md
|
||||
|
||||
# Update version file
|
||||
echo "1.0.$(date +%s)" > VERSION
|
||||
|
||||
pre_push_hook: |
|
||||
echo "✅ Pre-push: Final validation..."
|
||||
|
||||
# Validate all required files exist
|
||||
required_files=("feature.txt" "logs/changes.log" "CHANGELOG_ENTRY.md" "VERSION")
|
||||
for file in "${required_files[@]}"; do
|
||||
if [ ! -f "$file" ]; then
|
||||
echo "ERROR: Required file $file is missing!"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
echo "All validations passed!"
|
||||
|
||||
post_push_hook: |
|
||||
echo "🎉 Post-push: Cleanup and notification..."
|
||||
|
||||
# Clean up temporary files if any
|
||||
rm -f /tmp/build-*
|
||||
|
||||
# Log success
|
||||
echo "Deployment completed at $(date)" >> logs/deployment.log
|
||||
|
||||
echo "Comprehensive feature deployment completed!"
|
||||
|
||||
# Example 7: Error handling demonstration
|
||||
error-handling-example:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Make changes
|
||||
run: |
|
||||
echo "Some changes" > test-file.txt
|
||||
|
||||
- name: Demonstrate hook failure (this will fail)
|
||||
uses: ./
|
||||
continue-on-error: true
|
||||
with:
|
||||
commit_message: "This commit should fail"
|
||||
pre_commit_hook: |
|
||||
echo "Running validation that will fail..."
|
||||
|
||||
# This will cause the hook to fail
|
||||
if [ "$(cat test-file.txt)" = "Some changes" ]; then
|
||||
echo "ERROR: File content not allowed!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Show that workflow continues after failure
|
||||
run: |
|
||||
echo "This step runs even if the previous step failed due to continue-on-error: true"
|
||||
2
.github/workflows/linter.yml
vendored
2
.github/workflows/linter.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Lint Code Base
|
||||
uses: github/super-linter@v5
|
||||
uses: github/super-linter@v7
|
||||
env:
|
||||
VALIDATE_ALL_CODEBASE: false
|
||||
VALIDATE_MARKDOWN: false
|
||||
|
||||
67
CHANGELOG.md
67
CHANGELOG.md
@@ -5,10 +5,75 @@ 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.0...HEAD)
|
||||
## [Unreleased](https://github.com/stefanzweifel/git-auto-commit-action/compare/v6.0.1...HEAD)
|
||||
|
||||
> 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
|
||||
|
||||
### 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
|
||||
|
||||
- Fail if attempting to execute git commands in a directory that is not a git-repo. ([#326](https://github.com/stefanzweifel/git-auto-commit-action/pull/326)) [@ccomendant](https://github.com/@ccomendant)
|
||||
|
||||
### Dependency Updates
|
||||
|
||||
- Bump bats from 1.10.0 to 1.11.0 ([#325](https://github.com/stefanzweifel/git-auto-commit-action/pull/325)) [@dependabot](https://github.com/@dependabot)
|
||||
- Bump release-drafter/release-drafter from 5 to 6 ([#319](https://github.com/stefanzweifel/git-auto-commit-action/pull/319)) [@dependabot](https://github.com/@dependabot)
|
||||
|
||||
### Misc
|
||||
|
||||
- Clarify `commit_author` input option ([#315](https://github.com/stefanzweifel/git-auto-commit-action/pull/315)) [@npanuhin](https://github.com/@npanuhin)
|
||||
- Add step id explanation for output in README.md ([#324](https://github.com/stefanzweifel/git-auto-commit-action/pull/324)) [@ChristianVermeulen](https://github.com/@ChristianVermeulen)
|
||||
- Linux is not UNIX ([#321](https://github.com/stefanzweifel/git-auto-commit-action/pull/321)) [@couling](https://github.com/@couling)
|
||||
|
||||
## [v5.0.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.16.0...v5.0.0) - 2023-10-06
|
||||
|
||||
New major release that bumps the default runtime to Node 20. There are no other breaking changes.
|
||||
|
||||
238
README.md
238
README.md
@@ -40,8 +40,11 @@ jobs:
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.head_ref }}
|
||||
|
||||
# Other steps that change files in the repository
|
||||
# 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
|
||||
@@ -59,9 +62,8 @@ The following is an extended example with all available options.
|
||||
# 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`.
|
||||
@@ -82,7 +84,7 @@ 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 being created in the local repository and
|
||||
# pushed to remote repository and defined branch.
|
||||
@@ -103,18 +105,13 @@ The following is an extended example with all available options.
|
||||
# Optional. Disable dirty check and always try to create a commit and push
|
||||
skip_dirty_check: true
|
||||
|
||||
# Optional. Skip internal call to `git fetch`
|
||||
skip_fetch: true
|
||||
|
||||
# Optional. Skip internal call to `git checkout`
|
||||
skip_checkout: true
|
||||
|
||||
# Optional. Prevents the shell from expanding filenames.
|
||||
# Details: https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html
|
||||
disable_globbing: true
|
||||
|
||||
# Optional. Create given branch name in local and remote repository.
|
||||
create_branch: true
|
||||
# Optional. Creates a new tag and pushes it to remote without creating a commit.
|
||||
# Skips dirty check and changed files. Must be used with `tagging_message`.
|
||||
create_git_tag_only: false
|
||||
```
|
||||
|
||||
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.
|
||||
@@ -166,6 +163,7 @@ 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.**
|
||||
|
||||
@@ -231,14 +229,180 @@ storing the token as a secret in your repository and then passing the new token
|
||||
token: ${{ secrets.PAT }}
|
||||
```
|
||||
|
||||
If you create a personal access token, apply the `repo` and `workflow` scopes.
|
||||
If you create a personal access token (classic), apply the `repo` and `workflow` scopes.
|
||||
If you create a fine-grained personal access token, apply the `Contents`-permissions.
|
||||
|
||||
If you work in an organization and don't want to create a PAT from your personal account, we recommend using a [robot account](https://docs.github.com/en/github/getting-started-with-github/types-of-github-accounts) for the token.
|
||||
|
||||
### Prevent Infinite Loop when using a Personal Access Token
|
||||
|
||||
If you're using a Personal Access Token (PAT) to push commits to GitHub repository, the resulting commit or push can trigger other GitHub Actions workflows. This can result in an infinite loop.
|
||||
|
||||
If you would like to prevent this, you can add `skip-checks:true` to the commit message. See [Skipping workflow runs](https://docs.github.com/en/actions/managing-workflow-runs/skipping-workflow-runs) for details.
|
||||
|
||||
### Change to file is not detected
|
||||
|
||||
Does your workflow change a file, but "git-auto-commit" does not detect the change? Check the `.gitignore` that applies to the respective file. You might have accidentally marked the file to be ignored by git.
|
||||
|
||||
## Hooks
|
||||
|
||||
The action supports custom bash scripts that can be executed at various points during the git workflow. This allows for custom preparation, validation, or post-processing steps.
|
||||
|
||||
### Available Hooks
|
||||
|
||||
- **`pre_status_hook`** - Executed before checking git status. Useful for repository preparation like `git fetch --unshallow`.
|
||||
- **`pre_commit_hook`** - Executed after detecting changes but before adding files. Allows modification of files that will be included in the commit.
|
||||
- **`pre_push_hook`** - Executed after committing but before pushing to remote. Useful for final validation.
|
||||
- **`post_push_hook`** - Executed after successfully pushing changes. Useful for notifications or cleanup.
|
||||
|
||||
### Hook Examples
|
||||
|
||||
#### Unshallow Repository Before Checking Status
|
||||
|
||||
This example addresses the common issue where workflows use shallow checkouts (`fetch-depth: 1`) for performance, but need to unshallow before merging or when full history is required for certain operations.
|
||||
|
||||
```yaml
|
||||
name: Update Submodules
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
update-submodules:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1 # Shallow checkout for performance
|
||||
submodules: recursive
|
||||
|
||||
- name: Update submodule to latest
|
||||
run: |
|
||||
git submodule update --remote
|
||||
|
||||
- name: Commit submodule updates
|
||||
uses: stefanzweifel/git-auto-commit-action@v6
|
||||
with:
|
||||
file_pattern: .gitmodules *
|
||||
commit_message: "Update submodules to latest versions"
|
||||
pre_status_hook: |
|
||||
# Only unshallow if we have changes and need to merge
|
||||
if git status --porcelain | grep -q .; then
|
||||
echo "Changes detected, checking if repository is shallow..."
|
||||
if git rev-parse --is-shallow-repository 2>/dev/null | grep -q true; then
|
||||
echo "Repository is shallow, running git fetch --unshallow"
|
||||
git fetch --unshallow
|
||||
fi
|
||||
fi
|
||||
```
|
||||
|
||||
#### Addressing "refusing to merge unrelated histories" Error
|
||||
|
||||
This specific example addresses the use case discussed in [GitHub Issue #365](https://github.com/stefanzweifel/git-auto-commit-action/discussions/365), where shallow repositories can cause merge conflicts:
|
||||
|
||||
```yaml
|
||||
name: Update Dependencies with Unshallow
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 2 * * 1' # Weekly updates
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
update-deps:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1 # Start with shallow clone for performance
|
||||
|
||||
- name: Update dependencies
|
||||
run: |
|
||||
# Your dependency update commands here
|
||||
npm update
|
||||
# or pip install -r requirements.txt --upgrade
|
||||
# or bundle update
|
||||
|
||||
- name: Commit dependency updates
|
||||
uses: stefanzweifel/git-auto-commit-action@v6
|
||||
with:
|
||||
file_pattern: 'package*.json yarn.lock requirements.txt Gemfile.lock'
|
||||
commit_message: 'Update dependencies'
|
||||
pre_status_hook: |
|
||||
# Check if repository is shallow and unshallow if changes are detected
|
||||
if git status --porcelain | grep -q .; then
|
||||
echo "Dependencies have been updated, checking repository depth..."
|
||||
if git rev-parse --is-shallow-repository 2>/dev/null | grep -q true; then
|
||||
echo "Repository is shallow ($(git rev-list --count HEAD) commits), running git fetch --unshallow"
|
||||
git fetch --unshallow
|
||||
echo "Repository unshallowed successfully"
|
||||
else
|
||||
echo "Repository is not shallow ($(git rev-list --count HEAD) commits)"
|
||||
fi
|
||||
else
|
||||
echo "No dependency changes detected, skipping unshallow"
|
||||
fi
|
||||
```
|
||||
|
||||
#### Validate Files Before Committing
|
||||
|
||||
```yaml
|
||||
- name: Commit with validation
|
||||
uses: stefanzweifel/git-auto-commit-action@v6
|
||||
with:
|
||||
commit_message: Apply automatic changes
|
||||
pre_commit_hook: |
|
||||
echo "Running validation..."
|
||||
npm run lint
|
||||
npm run test
|
||||
```
|
||||
|
||||
#### Generate Additional Files in Pre-Commit Hook
|
||||
|
||||
```yaml
|
||||
- name: Commit with file generation
|
||||
uses: stefanzweifel/git-auto-commit-action@v6
|
||||
with:
|
||||
commit_message: Update files and manifest
|
||||
pre_commit_hook: |
|
||||
echo "Generating manifest..."
|
||||
echo "Build timestamp: $(date)" > build-info.txt
|
||||
echo "Commit: $GITHUB_SHA" >> build-info.txt
|
||||
```
|
||||
|
||||
#### Notify After Successful Push
|
||||
|
||||
```yaml
|
||||
- name: Commit and notify
|
||||
uses: stefanzweifel/git-auto-commit-action@v6
|
||||
with:
|
||||
commit_message: Apply automatic changes
|
||||
post_push_hook: |
|
||||
echo "Changes successfully pushed!"
|
||||
curl -X POST -H 'Content-type: application/json' \
|
||||
--data '{"text":"Code changes have been committed and pushed"}' \
|
||||
"$SLACK_WEBHOOK_URL"
|
||||
```
|
||||
|
||||
### Hook Error Handling
|
||||
|
||||
If any hook fails (exits with non-zero status), the entire action will fail and stop execution. This ensures that validation hooks can prevent commits/pushes when issues are detected.
|
||||
|
||||
```yaml
|
||||
- name: Commit with strict validation
|
||||
uses: stefanzweifel/git-auto-commit-action@v6
|
||||
with:
|
||||
commit_message: Apply automatic changes
|
||||
pre_commit_hook: |
|
||||
# This will fail the action if any .js files have syntax errors
|
||||
find . -name "*.js" -exec node -c {} \;
|
||||
```
|
||||
|
||||
### Hook Execution Context
|
||||
|
||||
- Hooks are executed in the repository directory
|
||||
- Hooks have access to all git commands and repository state
|
||||
- Hooks can access GitHub Actions environment variables
|
||||
- Files created/modified by `pre_commit_hook` will be included in the commit
|
||||
- Hooks run in bash and support multi-line scripts
|
||||
|
||||
## Advanced Uses
|
||||
|
||||
### Multiline Commit Messages
|
||||
@@ -271,11 +435,32 @@ The example below can be used as a starting point to generate a multiline commit
|
||||
commit_message: ${{ steps.commit_message_step.outputs.commit_message }}
|
||||
```
|
||||
|
||||
### Signing Commits & Other Git Command Line Options
|
||||
### Signing Commits
|
||||
|
||||
Using command lines options needs to be done manually for each workflow which you require the option enabled. So for example signing commits requires you to import the gpg signature each and every time. The following list of actions are worth checking out if you need to automate these tasks regularly.
|
||||
If you would like to sign your commits using a GPG key, you will need to use an additional action.
|
||||
You can use the [crazy-max/ghaction-import-gpg](https://github.com/crazy-max/ghaction-import-gpg) action and follow its setup instructions.
|
||||
|
||||
- [Import GPG Signature](https://github.com/crazy-max/ghaction-import-gpg) (Suggested by [TGTGamer](https://github.com/tgtgamer))
|
||||
As git-auto-commit by default does not use **your** username and email when creating a commit, you have to override these values in your workflow.
|
||||
|
||||
```yml
|
||||
- name: "Import GPG key"
|
||||
id: import-gpg
|
||||
uses: crazy-max/ghaction-import-gpg@v6
|
||||
with:
|
||||
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||
passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
||||
git_user_signingkey: true
|
||||
git_commit_gpgsign: true
|
||||
|
||||
- name: "Commit and push changes"
|
||||
uses: stefanzweifel/git-auto-commit-action@v5
|
||||
with:
|
||||
commit_author: "${{ steps.import-gpg.outputs.name }} <${{ steps.import-gpg.outputs.email }}>"
|
||||
commit_user_name: ${{ steps.import-gpg.outputs.name }}
|
||||
commit_user_email: ${{ steps.import-gpg.outputs.email }}
|
||||
```
|
||||
|
||||
See discussion [#334](https://github.com/stefanzweifel/git-auto-commit-action/discussions/334) for details.
|
||||
|
||||
### Use in forks from private repositories
|
||||
|
||||
@@ -386,7 +571,6 @@ The steps in your workflow might look like this:
|
||||
commit_message: ${{ steps.last-commit.outputs.message }}
|
||||
commit_options: '--amend --no-edit'
|
||||
push_options: '--force'
|
||||
skip_fetch: true
|
||||
```
|
||||
|
||||
See discussion in [#159](https://github.com/stefanzweifel/git-auto-commit-action/issues/159#issuecomment-845347950) for details.
|
||||
@@ -403,20 +587,34 @@ please update your Workflow configuration and usage of [`actions/checkout`](http
|
||||
|
||||
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/`
|
||||
|
||||
The default `GITHUB_TOKEN` issued by GitHub Action does not have permission to make changes to workflow files located in `.github/workflows/`.
|
||||
To fix this, please create a personal access token (PAT) and pass the token to the `actions/checkout`-step in your workflow. (Similar to [how to push to protected branches](https://github.com/stefanzweifel/git-auto-commit-action?tab=readme-ov-file#push-to-protected-branches)).
|
||||
|
||||
If a PAT does not work for you, you could also create a new GitHub app and use it's token in your workflows. See [this comment in #87](https://github.com/stefanzweifel/git-auto-commit-action/issues/87#issuecomment-1939138661) for details.
|
||||
|
||||
See [#322](https://github.com/stefanzweifel/git-auto-commit-action/issues/322) for details and discussions around this topic.
|
||||
|
||||
### Push to protected branches
|
||||
|
||||
If your repository uses [protected branches](https://help.github.com/en/github/administering-a-repository/configuring-protected-branches) you have to make some changes to your Workflow for the Action to work properly: You need a Personal Access Token and you either have to allow force pushes or the Personal Access Token needs to belong to an Administrator.
|
||||
If your repository uses [protected branches](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches) you have to make some changes to your Workflow for the Action to work properly: You need a Personal Access Token and you either have to allow force pushes or the Personal Access Token needs to belong to an Administrator.
|
||||
|
||||
First, you have to create a new [Personal Access Token (PAT)](https://github.com/settings/tokens/new),
|
||||
store the token as a secret in your repository and pass the new token to the [`actions/checkout`](https://github.com/actions/checkout#usage) Action step.
|
||||
|
||||
If you create a personal access token (classic), apply the `repo` and `workflow` scopes.
|
||||
If you create a fine-grained personal access token, apply the `Contents`-permissions.
|
||||
|
||||
```yaml
|
||||
- uses: actions/checkout@v4
|
||||
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.
|
||||
|
||||
|
||||
10
UPGRADING.md
Normal file
10
UPGRADING.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# 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`
|
||||
|
||||
66
action.yml
66
action.yml
@@ -1,5 +1,5 @@
|
||||
name: Git Auto Commit
|
||||
description: 'Automatically commits files which have been changed during the workflow run and push changes back to remote repository.'
|
||||
description: "Automatically commits files which have been changed during the workflow run and push changes back to remote repository."
|
||||
|
||||
author: Stefan Zweifel <stefan@stefanzweifel.dev>
|
||||
|
||||
@@ -15,23 +15,23 @@ inputs:
|
||||
commit_options:
|
||||
description: Commit options (eg. --no-verify)
|
||||
required: false
|
||||
default: ''
|
||||
default: ""
|
||||
add_options:
|
||||
description: Add options (eg. -u)
|
||||
required: false
|
||||
default: ''
|
||||
default: ""
|
||||
status_options:
|
||||
description: Status options (eg. --untracked-files=no)
|
||||
required: false
|
||||
default: ''
|
||||
default: ""
|
||||
file_pattern:
|
||||
description: File pattern used for `git add`. For example `src/*.js`
|
||||
required: false
|
||||
default: '.'
|
||||
default: "."
|
||||
repository:
|
||||
description: Local file path to the git repository. Defaults to the current directory (`.`)
|
||||
required: false
|
||||
default: '.'
|
||||
default: "."
|
||||
commit_user_name:
|
||||
description: Name used for the commit user
|
||||
required: false
|
||||
@@ -43,47 +43,69 @@ inputs:
|
||||
commit_author:
|
||||
description: Value used for the commit author. Defaults to the username of whoever triggered this workflow run.
|
||||
required: false
|
||||
default: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
|
||||
default: ${{ github.actor }} <${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com>
|
||||
tagging_message:
|
||||
description: Message used to create a new git tag with the commit. Keep this empty, if no tag should be created.
|
||||
required: false
|
||||
default: ''
|
||||
default: ""
|
||||
push_options:
|
||||
description: Push options (eg. --force)
|
||||
required: false
|
||||
default: ''
|
||||
default: ""
|
||||
skip_dirty_check:
|
||||
description: Skip the check if the git repository is dirty and always try to create a commit.
|
||||
required: false
|
||||
default: false
|
||||
skip_fetch:
|
||||
description: Skip the call to git-fetch.
|
||||
required: false
|
||||
default: false
|
||||
skip_checkout:
|
||||
description: Skip the call to git-checkout.
|
||||
required: false
|
||||
default: false
|
||||
disable_globbing:
|
||||
description: Stop the shell from expanding filenames (https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html)
|
||||
default: false
|
||||
create_branch:
|
||||
description: Create new branch with the name of `branch`-input in local and remote repository, if it doesn't exist yet.
|
||||
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
|
||||
pre_status_hook:
|
||||
description: Bash script to execute before checking git status. Useful for git fetch --unshallow or other repository preparation.
|
||||
required: false
|
||||
default: ""
|
||||
pre_commit_hook:
|
||||
description: Bash script to execute before committing changes. Useful for validation or last-minute file modifications.
|
||||
required: false
|
||||
default: ""
|
||||
pre_push_hook:
|
||||
description: Bash script to execute before pushing changes to remote. Useful for final validation.
|
||||
required: false
|
||||
default: ""
|
||||
post_push_hook:
|
||||
description: Bash script to execute after successfully pushing changes. Useful for notifications or cleanup.
|
||||
required: false
|
||||
default: ""
|
||||
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:
|
||||
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'
|
||||
main: 'index.js'
|
||||
using: "node20"
|
||||
main: "index.js"
|
||||
|
||||
branding:
|
||||
icon: 'git-commit'
|
||||
icon: "git-commit"
|
||||
color: orange
|
||||
|
||||
105
entrypoint.sh
105
entrypoint.sh
@@ -19,6 +19,32 @@ _set_github_output() {
|
||||
fi
|
||||
}
|
||||
|
||||
_execute_hook() {
|
||||
local hook_name=${1}
|
||||
local hook_script=${2}
|
||||
|
||||
if [ -n "$hook_script" ]; then
|
||||
_log "debug" "Executing $hook_name hook";
|
||||
echo "::group::$hook_name hook"
|
||||
|
||||
# Execute the hook script and capture exit code
|
||||
# Temporarily disable errexit to handle hook failures gracefully
|
||||
set +e
|
||||
eval "$hook_script"
|
||||
local exit_code=$?
|
||||
set -e
|
||||
|
||||
echo "::endgroup::"
|
||||
|
||||
if [ $exit_code -ne 0 ]; then
|
||||
_log "error" "$hook_name hook failed with exit code $exit_code";
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
_log "debug" "$hook_name hook completed successfully";
|
||||
fi
|
||||
}
|
||||
|
||||
_log() {
|
||||
local level=${1}
|
||||
local message=${2}
|
||||
@@ -27,15 +53,47 @@ _log() {
|
||||
}
|
||||
|
||||
_main() {
|
||||
if "$INPUT_SKIP_FETCH"; then
|
||||
_log "warning" "git-auto-commit: skip_fetch has been removed in v6. It does not have any effect anymore.";
|
||||
fi
|
||||
|
||||
if "$INPUT_SKIP_CHECKOUT"; then
|
||||
_log "warning" "git-auto-commit: skip_checkout has been removed in v6. It does not have any effect anymore.";
|
||||
fi
|
||||
|
||||
if "$INPUT_CREATE_BRANCH"; then
|
||||
_log "warning" "git-auto-commit: create_branch has been removed in v6. It does not have any effect anymore.";
|
||||
fi
|
||||
|
||||
_check_if_git_is_available
|
||||
|
||||
_switch_to_repository
|
||||
|
||||
if _git_is_dirty || "$INPUT_SKIP_DIRTY_CHECK"; then
|
||||
_check_if_is_git_repository
|
||||
|
||||
# _check_if_repository_is_in_detached_state
|
||||
|
||||
# Execute pre-status hook before checking repository state
|
||||
_execute_hook "pre_status" "$INPUT_PRE_STATUS_HOOK"
|
||||
|
||||
if "$INPUT_CREATE_GIT_TAG_ONLY"; then
|
||||
_log "debug" "Create git tag only";
|
||||
_set_github_output "create_git_tag_only" "true"
|
||||
_tag_commit
|
||||
|
||||
# Execute pre-push hook before pushing (tag-only mode)
|
||||
_execute_hook "pre_push" "$INPUT_PRE_PUSH_HOOK"
|
||||
|
||||
_push_to_github
|
||||
|
||||
# Execute post-push hook after successful push (tag-only mode)
|
||||
_execute_hook "post_push" "$INPUT_POST_PUSH_HOOK"
|
||||
elif _git_is_dirty || "$INPUT_SKIP_DIRTY_CHECK"; then
|
||||
|
||||
_set_github_output "changes_detected" "true"
|
||||
|
||||
_switch_to_branch
|
||||
# Execute pre-commit hook before adding files so hook can modify files
|
||||
_execute_hook "pre_commit" "$INPUT_PRE_COMMIT_HOOK"
|
||||
|
||||
_add_files
|
||||
|
||||
@@ -48,7 +106,13 @@ _main() {
|
||||
|
||||
_tag_commit
|
||||
|
||||
# Execute pre-push hook before pushing
|
||||
_execute_hook "pre_push" "$INPUT_PRE_PUSH_HOOK"
|
||||
|
||||
_push_to_github
|
||||
|
||||
# Execute post-push hook after successful push
|
||||
_execute_hook "post_push" "$INPUT_POST_PUSH_HOOK"
|
||||
else
|
||||
_set_github_output "changes_detected" "false"
|
||||
|
||||
@@ -86,36 +150,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>";
|
||||
exit 1;
|
||||
fi
|
||||
[ -n "$gitStatus" ]
|
||||
}
|
||||
|
||||
_switch_to_branch() {
|
||||
echo "INPUT_BRANCH value: $INPUT_BRANCH";
|
||||
|
||||
# Fetch remote to make sure that repo can be switched to the right branch.
|
||||
if "$INPUT_SKIP_FETCH"; then
|
||||
_log "debug" "git-fetch will not be executed.";
|
||||
_check_if_is_git_repository() {
|
||||
if [ -d ".git" ]; then
|
||||
_log "debug" "Repository found.";
|
||||
else
|
||||
git fetch --depth=1;
|
||||
_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
|
||||
}
|
||||
|
||||
# If `skip_checkout`-input is true, skip the entire checkout step.
|
||||
if "$INPUT_SKIP_CHECKOUT"; then
|
||||
_log "debug" "git-checkout will not be executed.";
|
||||
_check_if_repository_is_in_detached_state() {
|
||||
if [ -z "$(git symbolic-ref HEAD)" ]
|
||||
then
|
||||
_log "error" "Repository is in detached HEAD state. Please make sure you check out a branch. Adjust the `ref` input accordingly.";
|
||||
exit 1;
|
||||
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
|
||||
_log "debug" "Repository is on a branch.";
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -164,6 +217,8 @@ _tag_commit() {
|
||||
|
||||
_push_to_github() {
|
||||
|
||||
echo "INPUT_BRANCH value: $INPUT_BRANCH";
|
||||
|
||||
echo "INPUT_PUSH_OPTIONS: ${INPUT_PUSH_OPTIONS}";
|
||||
_log "debug" "Apply push options ${INPUT_PUSH_OPTIONS}";
|
||||
|
||||
|
||||
37
package-lock.json
generated
Normal file
37
package-lock.json
generated
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"name": "git-auto-commit-action",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"devDependencies": {
|
||||
"bats": "^1.12.0",
|
||||
"bats-assert": "ztombol/bats-assert",
|
||||
"bats-support": "ztombol/bats-support"
|
||||
}
|
||||
},
|
||||
"node_modules/bats": {
|
||||
"version": "1.12.0",
|
||||
"resolved": "https://registry.npmjs.org/bats/-/bats-1.12.0.tgz",
|
||||
"integrity": "sha512-1HTv2n+fjn3bmY9SNDgmzS6bjoKtVlSK2pIHON5aSA2xaqGkZFoCCWP46/G6jm9zZ7MCi84mD+3Byw4t3KGwBg==",
|
||||
"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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"devDependencies": {
|
||||
"bats": "^1.11.0",
|
||||
"bats": "^1.12.0",
|
||||
"bats-assert": "ztombol/bats-assert",
|
||||
"bats-support": "ztombol/bats-support"
|
||||
},
|
||||
|
||||
@@ -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}"
|
||||
@@ -34,11 +35,19 @@ setup() {
|
||||
export INPUT_TAGGING_MESSAGE=""
|
||||
export INPUT_PUSH_OPTIONS=""
|
||||
export INPUT_SKIP_DIRTY_CHECK=false
|
||||
export INPUT_DISABLE_GLOBBING=false
|
||||
export INPUT_INTERNAL_GIT_BINARY=git
|
||||
|
||||
# Hook variables
|
||||
export INPUT_PRE_STATUS_HOOK=""
|
||||
export INPUT_PRE_COMMIT_HOOK=""
|
||||
export INPUT_PRE_PUSH_HOOK=""
|
||||
export INPUT_POST_PUSH_HOOK=""
|
||||
|
||||
# Deprecated variables. Will be removed in future versions
|
||||
export INPUT_CREATE_BRANCH=false
|
||||
export INPUT_SKIP_FETCH=false
|
||||
export INPUT_SKIP_CHECKOUT=false
|
||||
export INPUT_DISABLE_GLOBBING=false
|
||||
export INPUT_CREATE_BRANCH=false
|
||||
export INPUT_INTERNAL_GIT_BINARY=git
|
||||
|
||||
# Set GitHub environment variables used by the GitHub Action
|
||||
temp_github_output_file=$(mktemp -t github_output_test.XXXXX)
|
||||
@@ -192,7 +201,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 "
|
||||
@@ -409,32 +417,6 @@ cat_github_output() {
|
||||
assert_output --partial refs/tags/v2.0.0
|
||||
}
|
||||
|
||||
@test "If SKIP_FETCH is true git-fetch will not be called" {
|
||||
|
||||
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
|
||||
|
||||
INPUT_SKIP_FETCH=true
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_success
|
||||
|
||||
assert_line "::debug::git-fetch will not be executed."
|
||||
}
|
||||
|
||||
@test "If SKIP_CHECKOUT is true git-checkout will not be called" {
|
||||
|
||||
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
|
||||
|
||||
INPUT_SKIP_CHECKOUT=true
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_success
|
||||
|
||||
assert_line "::debug::git-checkout will not be executed."
|
||||
}
|
||||
|
||||
@test "It pushes generated commit and tag to remote and actually updates the commit shas" {
|
||||
INPUT_BRANCH=""
|
||||
INPUT_TAGGING_MESSAGE="v2.0.0"
|
||||
@@ -465,10 +447,6 @@ cat_github_output() {
|
||||
}
|
||||
|
||||
@test "It pushes generated commit and tag to remote branch and updates commit sha" {
|
||||
# Create "a-new-branch"-branch and then immediately switch back to ${FAKE_DEFAULT_BRANCH}
|
||||
git checkout -b a-new-branch
|
||||
git checkout ${FAKE_DEFAULT_BRANCH}
|
||||
|
||||
INPUT_BRANCH="a-new-branch"
|
||||
INPUT_TAGGING_MESSAGE="v2.0.0"
|
||||
|
||||
@@ -491,7 +469,7 @@ cat_github_output() {
|
||||
assert_output --partial refs/tags/v2.0.0
|
||||
|
||||
# Assert that branch "a-new-branch" was updated on remote
|
||||
current_sha="$(git rev-parse --verify --short a-new-branch)"
|
||||
current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})"
|
||||
remote_sha="$(git rev-parse --verify --short origin/a-new-branch)"
|
||||
|
||||
assert_equal $current_sha $remote_sha
|
||||
@@ -535,7 +513,6 @@ cat_github_output() {
|
||||
@test "it does not throw an error if not changes are detected and SKIP_DIRTY_CHECK is false" {
|
||||
INPUT_FILE_PATTERN="."
|
||||
INPUT_SKIP_DIRTY_CHECK=false
|
||||
INPUT_SKIP_FETCH=false
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
@@ -578,9 +555,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"
|
||||
@@ -592,25 +568,24 @@ cat_github_output() {
|
||||
|
||||
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"
|
||||
@@ -635,9 +610,12 @@ cat_github_output() {
|
||||
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,13 +624,11 @@ 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" {
|
||||
|
||||
@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"
|
||||
@@ -677,6 +653,11 @@ cat_github_output() {
|
||||
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"
|
||||
|
||||
@@ -688,8 +669,7 @@ cat_github_output() {
|
||||
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 +686,6 @@ cat_github_output() {
|
||||
cd $FAKE_LOCAL_REPOSITORY
|
||||
|
||||
INPUT_BRANCH="existing-remote-branch"
|
||||
INPUT_CREATE_BRANCH=true
|
||||
|
||||
run git branch
|
||||
refute_line --partial "existing-remote-branch"
|
||||
@@ -734,13 +713,14 @@ cat_github_output() {
|
||||
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 +730,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" {
|
||||
# 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 +747,6 @@ cat_github_output() {
|
||||
cd $FAKE_LOCAL_REPOSITORY
|
||||
|
||||
INPUT_BRANCH="existing-remote-branch"
|
||||
INPUT_CREATE_BRANCH=true
|
||||
|
||||
run git branch
|
||||
refute_line --partial "existing-remote-branch"
|
||||
@@ -782,23 +761,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" {
|
||||
# Create `new-branch` on remote with changes the local repository does not yet have
|
||||
cd $FAKE_TEMP_LOCAL_REPOSITORY
|
||||
|
||||
@@ -818,7 +798,7 @@ cat_github_output() {
|
||||
|
||||
INPUT_BRANCH="new-branch"
|
||||
|
||||
# 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 +810,13 @@ 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 the remote contains work that you do"
|
||||
assert_line --partial "This is usually caused by another repository pushing"
|
||||
}
|
||||
|
||||
@test "throws fatal error if file pattern includes files that do not exist" {
|
||||
@@ -1004,7 +981,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 +1015,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
|
||||
@@ -1123,5 +1100,322 @@ 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 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."
|
||||
}
|
||||
|
||||
@test "it executes pre_status_hook when provided" {
|
||||
# Create a dummy file and setup the hook to create a marker file
|
||||
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-created-by-hook.txt
|
||||
|
||||
INPUT_PRE_STATUS_HOOK="echo 'pre-status-hook-executed' > hook-marker.txt"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_success
|
||||
assert_line "::debug::Executing pre_status hook"
|
||||
assert_line "::debug::pre_status hook completed successfully"
|
||||
|
||||
# Verify the hook actually executed
|
||||
assert [ -f "${FAKE_LOCAL_REPOSITORY}/hook-marker.txt" ]
|
||||
run cat "${FAKE_LOCAL_REPOSITORY}/hook-marker.txt"
|
||||
assert_output "pre-status-hook-executed"
|
||||
}
|
||||
|
||||
@test "it executes pre_commit_hook when changes are detected" {
|
||||
# Create a dummy file to trigger commit process
|
||||
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-created-by-hook.txt
|
||||
|
||||
INPUT_PRE_COMMIT_HOOK="echo 'pre-commit-hook-executed' > pre-commit-marker.txt"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_success
|
||||
assert_line "::debug::Executing pre_commit hook"
|
||||
assert_line "::debug::pre_commit hook completed successfully"
|
||||
|
||||
# Verify the hook actually executed
|
||||
assert [ -f "${FAKE_LOCAL_REPOSITORY}/pre-commit-marker.txt" ]
|
||||
run cat "${FAKE_LOCAL_REPOSITORY}/pre-commit-marker.txt"
|
||||
assert_output "pre-commit-hook-executed"
|
||||
}
|
||||
|
||||
@test "it executes pre_push_hook when changes are detected" {
|
||||
# Create a dummy file to trigger commit process
|
||||
touch "${FAKE_LOCAL_REPOSITORY}"/new-file.txt
|
||||
|
||||
INPUT_PRE_PUSH_HOOK="echo 'pre-push-hook-executed' > pre-push-marker.txt"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_success
|
||||
assert_line "::debug::Executing pre_push hook"
|
||||
assert_line "::debug::pre_push hook completed successfully"
|
||||
|
||||
# Verify the hook actually executed
|
||||
assert [ -f "${FAKE_LOCAL_REPOSITORY}/pre-push-marker.txt" ]
|
||||
run cat "${FAKE_LOCAL_REPOSITORY}/pre-push-marker.txt"
|
||||
assert_output "pre-push-hook-executed"
|
||||
}
|
||||
|
||||
@test "it executes post_push_hook when changes are detected" {
|
||||
# Create a dummy file to trigger commit process
|
||||
touch "${FAKE_LOCAL_REPOSITORY}"/new-file.txt
|
||||
|
||||
INPUT_POST_PUSH_HOOK="echo 'post-push-hook-executed' > post-push-marker.txt"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_success
|
||||
assert_line "::debug::Executing post_push hook"
|
||||
assert_line "::debug::post_push hook completed successfully"
|
||||
|
||||
# Verify the hook actually executed
|
||||
assert [ -f "${FAKE_LOCAL_REPOSITORY}/post-push-marker.txt" ]
|
||||
run cat "${FAKE_LOCAL_REPOSITORY}/post-push-marker.txt"
|
||||
assert_output "post-push-hook-executed"
|
||||
}
|
||||
|
||||
@test "it executes all hooks in correct order when changes are detected" {
|
||||
# Create a dummy file to trigger commit process
|
||||
touch "${FAKE_LOCAL_REPOSITORY}"/new-file.txt
|
||||
|
||||
INPUT_PRE_STATUS_HOOK="echo '1' > execution-order.txt"
|
||||
INPUT_PRE_COMMIT_HOOK="echo '2' >> execution-order.txt"
|
||||
INPUT_PRE_PUSH_HOOK="echo '3' >> execution-order.txt"
|
||||
INPUT_POST_PUSH_HOOK="echo '4' >> execution-order.txt"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_success
|
||||
assert_line "::debug::Executing pre_status hook"
|
||||
assert_line "::debug::Executing pre_commit hook"
|
||||
assert_line "::debug::Executing pre_push hook"
|
||||
assert_line "::debug::Executing post_push hook"
|
||||
|
||||
# Verify all hooks executed in the correct order
|
||||
run cat "${FAKE_LOCAL_REPOSITORY}/execution-order.txt"
|
||||
assert_line --index 0 "1"
|
||||
assert_line --index 1 "2"
|
||||
assert_line --index 2 "3"
|
||||
assert_line --index 3 "4"
|
||||
}
|
||||
|
||||
@test "it executes pre_status_hook even when no changes are detected" {
|
||||
INPUT_PRE_STATUS_HOOK="echo 'pre-status-hook-executed' > /tmp/hook-marker.txt"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_success
|
||||
assert_line "::debug::Executing pre_status hook"
|
||||
assert_line "Working tree clean. Nothing to commit."
|
||||
|
||||
# Verify the hook actually executed
|
||||
assert [ -f "/tmp/hook-marker.txt" ]
|
||||
run cat "/tmp/hook-marker.txt"
|
||||
assert_output "pre-status-hook-executed"
|
||||
rm -f "/tmp/hook-marker.txt"
|
||||
}
|
||||
|
||||
@test "it does not execute commit/push hooks when no changes are detected" {
|
||||
INPUT_PRE_COMMIT_HOOK="echo 'should-not-execute' > pre-commit-marker.txt"
|
||||
INPUT_PRE_PUSH_HOOK="echo 'should-not-execute' > pre-push-marker.txt"
|
||||
INPUT_POST_PUSH_HOOK="echo 'should-not-execute' > post-push-marker.txt"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_success
|
||||
assert_line "Working tree clean. Nothing to commit."
|
||||
|
||||
# Verify the hooks did not execute
|
||||
assert [ ! -f "${FAKE_LOCAL_REPOSITORY}/pre-commit-marker.txt" ]
|
||||
assert [ ! -f "${FAKE_LOCAL_REPOSITORY}/pre-push-marker.txt" ]
|
||||
assert [ ! -f "${FAKE_LOCAL_REPOSITORY}/post-push-marker.txt" ]
|
||||
}
|
||||
|
||||
@test "it executes hooks in tag-only mode" {
|
||||
INPUT_CREATE_GIT_TAG_ONLY=true
|
||||
INPUT_TAGGING_MESSAGE="v1.0.0"
|
||||
INPUT_PRE_STATUS_HOOK="echo 'pre-status-tag-only' > pre-status-marker.txt"
|
||||
INPUT_PRE_PUSH_HOOK="echo 'pre-push-tag-only' > pre-push-marker.txt"
|
||||
INPUT_POST_PUSH_HOOK="echo 'post-push-tag-only' > post-push-marker.txt"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_success
|
||||
assert_line "::debug::Executing pre_status hook"
|
||||
assert_line "::debug::Executing pre_push hook"
|
||||
assert_line "::debug::Executing post_push hook"
|
||||
|
||||
# Verify hooks executed
|
||||
assert [ -f "${FAKE_LOCAL_REPOSITORY}/pre-status-marker.txt" ]
|
||||
assert [ -f "${FAKE_LOCAL_REPOSITORY}/pre-push-marker.txt" ]
|
||||
assert [ -f "${FAKE_LOCAL_REPOSITORY}/post-push-marker.txt" ]
|
||||
}
|
||||
|
||||
@test "it fails when pre_status_hook fails" {
|
||||
INPUT_PRE_STATUS_HOOK="false"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_failure
|
||||
assert_line "::debug::Executing pre_status hook"
|
||||
assert_line "::error::pre_status hook failed with exit code 1"
|
||||
}
|
||||
|
||||
@test "it fails when pre_commit_hook fails" {
|
||||
# Create a dummy file to trigger commit process
|
||||
touch "${FAKE_LOCAL_REPOSITORY}"/new-file.txt
|
||||
|
||||
INPUT_PRE_COMMIT_HOOK="false"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_failure
|
||||
assert_line "::debug::Executing pre_commit hook"
|
||||
assert_line "::error::pre_commit hook failed with exit code 1"
|
||||
}
|
||||
|
||||
@test "it fails when pre_push_hook fails" {
|
||||
# Create a dummy file to trigger commit process
|
||||
touch "${FAKE_LOCAL_REPOSITORY}"/new-file.txt
|
||||
|
||||
INPUT_PRE_PUSH_HOOK="false"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_failure
|
||||
assert_line "::debug::Executing pre_push hook"
|
||||
assert_line "::error::pre_push hook failed with exit code 1"
|
||||
}
|
||||
|
||||
@test "it fails when post_push_hook fails" {
|
||||
# Create a dummy file to trigger commit process
|
||||
touch "${FAKE_LOCAL_REPOSITORY}"/new-file.txt
|
||||
|
||||
INPUT_POST_PUSH_HOOK="false"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_failure
|
||||
assert_line "::debug::Executing post_push hook"
|
||||
assert_line "::error::post_push hook failed with exit code 1"
|
||||
}
|
||||
|
||||
@test "hook can access git commands and repository state" {
|
||||
# Create a dummy file to trigger commit process
|
||||
touch "${FAKE_LOCAL_REPOSITORY}"/new-file.txt
|
||||
|
||||
INPUT_PRE_COMMIT_HOOK="git log --oneline | head -1 > git-log-output.txt"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_success
|
||||
assert_line "::debug::Executing pre_commit hook"
|
||||
|
||||
# Verify the hook could access git commands
|
||||
assert [ -f "${FAKE_LOCAL_REPOSITORY}/git-log-output.txt" ]
|
||||
run cat "${FAKE_LOCAL_REPOSITORY}/git-log-output.txt"
|
||||
assert_line --partial "Init Remote Repository"
|
||||
}
|
||||
|
||||
@test "hook can modify files that get included in commit" {
|
||||
# Create a dummy file to trigger commit process
|
||||
touch "${FAKE_LOCAL_REPOSITORY}"/new-file.txt
|
||||
|
||||
INPUT_PRE_COMMIT_HOOK="echo 'modified by hook' > hook-modified-file.txt"
|
||||
|
||||
run git_auto_commit
|
||||
|
||||
assert_success
|
||||
assert_line "::debug::Executing pre_commit hook"
|
||||
|
||||
# Verify the file created by the hook was committed
|
||||
run git log --name-only -1
|
||||
assert_line "hook-modified-file.txt"
|
||||
assert_line "new-file.txt"
|
||||
}
|
||||
|
||||
16
yarn.lock
16
yarn.lock
@@ -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.0:
|
||||
version "1.11.0"
|
||||
resolved "https://registry.yarnpkg.com/bats/-/bats-1.11.0.tgz#40281f021f5befcc10da54ed5674aa5b181f4953"
|
||||
integrity sha512-qiKdnS4ID3bJ1MaEOKuZe12R4w+t+psJF0ICj+UdkiHBBoObPMHv8xmD3w6F4a5qwUyZUHS+413lxENBNy8xcQ==
|
||||
Reference in New Issue
Block a user