From c78c155cf009f5bf4f726b032f19644586726efa Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Tue, 14 Dec 2021 02:01:31 -0500 Subject: [PATCH] [PR 2]: Added support for listing all modified files. (#285) * Added support for listing all modified files. * Updated the test. --- .github/workflows/test.yml | 87 +++++++++++++++++++++++++++++++++++++- README.md | 8 +++- action.yml | 14 +++++- entrypoint.sh | 76 ++++++++++++++++++++++++--------- 4 files changed, 159 insertions(+), 26 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ad6777b4..5e6eb981 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -236,6 +236,15 @@ jobs: fi shell: bash + - name: Verify any_modified for specific files + if: "!contains(steps.changed-files-specific.outputs.all_modified_files, 'action.yml') && !contains(steps.changed-files-specific.outputs.all_modified_files, '.github/workflows/test.yml')" + run: | + if [[ "${{ steps.changed-files-specific.outputs.any_modified }}" != "false" ]]; then + echo "Invalid output: Expected (false) got (${{ steps.changed-files-specific.outputs.any_modified }})" + exit 1 + fi + shell: + bash - name: Verify any_deleted for specific files if: "!contains(steps.changed-files-specific.outputs.deleted_files, 'action.yml') && !contains(steps.changed-files-specific.outputs.deleted_files, '.github/workflows/test.yml')" run: | @@ -252,10 +261,22 @@ jobs: files: | entrypoint.sh *.sh - - name: Verify all_changed_and_modified_files files has no duplicates + - name: Verify all_changed_files files has no duplicates if: contains(steps.changed-files-specific-duplicate-output.outputs.all_changed_files, 'entrypoint.sh') run: | - ALL_CHANGED_AND_MODIFIED_FILES=(${{ steps.changed-files-specific-duplicate-output.outputs.all_changed_files }}) + ALL_CHANGED_FILES=(${{ steps.changed-files-specific-duplicate-output.outputs.all_changed_files }}) + UNIQUE_ALL_CHANGED_FILES=$(echo "$ALL_CHANGED_FILES" | tr ' ' '\n' | sort -u | xargs) + + if [[ "$ALL_CHANGED_FILES[@]" != "$UNIQUE_ALL_CHANGED_FILES[@]" ]]; then + echo "Duplicate output: Expected "$UNIQUE_ALL_CHANGED_FILES" got $ALL_CHANGED_FILES" + exit 1 + fi + shell: + bash + - name: Verify all_changed_and_modified_files files has no duplicates + if: contains(steps.changed-files-specific-duplicate-output.outputs.all_changed_and_modified_files, 'entrypoint.sh') + run: | + ALL_CHANGED_AND_MODIFIED_FILES=(${{ steps.changed-files-specific-duplicate-output.outputs.all_changed_and_modified_files }}) UNIQUE_ALL_CHANGED_AND_MODIFIED_FILES=$(echo "$ALL_CHANGED_AND_MODIFIED_FILES" | tr ' ' '\n' | sort -u | xargs) if [[ "$ALL_CHANGED_AND_MODIFIED_FILES[@]" != "$UNIQUE_ALL_CHANGED_AND_MODIFIED_FILES[@]" ]]; then @@ -264,6 +285,18 @@ jobs: fi shell: bash + - name: Verify all_modified_files files has no duplicates + if: contains(steps.changed-files-specific-duplicate-output.outputs.all_modified_files, 'entrypoint.sh') + run: | + ALL_MODIFIED_FILES=(${{ steps.changed-files-specific-duplicate-output.outputs.all_modified_files }}) + UNIQUE_ALL_MODIFIED_FILES=$(echo "$ALL_MODIFIED_FILES" | tr ' ' '\n' | sort -u | xargs) + + if [[ "$ALL_MODIFIED_FILES[@]" != "$UNIQUE_ALL_MODIFIED_FILES[@]" ]]; then + echo "Duplicate output: Expected "$UNIQUE_ALL_MODIFIED_FILES" got $ALL_MODIFIED_FILES" + exit 1 + fi + shell: + bash - name: Run changed-files with specific files comma separator id: changed-files-specific-comma uses: ./ @@ -286,6 +319,15 @@ jobs: fi shell: bash + - name: Verify any_modified files comma separator + if: "!contains(steps.changed-files-specific-comma.outputs.all_modified_files, 'action.yml') && !contains(steps.changed-files-specific-comma.outputs.all_modified_files, '.github/workflows/test.yml')" + run: | + if [[ "${{ steps.changed-files-specific-comma.outputs.any_modified }}" != "false" ]]; then + echo "Invalid output: Expected (false) got (${{ steps.changed-files-specific-comma.outputs.any_modified }})" + exit 1 + fi + shell: + bash - name: Verify any_deleted files comma separator if: "!contains(steps.changed-files-specific-comma.outputs.deleted_files, 'action.yml') && !contains(steps.changed-files-specific-comma.outputs.deleted_files, '.github/workflows/test.yml')" run: | @@ -317,6 +359,15 @@ jobs: fi shell: bash + - name: Verify any_modified files comma separator + if: "!contains(steps.changed-files-specific-pipe.outputs.all_modified_files, 'action.yml') && !contains(steps.changed-files-specific-pipe.outputs.all_modified_files, '.github/workflows/test.yml')" + run: | + if [[ "${{ steps.changed-files-specific-pipe.outputs.any_modified }}" != "false" ]]; then + echo "Invalid output: Expected (false) got (${{ steps.changed-files-specific-pipe.outputs.any_modified }})" + exit 1 + fi + shell: + bash - name: Verify any_deleted files comma separator if: "!contains(steps.changed-files-specific-pipe.outputs.deleted_files, 'action.yml') && !contains(steps.changed-files-specific-pipe.outputs.deleted_files, '.github/workflows/test.yml')" run: | @@ -348,6 +399,15 @@ jobs: fi shell: bash + - name: Verify any_modified files comma separator + if: "!contains(steps.changed-files-specific-forward-slash.outputs.all_modified_files, 'action.yml') && !contains(steps.changed-files-specific-forward-slash.outputs.all_modified_files, '.github/workflows/test.yml')" + run: | + if [[ "${{ steps.changed-files-specific.outputs.any_modified }}" != "false" ]]; then + echo "Invalid output: Expected (false) got (${{ steps.changed-files-specific-forward-slash.outputs.any_modified }})" + exit 1 + fi + shell: + bash - name: Verify any_deleted files comma separator if: "!contains(steps.changed-files-specific-forward-slash.outputs.deleted_files, 'action.yml') && !contains(steps.changed-files-specific-forward-slash.outputs.deleted_files, '.github/workflows/test.yml')" run: | @@ -380,6 +440,20 @@ jobs: fi shell: bash + - name: Verify any_modified from source files + if: | + ( + !contains(steps.changed-files-specific-source-file.outputs.all_modified_files, 'action.yml') && + !contains(steps.changed-files-specific-source-file.outputs.all_modified_files, '.github/workflows/test.yml') && + !contains(steps.changed-files-specific-source-file.outputs.all_modified_files, '.github/workflows/rebase.yml') + ) + run: | + if [[ "${{ steps.changed-files-specific-source-file.outputs.any_modified }}" != "false" ]]; then + echo "Invalid output: Expected (false) got (${{ steps.changed-files-specific-source-file.outputs.any_modified }})" + exit 1 + fi + shell: + bash - name: Verify any_deleted from source files if: "!contains(steps.changed-files-specific-source-file.outputs.deleted_files, 'action.yml') && !contains(steps.changed-files-specific-source-file.outputs.deleted_files, '.github/workflows/test.yml')" run: | @@ -415,6 +489,15 @@ jobs: fi shell: bash + - name: Verify any_modified files comma separator + if: "!contains(steps.changed-files-specific-comma-source-file.outputs.all_modified_files, 'action.yml') && !contains(steps.changed-files-specific-comma-source-file.outputs.all_modified_files, '.github/workflows/test.yml')" + run: | + if [[ "${{ steps.changed-files-specific-comma-source-file.outputs.any_modified }}" != "false" ]]; then + echo "Invalid output: Expected (false) got (${{ steps.changed-files-specific-comma-source-file.outputs.any_modified }})" + exit 1 + fi + shell: + bash - name: Verify any_deleted files with comma separator if: "!contains(steps.changed-files-specific-comma-source-file.outputs.deleted_files, 'action.yml') && !contains(steps.changed-files-specific-comma-source-file.outputs.deleted_files, '.github/workflows/test.yml')" run: | diff --git a/README.md b/README.md index 2350e717..e17e7886 100644 --- a/README.md +++ b/README.md @@ -98,12 +98,16 @@ Support this project with a :star: | Output | type | example | description | |:--------------------:|:------------:|:----------------------------------:|:----------------------------------------:| | any\_changed | `string` | `true` OR `false` | Returns `true` when any
of the filenames provided using
the `files` input has changed.
i.e. *using a combination of all added,
copied, modified and renamed files (ACMR)* | -| only\_changed | `string` | `true` OR `false` | Returns `true` when only
files provided using
the `files` input have changed. (ACMR) | +| only\_changed | `string` | `true` OR `false` | Returns `true` when only
files provided using
the `files` input has changed. (ACMR) | | other\_changed\_files | `string` | `'new.txt path/to/file.png ...'` | Select all other changed files
not listed in the files input
i.e. *a combination of all added,
copied and modified files (ACMR)* | +| any\_modified | `string` | `true` OR `false` | Returns `true` when any
of the filenames provided using
the `files` input has been modified.
i.e. *using a combination of all added,
copied, modified, renamed, and deleted files (ACMRD)* | +| only\_modified | `string` | `true` OR `false` | Returns `true` when only
files provided using
the `files` input has been modified. (ACMRD) | +| other\_modified\_files | `string` | `'new.txt path/to/file.png ...'` | Select all other modified files
not listed in the files input
i.e. *a combination of all added,
copied, modified, and deleted files (ACMRD)* | | any\_deleted | `string` | `true` OR `false` | Returns `true` when any
of the filenames provided using
the `files` input has been deleted. (D) | | only\_deleted | `string` | `true` OR `false` | Returns `true` when only
files provided using
the `files` input has been deleted. (D) | | other\_deleted\_files | `string` | `'new.txt path/to/file.png ...'` | Select all other deleted files
not listed in the files input
i.e. *a combination of all deleted files (D)* | -| all\_modified\_files | `string` | `'new.txt path/to/file.png ...'` | Select all modified files
i.e. *a combination of all added,
copied, modified and renamed files (ACMR)* | +| all\_changed\_files | `string` | `'new.txt path/to/file.png ...'` | Select all changed files
i.e. *a combination of all added,
copied, modified and renamed files (ACMR)* | +| all\_modified\_files | `string` | `'new.txt path/to/file.png ...'` | Select all changed files
i.e. *a combination of all added,
copied, modified, renamed and deleted files (ACMRD)* | | all\_changed\_and\_modified\_files | `string` | `'new.txt path/to/file.png ...'` | Select all changed
and modified files
i.e. *a combination of (ACMRDTUX)* | | added\_files | `string` | `'new.txt path/to/file.png ...'` | Select only files that are Added (A) | | copied\_files | `string` | `'new.txt path/to/file.png ...'` | Select only files that are Copied (C) | diff --git a/action.yml b/action.yml index 95be0773..52c3dc88 100644 --- a/action.yml +++ b/action.yml @@ -63,7 +63,7 @@ outputs: description: List of all changed files. value: ${{ steps.changed-files.outputs.all_changed_and_modified_files }} all_changed_files: - description: List of all copied modified and added files. + description: List of all copied, modified, and added files. value: ${{ steps.changed-files.outputs.all_changed_files }} any_changed: description: Return true only when any files provided using the files input have changed. @@ -74,6 +74,18 @@ outputs: other_changed_files: description: Return list of changed files not listed in the files input. value: ${{ steps.changed-files.outputs.other_changed_files }} + all_modified_files: + description: List of all copied, modified, added and deleted files. + value: ${{ steps.changed-files.outputs.all_modified_files }} + any_modified: + description: Return true only when any files provided using the files input have been modified. + value: ${{ steps.changed-files.outputs.any_modified }} + only_modified: + description: Return true when all files provided using the files input have been modified. + value: ${{ steps.changed-files.outputs.only_modified }} + other_modified_files: + description: Return list of modified files not listed in the files input. + value: ${{ steps.changed-files.outputs.other_modified_files }} any_deleted: description: Return true only when any files provided using the files input have been deleted. value: ${{ steps.changed-files.outputs.any_deleted }} diff --git a/entrypoint.sh b/entrypoint.sh index ac1f5b2c..6be4cb55 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -104,6 +104,7 @@ if [[ -z "${INPUT_FILES[*]}" ]]; then UNKNOWN=$(git diff --diff-filter=X --name-only "$PREVIOUS_SHA" "$CURRENT_SHA" | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') ALL_CHANGED_AND_MODIFIED=$(git diff --diff-filter="*ACDMRTUX" --name-only "$PREVIOUS_SHA" "$CURRENT_SHA" | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') ALL_CHANGED=$(git diff --diff-filter="ACMR" --name-only "$PREVIOUS_SHA" "$CURRENT_SHA" | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') + ALL_MODIFIED=$(git diff --diff-filter="ACMRD" --name-only "$PREVIOUS_SHA" "$CURRENT_SHA" | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') else echo "Input files: ${INPUT_FILES[*]}" @@ -120,18 +121,11 @@ else UNKNOWN=$(git diff --diff-filter=X --name-only "$PREVIOUS_SHA" "$CURRENT_SHA" | grep -E "(${FILES})" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') ALL_CHANGED_AND_MODIFIED=$(git diff --diff-filter="*ACDMRTUX" --name-only "$PREVIOUS_SHA" "$CURRENT_SHA" | grep -E "(${FILES})" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') ALL_CHANGED=$(git diff --diff-filter="ACMR" --name-only "$PREVIOUS_SHA" "$CURRENT_SHA" | grep -E "(${FILES})" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') + ALL_MODIFIED=$(git diff --diff-filter="ACMRD" --name-only "$PREVIOUS_SHA" "$CURRENT_SHA" | grep -E "(${FILES})" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') - ALL_OTHER_MODIFIED=$(git diff --diff-filter="ACMR" --name-only "$PREVIOUS_SHA" "$CURRENT_SHA" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') + ALL_OTHER_CHANGED=$(git diff --diff-filter="ACMR" --name-only "$PREVIOUS_SHA" "$CURRENT_SHA" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') UNIQUE_ALL_CHANGED=$(echo "${ALL_CHANGED}" | awk '{gsub(/\|/,"\n"); print $0;}' | sort -u | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') - if [[ -n $ALL_OTHER_MODIFIED ]]; then - if [[ -n "$UNIQUE_ALL_CHANGED" ]]; then - OTHER_MODIFIED=$(echo "${ALL_OTHER_MODIFIED}|${UNIQUE_ALL_CHANGED}" | awk '{gsub(/\|/,"\n"); print $0;}' | sort | uniq -u | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') - else - OTHER_MODIFIED=$ALL_OTHER_MODIFIED - fi - fi - UNIQUE_ALL_CHANGED=$(echo "${UNIQUE_ALL_CHANGED}" | awk '{gsub(/\|/,"\n"); print $0;}' | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') if [[ -n "${UNIQUE_ALL_CHANGED}" ]]; then @@ -141,19 +135,64 @@ else echo "::set-output name=any_changed::false" fi - OTHER_MODIFIED=$(echo "${OTHER_MODIFIED}" | awk '{gsub(/\|/,"\n"); print $0;}' | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') + if [[ -n $ALL_OTHER_CHANGED ]]; then + if [[ -n "$UNIQUE_ALL_CHANGED" ]]; then + OTHER_CHANGED=$(echo "${ALL_OTHER_CHANGED}|${UNIQUE_ALL_CHANGED}" | awk '{gsub(/\|/,"\n"); print $0;}' | sort | uniq -u | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') + else + OTHER_CHANGED=$ALL_OTHER_CHANGED + fi + fi - if [[ -n "${OTHER_MODIFIED}" ]]; then - echo "Non Matching modified files: ${OTHER_MODIFIED}" + OTHER_CHANGED=$(echo "${OTHER_CHANGED}" | awk '{gsub(/\|/,"\n"); print $0;}' | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') + + if [[ -n "${OTHER_CHANGED}" ]]; then + echo "Non Matching changed files: ${OTHER_CHANGED}" echo "::set-output name=only_changed::false" - echo "::set-output name=other_changed_files::$OTHER_MODIFIED" + echo "::set-output name=other_changed_files::$OTHER_CHANGED" elif [[ -n "${UNIQUE_ALL_CHANGED}" ]]; then echo "::set-output name=only_changed::true" fi + ALL_OTHER_MODIFIED=$(git diff --diff-filter="ACMRD" --name-only "$PREVIOUS_SHA" "$CURRENT_SHA" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') + UNIQUE_ALL_MODIFIED=$(echo "${ALL_MODIFIED}" | awk '{gsub(/\|/,"\n"); print $0;}' | sort -u | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') + + UNIQUE_ALL_MODIFIED=$(echo "${UNIQUE_ALL_MODIFIED}" | awk '{gsub(/\|/,"\n"); print $0;}' | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') + + if [[ -n "${UNIQUE_ALL_MODIFIED}" ]]; then + echo "Matching modified files: ${UNIQUE_ALL_MODIFIED}" + echo "::set-output name=any_modified::true" + else + echo "::set-output name=any_modified::false" + fi + + if [[ -n $ALL_OTHER_MODIFIED ]]; then + if [[ -n "$UNIQUE_ALL_MODIFIED" ]]; then + OTHER_MODIFIED=$(echo "${ALL_OTHER_MODIFIED}|${UNIQUE_ALL_MODIFIED}" | awk '{gsub(/\|/,"\n"); print $0;}' | sort | uniq -u | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') + else + OTHER_MODIFIED=$ALL_OTHER_MODIFIED + fi + fi + + OTHER_MODIFIED=$(echo "${OTHER_MODIFIED}" | awk '{gsub(/\|/,"\n"); print $0;}' | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') + + if [[ -n "${OTHER_MODIFIED}" ]]; then + echo "Non Matching modified files: ${OTHER_MODIFIED}" + echo "::set-output name=only_modified::false" + echo "::set-output name=other_modified_files::$OTHER_MODIFIED" + elif [[ -n "${UNIQUE_ALL_MODIFIED}" ]]; then + echo "::set-output name=only_modified::true" + fi + ALL_OTHER_DELETED=$(git diff --diff-filter=D --name-only "$PREVIOUS_SHA" "$CURRENT_SHA" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') UNIQUE_ALL_DELETED=$(echo "${DELETED}" | awk '{gsub(/\|/,"\n"); print $0;}' | sort -u | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') + if [[ -n "${UNIQUE_ALL_DELETED}" ]]; then + echo "Matching deleted files: ${UNIQUE_ALL_DELETED}" + echo "::set-output name=any_deleted::true" + else + echo "::set-output name=any_deleted::false" + fi + if [[ -n $ALL_OTHER_DELETED ]]; then if [[ -n "$UNIQUE_ALL_DELETED" ]]; then OTHER_DELETED=$(echo "${ALL_OTHER_DELETED}|${UNIQUE_ALL_DELETED}" | awk '{gsub(/\|/,"\n"); print $0;}' | sort | uniq -u | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') @@ -162,14 +201,6 @@ else fi fi - echo "Matching deleted files: ${UNIQUE_ALL_DELETED}" - - if [[ -n "${UNIQUE_ALL_DELETED}" ]]; then - echo "::set-output name=any_deleted::true" - else - echo "::set-output name=any_deleted::false" - fi - OTHER_DELETED=$(echo "${OTHER_DELETED}" | awk '{gsub(/\|/,"\n"); print $0;}' | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') if [[ -n "${OTHER_DELETED}" ]]; then @@ -190,6 +221,7 @@ else UNKNOWN=$(echo "${UNKNOWN}" | awk '{gsub(/\|/,"\n"); print $0;}' | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') ALL_CHANGED_AND_MODIFIED=$(echo "${ALL_CHANGED_AND_MODIFIED}" | awk '{gsub(/\|/,"\n"); print $0;}' | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') ALL_CHANGED=$(echo "${ALL_CHANGED}" | awk '{gsub(/\|/,"\n"); print $0;}' | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') + ALL_MODIFIED=$(echo "${ALL_MODIFIED}" | awk '{gsub(/\|/,"\n"); print $0;}' | awk -v d="$INPUT_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') fi echo "Added files: $ADDED" @@ -202,6 +234,7 @@ echo "Unmerged files: $UNMERGED" echo "Unknown files: $UNKNOWN" echo "All changed and modified files: $ALL_CHANGED_AND_MODIFIED" echo "All changed files: $ALL_CHANGED" +echo "All modified files: $ALL_MODIFIED" git remote remove temp_changed_files @@ -215,5 +248,6 @@ echo "::set-output name=unmerged_files::$UNMERGED" echo "::set-output name=unknown_files::$UNKNOWN" echo "::set-output name=all_changed_and_modified_files::$ALL_CHANGED_AND_MODIFIED" echo "::set-output name=all_changed_files::$ALL_CHANGED" +echo "::set-output name=all_modified_files::$ALL_MODIFIED" echo "::endgroup::"