Compare commits

..

12 Commits

Author SHA1 Message Date
Stefan Zweifel 7f171889c8
Remove removed options from README 2023-12-20 20:20:24 +01:00
Stefan Zweifel 76f415fb30
Remove skip_fetch, skip_checkout and create_branch 2023-12-20 20:19:38 +01:00
Stefan Zweifel 3e796a0146
Update Assertion 2023-12-20 20:13:20 +01:00
Stefan Zweifel e833d4f211
Remove _switch_to_branch function 2023-12-20 20:10:12 +01:00
Stefan Zweifel 0aca01a1ef
Remove no longer used input options from tests 2023-12-20 20:09:59 +01:00
Stefan Zweifel 03fddc470c
Temp disable assertions 2023-12-20 20:09:40 +01:00
Stefan Zweifel ef7ed32535
Remove no longer needed tests 2023-12-20 20:03:21 +01:00
Stefan Zweifel 9062db8404
Update Tests 2023-12-19 21:00:32 +01:00
Stefan Zweifel 80052f0645
Update Tests 2023-12-19 20:45:55 +01:00
Stefan Zweifel 3b8231379d
Update Tests 2023-12-19 20:34:56 +01:00
Stefan Zweifel d9307b5e8c
Update Test 2023-12-19 20:13:01 +01:00
Stefan Zweifel aa2cec9c08
Don't switch local branches 2023-12-19 20:11:39 +01:00
13 changed files with 64 additions and 396 deletions

View File

@ -5,7 +5,7 @@ body:
- type: markdown - type: markdown
attributes: attributes:
value: | value: |
Before opening a bug report, please search for the behaviour in existing issues or discussions. Before opening a bug report, please search for the behaviour in the existing issues.
--- ---
@ -17,7 +17,7 @@ body:
description: "Which exact version of git-auto-commit are you using in your Workflow?" description: "Which exact version of git-auto-commit are you using in your Workflow?"
placeholder: "v4.14.0" placeholder: "v4.14.0"
validations: validations:
required: true required: true
- type: dropdown - type: dropdown
id: machine id: machine
attributes: attributes:
@ -33,7 +33,7 @@ body:
id: bug-description id: bug-description
attributes: attributes:
label: Bug description label: Bug description
description: What exactly happened? Please describe your problem in detail. description: What exactly happened?
validations: validations:
required: true required: true
- type: textarea - type: textarea
@ -52,7 +52,7 @@ body:
id: example-workflow id: example-workflow
attributes: attributes:
label: Example Workflow label: Example Workflow
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.) description: Please share your GitHub Actions workflow which causes the bug. We use this to reproduce the error. No need for backticks here.
render: yaml render: yaml
validations: validations:
required: true required: true
@ -60,10 +60,5 @@ body:
id: logs id: logs
attributes: attributes:
label: Relevant log output label: Relevant log output
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.) description: If applicable, provide relevant log output. No need for backticks here.
render: shell render: shell
- type: input
id: repository-url
attributes:
label: Repository
description: If applicable, please provide the repository where the bug occurred.

View File

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

View File

@ -12,7 +12,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Lint Code Base - name: Lint Code Base
uses: github/super-linter@v7 uses: github/super-linter@v5
env: env:
VALIDATE_ALL_CODEBASE: false VALIDATE_ALL_CODEBASE: false
VALIDATE_MARKDOWN: false VALIDATE_MARKDOWN: false

View File

@ -15,6 +15,6 @@ jobs:
contents: write contents: write
steps: steps:
- uses: release-drafter/release-drafter@v6 - uses: release-drafter/release-drafter@v5
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1 +0,0 @@
1sdlfjlasdf;ljf;ljas;ldfj23123

View File

@ -1,36 +1,14 @@
# Changelog
# add sdfsf
# add sdf
# Changelog234234
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## [Unreleased](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5.0.1...HEAD) ## [Unreleased](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5.0.0...HEAD)
> TBD > TBD
## [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 ## [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. New major release that bumps the default runtime to Node 20. There are no other breaking changes.

240
README.md
View File

