Compare commits

..

11 Commits

Author SHA1 Message Date
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
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
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
6 changed files with 339 additions and 768 deletions

View File

@@ -1,242 +0,0 @@
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"

View File

@@ -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@v6
with:
branch: master
commit_message: Update CHANGELOG

193
README.md
View File

@@ -19,7 +19,7 @@ Adding git-auto-commit to your Workflow only takes a couple lines of code.
2. Add the following step at the end of your job, after other steps that might add or change files.
```yaml
- uses: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v6
```
Your Workflow should look similar to this example.
@@ -47,7 +47,7 @@ jobs:
# …
# Commit all changed files back to the repository
- uses: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v6
```
> [!NOTE]
@@ -56,7 +56,7 @@ 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@v6
with:
# Optional. Commit message for the created commit.
# Defaults to "Apply automatic changes"
@@ -105,10 +105,19 @@ The following is an extended example with all available options.
# Optional. Disable dirty check and always try to create a commit and push
skip_dirty_check: true
# Optional. Skip internal call to `git fetch`
skip_fetch: true
# Optional. Skip internal call to `git checkout`
skip_checkout: true
# Optional. Prevents the shell from expanding filenames.
# Details: https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html
disable_globbing: true
# Optional. Create given branch name in local and remote repository.
create_branch: true
# Optional. Creates a new tag and pushes it to remote without creating a commit.
# Skips dirty check and changed files. Must be used with `tagging_message`.
create_git_tag_only: false
@@ -148,7 +157,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@v6
with:
commit_message: Apply php-cs-fixer changes
```
@@ -170,7 +179,7 @@ You can use these outputs to trigger other Actions in your Workflow run based on
### Example
```yaml
- uses: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v6
id: auto-commit-action #mandatory for the output to show up in ${{ steps }}
with:
commit_message: Apply php-cs-fixer changes
@@ -244,165 +253,6 @@ If you would like to prevent this, you can add `skip-checks:true` to the commit
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
@@ -429,7 +279,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@v6
id: commit
with:
commit_message: ${{ steps.commit_message_step.outputs.commit_message }}
@@ -453,7 +303,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@v6
with:
commit_author: "${{ steps.import-gpg.outputs.name }} <${{ steps.import-gpg.outputs.email }}>"
commit_user_name: ${{ steps.import-gpg.outputs.name }}
@@ -530,7 +380,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@v6
```
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/).
@@ -565,12 +415,13 @@ 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@v6
with:
commit_author: ${{ steps.last-commit.outputs.author }}
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.
@@ -621,7 +472,7 @@ You can learn more about Personal Access Token in the [GitHub documentation](htt
If you go the "force pushes" route, you have to enable force pushes to a protected branch (see [documentation](https://help.github.com/en/github/administering-a-repository/enabling-force-pushes-to-a-protected-branch)) and update your Workflow to use force push like this.
```yaml
- uses: stefanzweifel/git-auto-commit-action@v5
- uses: stefanzweifel/git-auto-commit-action@v6
with:
commit_message: Apply php-cs-fixer changes
push_options: --force
@@ -651,7 +502,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@v6
with:
file_pattern: '*.md'
disable_globbing: true
@@ -679,7 +530,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@v6` 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

View File

@@ -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
@@ -47,18 +47,29 @@ inputs:
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.
default: false
create_git_tag_only:
description: Perform a clean git tag and push, without commiting anything
required: false
@@ -66,33 +77,7 @@ inputs:
internal_git_binary:
description: Internal use only! Path to git binary used to check if git is available. (Don't change this!)
default: git
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:
@@ -103,9 +88,9 @@ outputs:
description: Value is "true", if a git tag was created using the `create_git_tag_only`-input.
runs:
using: "node20"
main: "index.js"
using: 'node24'
main: 'index.js'
branding:
icon: "git-commit"
icon: 'git-commit'
color: orange

View File

@@ -19,32 +19,6 @@ _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}
@@ -53,47 +27,24 @@ _log() {
}
_main() {
if "$INPUT_SKIP_FETCH"; then
_log "warning" "git-auto-commit: skip_fetch has been removed in v6. It does not have any effect anymore.";
fi
if "$INPUT_SKIP_CHECKOUT"; then
_log "warning" "git-auto-commit: skip_checkout has been removed in v6. It does not have any effect anymore.";
fi
if "$INPUT_CREATE_BRANCH"; then
_log "warning" "git-auto-commit: create_branch has been removed in v6. It does not have any effect anymore.";
fi
_check_if_git_is_available
_switch_to_repository
_check_if_is_git_repository
# _check_if_repository_is_in_detached_state
# Execute pre-status hook before checking repository state
_execute_hook "pre_status" "$INPUT_PRE_STATUS_HOOK"
_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
# 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"
# Execute pre-commit hook before adding files so hook can modify files
_execute_hook "pre_commit" "$INPUT_PRE_COMMIT_HOOK"
_switch_to_branch
_add_files
@@ -106,13 +57,7 @@ _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"
@@ -165,13 +110,40 @@ _check_if_is_git_repository() {
_check_if_repository_is_in_detached_state() {
if [ -z "$(git symbolic-ref HEAD)" ]
then
_log "error" "Repository is in detached HEAD state. Please make sure you check out a branch. Adjust the `ref` input accordingly.";
exit 1;
_log "warning" "Repository is in a detached HEAD state. git-auto-commit will likely handle this automatically. To avoid it, check out a branch using the ref option in actions/checkout.";
else
_log "debug" "Repository is on a branch.";
fi
}
_switch_to_branch() {
echo "INPUT_BRANCH value: $INPUT_BRANCH";
# Fetch remote to make sure that repo can be switched to the right branch.
if "$INPUT_SKIP_FETCH"; then
_log "debug" "git-fetch will not be executed.";
else
_log "debug" "git-fetch will be executed.";
git fetch --depth=1;
fi
# If `skip_checkout`-input is true, skip the entire checkout step.
if "$INPUT_SKIP_CHECKOUT"; then
_log "debug" "git-checkout will not be executed.";
else
_log "debug" "git-checkout will be executed.";
# Create new local branch if `create_branch`-input is true
if "$INPUT_CREATE_BRANCH"; then
# shellcheck disable=SC2086
git checkout -B $INPUT_BRANCH --;
else
# Switch to branch from current Workflow run
# shellcheck disable=SC2086
git checkout $INPUT_BRANCH --;
fi
fi
}
_add_files() {
echo "INPUT_ADD_OPTIONS: ${INPUT_ADD_OPTIONS}";
_log "debug" "Apply add options ${INPUT_ADD_OPTIONS}";

View File

@@ -35,19 +35,11 @@ setup() {
export INPUT_TAGGING_MESSAGE=""
export INPUT_PUSH_OPTIONS=""
export INPUT_SKIP_DIRTY_CHECK=false
export INPUT_DISABLE_GLOBBING=false
export INPUT_INTERNAL_GIT_BINARY=git
# 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)
@@ -417,6 +409,32 @@ cat_github_output() {
assert_output --partial refs/tags/v2.0.0
}
@test "If SKIP_FETCH is true git-fetch will not be called" {
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
INPUT_SKIP_FETCH=true
run git_auto_commit
assert_success
assert_line "::debug::git-fetch will not be executed."
}
@test "If SKIP_CHECKOUT is true git-checkout will not be called" {
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
INPUT_SKIP_CHECKOUT=true
run git_auto_commit
assert_success
assert_line "::debug::git-checkout will not be executed."
}
@test "It pushes generated commit and tag to remote and actually updates the commit shas" {
INPUT_BRANCH=""
INPUT_TAGGING_MESSAGE="v2.0.0"
@@ -447,6 +465,10 @@ cat_github_output() {
}
@test "It pushes generated commit and tag to remote branch and updates commit sha" {
# Create "a-new-branch"-branch and then immediately switch back to ${FAKE_DEFAULT_BRANCH}
git checkout -b a-new-branch
git checkout ${FAKE_DEFAULT_BRANCH}
INPUT_BRANCH="a-new-branch"
INPUT_TAGGING_MESSAGE="v2.0.0"
@@ -469,7 +491,7 @@ cat_github_output() {
assert_output --partial refs/tags/v2.0.0
# Assert that branch "a-new-branch" was updated on remote
current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})"
current_sha="$(git rev-parse --verify --short a-new-branch)"
remote_sha="$(git rev-parse --verify --short origin/a-new-branch)"
assert_equal $current_sha $remote_sha
@@ -513,6 +535,7 @@ cat_github_output() {
@test "it does not throw an error if not changes are detected and SKIP_DIRTY_CHECK is false" {
INPUT_FILE_PATTERN="."
INPUT_SKIP_DIRTY_CHECK=false
INPUT_SKIP_FETCH=false
run git_auto_commit
@@ -566,6 +589,8 @@ cat_github_output() {
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
INPUT_SKIP_CHECKOUT=true
run git_auto_commit
assert_success
@@ -595,6 +620,8 @@ cat_github_output() {
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
INPUT_SKIP_CHECKOUT=true
run git_auto_commit
assert_success
@@ -624,51 +651,6 @@ cat_github_output() {
assert_line -e "commit_hash=[0-9a-f]{40}$"
}
@test "It does not create new local branch if local branch already exists" {
git checkout -b not-existend-remote-branch
git checkout ${FAKE_DEFAULT_BRANCH}
INPUT_BRANCH="not-existend-remote-branch"
run git branch
assert_line --partial "not-existend-remote-branch"
run git branch -r
refute_line --partial "origin/not-existend-remote-branch"
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
run git_auto_commit
assert_success
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "INPUT_BRANCH value: not-existend-remote-branch"
assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: "
assert_line "::debug::Apply commit options "
assert_line "INPUT_TAGGING_MESSAGE: "
assert_line "No tagging message supplied. No tag will be added."
assert_line "INPUT_PUSH_OPTIONS: "
assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch not-existend-remote-branch"
# Assert checked out branch is still the same.
run git rev-parse --abbrev-ref HEAD
assert_line --partial ${FAKE_DEFAULT_BRANCH}
refute_line --partial "not-existend-remote-branch"
run git branch
assert_line --partial "not-existend-remote-branch"
run git branch -r
assert_line --partial "origin/not-existend-remote-branch"
run cat_github_output
assert_line "changes_detected=true"
assert_line -e "commit_hash=[0-9a-f]{40}$"
}
@test "It creates new local branch and pushes branch to remote even if the remote branch already exists" {
# Create `existing-remote-branch` on remote with changes the local repository does not yet have
cd $FAKE_TEMP_LOCAL_REPOSITORY
@@ -686,6 +668,7 @@ cat_github_output() {
cd $FAKE_LOCAL_REPOSITORY
INPUT_BRANCH="existing-remote-branch"
INPUT_SKIP_CHECKOUT=true
run git branch
refute_line --partial "existing-remote-branch"
@@ -730,7 +713,7 @@ cat_github_output() {
assert_line -e "commit_hash=[0-9a-f]{40}$"
}
@test "It fails if local branch is behind remote and when remote has newer commits" {
@test "It fails if local branch is behind remote and when remote has newer commits and skip_checkout is set to true" {
# Create `existing-remote-branch` on remote with changes the local repository does not yet have
cd $FAKE_TEMP_LOCAL_REPOSITORY
git checkout -b "existing-remote-branch"
@@ -747,6 +730,7 @@ cat_github_output() {
cd $FAKE_LOCAL_REPOSITORY
INPUT_BRANCH="existing-remote-branch"
INPUT_SKIP_CHECKOUT=true
run git branch
refute_line --partial "existing-remote-branch"
@@ -778,7 +762,7 @@ cat_github_output() {
refute [assert_equal $current_sha $remote_sha]
}
@test "It fails to push commit to remote if branch already exists and local repo is behind its remote counterpart" {
@test "It fails to push commit to remote if branch already exists and local repo is behind its remote counterpart and SKIP_CHECKOUT is used" {
# Create `new-branch` on remote with changes the local repository does not yet have
cd $FAKE_TEMP_LOCAL_REPOSITORY
@@ -797,6 +781,7 @@ cat_github_output() {
cd $FAKE_LOCAL_REPOSITORY
INPUT_BRANCH="new-branch"
INPUT_SKIP_CHECKOUT=true
# Assert that local remote does not have a "new-branch"-branch nor does
# know about the remote branch.
@@ -815,8 +800,7 @@ cat_github_output() {
assert_line "INPUT_BRANCH value: new-branch"
assert_line --partial "::debug::Push commit to remote branch new-branch"
assert_line --partial "Updates were rejected because the remote contains work that you do"
assert_line --partial "This is usually caused by another repository pushing"
assert_line --partial "Updates were rejected because a pushed branch tip is behind its remote"
}
@test "throws fatal error if file pattern includes files that do not exist" {
@@ -1103,8 +1087,7 @@ END
assert_line "::error::Not a git repository. Please make sure to run this action in a git repository. Adjust the `repository` input if necessary."
}
@test "It detects if the repository is in a detached state and exits with an error" {
skip
@test "It detects if the repository is in a detached state and logs a warning" {
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
run git_auto_commit
@@ -1119,8 +1102,8 @@ END
run git_auto_commit
assert_failure;
assert_line "::error::Repository is in detached HEAD state. Please make sure you check out a branch. Adjust the `ref` input accordingly."
assert_success;
assert_line "::warning::Repository is in a detached HEAD state. git-auto-commit will likely handle this automatically. To avoid it, check out a branch using the ref option in actions/checkout."
}
@test "it creates a tag if create_git_tag_only is set to true and a message has been supplied" {
@@ -1174,248 +1157,270 @@ END
assert_output ""
}
@test "it shows warning message if any deprecated options are used" {
INPUT_SKIP_FETCH=true
INPUT_SKIP_CHECKOUT=true
@test "script fails to push commit to new branch that does not exist yet" {
INPUT_BRANCH="not-existend-branch"
INPUT_CREATE_BRANCH=false
run git branch
refute_line --partial "not-existend-branch"
run git branch -r
refute_line --partial "origin/not-existend-branch"
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
run git_auto_commit
assert_failure
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "INPUT_BRANCH value: not-existend-branch"
assert_line "fatal: invalid reference: not-existend-branch"
run git branch
refute_line --partial "not-existend-branch"
run git branch -r
refute_line --partial "origin/not-existend-branch"
run cat_github_output
assert_line "changes_detected=true"
}
@test "It creates new local branch and pushes the new branch to remote" {
INPUT_BRANCH="not-existend-branch"
INPUT_CREATE_BRANCH=true
run git_auto_commit
run git branch
refute_line --partial "not-existend-branch"
assert_success
run git branch -r
refute_line --partial "origin/not-existend-branch"
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"
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.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"
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "INPUT_BRANCH value: not-existend-branch"
assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: "
assert_line "::debug::Apply commit options "
assert_line "INPUT_TAGGING_MESSAGE: "
assert_line "No tagging message supplied. No tag will be added."
assert_line "INPUT_PUSH_OPTIONS: "
assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch not-existend-branch"
run git branch
assert_line --partial "not-existend-branch"
run git branch -r
assert_line --partial "origin/not-existend-branch"
run cat_github_output
assert_line "changes_detected=true"
assert_line -e "commit_hash=[0-9a-f]{40}$"
}
@test "it 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
@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_PRE_COMMIT_HOOK="echo 'pre-commit-hook-executed' > pre-commit-marker.txt"
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 "::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"
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "INPUT_BRANCH value: not-existend-remote-branch"
assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: "
assert_line "::debug::Apply commit options "
assert_line "INPUT_TAGGING_MESSAGE: "
assert_line "No tagging message supplied. No tag will be added."
assert_line "INPUT_PUSH_OPTIONS: "
assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch not-existend-remote-branch"
# Assert checked out branch is still the same.
run git rev-parse --abbrev-ref HEAD
assert_line --partial ${FAKE_DEFAULT_BRANCH}
refute_line --partial "not-existend-remote-branch"
run git branch
assert_line --partial "not-existend-remote-branch"
run git branch -r
assert_line --partial "origin/not-existend-remote-branch"
run cat_github_output
assert_line "changes_detected=true"
assert_line -e "commit_hash=[0-9a-f]{40}$"
}
@test "it executes pre_push_hook when changes are detected" {
# Create a dummy file to trigger commit process
touch "${FAKE_LOCAL_REPOSITORY}"/new-file.txt
@test "it creates new local branch and pushes branch to remote even if the remote branch already exists" {
INPUT_PRE_PUSH_HOOK="echo 'pre-push-hook-executed' > pre-push-marker.txt"
# 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 "::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"
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "INPUT_BRANCH value: existing-remote-branch"
assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: "
assert_line "::debug::Apply commit options "
assert_line "INPUT_TAGGING_MESSAGE: "
assert_line "No tagging message supplied. No tag will be added."
assert_line "INPUT_PUSH_OPTIONS: "
assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch existing-remote-branch"
run git branch
assert_line --partial "existing-remote-branch"
run git branch -r
assert_line --partial "origin/existing-remote-branch"
# Assert that branch "existing-remote-branch" was updated on remote
current_sha="$(git rev-parse --verify --short existing-remote-branch)"
remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)"
assert_equal $current_sha $remote_sha
run cat_github_output
assert_line "changes_detected=true"
assert_line -e "commit_hash=[0-9a-f]{40}$"
}
@test "it executes post_push_hook when changes are detected" {
# Create a dummy file to trigger commit process
touch "${FAKE_LOCAL_REPOSITORY}"/new-file.txt
@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
INPUT_POST_PUSH_HOOK="echo 'post-push-hook-executed' > post-push-marker.txt"
run git branch
assert_line --partial "existing-remote-branch"
run git_auto_commit
# ---------
# Switch to our regular local repository and run `git-auto-commit`
cd $FAKE_LOCAL_REPOSITORY
assert_success
assert_line "::debug::Executing post_push hook"
assert_line "::debug::post_push hook completed successfully"
INPUT_BRANCH="existing-remote-branch"
INPUT_CREATE_BRANCH=true
# 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"
}
run git branch
refute_line --partial "existing-remote-branch"
@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
run git fetch --all
run git branch -r
assert_line --partial "origin/existing-remote-branch"
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"
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
run git_auto_commit
assert_failure
assert_line "::debug::Executing pre_status hook"
assert_line "::error::pre_status hook failed with exit code 1"
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 fails when pre_commit_hook fails" {
# Create a dummy file to trigger commit process
touch "${FAKE_LOCAL_REPOSITORY}"/new-file.txt
@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
INPUT_PRE_COMMIT_HOOK="false"
git checkout -b "new-branch"
touch new-branch-file.txt
git add new-branch-file.txt
run git_auto_commit
git commit --quiet -m "Add additional file"
git push origin new-branch
assert_failure
assert_line "::debug::Executing pre_commit hook"
assert_line "::error::pre_commit hook failed with exit code 1"
}
run git branch -r
assert_line --partial "origin/new-branch"
@test "it fails when pre_push_hook fails" {
# Create a dummy file to trigger commit process
touch "${FAKE_LOCAL_REPOSITORY}"/new-file.txt
# ---------
# Switch to our regular local repository and run `git-auto-commit`
cd $FAKE_LOCAL_REPOSITORY
INPUT_PRE_PUSH_HOOK="false"
INPUT_BRANCH="new-branch"
run git_auto_commit
# 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"
assert_failure
assert_line "::debug::Executing pre_push hook"
assert_line "::error::pre_push hook failed with exit code 1"
}
run git branch -r
refute_line --partial "origin/new-branch"
@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"
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.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"
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
}