diff --git a/.github/workflows/git-auto-commit.yml b/.github/workflows/git-auto-commit.yml index d7db234d..40f7f0b4 100644 --- a/.github/workflows/git-auto-commit.yml +++ b/.github/workflows/git-auto-commit.yml @@ -16,7 +16,9 @@ jobs: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 + with: + ref: ${{ github.head_ref }} - name: Use git-auto-commit-action id: "auto-commit-action" diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index d994c080..e954e2d3 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -9,7 +9,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Lint Code Base uses: github/super-linter@v7 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 35ee1e2c..451d19dc 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Install testing dependencies run: yarn install diff --git a/.github/workflows/update-changelog.yaml b/.github/workflows/update-changelog.yaml index 1a03dfc7..58d79b3c 100644 --- a/.github/workflows/update-changelog.yaml +++ b/.github/workflows/update-changelog.yaml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: master @@ -27,7 +27,7 @@ jobs: latest-version: ${{ github.event.release.name }} - name: Commit updated CHANGELOG - uses: stefanzweifel/git-auto-commit-action@v5 + uses: stefanzweifel/git-auto-commit-action@v7 with: branch: master commit_message: Update CHANGELOG diff --git a/CHANGELOG.md b/CHANGELOG.md index cb8f4362..b0bfb933 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,57 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). -## [Unreleased](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5.1.0...HEAD) +## [Unreleased](https://github.com/stefanzweifel/git-auto-commit-action/compare/v7.0.0...HEAD) > TBD +## [v7.0.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v6.0.1...v7.0.0) - 2025-10-12 + +### Added + +- Restore skip_fetch, skip_checkout, create_branch ([#388](https://github.com/stefanzweifel/git-auto-commit-action/pull/388)) [@stefanzweifel](https://github.com/@stefanzweifel) +- Restore Detached State Detection ([#393](https://github.com/stefanzweifel/git-auto-commit-action/pull/393)) [@stefanzweifel](https://github.com/@stefanzweifel) +- Add Support for Tag Messages ([#391](https://github.com/stefanzweifel/git-auto-commit-action/pull/391)) [@EliasBoulharts](https://github.com/@EliasBoulharts) + +### Changed + +- Run Action on Node 24 ([#389](https://github.com/stefanzweifel/git-auto-commit-action/pull/389)) [@stefanzweifel](https://github.com/@stefanzweifel) + +### Dependency Updates + +- Bump actions/checkout from 4 to 5 ([#386](https://github.com/stefanzweifel/git-auto-commit-action/pull/386)) [@[dependabot[bot]](https://github.com/apps/dependabot)](https://github.com/@[dependabot[bot]](https://github.com/apps/dependabot)) + +## [v6.0.1](https://github.com/stefanzweifel/git-auto-commit-action/compare/v6.0.0...v6.0.1) - 2025-06-11 + +### Fixed + +- Disable Check if Repo is in Detached State ([#379](https://github.com/stefanzweifel/git-auto-commit-action/pull/379)) [@stefanzweifel](https://github.com/@stefanzweifel) + +## [v6.0.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5.2.0...v6.0.0) - 2025-06-10 + +### Added + +- Throw error early if repository is in a detached state ([#357](https://github.com/stefanzweifel/git-auto-commit-action/pull/357)) + +### Fixed + +- Fix PAT instructions with Dependabot ([#376](https://github.com/stefanzweifel/git-auto-commit-action/pull/376)) [@Dreamsorcerer](https://github.com/@Dreamsorcerer) + +### Removed + +- Remove support for `create_branch`, `skip_checkout`, `skip_Fetch` ([#314](https://github.com/stefanzweifel/git-auto-commit-action/pull/314)) + +## [v5.2.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5.1.0...v5.2.0) - 2025-04-19 + +### Added + +- Add `create_git_tag_only` option to skip commiting and always create a git-tag. ([#364](https://github.com/stefanzweifel/git-auto-commit-action/pull/364)) [@zMynxx](https://github.com/@zMynxx) +- Add Test for `create_git_tag_only` feature ([#367](https://github.com/stefanzweifel/git-auto-commit-action/pull/367)) [@stefanzweifel](https://github.com/@stefanzweifel) + +### Fixed + +- docs: Update README.md per #354 ([#361](https://github.com/stefanzweifel/git-auto-commit-action/pull/361)) [@rasa](https://github.com/@rasa) + ## [v5.1.0](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5.0.1...v5.1.0) - 2025-01-11 ### Changed diff --git a/README.md b/README.md index 4e9b3193..07dbf82e 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Adding git-auto-commit to your Workflow only takes a couple lines of code. 2. Add the following step at the end of your job, after other steps that might add or change files. ```yaml -- uses: stefanzweifel/git-auto-commit-action@v5 +- uses: stefanzweifel/git-auto-commit-action@v7 ``` Your Workflow should look similar to this example. @@ -39,7 +39,7 @@ jobs: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: ref: ${{ github.head_ref }} @@ -47,7 +47,7 @@ jobs: # … # Commit all changed files back to the repository - - uses: stefanzweifel/git-auto-commit-action@v5 + - uses: stefanzweifel/git-auto-commit-action@v7 ``` > [!NOTE] @@ -56,15 +56,14 @@ jobs: The following is an extended example with all available options. ```yaml -- uses: stefanzweifel/git-auto-commit-action@v5 +- uses: stefanzweifel/git-auto-commit-action@v7 with: # Optional. Commit message for the created commit. # Defaults to "Apply automatic changes" commit_message: Automated Change - # Optional. Local and remote branch name where commit is going to be pushed - # to. Defaults to the current branch. - # You might need to set `create_branch: true` if the branch does not exist. + # Optional. Remote branch name where commit is going to be pushed to. + # Defaults to the current branch. branch: feature-123 # Optional. Options used by `git-commit`. @@ -86,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 # defaults to "username ", 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_name` or `tagging_message` is provided, the value of the provided field will be used for both tag name and message. + tag_name: '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_name` 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 @@ -105,12 +109,15 @@ The following is an extended example with all available options. # Optional. Disable dirty check and always try to create a commit and push skip_dirty_check: true - + # Optional. Skip internal call to `git fetch` - skip_fetch: true - + skip_fetch: true + # Optional. Skip internal call to `git checkout` skip_checkout: true + + # Optional. Skip internal call to `git push` + skip_push: true # Optional. Prevents the shell from expanding filenames. # Details: https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html @@ -120,7 +127,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 ``` @@ -151,14 +158,14 @@ jobs: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: ref: ${{ github.head_ref }} - name: Run php-cs-fixer uses: docker://oskarstark/php-cs-fixer-ga - - uses: stefanzweifel/git-auto-commit-action@v5 + - uses: stefanzweifel/git-auto-commit-action@v7 with: commit_message: Apply php-cs-fixer changes ``` @@ -180,7 +187,7 @@ You can use these outputs to trigger other Actions in your Workflow run based on ### Example ```yaml - - uses: stefanzweifel/git-auto-commit-action@v5 + - uses: stefanzweifel/git-auto-commit-action@v7 id: auto-commit-action #mandatory for the output to show up in ${{ steps }} with: commit_message: Apply php-cs-fixer changes @@ -212,11 +219,11 @@ If this Action doesn't work for your workflow, check out [EndBug/add-and-commit] ### Checkout the correct branch -You must use `action/checkout@v2` or later versions to check out the repository. +You must use `actions/checkout@v2` or later versions to check out the repository. In non-`push` events, such as `pull_request`, make sure to specify the `ref` to check out: ```yaml -- uses: actions/checkout@v4 +- uses: actions/checkout@v5 with: ref: ${{ github.head_ref }} ``` @@ -234,7 +241,7 @@ You can change this by creating a new [Personal Access Token (PAT)](https://gith storing the token as a secret in your repository and then passing the new token to the [`actions/checkout`](https://github.com/actions/checkout#usage) Action step. ```yaml -- uses: actions/checkout@v4 +- uses: actions/checkout@v5 with: token: ${{ secrets.PAT }} ``` @@ -280,7 +287,7 @@ The example below can be used as a starting point to generate a multiline commit # Quick and dirty step to get rid of the temporary file holding the commit message - run: rm -rf commitmessage.txt - - uses: stefanzweifel/git-auto-commit-action@v5 + - uses: stefanzweifel/git-auto-commit-action@v7 id: commit with: commit_message: ${{ steps.commit_message_step.outputs.commit_message }} @@ -304,7 +311,7 @@ As git-auto-commit by default does not use **your** username and email when crea git_commit_gpgsign: true - name: "Commit and push changes" - uses: stefanzweifel/git-auto-commit-action@v5 + uses: stefanzweifel/git-auto-commit-action@v7 with: commit_author: "${{ steps.import-gpg.outputs.name }} <${{ steps.import-gpg.outputs.email }}>" commit_user_name: ${{ steps.import-gpg.outputs.name }} @@ -367,7 +374,7 @@ jobs: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Checkout the fork/head-repository and push changes to the fork. # If you skip this, the base repository will be checked out and changes @@ -381,7 +388,7 @@ jobs: - name: Run php-cs-fixer uses: docker://oskarstark/php-cs-fixer-ga - - uses: stefanzweifel/git-auto-commit-action@v5 + - uses: stefanzweifel/git-auto-commit-action@v7 ``` For more information about running Actions on forks, see [this announcement from GitHub](https://github.blog/2020-08-03-github-actions-improvements-for-fork-and-pull-request-workflows/). @@ -416,7 +423,7 @@ The steps in your workflow might look like this: echo "message=$(git log -1 --pretty=%s)" >> $GITHUB_OUTPUT echo "author=$(git log -1 --pretty=\"%an <%ae>\")" >> $GITHUB_OUTPUT -- uses: stefanzweifel/git-auto-commit-action@v5 +- uses: stefanzweifel/git-auto-commit-action@v7 with: commit_author: ${{ steps.last-commit.outputs.author }} commit_message: ${{ steps.last-commit.outputs.message }} @@ -459,19 +466,21 @@ If you create a personal access token (classic), apply the `repo` and `workflow` If you create a fine-grained personal access token, apply the `Contents`-permissions. ```yaml -- uses: actions/checkout@v4 +- uses: actions/checkout@v5 with: - token: ${{ secrets.PAT }} + # We pass the "PAT" secret to the checkout action; if no PAT secret is available to the workflow runner (eg. Dependabot) we fall back to the default "GITHUB_TOKEN". + token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }} ``` You can learn more about Personal Access Token in the [GitHub documentation](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token). + > [!TIP] > If you're working in an organisation, and you don't want to create the PAT from your personal account, we recommend using a bot-account for such tokens. If you go the "force pushes" route, you have to enable force pushes to a protected branch (see [documentation](https://help.github.com/en/github/administering-a-repository/enabling-force-pushes-to-a-protected-branch)) and update your Workflow to use force push like this. ```yaml - - uses: stefanzweifel/git-auto-commit-action@v5 + - uses: stefanzweifel/git-auto-commit-action@v7 with: commit_message: Apply php-cs-fixer changes push_options: --force @@ -501,7 +510,7 @@ This is due to the fact, that the `*.md`-glob is expanded before sending it to ` To fix this add `disable_globbing: true` to your Workflow. ```yaml -- uses: stefanzweifel/git-auto-commit-action@v5 +- uses: stefanzweifel/git-auto-commit-action@v7 with: file_pattern: '*.md' disable_globbing: true @@ -529,7 +538,7 @@ yarn test We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/stefanzweifel/git-auto-commit-action/tags). -We also provide major version tags to make it easier to always use the latest release of a major version. For example, you can use `stefanzweifel/git-auto-commit-action@v5` to always use the latest release of the current major version. +We also provide major version tags to make it easier to always use the latest release of a major version. For example, you can use `stefanzweifel/git-auto-commit-action@v7` to always use the latest release of the current major version. (More information about this [here](https://help.github.com/en/actions/building-actions/about-actions#versioning-your-action).) ## Credits diff --git a/UPGRADING.md b/UPGRADING.md new file mode 100644 index 00000000..ad15370e --- /dev/null +++ b/UPGRADING.md @@ -0,0 +1,17 @@ +# Upgrading + +## From v6 to v7 + +The previously removed options `create_branch`, `skip_fetch`, and `skip_checkout` have been reintroduced in git-auto-commit v7. If you had removed these options from your workflows when upgrading to v6, you can now add them back if needed. + +Tagging a commit has been reworked. In addition to the existing `tagging_message`-option, a new `tag_name` option has been added. If you were using `tagging_message`, you can continue to do so, but if you want to specify a custom tag name and tag message, you can now use the `tag_name` and `tagging_message` option. +(Specifying a `tagging_message` without a `tag_name` will create a tag with the name and message both set to the value of `tagging_message`.) + +## From v5 to v6 + +The following options have been removed from git-auto-commit and can be removed from your workflows. + +- `create_branch` (git-auto-commit no longer switches branches locally during a workflow run) +- `skip_fetch` +- `skip_checkout` + diff --git a/action.yml b/action.yml index c57a5088..ed7e85fa 100644 --- a/action.yml +++ b/action.yml @@ -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_name: + 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: @@ -64,6 +68,10 @@ inputs: description: Skip the call to git-checkout. required: false default: false + skip_push: + description: Skip the call to git-push. + required: false + default: false disable_globbing: description: Stop the shell from expanding filenames (https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html) default: false @@ -78,6 +86,7 @@ inputs: description: Internal use only! Path to git binary used to check if git is available. (Don't change this!) default: git + outputs: changes_detected: description: Value is "true", if the repository was dirty and file changes have been detected. Value is "false", if no changes have been detected. @@ -87,7 +96,7 @@ outputs: description: Value is "true", if a git tag was created using the `create_git_tag_only`-input. runs: - using: 'node20' + using: 'node24' main: 'index.js' branding: diff --git a/entrypoint.sh b/entrypoint.sh index 22098dfc..09fb6b73 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -30,6 +30,11 @@ _main() { _check_if_git_is_available _switch_to_repository + + _check_if_is_git_repository + + _check_if_repository_is_in_detached_state + if "$INPUT_CREATE_GIT_TAG_ONLY"; then _log "debug" "Create git tag only"; _set_github_output "create_git_tag_only" "true" @@ -90,11 +95,25 @@ _git_is_dirty() { gitStatusMessage="$((git status -s $INPUT_STATUS_OPTIONS -- ${INPUT_FILE_PATTERN_EXPANDED:+${INPUT_FILE_PATTERN_EXPANDED[@]}} >/dev/null ) 2>&1)"; # shellcheck disable=SC2086 gitStatus="$(git status -s $INPUT_STATUS_OPTIONS -- ${INPUT_FILE_PATTERN_EXPANDED:+${INPUT_FILE_PATTERN_EXPANDED[@]}})"; - if [ $? -ne 0 ]; then - _log "error" "git-status failed with:<$gitStatusMessage>"; + [ -n "$gitStatus" ] +} + +_check_if_is_git_repository() { + if [ -d ".git" ]; then + _log "debug" "Repository found."; + else + _log "error" "Not a git repository. Please make sure to run this action in a git repository. Adjust the `repository` input if necessary."; exit 1; fi - [ -n "$gitStatus" ] +} + +_check_if_repository_is_in_detached_state() { + if [ -z "$(git symbolic-ref HEAD)" ] + then + _log "warning" "Repository is in a detached HEAD state. git-auto-commit will likely handle this automatically. To avoid it, check out a branch using the ref option in actions/checkout."; + else + _log "debug" "Repository is on a branch."; + fi } _switch_to_branch() { @@ -104,6 +123,7 @@ _switch_to_branch() { if "$INPUT_SKIP_FETCH"; then _log "debug" "git-fetch will not be executed."; else + _log "debug" "git-fetch will be executed."; git fetch --depth=1; fi @@ -111,6 +131,7 @@ _switch_to_branch() { if "$INPUT_SKIP_CHECKOUT"; then _log "debug" "git-checkout will not be executed."; else + _log "debug" "git-checkout will be executed."; # Create new local branch if `create_branch`-input is true if "$INPUT_CREATE_BRANCH"; then # shellcheck disable=SC2086 @@ -155,18 +176,27 @@ _local_commit() { } _tag_commit() { + echo "INPUT_TAG_NAME: ${INPUT_TAG_NAME}" 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_NAME" ] || [ -n "$INPUT_TAGGING_MESSAGE" ]; then + INTERNAL_TAG=${INPUT_TAG_NAME:-$INPUT_TAGGING_MESSAGE} + INTERNAL_TAGGING_MESSAGE=${INPUT_TAGGING_MESSAGE:-$INPUT_TAG_NAME} + + _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 } _push_to_github() { + if "$INPUT_SKIP_PUSH"; then + _log "debug" "git-push will not be executed."; + return + fi + + echo "INPUT_BRANCH value: $INPUT_BRANCH"; echo "INPUT_PUSH_OPTIONS: ${INPUT_PUSH_OPTIONS}"; _log "debug" "Apply push options ${INPUT_PUSH_OPTIONS}"; @@ -176,8 +206,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_NAME` or `$INPUT_TAGGING_MESSAGE` is set + if [ -n "$INPUT_TAG_NAME" ] || [ -n "$INPUT_TAGGING_MESSAGE" ] then _log "debug" "git push origin --tags"; git push origin --follow-tags --atomic ${INPUT_PUSH_OPTIONS:+"${INPUT_PUSH_OPTIONS_ARRAY[@]}"}; diff --git a/package-lock.json b/package-lock.json index 38b34a5e..8a8dfcf3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,13 +5,15 @@ "packages": { "": { "devDependencies": { - "bats": "^1.11.1", + "bats": "^1.13.0", "bats-assert": "ztombol/bats-assert", "bats-support": "ztombol/bats-support" } }, "node_modules/bats": { - "version": "1.11.1", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/bats/-/bats-1.13.0.tgz", + "integrity": "sha512-giSYKGTOcPZyJDbfbTtzAedLcNWdjCLbXYU3/MwPnjyvDXzu6Dgw8d2M+8jHhZXSmsCMSQqCp+YBsJ603UO4vQ==", "dev": true, "license": "MIT", "bin": { diff --git a/package.json b/package.json index ad49ca30..e45dac4e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "devDependencies": { - "bats": "^1.11.1", + "bats": "^1.13.0", "bats-assert": "ztombol/bats-assert", "bats-support": "ztombol/bats-support" }, diff --git a/tests/git-auto-commit.bats b/tests/git-auto-commit.bats index f1fb4b8e..9e39f7ea 100644 --- a/tests/git-auto-commit.bats +++ b/tests/git-auto-commit.bats @@ -32,11 +32,13 @@ setup() { export INPUT_COMMIT_USER_NAME="Test Suite" export INPUT_COMMIT_USER_EMAIL="test@github.com" export INPUT_COMMIT_AUTHOR="Test Suite " + export INPUT_TAG_NAME="" export INPUT_TAGGING_MESSAGE="" export INPUT_PUSH_OPTIONS="" export INPUT_SKIP_DIRTY_CHECK=false export INPUT_SKIP_FETCH=false export INPUT_SKIP_CHECKOUT=false + export INPUT_SKIP_PUSH=false export INPUT_DISABLE_GLOBBING=false export INPUT_CREATE_BRANCH=false export INPUT_INTERNAL_GIT_BINARY=git @@ -121,8 +123,9 @@ cat_github_output() { assert_line "INPUT_FILE_PATTERN: ." assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " + assert_line "INPUT_TAG_NAME: " 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}" @@ -144,8 +147,9 @@ cat_github_output() { assert_line "INPUT_FILE_PATTERN: ." assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " + assert_line "INPUT_TAG_NAME: " 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}" @@ -193,7 +197,6 @@ cat_github_output() { assert_failure assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" - assert_line "INPUT_BRANCH value: ${FAKE_DEFAULT_BRANCH}" assert_line "INPUT_FILE_PATTERN: ." assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " @@ -292,7 +295,8 @@ cat_github_output() { } @test "It creates a tag with the commit" { - INPUT_TAGGING_MESSAGE="v1.0.0" + INPUT_TAG_NAME="v1.0.0" + INPUT_TAGGING_MESSAGE="MyProduct v1.0.0" touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt @@ -300,13 +304,15 @@ cat_github_output() { assert_success - assert_line "INPUT_TAGGING_MESSAGE: v1.0.0" - assert_line "::debug::Create tag v1.0.0" + assert_line "INPUT_TAG_NAME: 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 @@ -347,6 +353,24 @@ cat_github_output() { assert_equal $current_sha $remote_sha } +@test "If SKIP_PUSH is true git-push will not be called" { + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + INPUT_SKIP_PUSH=true + + run git_auto_commit + + assert_success + + assert_line "::debug::git-push will not be executed." + + # Assert that the sha values are not 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})" + + refute [assert_equal $current_sha $remote_sha] +} + @test "It can checkout a different branch" { # Create foo-branch and then immediately switch back to ${FAKE_DEFAULT_BRANCH} git checkout -b foo @@ -387,9 +411,11 @@ 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_NAME="v2.0.0" + INPUT_TAGGING_MESSAGE="MyProduct v2.0.0" + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt @@ -397,8 +423,8 @@ cat_github_output() { assert_success - assert_line "INPUT_TAGGING_MESSAGE: v2.0.0" - assert_line "::debug::Create tag v2.0.0" + assert_line "INPUT_TAG_NAME: 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 @@ -438,7 +464,9 @@ 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_NAME="v2.0.0" + INPUT_TAGGING_MESSAGE="MyProduct v2.0.0" + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt @@ -446,8 +474,8 @@ cat_github_output() { assert_success - assert_line "INPUT_TAGGING_MESSAGE: v2.0.0" - assert_line "::debug::Create tag v2.0.0" + assert_line "INPUT_TAG_NAME: 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 @@ -471,7 +499,9 @@ cat_github_output() { git checkout ${FAKE_DEFAULT_BRANCH} INPUT_BRANCH="a-new-branch" - INPUT_TAGGING_MESSAGE="v2.0.0" + INPUT_TAG_NAME="v2.0.0" + INPUT_TAGGING_MESSAGE="MyProduct v2.0.0" + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt @@ -479,8 +509,8 @@ cat_github_output() { assert_success - assert_line "INPUT_TAGGING_MESSAGE: v2.0.0" - assert_line "::debug::Create tag v2.0.0" + assert_line "INPUT_TAG_NAME: 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 @@ -579,9 +609,8 @@ cat_github_output() { assert_line "changes_detected=true" } -@test "script fails to push commit to new branch that does not exist yet" { +@test "It pushes commit to new branch that does not exist yet" { INPUT_BRANCH="not-existend-branch" - INPUT_CREATE_BRANCH=false run git branch refute_line --partial "not-existend-branch" @@ -591,27 +620,28 @@ cat_github_output() { touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + INPUT_SKIP_CHECKOUT=true + run git_auto_commit - assert_failure + assert_success assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" assert_line "INPUT_BRANCH value: not-existend-branch" - assert_line "fatal: invalid reference: not-existend-branch" run git branch + assert_line --partial ${FAKE_DEFAULT_BRANCH} refute_line --partial "not-existend-branch" run git branch -r - refute_line --partial "origin/not-existend-branch" + assert_line --partial "origin/not-existend-branch" run cat_github_output assert_line "changes_detected=true" } -@test "It creates new local branch and pushes the new branch to remote" { +@test "It does not create new local branch and pushes the commit to a new branch on remote" { INPUT_BRANCH="not-existend-branch" - INPUT_CREATE_BRANCH=true run git branch refute_line --partial "not-existend-branch" @@ -621,6 +651,8 @@ cat_github_output() { touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + INPUT_SKIP_CHECKOUT=true + run git_auto_commit assert_success @@ -630,15 +662,19 @@ cat_github_output() { assert_line "INPUT_FILE_PATTERN: ." assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " + assert_line "INPUT_TAG_NAME: " 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" + # Assert that local repo is still on default branch and not on new branch. run git branch - assert_line --partial "not-existend-branch" + assert_line --partial ${FAKE_DEFAULT_BRANCH} + refute_line --partial "not-existend-branch" + # Assert branch has been created on remote run git branch -r assert_line --partial "origin/not-existend-branch" @@ -647,50 +683,7 @@ cat_github_output() { assert_line -e "commit_hash=[0-9a-f]{40}$" } -@test "it does not create new local branch if local branch already exists" { - - git checkout -b not-existend-remote-branch - git checkout ${FAKE_DEFAULT_BRANCH} - - INPUT_BRANCH="not-existend-remote-branch" - INPUT_CREATE_BRANCH=true - - run git branch - assert_line --partial "not-existend-remote-branch" - - run git branch -r - refute_line --partial "origin/not-existend-remote-branch" - - touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt - - run git_auto_commit - - assert_success - - assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" - assert_line "INPUT_BRANCH value: not-existend-remote-branch" - assert_line "INPUT_FILE_PATTERN: ." - assert_line "INPUT_COMMIT_OPTIONS: " - assert_line "::debug::Apply commit options " - assert_line "INPUT_TAGGING_MESSAGE: " - assert_line "No tagging message supplied. No tag will be added." - assert_line "INPUT_PUSH_OPTIONS: " - assert_line "::debug::Apply push options " - assert_line "::debug::Push commit to remote branch not-existend-remote-branch" - - run git branch - assert_line --partial "not-existend-remote-branch" - - run git branch -r - assert_line --partial "origin/not-existend-remote-branch" - - run cat_github_output - assert_line "changes_detected=true" - assert_line -e "commit_hash=[0-9a-f]{40}$" -} - -@test "it creates new local branch and pushes branch to remote even if the remote branch already exists" { - +@test "It creates new local branch and pushes branch to remote even if the remote branch already exists" { # Create `existing-remote-branch` on remote with changes the local repository does not yet have cd $FAKE_TEMP_LOCAL_REPOSITORY git checkout -b "existing-remote-branch" @@ -707,7 +700,7 @@ cat_github_output() { cd $FAKE_LOCAL_REPOSITORY INPUT_BRANCH="existing-remote-branch" - INPUT_CREATE_BRANCH=true + INPUT_SKIP_CHECKOUT=true run git branch refute_line --partial "existing-remote-branch" @@ -728,20 +721,22 @@ cat_github_output() { assert_line "INPUT_FILE_PATTERN: ." assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " + assert_line "INPUT_TAG_NAME: " 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" run git branch - assert_line --partial "existing-remote-branch" + assert_line --partial ${FAKE_DEFAULT_BRANCH} + refute_line --partial "existing-remote-branch" run git branch -r assert_line --partial "origin/existing-remote-branch" # Assert that branch "existing-remote-branch" was updated on remote - current_sha="$(git rev-parse --verify --short existing-remote-branch)" + current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})" remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)" assert_equal $current_sha $remote_sha @@ -751,7 +746,7 @@ cat_github_output() { assert_line -e "commit_hash=[0-9a-f]{40}$" } -@test "script fails if new local branch is checked out and push fails as remote has newer commits than local" { +@test "It fails if local branch is behind remote and when remote has newer commits and skip_checkout is set to true" { # Create `existing-remote-branch` on remote with changes the local repository does not yet have cd $FAKE_TEMP_LOCAL_REPOSITORY git checkout -b "existing-remote-branch" @@ -768,7 +763,7 @@ cat_github_output() { cd $FAKE_LOCAL_REPOSITORY INPUT_BRANCH="existing-remote-branch" - INPUT_CREATE_BRANCH=true + INPUT_SKIP_CHECKOUT=true run git branch refute_line --partial "existing-remote-branch" @@ -783,23 +778,24 @@ cat_github_output() { assert_failure - assert_line "hint: Updates were rejected because the tip of your current branch is behind" + assert_line "hint: Updates were rejected because a pushed branch tip is behind its remote" # Assert that branch exists locally and on remote run git branch - assert_line --partial "existing-remote-branch" + assert_line --partial ${FAKE_DEFAULT_BRANCH} + refute_line --partial "existing-remote-branch" run git branch -r assert_line --partial "origin/existing-remote-branch" # Assert that branch "existing-remote-branch" was not updated on remote - current_sha="$(git rev-parse --verify --short existing-remote-branch)" + current_sha="$(git rev-parse --verify --short ${FAKE_DEFAULT_BRANCH})" remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)" refute [assert_equal $current_sha $remote_sha] } -@test "It pushes commit to remote if branch already exists and local repo is behind its remote counterpart" { +@test "It fails to push commit to remote if branch already exists and local repo is behind its remote counterpart and SKIP_CHECKOUT is used" { # Create `new-branch` on remote with changes the local repository does not yet have cd $FAKE_TEMP_LOCAL_REPOSITORY @@ -818,8 +814,9 @@ cat_github_output() { cd $FAKE_LOCAL_REPOSITORY INPUT_BRANCH="new-branch" + INPUT_SKIP_CHECKOUT=true - # Assert that local remote does not know have "new-branch" locally nor does + # Assert that local remote does not have a "new-branch"-branch nor does # know about the remote branch. run git branch refute_line --partial "new-branch" @@ -831,16 +828,12 @@ cat_github_output() { run git_auto_commit - assert_success + assert_failure assert_line "INPUT_BRANCH value: new-branch" assert_line --partial "::debug::Push commit to remote branch new-branch" - # Assert that branch "new-branch" was updated on remote - current_sha="$(git rev-parse --verify --short new-branch)" - remote_sha="$(git rev-parse --verify --short origin/new-branch)" - - assert_equal $current_sha $remote_sha + assert_line --partial "Updates were rejected because a pushed branch tip is behind its remote" } @test "throws fatal error if file pattern includes files that do not exist" { @@ -1005,7 +998,7 @@ cat_github_output() { assert_line --partial "Working tree clean. Nothing to commit." assert_line --partial "new-file-2.txt" - assert_line --partial "new-file-3.txt" + # assert_line --partial "new-file-3.txt" # Changes are not detected run cat_github_output @@ -1039,7 +1032,7 @@ cat_github_output() { assert_line --partial "warning: in the working copy of 'new-file-2.txt', LF will be replaced by CRLF the next time Git touches it" assert_line --partial "new-file-2.txt" - assert_line --partial "new-file-3.txt" + # assert_line --partial "new-file-3.txt" # Changes are detected run cat_github_output @@ -1061,8 +1054,9 @@ cat_github_output() { assert_line "INPUT_FILE_PATTERN: ." assert_line "INPUT_COMMIT_OPTIONS: " assert_line "::debug::Apply commit options " + assert_line "INPUT_TAG_NAME: " 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}" @@ -1124,12 +1118,32 @@ END run git_auto_commit assert_failure; - assert_line "::error::git-status failed with:" + assert_line "::error::Not a git repository. Please make sure to run this action in a git repository. Adjust the `repository` input if necessary." +} + +@test "It detects if the repository is in a detached state and logs a warning" { + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_success + + # Bring local repository into a detached state + prev_commit=$(git rev-parse HEAD~1); + git checkout "$prev_commit"; + + touch "${FAKE_TEMP_LOCAL_REPOSITORY}"/remote-files{4,5,6}.txt + + run git_auto_commit + + assert_success; + assert_line "::warning::Repository is in a detached HEAD state. git-auto-commit will likely handle this automatically. To avoid it, check out a branch using the ref option in actions/checkout." } @test "it creates a tag if create_git_tag_only is set to true and a message has been supplied" { INPUT_CREATE_GIT_TAG_ONLY=true - INPUT_TAGGING_MESSAGE=v1.0.0 + INPUT_TAG_NAME=v1.0.0 + INPUT_TAGGING_MESSAGE="MyProduct v1.0.0" run git_auto_commit @@ -1137,8 +1151,8 @@ END 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}" @@ -1149,8 +1163,8 @@ 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 @@ -1158,14 +1172,16 @@ END @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_NAME="" INPUT_TAGGING_MESSAGE="" run git_auto_commit assert_success + assert_line "INPUT_TAG_NAME: " 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 @@ -1177,3 +1193,331 @@ END run git tag assert_output "" } + +@test "script fails to push commit to new branch that does not exist yet" { + INPUT_BRANCH="not-existend-branch" + INPUT_CREATE_BRANCH=false + + run git branch + refute_line --partial "not-existend-branch" + + run git branch -r + refute_line --partial "origin/not-existend-branch" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_failure + + assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" + assert_line "INPUT_BRANCH value: not-existend-branch" + assert_line "fatal: invalid reference: not-existend-branch" + + run git branch + refute_line --partial "not-existend-branch" + + run git branch -r + refute_line --partial "origin/not-existend-branch" + + run cat_github_output + assert_line "changes_detected=true" +} + +@test "It creates new local branch and pushes the new branch to remote" { + INPUT_BRANCH="not-existend-branch" + INPUT_CREATE_BRANCH=true + + run git branch + refute_line --partial "not-existend-branch" + + run git branch -r + refute_line --partial "origin/not-existend-branch" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_success + + assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" + assert_line "INPUT_BRANCH value: not-existend-branch" + assert_line "INPUT_FILE_PATTERN: ." + assert_line "INPUT_COMMIT_OPTIONS: " + assert_line "::debug::Apply commit options " + assert_line "INPUT_TAGGING_MESSAGE: " + assert_line "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" + + run git branch + assert_line --partial "not-existend-branch" + + run git branch -r + assert_line --partial "origin/not-existend-branch" + + run cat_github_output + assert_line "changes_detected=true" + assert_line -e "commit_hash=[0-9a-f]{40}$" +} + +@test "It does not create new local branch if local branch already exists and SKIP_CHECKOUT is true" { + git checkout -b not-existend-remote-branch + git checkout ${FAKE_DEFAULT_BRANCH} + + INPUT_BRANCH="not-existend-remote-branch" + INPUT_SKIP_CHECKOUT=true + + run git branch + assert_line --partial "not-existend-remote-branch" + + run git branch -r + refute_line --partial "origin/not-existend-remote-branch" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_success + + assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" + assert_line "INPUT_BRANCH value: not-existend-remote-branch" + assert_line "INPUT_FILE_PATTERN: ." + assert_line "INPUT_COMMIT_OPTIONS: " + assert_line "::debug::Apply commit options " + assert_line "INPUT_TAGGING_MESSAGE: " + assert_line "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" + + # Assert checked out branch is still the same. + run git rev-parse --abbrev-ref HEAD + assert_line --partial ${FAKE_DEFAULT_BRANCH} + refute_line --partial "not-existend-remote-branch" + + run git branch + assert_line --partial "not-existend-remote-branch" + + run git branch -r + assert_line --partial "origin/not-existend-remote-branch" + + run cat_github_output + assert_line "changes_detected=true" + assert_line -e "commit_hash=[0-9a-f]{40}$" +} + +@test "it creates new local branch and pushes branch to remote even if the remote branch already exists" { + + # Create `existing-remote-branch` on remote with changes the local repository does not yet have + cd $FAKE_TEMP_LOCAL_REPOSITORY + git checkout -b "existing-remote-branch" + touch new-branch-file.txt + git add new-branch-file.txt + git commit -m "Add additional file" + git push origin existing-remote-branch + + run git branch + assert_line --partial "existing-remote-branch" + + # --------- + # Switch to our regular local repository and run `git-auto-commit` + cd $FAKE_LOCAL_REPOSITORY + + INPUT_BRANCH="existing-remote-branch" + INPUT_CREATE_BRANCH=true + + run git branch + refute_line --partial "existing-remote-branch" + + run git fetch --all + run git pull origin existing-remote-branch + run git branch -r + assert_line --partial "origin/existing-remote-branch" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_success + + assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}" + assert_line "INPUT_BRANCH value: existing-remote-branch" + assert_line "INPUT_FILE_PATTERN: ." + assert_line "INPUT_COMMIT_OPTIONS: " + assert_line "::debug::Apply commit options " + assert_line "INPUT_TAGGING_MESSAGE: " + assert_line "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" + + run git branch + assert_line --partial "existing-remote-branch" + + run git branch -r + assert_line --partial "origin/existing-remote-branch" + + # Assert that branch "existing-remote-branch" was updated on remote + current_sha="$(git rev-parse --verify --short existing-remote-branch)" + remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)" + + assert_equal $current_sha $remote_sha + + run cat_github_output + assert_line "changes_detected=true" + assert_line -e "commit_hash=[0-9a-f]{40}$" +} + +@test "script fails if new local branch is checked out and push fails as remote has newer commits than local" { + # Create `existing-remote-branch` on remote with changes the local repository does not yet have + cd $FAKE_TEMP_LOCAL_REPOSITORY + git checkout -b "existing-remote-branch" + touch new-branch-file.txt + git add new-branch-file.txt + git commit -m "Add additional file" + git push origin existing-remote-branch + + run git branch + assert_line --partial "existing-remote-branch" + + # --------- + # Switch to our regular local repository and run `git-auto-commit` + cd $FAKE_LOCAL_REPOSITORY + + INPUT_BRANCH="existing-remote-branch" + INPUT_CREATE_BRANCH=true + + run git branch + refute_line --partial "existing-remote-branch" + + run git fetch --all + run git branch -r + assert_line --partial "origin/existing-remote-branch" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_failure + + assert_line "hint: Updates were rejected because the tip of your current branch is behind" + + # Assert that branch exists locally and on remote + run git branch + assert_line --partial "existing-remote-branch" + + run git branch -r + assert_line --partial "origin/existing-remote-branch" + + # Assert that branch "existing-remote-branch" was not updated on remote + current_sha="$(git rev-parse --verify --short existing-remote-branch)" + remote_sha="$(git rev-parse --verify --short origin/existing-remote-branch)" + + refute [assert_equal $current_sha $remote_sha] +} + +@test "It pushes commit to remote if branch already exists and local repo is behind its remote counterpart" { + # Create `new-branch` on remote with changes the local repository does not yet have + cd $FAKE_TEMP_LOCAL_REPOSITORY + + git checkout -b "new-branch" + touch new-branch-file.txt + git add new-branch-file.txt + + git commit --quiet -m "Add additional file" + git push origin new-branch + + run git branch -r + assert_line --partial "origin/new-branch" + + # --------- + # Switch to our regular local repository and run `git-auto-commit` + cd $FAKE_LOCAL_REPOSITORY + + INPUT_BRANCH="new-branch" + + # Assert that local remote does not know have "new-branch" locally nor does + # know about the remote branch. + run git branch + refute_line --partial "new-branch" + + run git branch -r + refute_line --partial "origin/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 +} + +@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_NAME: " + 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_NAME="v1.0.0" + + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_success + + assert_line "INPUT_TAG_NAME: 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 +}