mirror of
https://github.com/stefanzweifel/git-auto-commit-action.git
synced 2025-08-02 00:16:10 +08:00
Compare commits
41 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
268ec0c240 | ||
|
9abc4c41e5 | ||
|
1aee6e6b46 | ||
|
94941cff88 | ||
|
7507738fca | ||
|
53438d58ce | ||
|
8056699617 | ||
|
520c63c171 | ||
|
a6006229e0 | ||
|
40b55695d1 | ||
|
8f33b6cc31 | ||
|
c4ab3ecb7e | ||
|
350754fe3a | ||
|
75802d269e | ||
|
5b85132a3c | ||
|
292ae30da6 | ||
|
b53a2f8baf | ||
|
a9021d5359 | ||
|
fafea853e8 | ||
|
6576a06e26 | ||
|
b104287145 | ||
|
b8b8026fe4 | ||
|
fae0e424e9 | ||
|
a1604ef1d5 | ||
|
152b8c00c6 | ||
|
8edcd8b718 | ||
|
8f9132651a | ||
|
6c72ab7799 | ||
|
983b799941 | ||
|
bee2ad60b0 | ||
|
ac4585b8d5 | ||
|
4e7742676e | ||
|
2e61cc5f41 | ||
|
021e855056 | ||
|
7cec9acee6 | ||
|
bbd291750d | ||
|
114a5e6044 | ||
|
4a75a2e723 | ||
|
1e826be61c | ||
|
4bab898d25 | ||
|
45872c3c23 |
26
.github/workflows/integration-tests.yml
vendored
26
.github/workflows/integration-tests.yml
vendored
@@ -1,26 +0,0 @@
|
|||||||
name: Integration Tests
|
|
||||||
|
|
||||||
on: push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test-commit-works:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
ref: master
|
|
||||||
|
|
||||||
- name: Add Files
|
|
||||||
run: touch {a,b,c}.txt
|
|
||||||
|
|
||||||
- name: Run git-auto-commit
|
|
||||||
id: "auto-commit-action"
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
branch: ci-test
|
|
||||||
commit_message: Message
|
|
||||||
checkout_options: -b
|
|
||||||
|
|
||||||
- name: Delete Branch
|
|
||||||
run: git push -d origin ci-test
|
|
8
.github/workflows/tests.yml
vendored
8
.github/workflows/tests.yml
vendored
@@ -9,13 +9,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Install Shell Mock
|
- name: Install testing dependencies
|
||||||
run: |
|
|
||||||
git clone https://github.com/capitalone/bash_shell_mock
|
|
||||||
cd bash_shell_mock
|
|
||||||
sudo ./install.sh /usr/local
|
|
||||||
|
|
||||||
- name: Install BATS
|
|
||||||
run: yarn install
|
run: yarn install
|
||||||
|
|
||||||
- name: Run Tests
|
- name: Run Tests
|
||||||
|
6
.gitignore
vendored
6
.gitignore
vendored
@@ -1,4 +1,4 @@
|
|||||||
tests/test_repo
|
tests/test_fake_local_repository
|
||||||
tests/tmpstubs
|
tests/test_fake_remote_repository
|
||||||
tests/shellmock.*
|
tests/test_fake_temp_local_repository
|
||||||
yarn.lock
|
yarn.lock
|
||||||
|
31
CHANGELOG.md
31
CHANGELOG.md
@@ -4,18 +4,41 @@ 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/v4.7.1...HEAD)
|
## [Unreleased](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.9.0...HEAD)
|
||||||
|
|
||||||
> TBD
|
> TBD
|
||||||
|
|
||||||
|
|
||||||
## [v4.7.1](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.7.0...v4.7.1) - 2020-10-12
|
## [v4.9.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.8.0...v4.9.0) - 2021-02-20
|
||||||
|
|
||||||
### Removed
|
### Changed
|
||||||
|
- Automatically create btanch if a branch with the given name does not exist [#140](https://github.com/stefanzweifel/git-auto-commit-action/pull/140)
|
||||||
|
|
||||||
|
|
||||||
|
## [v4.8.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.7.2...v4.8.0) - 2020-12-15
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add `skip_fetch` option to skip the execution of `git-fetch` [#131](https://github.com/stefanzweifel/git-auto-commit-action/pull/131)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Update `git fetch` to only fetch the latest commit from remote [#131](https://github.com/stefanzweifel/git-auto-commit-action/pull/131)
|
||||||
|
|
||||||
|
|
||||||
|
## [v4.7.2](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.7.1...v4.7.2) - 2020-10-24
|
||||||
|
|
||||||
|
This release basically reverts the Action to the state of `v4.6.0`.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Revert change to fix git-checkout with special characters in branch names [#122](https://github.com/stefanzweifel/git-auto-commit-action/pull/122)
|
||||||
|
|
||||||
|
|
||||||
|
## [v4.7.1](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.7.0...v4.7.1) - 2020-10-22
|
||||||
|
|
||||||
|
### Removed
|
||||||
- Remove `checkout_options` as it broke everything [#120](https://github.com/stefanzweifel/git-auto-commit-action/pull/120/)
|
- Remove `checkout_options` as it broke everything [#120](https://github.com/stefanzweifel/git-auto-commit-action/pull/120/)
|
||||||
|
|
||||||
|
|
||||||
## [v4.7.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.6.0...v4.7.0) - 2020-10-11
|
## [v4.7.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4.6.0...v4.7.0) - 2020-10-21
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- Add `checkout_options` [#115](https://github.com/stefanzweifel/git-auto-commit-action/pull/115)
|
- Add `checkout_options` [#115](https://github.com/stefanzweifel/git-auto-commit-action/pull/115)
|
||||||
|
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2019 Stefan Zweifel
|
Copyright (c) 2021 Stefan Zweifel
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
46
README.md
46
README.md
@@ -2,30 +2,39 @@
|
|||||||
|
|
||||||
> The GitHub Action for committing files for the 80% use case.
|
> The GitHub Action for committing files for the 80% use case.
|
||||||
|
|
||||||
|
<a href="https://github.com/search?o=desc&q=stefanzweifel%2Fgit-auto-commit-action+path%3A.github%2Fworkflows+language%3AYAML&s=&type=Code" target="_blank" title="Public workflows that use this action."><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fapi-git-master.endbug.vercel.app%2Fapi%2Fgithub-actions%2Fused-by%3Faction%3Dstefanzweifel%2Fgit-auto-commit-action%26badge%3Dtrue" alt="Public workflows that use this action."></a>
|
||||||
<a href="https://github.com/stefanzweifel/git-auto-commit-action/actions?query=workflow%3Atests">
|
<a href="https://github.com/stefanzweifel/git-auto-commit-action/actions?query=workflow%3Atests">
|
||||||
<img src="https://github.com/stefanzweifel/git-auto-commit-action/workflows/tests/badge.svg" alt="">
|
<img src="https://github.com/stefanzweifel/git-auto-commit-action/workflows/tests/badge.svg" alt="">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/stefanzweifel/git-auto-commit-action/actions?query=workflow%3A%22Integration+Tests%22">
|
|
||||||
<img src="https://github.com/stefanzweifel/git-auto-commit-action/workflows/Integration%20Tests/badge.svg" alt="">
|
|
||||||
</a>
|
|
||||||
|
|
||||||
This GitHub Action automatically commits files which have been changed during a Workflow run and pushes the commit back to GitHub.
|
This GitHub Action automatically commits files which have been changed during a Workflow run and pushes the commit back to GitHub.
|
||||||
The default committer is "GitHub Actions <actions@github.com>", and the default author of the commit is "Your GitHub Username <github_username@users.noreply.github.com>".
|
By default, the commit is made in the name of "GitHub Actions" and co-authored by the user that made the last commit.
|
||||||
|
|
||||||
This Action has been inspired and adapted from the [auto-commit](https://github.com/cds-snc/github-actions/tree/master/auto-commit
|
This Action has been inspired and adapted from the [auto-commit](https://github.com/cds-snc/github-actions/tree/master/auto-commit
|
||||||
)-Action of the Canadian Digital Service and this [commit](https://github.com/elstudio/actions-js-build/blob/41d604d6e73d632e22eac40df8cc69b5added04b/commit/entrypoint.sh)-Action by Eric Johnson.
|
)-Action of the Canadian Digital Service and this [commit](https://github.com/elstudio/actions-js-build/blob/41d604d6e73d632e22eac40df8cc69b5added04b/commit/entrypoint.sh)-Action by Eric Johnson.
|
||||||
|
|
||||||
|
If you want to learn more how this Action works under the hood, check out [this article](https://michaelheap.com/git-auto-commit/) by Michael Heap.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Add the following step at the end of your job, after other steps that might add or change files.
|
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@v4
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
This is a more extended example with all possible options.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: stefanzweifel/git-auto-commit-action@v4
|
- uses: stefanzweifel/git-auto-commit-action@v4
|
||||||
with:
|
with:
|
||||||
# Optional but recommended, defaults to "Apply automatic changes"
|
# Optional but recommended
|
||||||
|
# Defaults to "Apply automatic changes"
|
||||||
commit_message: Apply automatic changes
|
commit_message: Apply automatic changes
|
||||||
|
|
||||||
# Optional branch to push to, defaults to the current branch
|
# Optional branch name where commit should be pushed to
|
||||||
|
# Defaults to the current branch
|
||||||
branch: feature-123
|
branch: feature-123
|
||||||
|
|
||||||
# Optional options appended to `git-commit`
|
# Optional options appended to `git-commit`
|
||||||
@@ -33,18 +42,20 @@ Add the following step at the end of your job, after other steps that might add
|
|||||||
commit_options: '--no-verify --signoff'
|
commit_options: '--no-verify --signoff'
|
||||||
|
|
||||||
# Optional glob pattern of files which should be added to the commit
|
# Optional glob pattern of files which should be added to the commit
|
||||||
|
# Defaults to all (.)
|
||||||
# See the `pathspec`-documentation for git
|
# See the `pathspec`-documentation for git
|
||||||
# - https://git-scm.com/docs/git-add#Documentation/git-add.txt-ltpathspecgt82308203
|
# - https://git-scm.com/docs/git-add#Documentation/git-add.txt-ltpathspecgt82308203
|
||||||
# - https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefpathspecapathspec
|
# - https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefpathspecapathspec
|
||||||
file_pattern: src/*.js tests/*.js *.php
|
file_pattern: src/*.js tests/*.js *.php
|
||||||
|
|
||||||
# Optional local file path to the repository
|
# Optional local file path to the repository
|
||||||
|
# Defaults to the root of the repository
|
||||||
repository: .
|
repository: .
|
||||||
|
|
||||||
# Optional commit user and author settings
|
# Optional commit user and author settings
|
||||||
commit_user_name: My GitHub Actions Bot
|
commit_user_name: My GitHub Actions Bot # defaults to "GitHub Actions"
|
||||||
commit_user_email: my-github-actions-bot@example.org
|
commit_user_email: my-github-actions-bot@example.org # defaults to "actions@github.com"
|
||||||
commit_author: Author <actions@github.com>
|
commit_author: Author <actions@github.com> # defaults to author of the commit that triggered the run
|
||||||
|
|
||||||
# Optional tag message
|
# Optional tag message
|
||||||
# Action will create and push a new tag to the remote repository and the defined branch
|
# Action will create and push a new tag to the remote repository and the defined branch
|
||||||
@@ -55,7 +66,10 @@ Add the following step at the end of your job, after other steps that might add
|
|||||||
push_options: '--force'
|
push_options: '--force'
|
||||||
|
|
||||||
# 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
|
||||||
```
|
```
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
@@ -131,7 +145,7 @@ You have to do this to avoid that the `checkout`-Action clones your repository i
|
|||||||
### Commits of this Action do not trigger new Workflow runs
|
### Commits of this Action do not trigger new Workflow runs
|
||||||
|
|
||||||
The resulting commit **will not trigger** another GitHub Actions Workflow run.
|
The resulting commit **will not trigger** another GitHub Actions Workflow run.
|
||||||
This is due to [limititations set by GitHub](https://help.github.com/en/actions/reference/events-that-trigger-workflows#triggering-new-workflows-using-a-personal-access-token).
|
This is due to [limitations set by GitHub](https://help.github.com/en/actions/reference/events-that-trigger-workflows#triggering-new-workflows-using-a-personal-access-token).
|
||||||
|
|
||||||
> When you use the repository's GITHUB_TOKEN to perform tasks on behalf of the GitHub Actions app, events triggered by the GITHUB_TOKEN will not create a new workflow run. This prevents you from accidentally creating recursive workflow runs.
|
> When you use the repository's GITHUB_TOKEN to perform tasks on behalf of the GitHub Actions app, events triggered by the GITHUB_TOKEN will not create a new workflow run. This prevents you from accidentally creating recursive workflow runs.
|
||||||
|
|
||||||
@@ -257,10 +271,18 @@ This is due to limitations set up by GitHub, [commits of this Action do not trig
|
|||||||
|
|
||||||
## Running the tests
|
## Running the tests
|
||||||
|
|
||||||
The package has tests written in [bats](https://github.com/bats-core/bats-core). You can run them with the following command.
|
The package has tests written in [bats](https://github.com/bats-core/bats-core). Before you can run the test suite locally, you have to install the dependencies with `npm` or `yarn`.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
npm install
|
||||||
|
yarn
|
||||||
|
```
|
||||||
|
|
||||||
|
You can run the test suite with `npm` or `yarn`.
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
npm run test
|
npm run test
|
||||||
|
yarn test
|
||||||
```
|
```
|
||||||
|
|
||||||
## Versioning
|
## Versioning
|
||||||
|
@@ -48,6 +48,10 @@ 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
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
changes_detected:
|
changes_detected:
|
||||||
|
@@ -41,10 +41,35 @@ _switch_to_branch() {
|
|||||||
echo "INPUT_BRANCH value: $INPUT_BRANCH";
|
echo "INPUT_BRANCH value: $INPUT_BRANCH";
|
||||||
|
|
||||||
# Fetch remote to make sure that repo can be switched to the right branch.
|
# Fetch remote to make sure that repo can be switched to the right branch.
|
||||||
git fetch;
|
|
||||||
|
|
||||||
# Switch to branch from current Workflow run
|
if "$INPUT_SKIP_FETCH"; then
|
||||||
git checkout "$INPUT_BRANCH" --;
|
echo "::debug::git-fetch has not been executed";
|
||||||
|
else
|
||||||
|
git fetch --depth=1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# If INPUT_BRANCH is empty, just run `git checkout`
|
||||||
|
if [ -z "$INPUT_BRANCH" ]
|
||||||
|
then
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
git checkout $INPUT_BRANCH;
|
||||||
|
else
|
||||||
|
# If the branch which we should checkout already exists, just
|
||||||
|
# run `git checkout $INPUT_BRANCH`
|
||||||
|
# Otherwhise create a new branch by adding the `-b` option to
|
||||||
|
# `git-checkout`
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
if [ -n "$(git branch --list $INPUT_BRANCH)" ]
|
||||||
|
then
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
git checkout $INPUT_BRANCH;
|
||||||
|
else
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
git checkout -b $INPUT_BRANCH;
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_add_files() {
|
_add_files() {
|
||||||
@@ -61,6 +86,11 @@ _local_commit() {
|
|||||||
# shellcheck disable=SC2206
|
# shellcheck disable=SC2206
|
||||||
INPUT_COMMIT_OPTIONS_ARRAY=( $INPUT_COMMIT_OPTIONS );
|
INPUT_COMMIT_OPTIONS_ARRAY=( $INPUT_COMMIT_OPTIONS );
|
||||||
|
|
||||||
|
echo "INPUT_COMMIT_USER_NAME: ${INPUT_COMMIT_USER_NAME}";
|
||||||
|
echo "INPUT_COMMIT_USER_EMAIL: ${INPUT_COMMIT_USER_EMAIL}";
|
||||||
|
echo "INPUT_COMMIT_MESSAGE: ${INPUT_COMMIT_MESSAGE}";
|
||||||
|
echo "INPUT_COMMIT_AUTHOR: ${INPUT_COMMIT_AUTHOR}";
|
||||||
|
|
||||||
git -c user.name="$INPUT_COMMIT_USER_NAME" -c user.email="$INPUT_COMMIT_USER_EMAIL" \
|
git -c user.name="$INPUT_COMMIT_USER_NAME" -c user.email="$INPUT_COMMIT_USER_EMAIL" \
|
||||||
commit -m "$INPUT_COMMIT_MESSAGE" \
|
commit -m "$INPUT_COMMIT_MESSAGE" \
|
||||||
--author="$INPUT_COMMIT_AUTHOR" \
|
--author="$INPUT_COMMIT_AUTHOR" \
|
||||||
|
@@ -1,8 +1,10 @@
|
|||||||
{
|
{
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"bats": "^1.1.0"
|
"bats": "^1.1.0",
|
||||||
|
"bats-assert": "ztombol/bats-assert",
|
||||||
|
"bats-support": "ztombol/bats-support"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "rm -rf tests/tmpstubs && rm -rf tests/shellmock.* && bats tests"
|
"test": "bats tests"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,439 +0,0 @@
|
|||||||
#!/usr/bin/env bats
|
|
||||||
|
|
||||||
setup() {
|
|
||||||
. shellmock
|
|
||||||
|
|
||||||
# Build World
|
|
||||||
export test_repository="${BATS_TEST_DIRNAME}/test_repo"
|
|
||||||
|
|
||||||
rm -rf "${test_repository}"
|
|
||||||
mkdir "${test_repository}"
|
|
||||||
touch "${test_repository}"/{a,b,c}.txt
|
|
||||||
cd "${test_repository}"
|
|
||||||
|
|
||||||
git init --quiet
|
|
||||||
git add . > /dev/null 2>&1
|
|
||||||
|
|
||||||
if [[ -z $(git config user.name) ]]; then
|
|
||||||
git config --global user.email "test@github.com"
|
|
||||||
git config --global user.name "Test Suite"
|
|
||||||
fi
|
|
||||||
|
|
||||||
git commit --quiet -m "Init Repo"
|
|
||||||
|
|
||||||
# Set default INPUT variables
|
|
||||||
export INPUT_REPOSITORY="${BATS_TEST_DIRNAME}/test_repo"
|
|
||||||
export INPUT_COMMIT_MESSAGE="Commit Message"
|
|
||||||
export INPUT_BRANCH="master"
|
|
||||||
export INPUT_COMMIT_OPTIONS=""
|
|
||||||
export INPUT_FILE_PATTERN="."
|
|
||||||
export INPUT_COMMIT_USER_NAME="Test Suite"
|
|
||||||
export INPUT_COMMIT_USER_EMAIL="test@github.com"
|
|
||||||
export INPUT_COMMIT_AUTHOR="Test Suite <test@users.noreply.github.com>"
|
|
||||||
export INPUT_TAGGING_MESSAGE=""
|
|
||||||
export INPUT_PUSH_OPTIONS=""
|
|
||||||
export INPUT_SKIP_DIRTY_CHECK=false
|
|
||||||
|
|
||||||
skipIfNot "$BATS_TEST_DESCRIPTION"
|
|
||||||
|
|
||||||
if [ -z "$TEST_FUNCTION" ]; then
|
|
||||||
shellmock_clean
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
teardown() {
|
|
||||||
|
|
||||||
if [ -z "$TEST_FUNCTION" ]; then
|
|
||||||
shellmock_clean
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -rf "${test_repository}"
|
|
||||||
}
|
|
||||||
|
|
||||||
main() {
|
|
||||||
bash "${BATS_TEST_DIRNAME}"/../entrypoint.sh
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@test "clean-repo-prints-nothing-to-commit-message" {
|
|
||||||
|
|
||||||
run main
|
|
||||||
|
|
||||||
[ "$status" -eq 0 ]
|
|
||||||
[ "${lines[0]}" = "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" ]
|
|
||||||
[ "${lines[1]}" = "::set-output name=changes_detected::false" ]
|
|
||||||
[ "${lines[2]}" = "Working tree clean. Nothing to commit." ]
|
|
||||||
}
|
|
||||||
|
|
||||||
@test "commit-changed-files-and-push-to-remote" {
|
|
||||||
|
|
||||||
touch "${test_repository}"/new-file-{1,2,3}.txt
|
|
||||||
|
|
||||||
shellmock_expect git --type partial --output " M new-file-1.txt M new-file-2.txt M new-file-3.txt" --match "status"
|
|
||||||
shellmock_expect git --type exact --match "fetch"
|
|
||||||
shellmock_expect git --type exact --match "checkout master --"
|
|
||||||
shellmock_expect git --type partial --match "add ."
|
|
||||||
shellmock_expect git --type partial --match '-c'
|
|
||||||
shellmock_expect git --type partial --match 'push --set-upstream origin'
|
|
||||||
|
|
||||||
run main
|
|
||||||
|
|
||||||
echo "$output"
|
|
||||||
|
|
||||||
# Success Exit Code
|
|
||||||
[ "$status" = 0 ]
|
|
||||||
|
|
||||||
[ "${lines[0]}" = "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" ]
|
|
||||||
[ "${lines[1]}" = "::set-output name=changes_detected::true" ]
|
|
||||||
[ "${lines[2]}" = "INPUT_BRANCH value: master" ]
|
|
||||||
[ "${lines[3]}" = "INPUT_FILE_PATTERN: ." ]
|
|
||||||
[ "${lines[4]}" = "INPUT_COMMIT_OPTIONS: " ]
|
|
||||||
[ "${lines[5]}" = "::debug::Apply commit options " ]
|
|
||||||
[ "${lines[6]}" = "INPUT_TAGGING_MESSAGE: " ]
|
|
||||||
[ "${lines[7]}" = "No tagging message supplied. No tag will be added." ]
|
|
||||||
[ "${lines[8]}" = "INPUT_PUSH_OPTIONS: " ]
|
|
||||||
[ "${lines[9]}" = "::debug::Apply push options " ]
|
|
||||||
[ "${lines[10]}" = "::debug::Push commit to remote branch master" ]
|
|
||||||
|
|
||||||
|
|
||||||
shellmock_verify
|
|
||||||
[ "${capture[0]}" = "git-stub status -s -- ." ]
|
|
||||||
[ "${capture[1]}" = "git-stub fetch" ]
|
|
||||||
[ "${capture[2]}" = "git-stub checkout master --" ]
|
|
||||||
[ "${capture[3]}" = "git-stub add ." ]
|
|
||||||
[ "${capture[4]}" = "git-stub -c user.name=Test Suite -c user.email=test@github.com commit -m Commit Message --author=Test Suite <test@users.noreply.github.com>" ]
|
|
||||||
[ "${capture[5]}" = "git-stub push --set-upstream origin HEAD:master --tags" ]
|
|
||||||
}
|
|
||||||
|
|
||||||
@test "skip-dirty-on-clean-repo-failure" {
|
|
||||||
|
|
||||||
INPUT_SKIP_DIRTY_CHECK=true
|
|
||||||
|
|
||||||
shellmock_expect git --type exact --match "status -s ."
|
|
||||||
shellmock_expect git --type exact --match "fetch"
|
|
||||||
shellmock_expect git --type exact --match "checkout master --"
|
|
||||||
shellmock_expect git --type exact --match "add ."
|
|
||||||
shellmock_expect git --type partial --match '-c'
|
|
||||||
shellmock_expect git --type partial --match 'push origin'
|
|
||||||
|
|
||||||
run main
|
|
||||||
|
|
||||||
echo "$output"
|
|
||||||
|
|
||||||
shellmock_verify
|
|
||||||
[ "${capture[0]}" = "git-stub status -s -- ." ]
|
|
||||||
[ "${capture[1]}" = "git-stub fetch" ]
|
|
||||||
[ "${capture[2]}" = "git-stub checkout master --" ]
|
|
||||||
[ "${capture[3]}" = "git-stub add ." ]
|
|
||||||
[ "${capture[4]}" = "git-stub -c user.name=Test Suite -c user.email=test@github.com commit -m Commit Message --author=Test Suite <test@users.noreply.github.com>" ]
|
|
||||||
[ "${capture[5]}" = "git-stub push --set-upstream origin HEAD:master --tags" ]
|
|
||||||
|
|
||||||
# Failed Exit Code
|
|
||||||
[ "$status" -ne 0 ]
|
|
||||||
|
|
||||||
[ "${lines[0]}" = "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" ]
|
|
||||||
[ "${lines[1]}" = "::set-output name=changes_detected::true" ]
|
|
||||||
[ "${lines[2]}" = "INPUT_BRANCH value: master" ]
|
|
||||||
[ "${lines[3]}" = "INPUT_FILE_PATTERN: ." ]
|
|
||||||
[ "${lines[4]}" = "INPUT_COMMIT_OPTIONS: " ]
|
|
||||||
[ "${lines[5]}" = "::debug::Apply commit options " ]
|
|
||||||
}
|
|
||||||
|
|
||||||
@test "git-add-file-pattern-is-applied" {
|
|
||||||
|
|
||||||
INPUT_FILE_PATTERN="*.txt *.html"
|
|
||||||
|
|
||||||
touch "${test_repository}"/new-file-{1,2}.php
|
|
||||||
touch "${test_repository}"/new-file-{1,2}.html
|
|
||||||
|
|
||||||
shellmock_expect git --type partial --output " M new-file-1.html M new-file-2.html" --match "status"
|
|
||||||
shellmock_expect git --type exact --match "fetch"
|
|
||||||
shellmock_expect git --type exact --match "checkout master --"
|
|
||||||
shellmock_expect git --type partial --match "add"
|
|
||||||
shellmock_expect git --type partial --match '-c'
|
|
||||||
shellmock_expect git --type partial --match 'push --set-upstream origin'
|
|
||||||
|
|
||||||
run main
|
|
||||||
|
|
||||||
echo "$output"
|
|
||||||
|
|
||||||
# Success Exit Code
|
|
||||||
[ "$status" = 0 ]
|
|
||||||
|
|
||||||
[ "${lines[3]}" = "INPUT_FILE_PATTERN: *.txt *.html" ]
|
|
||||||
[ "${lines[10]}" = "::debug::Push commit to remote branch master" ]
|
|
||||||
|
|
||||||
|
|
||||||
shellmock_verify
|
|
||||||
[ "${capture[0]}" = "git-stub status -s -- a.txt b.txt c.txt new-file-1.html new-file-2.html" ]
|
|
||||||
[ "${capture[1]}" = "git-stub fetch" ]
|
|
||||||
[ "${capture[2]}" = "git-stub checkout master --" ]
|
|
||||||
[ "${capture[3]}" = "git-stub add a.txt b.txt c.txt new-file-1.html new-file-2.html" ]
|
|
||||||
[ "${capture[4]}" = "git-stub -c user.name=Test Suite -c user.email=test@github.com commit -m Commit Message --author=Test Suite <test@users.noreply.github.com>" ]
|
|
||||||
[ "${capture[5]}" = "git-stub push --set-upstream origin HEAD:master --tags" ]
|
|
||||||
}
|
|
||||||
|
|
||||||
@test "git-commit-options-are-applied" {
|
|
||||||
|
|
||||||
INPUT_COMMIT_OPTIONS="--no-verify --signoff"
|
|
||||||
|
|
||||||
touch "${test_repository}"/new-file-{1,2}.txt
|
|
||||||
|
|
||||||
shellmock_expect git --type partial --output " M new-file-1.txt M new-file-2.txt" --match "status"
|
|
||||||
shellmock_expect git --type exact --match "fetch"
|
|
||||||
shellmock_expect git --type exact --match "checkout master --"
|
|
||||||
shellmock_expect git --type partial --match "add"
|
|
||||||
shellmock_expect git --type partial --match '-c'
|
|
||||||
shellmock_expect git --type partial --match 'push --set-upstream origin'
|
|
||||||
|
|
||||||
run main
|
|
||||||
|
|
||||||
echo "$output"
|
|
||||||
|
|
||||||
# Success Exit Code
|
|
||||||
[ "$status" = 0 ]
|
|
||||||
[ "${lines[4]}" = "INPUT_COMMIT_OPTIONS: --no-verify --signoff" ]
|
|
||||||
[ "${lines[10]}" = "::debug::Push commit to remote branch master" ]
|
|
||||||
|
|
||||||
shellmock_verify
|
|
||||||
[ "${capture[0]}" = "git-stub status -s -- ." ]
|
|
||||||
[ "${capture[1]}" = "git-stub fetch" ]
|
|
||||||
[ "${capture[2]}" = "git-stub checkout master --" ]
|
|
||||||
[ "${capture[3]}" = "git-stub add ." ]
|
|
||||||
[ "${capture[4]}" = "git-stub -c user.name=Test Suite -c user.email=test@github.com commit -m Commit Message --author=Test Suite <test@users.noreply.github.com> --no-verify --signoff" ]
|
|
||||||
[ "${capture[5]}" = "git-stub push --set-upstream origin HEAD:master --tags" ]
|
|
||||||
}
|
|
||||||
|
|
||||||
@test "commit-user-and-author-settings-are-applied" {
|
|
||||||
|
|
||||||
INPUT_COMMIT_USER_NAME="A Single Test"
|
|
||||||
INPUT_COMMIT_USER_EMAIL="single-test@github.com"
|
|
||||||
INPUT_COMMIT_AUTHOR="A Single Test <single@users.noreply.github.com>"
|
|
||||||
|
|
||||||
touch "${test_repository}"/new-file-{1,2}.txt
|
|
||||||
|
|
||||||
shellmock_expect git --type partial --output " M new-file-1.txt M new-file-2.txt" --match "status"
|
|
||||||
shellmock_expect git --type exact --match "fetch"
|
|
||||||
shellmock_expect git --type exact --match "checkout master --"
|
|
||||||
shellmock_expect git --type partial --match "add"
|
|
||||||
shellmock_expect git --type partial --match '-c'
|
|
||||||
shellmock_expect git --type partial --match 'push --set-upstream origin'
|
|
||||||
|
|
||||||
run main
|
|
||||||
|
|
||||||
echo "$output"
|
|
||||||
|
|
||||||
# Success Exit Code
|
|
||||||
[ "$status" = 0 ]
|
|
||||||
|
|
||||||
[ "${lines[10]}" = "::debug::Push commit to remote branch master" ]
|
|
||||||
|
|
||||||
shellmock_verify
|
|
||||||
[ "${capture[0]}" = "git-stub status -s -- ." ]
|
|
||||||
[ "${capture[1]}" = "git-stub fetch" ]
|
|
||||||
[ "${capture[2]}" = "git-stub checkout master --" ]
|
|
||||||
[ "${capture[3]}" = "git-stub add ." ]
|
|
||||||
[ "${capture[4]}" = "git-stub -c user.name=A Single Test -c user.email=single-test@github.com commit -m Commit Message --author=A Single Test <single@users.noreply.github.com>" ]
|
|
||||||
[ "${capture[5]}" = "git-stub push --set-upstream origin HEAD:master --tags" ]
|
|
||||||
}
|
|
||||||
|
|
||||||
@test "can-create-tag" {
|
|
||||||
|
|
||||||
INPUT_TAGGING_MESSAGE="v1.0.0"
|
|
||||||
|
|
||||||
touch "${test_repository}"/new-file-{1,2,3}.txt
|
|
||||||
|
|
||||||
shellmock_expect git --type partial --output " M new-file-1.txt M new-file-2.txt M new-file-3.txt" --match "status"
|
|
||||||
shellmock_expect git --type exact --match "fetch"
|
|
||||||
shellmock_expect git --type exact --match "checkout master --"
|
|
||||||
shellmock_expect git --type partial --match "add ."
|
|
||||||
shellmock_expect git --type partial --match '-c'
|
|
||||||
shellmock_expect git --type partial --match 'push --set-upstream origin'
|
|
||||||
|
|
||||||
run main
|
|
||||||
|
|
||||||
echo "$output"
|
|
||||||
|
|
||||||
# Success Exit Code
|
|
||||||
[ "$status" = 0 ]
|
|
||||||
|
|
||||||
[ "${lines[6]}" = "INPUT_TAGGING_MESSAGE: v1.0.0" ]
|
|
||||||
[ "${lines[7]}" = "::debug::Create tag v1.0.0" ]
|
|
||||||
[ "${lines[10]}" = "::debug::Push commit to remote branch master" ]
|
|
||||||
|
|
||||||
|
|
||||||
shellmock_verify
|
|
||||||
[ "${capture[0]}" = "git-stub status -s -- ." ]
|
|
||||||
[ "${capture[1]}" = "git-stub fetch" ]
|
|
||||||
[ "${capture[2]}" = "git-stub checkout master --" ]
|
|
||||||
[ "${capture[3]}" = "git-stub add ." ]
|
|
||||||
[ "${capture[4]}" = "git-stub -c user.name=Test Suite -c user.email=test@github.com commit -m Commit Message --author=Test Suite <test@users.noreply.github.com>" ]
|
|
||||||
[ "${capture[5]}" = "git-stub -c user.name=Test Suite -c user.email=test@github.com tag -a v1.0.0 -m v1.0.0" ]
|
|
||||||
[ "${capture[6]}" = "git-stub push --set-upstream origin HEAD:master --tags" ]
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@test "git-push-options-are-applied" {
|
|
||||||
|
|
||||||
INPUT_PUSH_OPTIONS="--force"
|
|
||||||
|
|
||||||
touch "${test_repository}"/new-file-{1,2,3}.txt
|
|
||||||
|
|
||||||
shellmock_expect git --type partial --output " M new-file-1.txt M new-file-2.txt M new-file-3.txt" --match "status"
|
|
||||||
shellmock_expect git --type exact --match "fetch"
|
|
||||||
shellmock_expect git --type exact --match "checkout master --"
|
|
||||||
shellmock_expect git --type partial --match "add ."
|
|
||||||
shellmock_expect git --type partial --match '-c'
|
|
||||||
shellmock_expect git --type partial --match 'push --set-upstream origin'
|
|
||||||
|
|
||||||
run main
|
|
||||||
|
|
||||||
echo "$output"
|
|
||||||
|
|
||||||
# Success Exit Code
|
|
||||||
[ "$status" = 0 ]
|
|
||||||
|
|
||||||
[ "${lines[8]}" = "INPUT_PUSH_OPTIONS: --force" ]
|
|
||||||
[ "${lines[9]}" = "::debug::Apply push options --force" ]
|
|
||||||
[ "${lines[10]}" = "::debug::Push commit to remote branch master" ]
|
|
||||||
|
|
||||||
|
|
||||||
shellmock_verify
|
|
||||||
[ "${capture[0]}" = "git-stub status -s -- ." ]
|
|
||||||
[ "${capture[1]}" = "git-stub fetch" ]
|
|
||||||
[ "${capture[2]}" = "git-stub checkout master --" ]
|
|
||||||
[ "${capture[3]}" = "git-stub add ." ]
|
|
||||||
[ "${capture[4]}" = "git-stub -c user.name=Test Suite -c user.email=test@github.com commit -m Commit Message --author=Test Suite <test@users.noreply.github.com>" ]
|
|
||||||
[ "${capture[5]}" = "git-stub push --set-upstream origin HEAD:master --tags --force" ]
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@test "can-checkout-different-branch" {
|
|
||||||
|
|
||||||
INPUT_BRANCH="foo"
|
|
||||||
|
|
||||||
touch "${test_repository}"/new-file-{1,2,3}.txt
|
|
||||||
|
|
||||||
shellmock_expect git --type partial --output " M new-file-1.txt M new-file-2.txt M new-file-3.txt" --match "status"
|
|
||||||
shellmock_expect git --type exact --match "fetch"
|
|
||||||
shellmock_expect git --type exact --match "checkout foo --"
|
|
||||||
shellmock_expect git --type partial --match "add ."
|
|
||||||
shellmock_expect git --type partial --match '-c'
|
|
||||||
shellmock_expect git --type partial --match 'push --set-upstream origin'
|
|
||||||
|
|
||||||
run main
|
|
||||||
|
|
||||||
echo "$output"
|
|
||||||
|
|
||||||
# Success Exit Code
|
|
||||||
[ "$status" = 0 ]
|
|
||||||
|
|
||||||
[ "${lines[0]}" = "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" ]
|
|
||||||
[ "${lines[1]}" = "::set-output name=changes_detected::true" ]
|
|
||||||
[ "${lines[2]}" = "INPUT_BRANCH value: foo" ]
|
|
||||||
[ "${lines[3]}" = "INPUT_FILE_PATTERN: ." ]
|
|
||||||
[ "${lines[4]}" = "INPUT_COMMIT_OPTIONS: " ]
|
|
||||||
[ "${lines[5]}" = "::debug::Apply commit options " ]
|
|
||||||
[ "${lines[6]}" = "INPUT_TAGGING_MESSAGE: " ]
|
|
||||||
[ "${lines[7]}" = "No tagging message supplied. No tag will be added." ]
|
|
||||||
[ "${lines[8]}" = "INPUT_PUSH_OPTIONS: " ]
|
|
||||||
[ "${lines[9]}" = "::debug::Apply push options " ]
|
|
||||||
[ "${lines[10]}" = "::debug::Push commit to remote branch foo" ]
|
|
||||||
|
|
||||||
|
|
||||||
shellmock_verify
|
|
||||||
[ "${capture[0]}" = "git-stub status -s -- ." ]
|
|
||||||
[ "${capture[1]}" = "git-stub fetch" ]
|
|
||||||
[ "${capture[2]}" = "git-stub checkout foo --" ]
|
|
||||||
[ "${capture[3]}" = "git-stub add ." ]
|
|
||||||
[ "${capture[4]}" = "git-stub -c user.name=Test Suite -c user.email=test@github.com commit -m Commit Message --author=Test Suite <test@users.noreply.github.com>" ]
|
|
||||||
[ "${capture[5]}" = "git-stub push --set-upstream origin HEAD:foo --tags" ]
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@test "can-work-with-empty-branch-name" {
|
|
||||||
|
|
||||||
INPUT_BRANCH=""
|
|
||||||
|
|
||||||
touch "${test_repository}"/new-file-{1,2,3}.txt
|
|
||||||
|
|
||||||
shellmock_expect git --type partial --output " M new-file-1.txt M new-file-2.txt M new-file-3.txt" --match "status"
|
|
||||||
shellmock_expect git --type exact --match "fetch"
|
|
||||||
shellmock_expect git --type exact --match "checkout --"
|
|
||||||
shellmock_expect git --type partial --match "add ."
|
|
||||||
shellmock_expect git --type partial --match '-c'
|
|
||||||
shellmock_expect git --type partial --match 'push origin'
|
|
||||||
|
|
||||||
run main
|
|
||||||
|
|
||||||
echo "$output"
|
|
||||||
|
|
||||||
# Success Exit Code
|
|
||||||
[ "$status" = 0 ]
|
|
||||||
|
|
||||||
[ "${lines[0]}" = "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" ]
|
|
||||||
[ "${lines[1]}" = "::set-output name=changes_detected::true" ]
|
|
||||||
[ "${lines[2]}" = "INPUT_BRANCH value: " ]
|
|
||||||
[ "${lines[3]}" = "INPUT_FILE_PATTERN: ." ]
|
|
||||||
[ "${lines[4]}" = "INPUT_COMMIT_OPTIONS: " ]
|
|
||||||
[ "${lines[5]}" = "::debug::Apply commit options " ]
|
|
||||||
[ "${lines[6]}" = "INPUT_TAGGING_MESSAGE: " ]
|
|
||||||
[ "${lines[7]}" = "No tagging message supplied. No tag will be added." ]
|
|
||||||
[ "${lines[8]}" = "INPUT_PUSH_OPTIONS: " ]
|
|
||||||
[ "${lines[9]}" = "::debug::Apply push options " ]
|
|
||||||
[ "${lines[10]}" = "::debug::git push origin" ]
|
|
||||||
|
|
||||||
|
|
||||||
shellmock_verify
|
|
||||||
[ "${capture[0]}" = "git-stub status -s -- ." ]
|
|
||||||
[ "${capture[1]}" = "git-stub fetch" ]
|
|
||||||
[ "${capture[2]}" = "git-stub checkout --" ]
|
|
||||||
[ "${capture[3]}" = "git-stub add ." ]
|
|
||||||
[ "${capture[4]}" = "git-stub -c user.name=Test Suite -c user.email=test@github.com commit -m Commit Message --author=Test Suite <test@users.noreply.github.com>" ]
|
|
||||||
[ "${capture[5]}" = "git-stub push origin" ]
|
|
||||||
}
|
|
||||||
|
|
||||||
@test "can-work-with-empty-branch-name-and-tags" {
|
|
||||||
|
|
||||||
INPUT_BRANCH=""
|
|
||||||
INPUT_TAGGING_MESSAGE="v2.0.0"
|
|
||||||
|
|
||||||
touch "${test_repository}"/new-file-{1,2,3}.txt
|
|
||||||
|
|
||||||
shellmock_expect git --type partial --output " M new-file-1.txt M new-file-2.txt M new-file-3.txt" --match "status"
|
|
||||||
shellmock_expect git --type exact --match "fetch"
|
|
||||||
shellmock_expect git --type exact --match "checkout --"
|
|
||||||
shellmock_expect git --type partial --match "add ."
|
|
||||||
shellmock_expect git --type partial --match '-c'
|
|
||||||
shellmock_expect git --type partial --match 'push origin'
|
|
||||||
|
|
||||||
run main
|
|
||||||
|
|
||||||
echo "$output"
|
|
||||||
|
|
||||||
# Success Exit Code
|
|
||||||
[ "$status" = 0 ]
|
|
||||||
|
|
||||||
[ "${lines[0]}" = "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" ]
|
|
||||||
[ "${lines[1]}" = "::set-output name=changes_detected::true" ]
|
|
||||||
[ "${lines[2]}" = "INPUT_BRANCH value: " ]
|
|
||||||
[ "${lines[3]}" = "INPUT_FILE_PATTERN: ." ]
|
|
||||||
[ "${lines[4]}" = "INPUT_COMMIT_OPTIONS: " ]
|
|
||||||
[ "${lines[5]}" = "::debug::Apply commit options " ]
|
|
||||||
[ "${lines[6]}" = "INPUT_TAGGING_MESSAGE: v2.0.0" ]
|
|
||||||
[ "${lines[7]}" = "::debug::Create tag v2.0.0" ]
|
|
||||||
[ "${lines[8]}" = "INPUT_PUSH_OPTIONS: " ]
|
|
||||||
[ "${lines[9]}" = "::debug::Apply push options " ]
|
|
||||||
[ "${lines[10]}" = "::debug::git push origin --tags" ]
|
|
||||||
|
|
||||||
|
|
||||||
shellmock_verify
|
|
||||||
[ "${capture[0]}" = "git-stub status -s -- ." ]
|
|
||||||
[ "${capture[1]}" = "git-stub fetch" ]
|
|
||||||
[ "${capture[2]}" = "git-stub checkout --" ]
|
|
||||||
[ "${capture[3]}" = "git-stub add ." ]
|
|
||||||
[ "${capture[4]}" = "git-stub -c user.name=Test Suite -c user.email=test@github.com commit -m Commit Message --author=Test Suite <test@users.noreply.github.com>" ]
|
|
||||||
[ "${capture[5]}" = "git-stub -c user.name=Test Suite -c user.email=test@github.com tag -a v2.0.0 -m v2.0.0" ]
|
|
||||||
[ "${capture[6]}" = "git-stub push origin --tags" ]
|
|
||||||
|
|
||||||
}
|
|
355
tests/git-auto-commit.bats
Normal file
355
tests/git-auto-commit.bats
Normal file
@@ -0,0 +1,355 @@
|
|||||||
|
#!/usr/bin/env bats
|
||||||
|
|
||||||
|
load '../node_modules/bats-support/load'
|
||||||
|
load '../node_modules/bats-assert/load'
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
# Define Paths for local repository used during tests
|
||||||
|
export FAKE_LOCAL_REPOSITORY="${BATS_TEST_DIRNAME}/test_fake_local_repository"
|
||||||
|
export FAKE_REMOTE="${BATS_TEST_DIRNAME}/test_fake_remote_repository"
|
||||||
|
export FAKE_TEMP_LOCAL_REPOSITORY="${BATS_TEST_DIRNAME}/test_fake_temp_local_repository"
|
||||||
|
|
||||||
|
# Set default INPUT variables used by the GitHub Action
|
||||||
|
export INPUT_REPOSITORY="${FAKE_LOCAL_REPOSITORY}"
|
||||||
|
export INPUT_COMMIT_MESSAGE="Commit Message"
|
||||||
|
export INPUT_BRANCH="master"
|
||||||
|
export INPUT_COMMIT_OPTIONS=""
|
||||||
|
export INPUT_FILE_PATTERN="."
|
||||||
|
export INPUT_COMMIT_USER_NAME="Test Suite"
|
||||||
|
export INPUT_COMMIT_USER_EMAIL="test@github.com"
|
||||||
|
export INPUT_COMMIT_AUTHOR="Test Suite <test@users.noreply.github.com>"
|
||||||
|
export INPUT_TAGGING_MESSAGE=""
|
||||||
|
export INPUT_PUSH_OPTIONS=""
|
||||||
|
export INPUT_SKIP_DIRTY_CHECK=false
|
||||||
|
export INPUT_SKIP_FETCH=false
|
||||||
|
|
||||||
|
# Configure Git
|
||||||
|
if [[ -z $(git config user.name) ]]; then
|
||||||
|
git config --global user.name "Test Suite"
|
||||||
|
git config --global user.email "test@github.com"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create and setup some fake repositories for testing
|
||||||
|
_setup_fake_remote_repository
|
||||||
|
_setup_local_repository
|
||||||
|
}
|
||||||
|
|
||||||
|
teardown() {
|
||||||
|
rm -rf "${FAKE_LOCAL_REPOSITORY}"
|
||||||
|
rm -rf "${FAKE_REMOTE}"
|
||||||
|
rm -rf "${FAKE_TEMP_LOCAL_REPOSITORY}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create a fake remote repository which tests can push against
|
||||||
|
_setup_fake_remote_repository() {
|
||||||
|
# Create the bare repository, which will act as our remote/origin
|
||||||
|
rm -rf "${FAKE_REMOTE}";
|
||||||
|
mkdir "${FAKE_REMOTE}";
|
||||||
|
cd "${FAKE_REMOTE}";
|
||||||
|
git init --bare;
|
||||||
|
|
||||||
|
# Clone the remote repository to a temporary location.
|
||||||
|
rm -rf "${FAKE_TEMP_LOCAL_REPOSITORY}"
|
||||||
|
git clone "${FAKE_REMOTE}" "${FAKE_TEMP_LOCAL_REPOSITORY}"
|
||||||
|
|
||||||
|
# Create some files, commit them and push them to the remote repository
|
||||||
|
touch "${FAKE_TEMP_LOCAL_REPOSITORY}"/remote-files{1,2,3}.txt
|
||||||
|
cd "${FAKE_TEMP_LOCAL_REPOSITORY}";
|
||||||
|
git add .;
|
||||||
|
git commit --quiet -m "Init Remote Repository";
|
||||||
|
git push origin master;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Clone our fake remote repository and set it up for testing
|
||||||
|
_setup_local_repository() {
|
||||||
|
# Clone remote repository. In this repository we will do our testing
|
||||||
|
rm -rf "${FAKE_LOCAL_REPOSITORY}"
|
||||||
|
git clone "${FAKE_REMOTE}" "${FAKE_LOCAL_REPOSITORY}"
|
||||||
|
|
||||||
|
cd "${FAKE_LOCAL_REPOSITORY}";
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run the main code related to this GitHub Action
|
||||||
|
git_auto_commit() {
|
||||||
|
bash "${BATS_TEST_DIRNAME}"/../entrypoint.sh
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "It detects changes, commits them and pushes them to the remote repository" {
|
||||||
|
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 "::set-output name=changes_detected::true"
|
||||||
|
assert_line "INPUT_BRANCH value: master"
|
||||||
|
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 master"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "It detects when files have been deleted, commits changes and pushes them to the remote repository" {
|
||||||
|
rm -rf "${FAKE_LOCAL_REPOSITORY}"/remote-files1.txt
|
||||||
|
|
||||||
|
run git_auto_commit
|
||||||
|
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
|
||||||
|
assert_line "::set-output name=changes_detected::true"
|
||||||
|
assert_line "INPUT_BRANCH value: master"
|
||||||
|
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 master"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "It prints a 'Nothing to commit' message in a clean repository" {
|
||||||
|
run git_auto_commit
|
||||||
|
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
|
||||||
|
assert_line "::set-output name=changes_detected::false"
|
||||||
|
assert_line "Working tree clean. Nothing to commit."
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "If SKIP_DIRTY_CHECK is set to true on a clean repo it fails to push" {
|
||||||
|
INPUT_SKIP_DIRTY_CHECK=true
|
||||||
|
|
||||||
|
run git_auto_commit
|
||||||
|
|
||||||
|
assert_failure
|
||||||
|
|
||||||
|
assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
|
||||||
|
assert_line "::set-output name=changes_detected::true"
|
||||||
|
|
||||||
|
assert_line "::set-output name=changes_detected::true"
|
||||||
|
assert_line "INPUT_BRANCH value: master"
|
||||||
|
assert_line "INPUT_FILE_PATTERN: ."
|
||||||
|
assert_line "INPUT_COMMIT_OPTIONS: "
|
||||||
|
assert_line "::debug::Apply commit options "
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "It applies INPUT_FILE_PATTERN when creating commit" {
|
||||||
|
INPUT_FILE_PATTERN="*.txt *.html"
|
||||||
|
|
||||||
|
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2}.php
|
||||||
|
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2}.html
|
||||||
|
|
||||||
|
run git_auto_commit
|
||||||
|
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
assert_line "INPUT_FILE_PATTERN: *.txt *.html"
|
||||||
|
assert_line "::debug::Push commit to remote branch master"
|
||||||
|
|
||||||
|
# Assert that PHP files have not been added.
|
||||||
|
run git status
|
||||||
|
assert_output --partial 'new-file-1.php'
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "It applies INPUT_COMMIT_OPTIONS when creating commit" {
|
||||||
|
INPUT_COMMIT_OPTIONS="--no-verify --signoff"
|
||||||
|
|
||||||
|
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2}.txt
|
||||||
|
|
||||||
|
run git_auto_commit
|
||||||
|
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
assert_line "INPUT_COMMIT_OPTIONS: --no-verify --signoff"
|
||||||
|
assert_line "::debug::Push commit to remote branch master"
|
||||||
|
|
||||||
|
# Assert last commit was signed off
|
||||||
|
run git log -n 1
|
||||||
|
assert_output --partial "Signed-off-by:"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "It applies commit user and author settings" {
|
||||||
|
INPUT_COMMIT_USER_NAME="A Single Test"
|
||||||
|
INPUT_COMMIT_USER_EMAIL="single-test@github.com"
|
||||||
|
INPUT_COMMIT_AUTHOR="A Single Test <single@users.noreply.github.com>"
|
||||||
|
|
||||||
|
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2}.txt
|
||||||
|
|
||||||
|
run git_auto_commit
|
||||||
|
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
assert_line "INPUT_COMMIT_USER_NAME: A Single Test";
|
||||||
|
assert_line "INPUT_COMMIT_USER_EMAIL: single-test@github.com";
|
||||||
|
assert_line "INPUT_COMMIT_AUTHOR: A Single Test <single@users.noreply.github.com>";
|
||||||
|
assert_line "::debug::Push commit to remote branch master"
|
||||||
|
|
||||||
|
# Asser last commit was made by the defined user/author
|
||||||
|
run git log -1 --pretty=format:'%ae'
|
||||||
|
assert_output --partial "single@users.noreply.github.com"
|
||||||
|
|
||||||
|
run git log -1 --pretty=format:'%an'
|
||||||
|
assert_output --partial "A Single Test"
|
||||||
|
|
||||||
|
run git log -1 --pretty=format:'%cn'
|
||||||
|
assert_output --partial "A Single Test"
|
||||||
|
|
||||||
|
run git log -1 --pretty=format:'%ce'
|
||||||
|
assert_output --partial "single-test@github.com"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "It creates a tag with the commit" {
|
||||||
|
INPUT_TAGGING_MESSAGE="v1.0.0"
|
||||||
|
|
||||||
|
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
|
||||||
|
|
||||||
|
run git_auto_commit
|
||||||
|
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
assert_line "INPUT_TAGGING_MESSAGE: v1.0.0"
|
||||||
|
assert_line "::debug::Create tag v1.0.0"
|
||||||
|
assert_line "::debug::Push commit to remote branch master"
|
||||||
|
|
||||||
|
# Assert a tag v1.0.0 has been created
|
||||||
|
run git tag
|
||||||
|
assert_output v1.0.0
|
||||||
|
|
||||||
|
run git ls-remote --tags --refs
|
||||||
|
assert_output --partial refs/tags/v1.0.0
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "It applies INPUT_PUSH_OPTIONS when pushing commit to remote" {
|
||||||
|
|
||||||
|
touch "${FAKE_TEMP_LOCAL_REPOSITORY}"/newer-remote-files{1,2,3}.txt
|
||||||
|
cd "${FAKE_TEMP_LOCAL_REPOSITORY}";
|
||||||
|
git add .;
|
||||||
|
git commit --quiet -m "Add more remote files";
|
||||||
|
git push origin master;
|
||||||
|
|
||||||
|
|
||||||
|
INPUT_PUSH_OPTIONS="--force"
|
||||||
|
|
||||||
|
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
|
||||||
|
|
||||||
|
run git_auto_commit
|
||||||
|
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
assert_line "INPUT_PUSH_OPTIONS: --force"
|
||||||
|
assert_line "::debug::Apply push options --force"
|
||||||
|
assert_line "::debug::Push commit to remote branch master"
|
||||||
|
|
||||||
|
# Assert that the commit has been pushed with --force and
|
||||||
|
# sha values are equal on local and remote
|
||||||
|
current_sha="$(git rev-parse --verify --short master)"
|
||||||
|
remote_sha="$(git rev-parse --verify --short origin/master)"
|
||||||
|
|
||||||
|
assert_equal $current_sha $remote_sha
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "It can checkout a different branch" {
|
||||||
|
# Create foo-branch and then immediately switch back to master
|
||||||
|
git checkout -b foo
|
||||||
|
git checkout master
|
||||||
|
|
||||||
|
INPUT_BRANCH="foo"
|
||||||
|
|
||||||
|
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
|
||||||
|
|
||||||
|
run git_auto_commit
|
||||||
|
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
assert_line "INPUT_BRANCH value: foo"
|
||||||
|
assert_line "::debug::Push commit to remote branch foo"
|
||||||
|
|
||||||
|
# Assert a new branch "foo" exists on remote
|
||||||
|
run git ls-remote --heads
|
||||||
|
assert_output --partial refs/heads/foo
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "It uses existing branch name when pushing when INPUT_BRANCH is empty" {
|
||||||
|
INPUT_BRANCH=""
|
||||||
|
|
||||||
|
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
|
||||||
|
|
||||||
|
run git_auto_commit
|
||||||
|
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
assert_line "INPUT_BRANCH value: "
|
||||||
|
assert_line --partial "::debug::git push origin"
|
||||||
|
|
||||||
|
# Assert that branch "master" was updated on remote
|
||||||
|
current_sha="$(git rev-parse --verify --short master)"
|
||||||
|
remote_sha="$(git rev-parse --verify --short origin/master)"
|
||||||
|
|
||||||
|
assert_equal $current_sha $remote_sha
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "It uses existing branch when INPUT_BRANCH is empty and INPUT_TAGGING_MESSAGE is set" {
|
||||||
|
INPUT_BRANCH=""
|
||||||
|
INPUT_TAGGING_MESSAGE="v2.0.0"
|
||||||
|
|
||||||
|
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
|
||||||
|
|
||||||
|
run git_auto_commit
|
||||||
|
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
assert_line "INPUT_TAGGING_MESSAGE: v2.0.0"
|
||||||
|
assert_line "::debug::Create tag v2.0.0"
|
||||||
|
assert_line "::debug::git push origin --tags"
|
||||||
|
|
||||||
|
# Assert a tag v2.0.0 has been created
|
||||||
|
run git tag
|
||||||
|
assert_output v2.0.0
|
||||||
|
|
||||||
|
# Assert tag v2.0.0 has been pushed to remote
|
||||||
|
run git ls-remote --tags --refs
|
||||||
|
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 has not been executed"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "If INPUT_BRANCH is set and the branch does not exist it creates one" {
|
||||||
|
INPUT_BRANCH="new-branch"
|
||||||
|
|
||||||
|
run git branch
|
||||||
|
refute_line "new-branch"
|
||||||
|
|
||||||
|
touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
|
||||||
|
|
||||||
|
run git_auto_commit
|
||||||
|
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
assert_line "INPUT_BRANCH value: new-branch"
|
||||||
|
assert_line --partial "::debug::Push commit to remote branch new-branch"
|
||||||
|
|
||||||
|
# Assert that branch "new-branch" was updated on remote
|
||||||
|
current_sha="$(git rev-parse --verify --short new-branch)"
|
||||||
|
remote_sha="$(git rev-parse --verify --short origin/new-branch)"
|
||||||
|
|
||||||
|
assert_equal $current_sha $remote_sha
|
||||||
|
}
|
@@ -2,6 +2,14 @@
|
|||||||
# yarn lockfile v1
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
bats-assert@ztombol/bats-assert:
|
||||||
|
version "0.3.0"
|
||||||
|
resolved "https://codeload.github.com/ztombol/bats-assert/tar.gz/9f88b4207da750093baabc4e3f41bf68f0dd3630"
|
||||||
|
|
||||||
|
bats-support@ztombol/bats-support:
|
||||||
|
version "0.3.0"
|
||||||
|
resolved "https://codeload.github.com/ztombol/bats-support/tar.gz/004e707638eedd62e0481e8cdc9223ad471f12ee"
|
||||||
|
|
||||||
bats@^1.1.0:
|
bats@^1.1.0:
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/bats/-/bats-1.2.1.tgz#c15aecc3eb331aedf28678880fab2be0b73eba43"
|
resolved "https://registry.yarnpkg.com/bats/-/bats-1.2.1.tgz#c15aecc3eb331aedf28678880fab2be0b73eba43"
|
||||||
|
Reference in New Issue
Block a user