@ -1,151 +1,4 @@
# abcd add haha ... git-auto-commit Action # git-auto-commit Action
# add env #!/usr/bin/env bash
set -o pipefail
readonly DEFAULT_FILE_MAXSIZE_MB="30"
readonly CONFIG_NAME="hooks.maxfilesize"
readonly NULLSHA="0000000000000000000000000000000000000000"
readonly EXIT_SUCCESS=0
readonly EXIT_FAILURE=1
readonly DEFAULT_REPO_MAXSIZE_MB="1024"
readonly CHECK_FLAG_ON=1
env
echo "CHECK_FLAG_ON=====$CHECK_FLAG_ON"
echo "PUSH_SIZE_CHECK_FLAG=====$PUSH_SIZE_CHECK_FLAG"
status="$EXIT_SUCCESS"
# skip this hook entirely if shell check is not open
check_flag=1 #${PUSH_SIZE_CHECK_FLAG}
if [[ $check_flag != $CHECK_FLAG_ON ]]; then
exit $EXIT_SUCCESS
fi
export REPO_MAX_SIZE=50
echo "REPO_MAX_FILE_SIZE===${REPO_MAX_FILE_SIZE}"
echo "REPO_MAX_SIZE===${REPO_MAX_SIZE}"
echo "REPO_CURRENT_SIZE===${REPO_CURRENT_SIZE}"
#######################################
# check the file max size limit
#######################################
# get maximum filesize (from repository-specific config)
maxsize_mb="${REPO_MAX_FILE_SIZE}"
if [[ "$?" != $EXIT_SUCCESS ]]; then
echo "failed to get ${CONFIG_NAME} from config"
exit "$EXIT_FAILURE"
fi
push_size="0"
# read lines from stdin (format: "<oldref> <newref> <refname>\n")
while read oldref newref refname; do
# skip branch deletions
if [[ "$newref" == "$NULLSHA" ]]; then
continue
fi
# find large objects
# check all objects from $oldref (possible $NULLSHA) to $newref, but
# skip all objects that have already been accepted (i.e. are referenced by
# another branch or tag).
new_branch_flag=0
if [[ "$oldref" == "$NULLSHA" ]]; then
target="$newref"
new_branch_flag=1
echo "You are creating a new remote branch,openI will check all files in commit history to find oversize files"
else
target="${oldref}..${newref}"
fi
echo "target==${target}"
maxsize=`expr $maxsize_mb \* 1048576`
# find objects in this push_size
# print like:
# 08da8e2ab9ae4095bf94dd71ac913132b880b463 commit 214
# 43e993b768ede5740e8c65de2ed6edec25053ea1 tree 185
# 4476971d76569039df7569af1b8d03c288f6b193 blob 20167318 b0417e6593a1.zip
files="$(git rev-list --objects "$target" | \
git cat-file $'--batch-check=%(objectname) %(objecttype) %(objectsize) %(rest)' | \
awk -F ' ' -v maxbytes="$maxsize" 'BEGIN {totalIn=0} {if( $3 > maxbytes && $2 == "blob") { totalIn+=$3; print $4} else { totalIn+=$3}} END { printf ("totalIn=\t%s",totalIn)}' )"
if [[ "$?" != $EXIT_SUCCESS ]]; then
echo "failed to check for large files in ref ${refname}"
continue
fi
IFS=$'\n'
# rewrite IFS to seperate line in $files
for file in $files; do
# if don't unset IFS,temp_array=(${file}) will get error answer
if [[ ${file} == totalIn=* ]]; then
IFS=$'\t'
temp_array=(${file})
push_size=${temp_array[1]}
continue
fi
unset IFS
if [[ "$status" == $EXIT_SUCCESS ]]; then
echo -e "Error: Your push was rejected because it contains files larger than $(numfmt --to=iec "$maxsize_mb") Mb"
echo "help document -- https://openi.pcl.ac.cn/zeizei/OpenI_Learning/src/branch/master/docs/git/repository_capacity_help.md"
echo "oversize files:"
# status="$EXIT_FAILURE"
fi
echo -e "\033[31m- ${file}\033[0m "
done
echo "push_size=======${push_size}"
if [[ "$status" != $EXIT_SUCCESS ]]; then
exit "$status"
fi
done
#######################################
# check the repo max size limit
#######################################
if [[ $push_size -eq "0" ]]; then
exit $EXIT_SUCCESS
fi
# if create new branch or tag,use count-objects -v to get pack size
if [[ $new_branch_flag -eq 1 ]]; then
size_kb=`git count-objects -v | grep 'size-pack' | sed 's/.*\(size-pack:\).//'`
size_pack_kb=`git count-objects -v | grep 'size:' | sed 's/.*\(size:\).//'`
total_kb=`expr $size_kb + $size_pack_kb`
let push_size=$total_kb*1024
fi
sizelimit_mb="${REPO_MAX_SIZE}"
let sizelimit_b=$sizelimit_mb*1024*1024
# repo size at here means the size of repo directory in server
reposize_b=${REPO_CURRENT_SIZE}
total=`expr $push_size + $reposize_b`
if [ $total -gt $sizelimit_b ]; then
echo "Error: Your push was rejected because the repository size is large than $sizelimit_mb Mb"
echo "see the help document--https://openi.pcl.ac.cn/zeizei/OpenI_Learning/src/branch/master/docs/git/repository_capacity_help.md"
exit $EXIT_FAILURE
fi
exit $EXIT_SUCCESS
v
> The GitHub Action for committing files for the 80% use case. > The GitHub Action for committing files for the 80% use case.
@ -187,18 +40,15 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
# Other steps that change files in the repository go here # Other steps that change files in the repository
# …
# Commit all changed files back to the repository # Commit all changed files back to the repository
- uses: stefanzweifel/git-auto-commit-action@v5 - uses: stefanzweifel/git-auto-commit-action@v5
``` ```
> [!NOTE] > [!NOTE]
> The Action has to be used in a Job that runs on a UNIX-like system (e.g. `ubuntu-latest`). > The Action has to be used in a Job that runs on a UNIX system (e.g. `ubuntu-latest`).
The following is an extended example with all available options. The following is an extended example with all available options.
@ -209,9 +59,8 @@ The following is an extended example with all available options.
# Defaults to "Apply automatic changes" # Defaults to "Apply automatic changes"
commit_message: Automated Change commit_message: Automated Change
# Optional. Local and remote branch name where commit is going to be pushed # Optional. Remote branch name where commit is going to be pushed to.
# to. Defaults to the current branch. # Defaults to the current branch.
# You might need to set `create_branch: true` if the branch does not exist.
branch: feature-123 branch: feature-123
# Optional. Options used by `git-commit`. # Optional. Options used by `git-commit`.
@ -232,7 +81,7 @@ The following is an extended example with all available options.
# Optional commit user and author settings # Optional commit user and author settings
commit_user_name: My GitHub Actions Bot # defaults to "github-actions[bot]" commit_user_name: My GitHub Actions Bot # defaults to "github-actions[bot]"
commit_user_email: my-github-actions-bot@example.org # defaults to "41898282+github-actions[bot]@users.noreply.github.com" commit_user_email: my-github-actions-bot@example.org # defaults to "41898282+github-actions[bot]@users.noreply.github.com"
commit_author: Author <actions@github.com> # defaults to "username <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 author of the commit that triggered the run
# Optional. Tag name being created in the local repository and # Optional. Tag name being created in the local repository and
# pushed to remote repository and defined branch. # pushed to remote repository and defined branch.
@ -252,19 +101,10 @@ The following is an extended example with all available options.
# Optional. Disable dirty check and always try to create a commit and push # Optional. Disable dirty check and always try to create a commit and push
skip_dirty_check: true skip_dirty_check: true
# Optional. Skip internal call to `git fetch`
skip_fetch: true
# Optional. Skip internal call to `git checkout`
skip_checkout: true
# Optional. Prevents the shell from expanding filenames. # Optional. Prevents the shell from expanding filenames.
# Details: https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html # Details: https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html
disable_globbing: true disable_globbing: true
# Optional. Create given branch name in local and remote repository.
create_branch: true
``` ```
Please note that the Action depends on `bash`. If you're using the Action in a job in combination with a custom Docker container, make sure that `bash` is installed. Please note that the Action depends on `bash`. If you're using the Action in a job in combination with a custom Docker container, make sure that `bash` is installed.
@ -317,16 +157,9 @@ You can use these outputs to trigger other Actions in your Workflow run based on
- `changes_detected`: Returns either "true" or "false" if the repository was dirty and files have changed. - `changes_detected`: Returns either "true" or "false" if the repository was dirty and files have changed.
- `commit_hash`: Returns the full hash of the commit if one was created. - `commit_hash`: Returns the full hash of the commit if one was created.
**⚠️ When using outputs, the step needs to be given an id. See example below.**
### Example ### Example
```yaml ```yaml
- uses: stefanzweifel/git-auto-commit-action@v5
id: auto-commit-action #mandatory for the output to show up in ${{ steps }}
with:
commit_message: Apply php-cs-fixer changes
- name: "Run if changes have been detected" - name: "Run if changes have been detected"
if: steps.auto-commit-action.outputs.changes_detected == 'true' if: steps.auto-commit-action.outputs.changes_detected == 'true'
run: echo "Changes!" run: echo "Changes!"
@ -381,17 +214,10 @@ storing the token as a secret in your repository and then passing the new token
token: ${{ secrets.PAT }} token: ${{ secrets.PAT }}
``` ```
If you create a personal access token (classic), apply the `repo` and `workflow` scopes. If you create a personal access token, 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. 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 ### 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. 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.
@ -428,32 +254,11 @@ The example below can be used as a starting point to generate a multiline commit
commit_message: ${{ steps.commit_message_step.outputs.commit_message }} commit_message: ${{ steps.commit_message_step.outputs.commit_message }}
``` ```
### Signing Commits ### Signing Commits & Other Git Command Line Options
If you would like to sign your commits using a GPG key, you will need to use an additional action. 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.
You can use the [crazy-max/ghaction-import-gpg](https://github.com/crazy-max/ghaction-import-gpg) action and follow its setup instructions.
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. - [Import GPG Signature](https://github.com/crazy-max/ghaction-import-gpg) (Suggested by [TGTGamer](https://github.com/tgtgamer))
```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 ### Use in forks from private repositories
@ -538,8 +343,6 @@ If you would like to use this Action to create a commit using [`--amend`](https:
First, you need to extract the previous commit message by using `git log -1 --pretty=%s`. First, you need to extract the previous commit message by using `git log -1 --pretty=%s`.
Then you need to provide this last commit message to the Action through the `commit_message` input option. Then you need to provide this last commit message to the Action through the `commit_message` input option.
By default, the commit author is changed to `username <username@users.noreply.github.com>`, where `username` is the name of the user who triggered the workflow (The [`github.actor`](https://docs.github.com/en/actions/learn-github-actions/contexts#github-context) context is used here). If you want to preserve the name and email of the original author, you must extract them from the last commit and provide them to the Action through the `commit_author` input option.
Finally, you have to use `push_options: '--force'` to overwrite the git history on the GitHub remote repository. (git-auto-commit will not do a `git-rebase` for you!) Finally, you have to use `push_options: '--force'` to overwrite the git history on the GitHub remote repository. (git-auto-commit will not do a `git-rebase` for you!)
The steps in your workflow might look like this: The steps in your workflow might look like this:
@ -553,18 +356,15 @@ The steps in your workflow might look like this:
# Other steps in your workflow to trigger a changed file # Other steps in your workflow to trigger a changed file
- name: Get last commit message - name: Get last commit message
id: last-commit id: last-commit-message
run: | run: |
echo "message=$(git log -1 --pretty=%s)" >> $GITHUB_OUTPUT echo "msg=$(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@v5
with: with:
commit_author: ${{ steps.last-commit.outputs.author }} commit_message: ${{ steps.last-commit-message.outputs.msg }}
commit_message: ${{ steps.last-commit.outputs.message }}
commit_options: '--amend --no-edit' commit_options: '--amend --no-edit'
push_options: '--force' push_options: '--force'
skip_fetch: true
``` ```
See discussion in [#159](https://github.com/stefanzweifel/git-auto-commit-action/issues/159#issuecomment-845347950) for details. See discussion in [#159](https://github.com/stefanzweifel/git-auto-commit-action/issues/159#issuecomment-845347950) for details.
@ -581,25 +381,13 @@ please update your Workflow configuration and usage of [`actions/checkout`](http
Updating the `token` value with a Personal Access Token should fix your issues. 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 ### Push to protected branches
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. 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.
First, you have to create a new [Personal Access Token (PAT)](https://github.com/settings/tokens/new), 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. 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 ```yaml
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:

View File

@ -56,20 +56,9 @@ inputs:
description: Skip the check if the git repository is dirty and always try to create a commit. description: Skip the check if the git repository is dirty and always try to create a commit.
required: false required: false
default: false default: false
skip_fetch:
description: Skip the call to git-fetch.
required: false
default: false
skip_checkout:
description: Skip the call to git-checkout.
required: false
default: false
disable_globbing: disable_globbing:
description: Stop the shell from expanding filenames (https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html) description: Stop the shell from expanding filenames (https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html)
default: false default: false
create_branch:
description: Create new branch with the name of `branch`-input in local and remote repository, if it doesn't exist yet.
default: false
internal_git_binary: internal_git_binary:
description: Internal use only! Path to git binary used to check if git is available. (Don't change this!) description: Internal use only! Path to git binary used to check if git is available. (Don't change this!)
default: git default: git

BIN
build.zip

Binary file not shown.

View File

@ -35,8 +35,6 @@ _main() {
_set_github_output "changes_detected" "true" _set_github_output "changes_detected" "true"
_switch_to_branch
_add_files _add_files
# Check dirty state of repo again using git-diff. # Check dirty state of repo again using git-diff.
@ -82,41 +80,8 @@ _git_is_dirty() {
echo "INPUT_FILE_PATTERN: ${INPUT_FILE_PATTERN}"; echo "INPUT_FILE_PATTERN: ${INPUT_FILE_PATTERN}";
read -r -a INPUT_FILE_PATTERN_EXPANDED <<< "$INPUT_FILE_PATTERN"; read -r -a INPUT_FILE_PATTERN_EXPANDED <<< "$INPUT_FILE_PATTERN";
# capture stderr
gitStatusMessage="$((git status -s $INPUT_STATUS_OPTIONS -- ${INPUT_FILE_PATTERN_EXPANDED:+${INPUT_FILE_PATTERN_EXPANDED[@]}} >/dev/null ) 2>&1)";
# shellcheck disable=SC2086 # shellcheck disable=SC2086
gitStatus="$(git status -s $INPUT_STATUS_OPTIONS -- ${INPUT_FILE_PATTERN_EXPANDED:+${INPUT_FILE_PATTERN_EXPANDED[@]}})"; [ -n "$(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.";
else
git fetch --depth=1;
fi
# If `skip_checkout`-input is true, skip the entire checkout step.
if "$INPUT_SKIP_CHECKOUT"; then
_log "debug" "git-checkout will not be executed.";
else
# Create new local branch if `create_branch`-input is true
if "$INPUT_CREATE_BRANCH"; then
# shellcheck disable=SC2086
git checkout -B $INPUT_BRANCH --;
else
# Switch to branch from current Workflow run
# shellcheck disable=SC2086
git checkout $INPUT_BRANCH --;
fi
fi
} }
_add_files() { _add_files() {
@ -164,6 +129,8 @@ _tag_commit() {
_push_to_github() { _push_to_github() {
echo "INPUT_BRANCH value: $INPUT_BRANCH";
echo "INPUT_PUSH_OPTIONS: ${INPUT_PUSH_OPTIONS}"; echo "INPUT_PUSH_OPTIONS: ${INPUT_PUSH_OPTIONS}";
_log "debug" "Apply push options ${INPUT_PUSH_OPTIONS}"; _log "debug" "Apply push options ${INPUT_PUSH_OPTIONS}";

View File

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

View File

@ -8,7 +8,6 @@ setup() {
export FAKE_LOCAL_REPOSITORY="${BATS_TEST_DIRNAME}/tests_local_repository" export FAKE_LOCAL_REPOSITORY="${BATS_TEST_DIRNAME}/tests_local_repository"
export FAKE_REMOTE="${BATS_TEST_DIRNAME}/tests_remote_repository" export FAKE_REMOTE="${BATS_TEST_DIRNAME}/tests_remote_repository"
export FAKE_TEMP_LOCAL_REPOSITORY="${BATS_TEST_DIRNAME}/tests_clone_of_remote_repository" export FAKE_TEMP_LOCAL_REPOSITORY="${BATS_TEST_DIRNAME}/tests_clone_of_remote_repository"
export FAKE_FOLDER_WITHOUT_GIT_REPO="/tmp/tests_folder_without_git_repo"
# While it is likely the GitHub hosted runners will use master as the default branch, # While it is likely the GitHub hosted runners will use master as the default branch,
# locally anyone may change that. So for tests lets grab whatever is currently set # locally anyone may change that. So for tests lets grab whatever is currently set
@ -34,10 +33,7 @@ setup() {
export INPUT_TAGGING_MESSAGE="" export INPUT_TAGGING_MESSAGE=""
export INPUT_PUSH_OPTIONS="" export INPUT_PUSH_OPTIONS=""
export INPUT_SKIP_DIRTY_CHECK=false export INPUT_SKIP_DIRTY_CHECK=false
export INPUT_SKIP_FETCH=false
export INPUT_SKIP_CHECKOUT=false
export INPUT_DISABLE_GLOBBING=false export INPUT_DISABLE_GLOBBING=false
export INPUT_CREATE_BRANCH=false
export INPUT_INTERNAL_GIT_BINARY=git export INPUT_INTERNAL_GIT_BINARY=git
# Set GitHub environment variables used by the GitHub Action # Set GitHub environment variables used by the GitHub Action
@ -59,7 +55,6 @@ teardown() {
rm -rf "${FAKE_LOCAL_REPOSITORY}" rm -rf "${FAKE_LOCAL_REPOSITORY}"
rm -rf "${FAKE_REMOTE}" rm -rf "${FAKE_REMOTE}"
rm -rf "${FAKE_TEMP_LOCAL_REPOSITORY}" rm -rf "${FAKE_TEMP_LOCAL_REPOSITORY}"
rm -rf "${INPUT_REPOSITORY}"
if [ -z ${GITHUB_OUTPUT+x} ]; then if [ -z ${GITHUB_OUTPUT+x} ]; then
echo "GITHUB_OUTPUT is not set" echo "GITHUB_OUTPUT is not set"
@ -192,7 +187,6 @@ cat_github_output() {
assert_failure assert_failure
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "INPUT_BRANCH value: ${FAKE_DEFAULT_BRANCH}"
assert_line "INPUT_FILE_PATTERN: ." assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: " assert_line "INPUT_COMMIT_OPTIONS: "
assert_line "::debug::Apply commit options " assert_line "::debug::Apply commit options "
@ -409,32 +403,6 @@ cat_github_output() {
assert_output --partial refs/tags/v2.0.0 assert_output --partial refs/tags/v2.0.0
} }
@test "If SKIP_FETCH is true git-fetch will not be called" {
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
INPUT_SKIP_FETCH=true
run git_auto_commit
assert_success
assert_line "::debug::git-fetch will not be executed."
}
@test "If SKIP_CHECKOUT is true git-checkout will not be called" {
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
INPUT_SKIP_CHECKOUT=true
run git_auto_commit
assert_success
assert_line "::debug::git-checkout will not be executed."
}
@test "It pushes generated commit and tag to remote and actually updates the commit shas" { @test "It pushes generated commit and tag to remote and actually updates the commit shas" {
INPUT_BRANCH="" INPUT_BRANCH=""
INPUT_TAGGING_MESSAGE="v2.0.0" INPUT_TAGGING_MESSAGE="v2.0.0"
@ -465,10 +433,6 @@ cat_github_output() {
} }
@test "It pushes generated commit and tag to remote branch and updates commit sha" { @test "It pushes generated commit and tag to remote branch and updates commit sha" {
# Create "a-new-branch"-branch and then immediately switch back to ${FAKE_DEFAULT_BRANCH}
git checkout -b a-new-branch
git checkout ${FAKE_DEFAULT_BRANCH}
INPUT_BRANCH="a-new-branch" INPUT_BRANCH="a-new-branch"
INPUT_TAGGING_MESSAGE="v2.0.0" INPUT_TAGGING_MESSAGE="v2.0.0"
@ -491,7 +455,7 @@ cat_github_output() {
assert_output --partial refs/tags/v2.0.0 assert_output --partial refs/tags/v2.0.0
# Assert that branch "a-new-branch" was updated on remote # Assert that branch "a-new-branch" was updated on remote
current_sha="$(git rev-parse --verify --short a-new-branch)" current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})"
remote_sha="$(git rev-parse --verify --short origin/a-new-branch)" remote_sha="$(git rev-parse --verify --short origin/a-new-branch)"
assert_equal $current_sha $remote_sha assert_equal $current_sha $remote_sha
@ -535,7 +499,6 @@ cat_github_output() {
@test "it does not throw an error if not changes are detected and SKIP_DIRTY_CHECK is false" { @test "it does not throw an error if not changes are detected and SKIP_DIRTY_CHECK is false" {
INPUT_FILE_PATTERN="." INPUT_FILE_PATTERN="."
INPUT_SKIP_DIRTY_CHECK=false INPUT_SKIP_DIRTY_CHECK=false
INPUT_SKIP_FETCH=false
run git_auto_commit run git_auto_commit
@ -578,9 +541,8 @@ cat_github_output() {
assert_line "changes_detected=true" 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_BRANCH="not-existend-branch"
INPUT_CREATE_BRANCH=false
run git branch run git branch
refute_line --partial "not-existend-branch" refute_line --partial "not-existend-branch"
@ -592,25 +554,24 @@ cat_github_output() {
run git_auto_commit run git_auto_commit
assert_failure assert_success
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
assert_line "INPUT_BRANCH value: not-existend-branch" assert_line "INPUT_BRANCH value: not-existend-branch"
assert_line "fatal: invalid reference: not-existend-branch"
run git branch run git branch
assert_line --partial ${FAKE_DEFAULT_BRANCH}
refute_line --partial "not-existend-branch" refute_line --partial "not-existend-branch"
run git branch -r run git branch -r
refute_line --partial "origin/not-existend-branch" assert_line --partial "origin/not-existend-branch"
run cat_github_output run cat_github_output
assert_line "changes_detected=true" assert_line "changes_detected=true"
} }
@test "It 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_BRANCH="not-existend-branch"
INPUT_CREATE_BRANCH=true
run git branch run git branch
refute_line --partial "not-existend-branch" refute_line --partial "not-existend-branch"
@ -635,9 +596,12 @@ cat_github_output() {
assert_line "::debug::Apply push options " assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch not-existend-branch" assert_line "::debug::Push commit to remote branch not-existend-branch"
# Assert that local repo is still on default branch and not on new branch.
run git branch run git branch
assert_line --partial "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 run git branch -r
assert_line --partial "origin/not-existend-branch" assert_line --partial "origin/not-existend-branch"
@ -646,13 +610,11 @@ cat_github_output() {
assert_line -e "commit_hash=[0-9a-f]{40}$" assert_line -e "commit_hash=[0-9a-f]{40}$"
} }
@test "it does not create new local branch if local branch already exists" { @test "It does not create new local branch if local branch already exists" {
git checkout -b not-existend-remote-branch git checkout -b not-existend-remote-branch
git checkout ${FAKE_DEFAULT_BRANCH} git checkout ${FAKE_DEFAULT_BRANCH}
INPUT_BRANCH="not-existend-remote-branch" INPUT_BRANCH="not-existend-remote-branch"
INPUT_CREATE_BRANCH=true
run git branch run git branch
assert_line --partial "not-existend-remote-branch" assert_line --partial "not-existend-remote-branch"
@ -677,6 +639,11 @@ cat_github_output() {
assert_line "::debug::Apply push options " assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch not-existend-remote-branch" assert_line "::debug::Push commit to remote branch not-existend-remote-branch"
# Assert checked out branch is still the same.
run git rev-parse --abbrev-ref HEAD
assert_line --partial ${FAKE_DEFAULT_BRANCH}
refute_line --partial "not-existend-remote-branch"
run git branch run git branch
assert_line --partial "not-existend-remote-branch" assert_line --partial "not-existend-remote-branch"
@ -688,8 +655,7 @@ cat_github_output() {
assert_line -e "commit_hash=[0-9a-f]{40}$" assert_line -e "commit_hash=[0-9a-f]{40}$"
} }
@test "it creates new local branch and pushes branch to remote even if the remote branch already exists" { @test "It creates new local branch and pushes branch to remote even if the remote branch already exists" {
# Create `existing-remote-branch` on remote with changes the local repository does not yet have # Create `existing-remote-branch` on remote with changes the local repository does not yet have
cd $FAKE_TEMP_LOCAL_REPOSITORY cd $FAKE_TEMP_LOCAL_REPOSITORY
git checkout -b "existing-remote-branch" git checkout -b "existing-remote-branch"
@ -706,7 +672,6 @@ cat_github_output() {
cd $FAKE_LOCAL_REPOSITORY cd $FAKE_LOCAL_REPOSITORY
INPUT_BRANCH="existing-remote-branch" INPUT_BRANCH="existing-remote-branch"
INPUT_CREATE_BRANCH=true
run git branch run git branch
refute_line --partial "existing-remote-branch" refute_line --partial "existing-remote-branch"
@ -734,13 +699,14 @@ cat_github_output() {
assert_line "::debug::Push commit to remote branch existing-remote-branch" assert_line "::debug::Push commit to remote branch existing-remote-branch"
run git branch run git branch
assert_line --partial "existing-remote-branch" assert_line --partial ${FAKE_DEFAULT_BRANCH}
refute_line --partial "existing-remote-branch"
run git branch -r run git branch -r
assert_line --partial "origin/existing-remote-branch" assert_line --partial "origin/existing-remote-branch"
# Assert that branch "existing-remote-branch" was updated on remote # Assert that branch "existing-remote-branch" was updated on remote
current_sha="$(git rev-parse --verify --short existing-remote-branch)" current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})"
remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)" remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)"
assert_equal $current_sha $remote_sha assert_equal $current_sha $remote_sha
@ -750,7 +716,7 @@ cat_github_output() {
assert_line -e "commit_hash=[0-9a-f]{40}$" 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 # Create `existing-remote-branch` on remote with changes the local repository does not yet have
cd $FAKE_TEMP_LOCAL_REPOSITORY cd $FAKE_TEMP_LOCAL_REPOSITORY
git checkout -b "existing-remote-branch" git checkout -b "existing-remote-branch"
@ -767,7 +733,6 @@ cat_github_output() {
cd $FAKE_LOCAL_REPOSITORY cd $FAKE_LOCAL_REPOSITORY
INPUT_BRANCH="existing-remote-branch" INPUT_BRANCH="existing-remote-branch"
INPUT_CREATE_BRANCH=true
run git branch run git branch
refute_line --partial "existing-remote-branch" refute_line --partial "existing-remote-branch"
@ -782,23 +747,24 @@ cat_github_output() {
assert_failure 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 # Assert that branch exists locally and on remote
run git 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 run git branch -r
assert_line --partial "origin/existing-remote-branch" assert_line --partial "origin/existing-remote-branch"
# Assert that branch "existing-remote-branch" was not updated on remote # Assert that branch "existing-remote-branch" was not updated on remote
current_sha="$(git rev-parse --verify --short existing-remote-branch)" current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})"
remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)" remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)"
refute [assert_equal $current_sha $remote_sha] refute [assert_equal $current_sha $remote_sha]
} }
@test "It 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 # Create `new-branch` on remote with changes the local repository does not yet have
cd $FAKE_TEMP_LOCAL_REPOSITORY cd $FAKE_TEMP_LOCAL_REPOSITORY
@ -818,7 +784,7 @@ cat_github_output() {
INPUT_BRANCH="new-branch" 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. # know about the remote branch.
run git branch run git branch
refute_line --partial "new-branch" refute_line --partial "new-branch"
@ -830,16 +796,13 @@ cat_github_output() {
run git_auto_commit run git_auto_commit
assert_success assert_failure
assert_line "INPUT_BRANCH value: new-branch" assert_line "INPUT_BRANCH value: new-branch"
assert_line --partial "::debug::Push commit to remote branch new-branch" assert_line --partial "::debug::Push commit to remote branch new-branch"
# Assert that branch "new-branch" was updated on remote assert_line --partial "Updates were rejected because the remote contains work that you do"
current_sha="$(git rev-parse --verify --short new-branch)" assert_line --partial "This is usually caused by another repository pushing"
remote_sha="$(git rev-parse --verify --short origin/new-branch)"
assert_equal $current_sha $remote_sha
} }
@test "throws fatal error if file pattern includes files that do not exist" { @test "throws fatal error if file pattern includes files that do not exist" {
@ -1004,7 +967,7 @@ cat_github_output() {
assert_line --partial "Working tree clean. Nothing to commit." assert_line --partial "Working tree clean. Nothing to commit."
assert_line --partial "new-file-2.txt" assert_line --partial "new-file-2.txt"
assert_line --partial "new-file-3.txt" # assert_line --partial "new-file-3.txt"
# Changes are not detected # Changes are not detected
run cat_github_output run cat_github_output
@ -1038,7 +1001,7 @@ cat_github_output() {
assert_line --partial "warning: in the working copy of 'new-file-2.txt', LF will be replaced by CRLF the next time Git touches it" assert_line --partial "warning: in the working copy of 'new-file-2.txt', LF will be replaced by CRLF the next time Git touches it"
assert_line --partial "new-file-2.txt" assert_line --partial "new-file-2.txt"
assert_line --partial "new-file-3.txt" # assert_line --partial "new-file-3.txt"
# Changes are detected # Changes are detected
run cat_github_output run cat_github_output
@ -1114,14 +1077,3 @@ END
run git log -n 1 run git log -n 1
assert_output --partial $COMMIT_MESSAGE assert_output --partial $COMMIT_MESSAGE
} }
@test "It exits with error message if entrypoint.sh is being run not in a git repository" {
INPUT_REPOSITORY="${FAKE_FOLDER_WITHOUT_GIT_REPO}"
mkdir "${INPUT_REPOSITORY}"
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>"
}

View File

@ -10,7 +10,7 @@ bats-support@ztombol/bats-support:
version "0.3.0" version "0.3.0"
resolved "https://codeload.github.com/ztombol/bats-support/tar.gz/004e707638eedd62e0481e8cdc9223ad471f12ee" resolved "https://codeload.github.com/ztombol/bats-support/tar.gz/004e707638eedd62e0481e8cdc9223ad471f12ee"
bats@^1.11.0: bats@^1.10.0:
version "1.11.0" version "1.10.0"
resolved "https://registry.yarnpkg.com/bats/-/bats-1.11.0.tgz#40281f021f5befcc10da54ed5674aa5b181f4953" resolved "https://registry.yarnpkg.com/bats/-/bats-1.10.0.tgz#d22cb6e2d88fd39302167da237d710406d1587ce"
integrity sha512-qiKdnS4ID3bJ1MaEOKuZe12R4w+t+psJF0ICj+UdkiHBBoObPMHv8xmD3w6F4a5qwUyZUHS+413lxENBNy8xcQ== integrity sha512-yOQrC7npuCrN+Ic3TyjTjJlzHa0qlK3oEO6VAYPWwFeutx/GmpljIyB6uNSl/UTASyc2w4FgVuA/QMMf9OdsCw==