Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,15 @@ The following is an extended example with all available options.
commit_user_name: My GitHub Actions Bot # defaults to "github-actions[bot]"
commit_user_email: my-github-actions-bot@example.org # defaults to "41898282+github-actions[bot]@users.noreply.github.com"
commit_author: Author <actions@github.com> # defaults to "username <numeric_id+username@users.noreply.github.com>", where "numeric_id" and "username" belong to the author of the commit that triggered the run

# Optional. Tag name to be created in the local repository and
# pushed to the remote repository on the defined branch.
# If only one of `tag` or `tagging_message` is provided, the value of the provided field will be used for both tag name and message.
tag: 'v1.0.0'

# Optional. Tag name being created in the local repository and
# pushed to remote repository and defined branch.
tagging_message: 'v1.0.0'
# Optional. Message to annotate the created tag with.
# If only one of `tag` or `tagging_message` is provided, the value of the provided field will be used for both tag name and message.
tagging_message: 'Codename "Sunshine"'

# Optional. Option used by `git-status` to determine if the repository is
# dirty. See https://git-scm.com/docs/git-status#_options
Expand Down Expand Up @@ -119,7 +124,7 @@ The following is an extended example with all available options.
create_branch: true

# Optional. Creates a new tag and pushes it to remote without creating a commit.
# Skips dirty check and changed files. Must be used with `tagging_message`.
# Skips dirty check and changed files. Must be used in combination with `tag` and `tagging_message`.
create_git_tag_only: false
```

Expand Down
6 changes: 5 additions & 1 deletion action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,12 @@ inputs:
description: Value used for the commit author. Defaults to the username of whoever triggered this workflow run.
required: false
default: ${{ github.actor }} <${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com>
tag:
description: Tag name used for creating a new git tag with the commit. Keep this empty, if no tag should be created.
required: false
default: ''
tagging_message:
description: Message used to create a new git tag with the commit. Keep this empty, if no tag should be created.
description: Tagging message used for creating a new git tag with the commit. Keep this empty, if no tag should be created.
required: false
default: ''
push_options:
Expand Down
17 changes: 10 additions & 7 deletions entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -176,14 +176,17 @@ _local_commit() {
}

_tag_commit() {
echo "INPUT_TAG: ${INPUT_TAG}"
echo "INPUT_TAGGING_MESSAGE: ${INPUT_TAGGING_MESSAGE}"

if [ -n "$INPUT_TAGGING_MESSAGE" ]
then
_log "debug" "Create tag $INPUT_TAGGING_MESSAGE";
git -c user.name="$INPUT_COMMIT_USER_NAME" -c user.email="$INPUT_COMMIT_USER_EMAIL" tag -a "$INPUT_TAGGING_MESSAGE" -m "$INPUT_TAGGING_MESSAGE";
if [ -n "$INPUT_TAG" ] || [ -n "$INPUT_TAGGING_MESSAGE" ]; then
INTERNAL_TAG=${INPUT_TAG:-$INPUT_TAGGING_MESSAGE}
INTERNAL_TAGGING_MESSAGE=${INPUT_TAGGING_MESSAGE:-$INPUT_TAG}

_log "debug" "Create tag $INTERNAL_TAG: $INTERNAL_TAGGING_MESSAGE"
git -c user.name="$INPUT_COMMIT_USER_NAME" -c user.email="$INPUT_COMMIT_USER_EMAIL" tag -a "$INTERNAL_TAG" -m "$INTERNAL_TAGGING_MESSAGE"
else
echo "No tagging message supplied. No tag will be added.";
echo "Neither tag nor tag message is set. No tag will be added.";
fi
}

Expand All @@ -199,8 +202,8 @@ _push_to_github() {

if [ -z "$INPUT_BRANCH" ]
then
# Only add `--tags` option, if `$INPUT_TAGGING_MESSAGE` is set
if [ -n "$INPUT_TAGGING_MESSAGE" ]
# Only add `--tags` option, if `$INPUT_TAG` or `$INPUT_TAGGING_MESSAGE` is set
if [ -n "$INPUT_TAG" ] || [ -n "$INPUT_TAGGING_MESSAGE" ]
then
_log "debug" "git push origin --tags";
git push origin --follow-tags --atomic ${INPUT_PUSH_OPTIONS:+"${INPUT_PUSH_OPTIONS_ARRAY[@]}"};
Expand Down
136 changes: 107 additions & 29 deletions tests/git-auto-commit.bats
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ setup() {
export INPUT_COMMIT_USER_NAME="Test Suite"
export INPUT_COMMIT_USER_EMAIL="test@github.com"
export INPUT_COMMIT_AUTHOR="Test Suite <test@users.noreply.github.com>"
export INPUT_TAG=""
export INPUT_TAGGING_MESSAGE=""
export INPUT_PUSH_OPTIONS=""
export INPUT_SKIP_DIRTY_CHECK=false
Expand Down Expand Up @@ -121,8 +122,9 @@ cat_github_output() {
assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: "
assert_line "::debug::Apply commit options "
assert_line "INPUT_TAG: "
assert_line "INPUT_TAGGING_MESSAGE: "
assert_line "No tagging message supplied. No tag will be added."
assert_line "Neither tag nor tag message is set. No tag will be added."
assert_line "INPUT_PUSH_OPTIONS: "
assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}"
Expand All @@ -144,8 +146,9 @@ cat_github_output() {
assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: "
assert_line "::debug::Apply commit options "
assert_line "INPUT_TAG: "
assert_line "INPUT_TAGGING_MESSAGE: "
assert_line "No tagging message supplied. No tag will be added."
assert_line "Neither tag nor tag message is set. No tag will be added."
assert_line "INPUT_PUSH_OPTIONS: "
assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}"
Expand Down Expand Up @@ -291,21 +294,24 @@ cat_github_output() {
}

@test "It creates a tag with the commit" {
INPUT_TAGGING_MESSAGE="v1.0.0"
INPUT_TAG="v1.0.0"
INPUT_TAGGING_MESSAGE="MyProduct 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 "INPUT_TAG: v1.0.0"
assert_line "INPUT_TAGGING_MESSAGE: MyProduct v1.0.0"

assert_line "::debug::Create tag v1.0.0: MyProduct v1.0.0"
assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}"

# Assert a tag v1.0.0 has been created
run git tag
assert_output v1.0.0
run git tag -n
assert_output 'v1.0.0 MyProduct v1.0.0'

run git ls-remote --tags --refs
assert_output --partial refs/tags/v1.0.0
Expand Down Expand Up @@ -386,18 +392,20 @@ cat_github_output() {
assert_equal $current_sha $remote_sha
}

@test "It uses existing branch when INPUT_BRANCH is empty and INPUT_TAGGING_MESSAGE is set" {
@test "It uses existing branch when INPUT_BRANCH is empty and INPUT_TAG is set" {
INPUT_BRANCH=""
INPUT_TAGGING_MESSAGE="v2.0.0"
INPUT_TAG="v2.0.0"
INPUT_TAGGING_MESSAGE="MyProduct 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 "INPUT_TAG: v2.0.0"
assert_line "::debug::Create tag v2.0.0: MyProduct v2.0.0"
assert_line "::debug::git push origin --tags"

# Assert a tag v2.0.0 has been created
Expand Down Expand Up @@ -437,16 +445,18 @@ cat_github_output() {

@test "It pushes generated commit and tag to remote and actually updates the commit shas" {
INPUT_BRANCH=""
INPUT_TAGGING_MESSAGE="v2.0.0"
INPUT_TAG="v2.0.0"
INPUT_TAGGING_MESSAGE="MyProduct 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 "INPUT_TAG: v2.0.0"
assert_line "::debug::Create tag v2.0.0: MyProduct v2.0.0"
assert_line "::debug::git push origin --tags"

# Assert a tag v2.0.0 has been created
Expand All @@ -470,16 +480,18 @@ cat_github_output() {
git checkout ${FAKE_DEFAULT_BRANCH}

INPUT_BRANCH="a-new-branch"
INPUT_TAGGING_MESSAGE="v2.0.0"
INPUT_TAG="v2.0.0"
INPUT_TAGGING_MESSAGE="MyProduct 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 "INPUT_TAG: v2.0.0"
assert_line "::debug::Create tag v2.0.0: MyProduct v2.0.0"
assert_line "::debug::Push commit to remote branch a-new-branch"

# Assert a tag v2.0.0 has been created
Expand Down Expand Up @@ -631,8 +643,9 @@ cat_github_output() {
assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: "
assert_line "::debug::Apply commit options "
assert_line "INPUT_TAG: "
assert_line "INPUT_TAGGING_MESSAGE: "
assert_line "No tagging message supplied. No tag will be added."
assert_line "Neither tag nor tag message is set. No tag will be added."
assert_line "INPUT_PUSH_OPTIONS: "
assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch not-existend-branch"
Expand Down Expand Up @@ -689,8 +702,9 @@ cat_github_output() {
assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: "
assert_line "::debug::Apply commit options "
assert_line "INPUT_TAG: "
assert_line "INPUT_TAGGING_MESSAGE: "
assert_line "No tagging message supplied. No tag will be added."
assert_line "Neither tag nor tag message is set. No tag will be added."
assert_line "INPUT_PUSH_OPTIONS: "
assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch existing-remote-branch"
Expand Down Expand Up @@ -1021,8 +1035,9 @@ cat_github_output() {
assert_line "INPUT_FILE_PATTERN: ."
assert_line "INPUT_COMMIT_OPTIONS: "
assert_line "::debug::Apply commit options "
assert_line "INPUT_TAG: "
assert_line "INPUT_TAGGING_MESSAGE: "
assert_line "No tagging message supplied. No tag will be added."
assert_line "Neither tag nor tag message is set. No tag will be added."
assert_line "INPUT_PUSH_OPTIONS: "
assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}"
Expand Down Expand Up @@ -1108,16 +1123,17 @@ END

@test "it creates a tag if create_git_tag_only is set to true and a message has been supplied" {
INPUT_CREATE_GIT_TAG_ONLY=true
INPUT_TAGGING_MESSAGE=v1.0.0
INPUT_TAG=v1.0.0
INPUT_TAGGING_MESSAGE="MyProduct v1.0.0"

run git_auto_commit

assert_success

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

assert_line "::debug::Create tag v1.0.0"
refute_line "No tagging message supplied. No tag will be added."
assert_line "::debug::Create tag v1.0.0: MyProduct v1.0.0"
refute_line "Neither tag nor tag message is set. No tag will be added."

assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}"
Expand All @@ -1128,23 +1144,25 @@ END
refute_line -e "commit_hash=[0-9a-f]{40}$"

# Assert a tag v1.0.0 has been created
run git tag
assert_output v1.0.0
run git tag -n
assert_output 'v1.0.0 MyProduct v1.0.0'

run git ls-remote --tags --refs
assert_output --partial refs/tags/v1.0.0
}

@test "it output no tagging message supplied if no tagging message is set but create_git_tag_only is set to true" {
INPUT_CREATE_GIT_TAG_ONLY=true
INPUT_TAG=""
INPUT_TAGGING_MESSAGE=""

run git_auto_commit

assert_success

assert_line "INPUT_TAG: "
assert_line "INPUT_TAGGING_MESSAGE: "
assert_line "No tagging message supplied. No tag will be added."
assert_line "Neither tag nor tag message is set. No tag will be added."
assert_line "::debug::Create git tag only"

run cat_github_output
Expand Down Expand Up @@ -1209,7 +1227,7 @@ END
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 "Neither tag nor tag message is set. No tag will be added."
assert_line "INPUT_PUSH_OPTIONS: "
assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch not-existend-branch"
Expand Down Expand Up @@ -1250,7 +1268,7 @@ END
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 "Neither tag nor tag message is set. No tag will be added."
assert_line "INPUT_PUSH_OPTIONS: "
assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch not-existend-remote-branch"
Expand Down Expand Up @@ -1311,7 +1329,7 @@ END
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 "Neither tag nor tag message is set. No tag will be added."
assert_line "INPUT_PUSH_OPTIONS: "
assert_line "::debug::Apply push options "
assert_line "::debug::Push commit to remote branch existing-remote-branch"
Expand Down Expand Up @@ -1424,3 +1442,63 @@ END

assert_equal $current_sha $remote_sha
}

@test "Set a tag message only" {
INPUT_TAGGING_MESSAGE="v1.0.0"

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

run git_auto_commit

assert_success

assert_line "INPUT_TAG: "
assert_line "INPUT_TAGGING_MESSAGE: v1.0.0"

assert_line "::debug::Create tag v1.0.0: v1.0.0"
assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}"

# Assert a tag v1.0.0 has been created
run git tag -n
assert_output 'v1.0.0 v1.0.0'

run git ls-remote --tags --refs
assert_output --partial refs/tags/v1.0.0

# Assert that the commit has been pushed with --force and
# sha values are equal on local and remote
current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})"
remote_sha="$(git rev-parse --verify --short origin/${FAKE_DEFAULT_BRANCH})"

assert_equal $current_sha $remote_sha
}

@test "Set a tag only" {
INPUT_TAG="v1.0.0"

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

run git_auto_commit

assert_success

assert_line "INPUT_TAG: v1.0.0"
assert_line "INPUT_TAGGING_MESSAGE: "

assert_line "::debug::Create tag v1.0.0: v1.0.0"
assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}"

# Assert a tag v1.0.0 has been created
run git tag -n
assert_output 'v1.0.0 v1.0.0'

run git ls-remote --tags --refs
assert_output --partial refs/tags/v1.0.0

# Assert that the commit has been pushed with --force and
# sha values are equal on local and remote
current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})"
remote_sha="$(git rev-parse --verify --short origin/${FAKE_DEFAULT_BRANCH})"

assert_equal $current_sha $remote_sha
}
Loading