From 08d0cedfeaebcc4aaf7748d120e9ed3258d8487d Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 17:25:26 -0700 Subject: [PATCH 01/22] feat: add support for dir_names_max_depth --- action.yml | 4 ++++ get-changed-paths.sh | 29 +++++++++++++++++++++++++++-- test/test/test.txt | 2 +- test/test2/test.txt | 1 + 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 test/test2/test.txt diff --git a/action.yml b/action.yml index 160846a6..89e4d66a 100644 --- a/action.yml +++ b/action.yml @@ -73,6 +73,9 @@ inputs: default: "false" description: "Output unique changed directories instead of filenames. **NOTE:** This returns `.` for changed files located in the root of the project." required: false + dir_names_max_depth: + description: "Maximum depth of directories to output." + required: false json: description: "Output list of changed files in a JSON formatted string which can be used for matrix jobs." required: false @@ -221,6 +224,7 @@ runs: INPUT_OLD_NEW_FILES_SEPARATOR: ${{ inputs.old_new_files_separator }} INPUT_DIFF_RELATIVE: ${{ inputs.diff_relative }} INPUT_DIR_NAMES: ${{ inputs.dir_names }} + INPUT_DIR_NAMES_MAX_DEPTH: ${{ inputs.dir_names_max_depth }} INPUT_JSON: ${{ inputs.json }} INPUT_HAS_CUSTOM_PATTERNS: ${{ steps.glob.outputs.has-custom-patterns }} diff --git a/get-changed-paths.sh b/get-changed-paths.sh index 265ac711..e593ecfc 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -24,6 +24,31 @@ if [[ -n $INPUT_DIFF_RELATIVE ]]; then git config --global diff.relative "$INPUT_DIFF_RELATIVE" fi +function dirname_max_depth() { + local dir="$1" + + local dirs=($(echo "$dir" | tr "/" " ")) + local max_depth="${#dirs[@]}" + + if [[ -n "$INPUT_DIR_NAMES_MAX_DEPTH" && "$INPUT_DIR_NAMES_MAX_DEPTH" -lt "$max_depth" ]]; then + max_depth="$INPUT_DIR_NAMES_MAX_DEPTH" + fi + + local output=${dirs[1]} + local depth=2 + + while [ $depth -le $max_depth ]; do + if [[ -n "${dirs[$depth]}" ]]; then + output="$output/${dirs[$depth]}" + else + break + fi + depth=$((depth+1)) + done + + echo "$output" +} + function get_diff() { local base="$1" local sha="$2" @@ -53,7 +78,7 @@ function get_diff() { done < <(git submodule | awk '{print $2}') if [[ "$INPUT_DIR_NAMES" == "true" ]]; then - git diff --diff-filter="$filter" --name-only --ignore-submodules=all "$base$DIFF$sha" | xargs -I {} dirname {} | uniq && exit_status=$? || exit_status=$? + git diff --diff-filter="$filter" --name-only --ignore-submodules=all "$base$DIFF$sha" | xargs -I {} dirname {} | dirname_max_depth | uniq && exit_status=$? || exit_status=$? if [[ $exit_status -ne 0 ]]; then echo "::error::Failed to get changed directories between: $base$DIFF$sha" @@ -97,7 +122,7 @@ function get_renames() { done < <(git submodule | awk '{print $2}') if [[ "$INPUT_DIR_NAMES" == "true" ]]; then - git log --name-status --ignore-submodules=all "$base" "$sha" | { grep -E "^R" || true; } | awk -F '\t' -v d="$INPUT_OLD_NEW_SEPARATOR" '{print $2d$3}' | xargs -I {} dirname {} | uniq && exit_status=$? || exit_status=$? + git log --name-status --ignore-submodules=all "$base" "$sha" | { grep -E "^R" || true; } | awk -F '\t' -v d="$INPUT_OLD_NEW_SEPARATOR" '{print $2d$3}' | xargs -I {} dirname {} | dirname_max_depth | uniq && exit_status=$? || exit_status=$? if [[ $exit_status -ne 0 ]]; then echo "::error::Failed to get renamed directories between: $base → $sha" diff --git a/test/test/test.txt b/test/test/test.txt index 6de7b8c6..9f4b6d8b 100644 --- a/test/test/test.txt +++ b/test/test/test.txt @@ -1 +1 @@ -This is a test file. +This is a test file diff --git a/test/test2/test.txt b/test/test2/test.txt new file mode 100644 index 00000000..570d0dbf --- /dev/null +++ b/test/test2/test.txt @@ -0,0 +1 @@ +Lorem ipsum dolor sit amet, consectetur adip eget, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \ No newline at end of file From 0a5b7c6ec0d39ead3bee3231fa3a651e2c80ecce Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 17:29:39 -0700 Subject: [PATCH 02/22] Added test files --- test/test2/test3/new.txt | 1 + test/test2/test3/test4/test.txt | 1 + 2 files changed, 2 insertions(+) create mode 100644 test/test2/test3/new.txt create mode 100644 test/test2/test3/test4/test.txt diff --git a/test/test2/test3/new.txt b/test/test2/test3/new.txt new file mode 100644 index 00000000..7b03026c --- /dev/null +++ b/test/test2/test3/new.txt @@ -0,0 +1 @@ +Test file. \ No newline at end of file diff --git a/test/test2/test3/test4/test.txt b/test/test2/test3/test4/test.txt new file mode 100644 index 00000000..7b03026c --- /dev/null +++ b/test/test2/test3/test4/test.txt @@ -0,0 +1 @@ +Test file. \ No newline at end of file From df466ccd7d719c2fc7e647fbf8042dbd455c2b0c Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 17:32:14 -0700 Subject: [PATCH 03/22] fixed test --- .github/workflows/test.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c09fa4fc..1bae6e56 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -417,6 +417,27 @@ jobs: echo '${{ toJSON(steps.changed-files-quotepath.outputs) }}' shell: bash + - name: Run changed-files with dir_names and dir_names_max_depth + id: changed-files-dir-names-max-depth + uses: ./ + with: + base_sha: ba788ed + sha: 0a5b7c6 + fetch_depth: 60000 + dir_names: "true" + dir_names_max_depth: 3 + - name: Show output + run: | + echo '${{ toJSON(steps.changed-files-dir-names-max-depth.outputs) }}' + shell: + bash + - name: Check dir_names output + if: "!contains(steps.changed-files-dir-names-max-depth.outputs.all_changed_files, 'test/test2/test3')" + run: | + echo "Invalid output: Expected to include (test/test2/test3) got (${{ steps.changed-files-dir-names-max-depth.outputs.all_changed_files }})" + exit 1 + shell: + bash - name: Run changed-files with dir_names id: changed-files-dir-names uses: ./ From 80e364a5d0325efe4702271d2c33435e64caeb53 Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 17:35:43 -0700 Subject: [PATCH 04/22] Update get-changed-paths.sh --- get-changed-paths.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index e593ecfc..9690618f 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -37,7 +37,7 @@ function dirname_max_depth() { local output=${dirs[1]} local depth=2 - while [ $depth -le $max_depth ]; do + while [ $depth -le "$max_depth" ]; do if [[ -n "${dirs[$depth]}" ]]; then output="$output/${dirs[$depth]}" else From 3c938dc216578beaa3ba81f87ada096f4c7781ad Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 17:39:37 -0700 Subject: [PATCH 05/22] fixed unbound variable --- get-changed-paths.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index 9690618f..edf83b40 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -28,7 +28,8 @@ function dirname_max_depth() { local dir="$1" local dirs=($(echo "$dir" | tr "/" " ")) - local max_depth="${#dirs[@]}" + local max_depth=${#dirs[@]} + INPUT_DIR_NAMES_MAX_DEPTH="${INPUT_DIR_NAMES_MAX_DEPTH:-$max_depth}" if [[ -n "$INPUT_DIR_NAMES_MAX_DEPTH" && "$INPUT_DIR_NAMES_MAX_DEPTH" -lt "$max_depth" ]]; then max_depth="$INPUT_DIR_NAMES_MAX_DEPTH" From bcd97d287019578441cdf866cf509a25b0a42db5 Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 18:03:33 -0700 Subject: [PATCH 06/22] fixed unbound variable --- get-changed-paths.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index edf83b40..4da328aa 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -79,7 +79,7 @@ function get_diff() { done < <(git submodule | awk '{print $2}') if [[ "$INPUT_DIR_NAMES" == "true" ]]; then - git diff --diff-filter="$filter" --name-only --ignore-submodules=all "$base$DIFF$sha" | xargs -I {} dirname {} | dirname_max_depth | uniq && exit_status=$? || exit_status=$? + git diff --diff-filter="$filter" --name-only --ignore-submodules=all "$base$DIFF$sha" | xargs -I {} dirname {} | xargs -I {} dirname_max_depth {} | xargs -I {} uniq {} && exit_status=$? || exit_status=$? if [[ $exit_status -ne 0 ]]; then echo "::error::Failed to get changed directories between: $base$DIFF$sha" @@ -123,7 +123,7 @@ function get_renames() { done < <(git submodule | awk '{print $2}') if [[ "$INPUT_DIR_NAMES" == "true" ]]; then - git log --name-status --ignore-submodules=all "$base" "$sha" | { grep -E "^R" || true; } | awk -F '\t' -v d="$INPUT_OLD_NEW_SEPARATOR" '{print $2d$3}' | xargs -I {} dirname {} | dirname_max_depth | uniq && exit_status=$? || exit_status=$? + git log --name-status --ignore-submodules=all "$base" "$sha" | { grep -E "^R" || true; } | awk -F '\t' -v d="$INPUT_OLD_NEW_SEPARATOR" '{print $2d$3}' | xargs -I {} dirname {} | xargs -I {} dirname_max_depth {} | xargs -I {} uniq {} && exit_status=$? || exit_status=$? if [[ $exit_status -ne 0 ]]; then echo "::error::Failed to get renamed directories between: $base → $sha" From f08344bfbc9cacfc4d362a660d57d0f96196d950 Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 18:17:30 -0700 Subject: [PATCH 07/22] fixed shellcheck error --- get-changed-paths.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index 4da328aa..c2b977c1 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -27,7 +27,8 @@ fi function dirname_max_depth() { local dir="$1" - local dirs=($(echo "$dir" | tr "/" " ")) + local dirs=() + IFS="/" read -r -a dirs <<< "$dir" local max_depth=${#dirs[@]} INPUT_DIR_NAMES_MAX_DEPTH="${INPUT_DIR_NAMES_MAX_DEPTH:-$max_depth}" From 32c707316b0f74fb146b33c844273c877663c52d Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 18:35:30 -0700 Subject: [PATCH 08/22] Updated get-changed-paths.sh --- get-changed-paths.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index c2b977c1..6214e1c2 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -24,11 +24,12 @@ if [[ -n $INPUT_DIFF_RELATIVE ]]; then git config --global diff.relative "$INPUT_DIFF_RELATIVE" fi -function dirname_max_depth() { +function get_dirname_max_depth() { local dir="$1" local dirs=() - IFS="/" read -r -a dirs <<< "$dir" + IFS='/' read -ra dirs <<< "$dir" + local max_depth=${#dirs[@]} INPUT_DIR_NAMES_MAX_DEPTH="${INPUT_DIR_NAMES_MAX_DEPTH:-$max_depth}" @@ -48,7 +49,7 @@ function dirname_max_depth() { depth=$((depth+1)) done - echo "$output" + echo "$output" } function get_diff() { @@ -80,7 +81,7 @@ function get_diff() { done < <(git submodule | awk '{print $2}') if [[ "$INPUT_DIR_NAMES" == "true" ]]; then - git diff --diff-filter="$filter" --name-only --ignore-submodules=all "$base$DIFF$sha" | xargs -I {} dirname {} | xargs -I {} dirname_max_depth {} | xargs -I {} uniq {} && exit_status=$? || exit_status=$? + git diff --diff-filter="$filter" --name-only --ignore-submodules=all "$base$DIFF$sha" | xargs -I {} dirname {} | uniq | get_dirname_max_depth | uniq && exit_status=$? || exit_status=$? if [[ $exit_status -ne 0 ]]; then echo "::error::Failed to get changed directories between: $base$DIFF$sha" @@ -124,7 +125,7 @@ function get_renames() { done < <(git submodule | awk '{print $2}') if [[ "$INPUT_DIR_NAMES" == "true" ]]; then - git log --name-status --ignore-submodules=all "$base" "$sha" | { grep -E "^R" || true; } | awk -F '\t' -v d="$INPUT_OLD_NEW_SEPARATOR" '{print $2d$3}' | xargs -I {} dirname {} | xargs -I {} dirname_max_depth {} | xargs -I {} uniq {} && exit_status=$? || exit_status=$? + git log --name-status --ignore-submodules=all "$base" "$sha" | { grep -E "^R" || true; } | awk -F '\t' -v d="$INPUT_OLD_NEW_SEPARATOR" '{print $2d$3}' | xargs -I {} dirname {} | uniq | get_dirname_max_depth | uniq && exit_status=$? || exit_status=$? if [[ $exit_status -ne 0 ]]; then echo "::error::Failed to get renamed directories between: $base → $sha" From 0951b64836667676e279fa4d1f9c7fae2a28f34b Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 18:38:53 -0700 Subject: [PATCH 09/22] Updated arguments --- get-changed-paths.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index 6214e1c2..d8560490 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -25,7 +25,7 @@ if [[ -n $INPUT_DIFF_RELATIVE ]]; then fi function get_dirname_max_depth() { - local dir="$1" + local dir="$@" local dirs=() IFS='/' read -ra dirs <<< "$dir" From bf3ca40593d5376ae0b8ed826ef17733e1eda987 Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 18:46:46 -0700 Subject: [PATCH 10/22] Updated get-changed-paths.sh --- get-changed-paths.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index d8560490..7aab9818 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -25,7 +25,7 @@ if [[ -n $INPUT_DIFF_RELATIVE ]]; then fi function get_dirname_max_depth() { - local dir="$@" + local dir="$1" local dirs=() IFS='/' read -ra dirs <<< "$dir" @@ -81,7 +81,7 @@ function get_diff() { done < <(git submodule | awk '{print $2}') if [[ "$INPUT_DIR_NAMES" == "true" ]]; then - git diff --diff-filter="$filter" --name-only --ignore-submodules=all "$base$DIFF$sha" | xargs -I {} dirname {} | uniq | get_dirname_max_depth | uniq && exit_status=$? || exit_status=$? + git diff --diff-filter="$filter" --name-only --ignore-submodules=all "$base$DIFF$sha" | xargs -I {} dirname {} | uniq | xargs get_dirname_max_depth | uniq && exit_status=$? || exit_status=$? if [[ $exit_status -ne 0 ]]; then echo "::error::Failed to get changed directories between: $base$DIFF$sha" @@ -125,7 +125,7 @@ function get_renames() { done < <(git submodule | awk '{print $2}') if [[ "$INPUT_DIR_NAMES" == "true" ]]; then - git log --name-status --ignore-submodules=all "$base" "$sha" | { grep -E "^R" || true; } | awk -F '\t' -v d="$INPUT_OLD_NEW_SEPARATOR" '{print $2d$3}' | xargs -I {} dirname {} | uniq | get_dirname_max_depth | uniq && exit_status=$? || exit_status=$? + git log --name-status --ignore-submodules=all "$base" "$sha" | { grep -E "^R" || true; } | awk -F '\t' -v d="$INPUT_OLD_NEW_SEPARATOR" '{print $2d$3}' | xargs -I {} dirname {} | uniq | xargs get_dirname_max_depth | uniq && exit_status=$? || exit_status=$? if [[ $exit_status -ne 0 ]]; then echo "::error::Failed to get renamed directories between: $base → $sha" From 6093777a385ec81bed1fd5bb407881f848bed2d3 Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 18:59:55 -0700 Subject: [PATCH 11/22] Updated get-changed-paths.sh --- get-changed-paths.sh | 130 ++++++++++++++++++++++--------------------- 1 file changed, 67 insertions(+), 63 deletions(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index 7aab9818..d94403ef 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -25,31 +25,35 @@ if [[ -n $INPUT_DIFF_RELATIVE ]]; then fi function get_dirname_max_depth() { - local dir="$1" + local depth=0 + local dir="" + local dirs=() - local dirs=() - IFS='/' read -ra dirs <<< "$dir" + while IFS='' read -r line; do + dir="$line" + IFS='/' read -ra dirs <<<"$dir" - local max_depth=${#dirs[@]} - INPUT_DIR_NAMES_MAX_DEPTH="${INPUT_DIR_NAMES_MAX_DEPTH:-$max_depth}" + local max_depth=${#dirs[@]} + local input_dir_names_max_depth="${INPUT_DIR_NAMES_MAX_DEPTH:-$max_depth}" - if [[ -n "$INPUT_DIR_NAMES_MAX_DEPTH" && "$INPUT_DIR_NAMES_MAX_DEPTH" -lt "$max_depth" ]]; then - max_depth="$INPUT_DIR_NAMES_MAX_DEPTH" - fi + if [[ -n "$input_dir_names_max_depth" && "$input_dir_names_max_depth" -lt "$max_depth" ]]; then + max_depth="$input_dir_names_max_depth" + fi - local output=${dirs[1]} - local depth=2 + local output=${dirs[1]} + local depth=2 - while [ $depth -le "$max_depth" ]; do - if [[ -n "${dirs[$depth]}" ]]; then - output="$output/${dirs[$depth]}" - else - break - fi - depth=$((depth+1)) - done + while [ $depth -le "$max_depth" ]; do + if [[ -n "${dirs[$depth]}" ]]; then + output="$output/${dirs[$depth]}" + else + break + fi + depth=$((depth + 1)) + done - echo "$output" + echo "$output" + done < <(uniq) } function get_diff() { @@ -71,17 +75,17 @@ function get_diff() { fi if [ -n "$sub_commit_cur" ]; then - ( - cd "$sub" && ( - # the strange magic number is a hardcoded "empty tree" commit sha - get_diff "${sub_commit_pre:-4b825dc642cb6eb9a060e54bf8d69288fbee4904}" "${sub_commit_cur}" "$filter" | awk -v r="$sub" '{ print "" r "/" $0}' + ( + cd "$sub" && ( + # the strange magic number is a hardcoded "empty tree" commit sha + get_diff "${sub_commit_pre:-4b825dc642cb6eb9a060e54bf8d69288fbee4904}" "${sub_commit_cur}" "$filter" | awk -v r="$sub" '{ print "" r "/" $0}' + ) ) - ) fi done < <(git submodule | awk '{print $2}') if [[ "$INPUT_DIR_NAMES" == "true" ]]; then - git diff --diff-filter="$filter" --name-only --ignore-submodules=all "$base$DIFF$sha" | xargs -I {} dirname {} | uniq | xargs get_dirname_max_depth | uniq && exit_status=$? || exit_status=$? + git diff --diff-filter="$filter" --name-only --ignore-submodules=all "$base$DIFF$sha" | xargs -I {} dirname {} | get_dirname_max_depth | uniq && exit_status=$? || exit_status=$? if [[ $exit_status -ne 0 ]]; then echo "::error::Failed to get changed directories between: $base$DIFF$sha" @@ -108,24 +112,24 @@ function get_renames() { exit 1 fi - sub_commit_cur="$(git diff "$base$DIFF$sha" -- "$sub" | { grep '^[+]Subproject commit' || true; } | awk '{print $3}')" && exit_status=$? || exit_status=$? + sub_commit_cur="$(git diff "$base$DIFF$sha" -- "$sub" | { grep '^[+]Subproject commit' || true; } | awk '{print $3}')" && exit_status=$? || exit_status=$? if [[ $exit_status -ne 0 ]]; then echo "::error::Failed to get current commit for submodule ($sub) between: $base$DIFF$sha" exit 1 fi if [ -n "$sub_commit_cur" ]; then - ( - cd "$sub" && ( - # the strange magic number is a hardcoded "empty tree" commit sha - get_renames "${sub_commit_pre:-4b825dc642cb6eb9a060e54bf8d69288fbee4904}" "${sub_commit_cur}" | awk -v r="$sub" '{ print "" r "/" $0}' + ( + cd "$sub" && ( + # the strange magic number is a hardcoded "empty tree" commit sha + get_renames "${sub_commit_pre:-4b825dc642cb6eb9a060e54bf8d69288fbee4904}" "${sub_commit_cur}" | awk -v r="$sub" '{ print "" r "/" $0}' + ) ) - ) fi done < <(git submodule | awk '{print $2}') if [[ "$INPUT_DIR_NAMES" == "true" ]]; then - git log --name-status --ignore-submodules=all "$base" "$sha" | { grep -E "^R" || true; } | awk -F '\t' -v d="$INPUT_OLD_NEW_SEPARATOR" '{print $2d$3}' | xargs -I {} dirname {} | uniq | xargs get_dirname_max_depth | uniq && exit_status=$? || exit_status=$? + git log --name-status --ignore-submodules=all "$base" "$sha" | { grep -E "^R" || true; } | awk -F '\t' -v d="$INPUT_OLD_NEW_SEPARATOR" '{print $2d$3}' | xargs -I {} dirname {} | get_dirname_max_depth | uniq && exit_status=$? || exit_status=$? if [[ $exit_status -ne 0 ]]; then echo "::error::Failed to get renamed directories between: $base → $sha" @@ -173,19 +177,19 @@ if [[ "$INPUT_HAS_CUSTOM_PATTERNS" == "false" ]]; then ALL_OLD_NEW_RENAMED=$(get_renames "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" | awk -v d="$INPUT_OLD_NEW_FILES_SEPARATOR" '{s=(NR==1?s:s d)$0}END{print s}') fi else - ADDED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" A | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}'| jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) - COPIED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" C | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}'| jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) - DELETED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" D | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}'| jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) - MODIFIED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" M | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}'| jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) - RENAMED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" R | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}'| jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) - TYPE_CHANGED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" T | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}'| jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) - UNMERGED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" U | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}'| jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) - UNKNOWN=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" X | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}'| jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) - ALL_CHANGED_AND_MODIFIED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" "*ACDMRTUX" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}'| jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) - ALL_CHANGED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" "ACMR" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}'| jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) - ALL_MODIFIED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" "ACMRD" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}'| jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) + ADDED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" A | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}' | jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) + COPIED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" C | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}' | jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) + DELETED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" D | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}' | jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) + MODIFIED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" M | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}' | jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) + RENAMED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" R | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}' | jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) + TYPE_CHANGED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" T | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}' | jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) + UNMERGED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" U | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}' | jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) + UNKNOWN=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" X | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}' | jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) + ALL_CHANGED_AND_MODIFIED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" "*ACDMRTUX" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}' | jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) + ALL_CHANGED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" "ACMR" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}' | jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) + ALL_MODIFIED=$(get_diff "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" "ACMRD" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}' | jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) if [[ $INPUT_INCLUDE_ALL_OLD_NEW_RENAMED_FILES == "true" ]]; then - ALL_OLD_NEW_RENAMED=$(get_renames "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}'| jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) + ALL_OLD_NEW_RENAMED=$(get_renames "$INPUT_PREVIOUS_SHA" "$INPUT_CURRENT_SHA" | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}' | jq -R 'split("|") | @json' | sed -r 's/^"|"$//g' | tr -s /) fi fi else @@ -211,13 +215,13 @@ else if [[ -z "$GITHUB_OUTPUT" ]]; then echo "::set-output name=any_changed::true" else - echo "any_changed=true" >> "$GITHUB_OUTPUT" + echo "any_changed=true" >>"$GITHUB_OUTPUT" fi else if [[ -z "$GITHUB_OUTPUT" ]]; then echo "::set-output name=any_changed::false" else - echo "any_changed=false" >> "$GITHUB_OUTPUT" + echo "any_changed=false" >>"$GITHUB_OUTPUT" fi fi @@ -225,7 +229,7 @@ else if [[ -n $ALL_OTHER_CHANGED ]]; then if [[ -n "$ALL_CHANGED" ]]; then - OTHER_CHANGED=$(echo "${ALL_OTHER_CHANGED}|${ALL_CHANGED}" | awk '{gsub(/\|/,"\n"); print $0;}' | sort | uniq -u | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') + OTHER_CHANGED=$(echo "${ALL_OTHER_CHANGED}|${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 @@ -244,15 +248,15 @@ else echo "::set-output name=only_changed::false" echo "::set-output name=other_changed_files::$OTHER_CHANGED" else - echo "only_changed=false" >> "$GITHUB_OUTPUT" - echo "other_changed_files=$OTHER_CHANGED" >> "$GITHUB_OUTPUT" + echo "only_changed=false" >>"$GITHUB_OUTPUT" + echo "other_changed_files=$OTHER_CHANGED" >>"$GITHUB_OUTPUT" fi elif [[ -n "${ALL_CHANGED}" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then echo "::set-output name=only_changed::true" else - echo "only_changed=true" >> "$GITHUB_OUTPUT" + echo "only_changed=true" >>"$GITHUB_OUTPUT" fi fi @@ -263,13 +267,13 @@ else if [[ -z "$GITHUB_OUTPUT" ]]; then echo "::set-output name=any_modified::true" else - echo "any_modified=true" >> "$GITHUB_OUTPUT" + echo "any_modified=true" >>"$GITHUB_OUTPUT" fi else if [[ -z "$GITHUB_OUTPUT" ]]; then echo "::set-output name=any_modified::false" else - echo "any_modified=false" >> "$GITHUB_OUTPUT" + echo "any_modified=false" >>"$GITHUB_OUTPUT" fi fi @@ -277,7 +281,7 @@ else if [[ -n $ALL_OTHER_MODIFIED ]]; then if [[ -n "$ALL_MODIFIED" ]]; then - OTHER_MODIFIED=$(echo "${ALL_OTHER_MODIFIED}|${ALL_MODIFIED}" | awk '{gsub(/\|/,"\n"); print $0;}' | sort | uniq -u | awk -v d="|" '{s=(NR==1?s:s d)$0}END{print s}') + OTHER_MODIFIED=$(echo "${ALL_OTHER_MODIFIED}|${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 @@ -296,14 +300,14 @@ else echo "::set-output name=only_modified::false" echo "::set-output name=other_modified_files::$OTHER_MODIFIED" else - echo "only_modified=false" >> "$GITHUB_OUTPUT" - echo "other_modified_files=$OTHER_MODIFIED" >> "$GITHUB_OUTPUT" + echo "only_modified=false" >>"$GITHUB_OUTPUT" + echo "other_modified_files=$OTHER_MODIFIED" >>"$GITHUB_OUTPUT" fi elif [[ -n "${ALL_MODIFIED}" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then echo "::set-output name=only_modified::true" else - echo "only_modified=true" >> "$GITHUB_OUTPUT" + echo "only_modified=true" >>"$GITHUB_OUTPUT" fi fi @@ -314,13 +318,13 @@ else if [[ -z "$GITHUB_OUTPUT" ]]; then echo "::set-output name=any_deleted::true" else - echo "any_deleted=true" >> "$GITHUB_OUTPUT" + echo "any_deleted=true" >>"$GITHUB_OUTPUT" fi else if [[ -z "$GITHUB_OUTPUT" ]]; then echo "::set-output name=any_deleted::false" else - echo "any_deleted=false" >> "$GITHUB_OUTPUT" + echo "any_deleted=false" >>"$GITHUB_OUTPUT" fi fi @@ -346,14 +350,14 @@ else echo "::set-output name=only_deleted::false" echo "::set-output name=other_deleted_files::$OTHER_DELETED" else - echo "only_deleted=false" >> "$GITHUB_OUTPUT" - echo "other_deleted_files=$OTHER_DELETED" >> "$GITHUB_OUTPUT" + echo "only_deleted=false" >>"$GITHUB_OUTPUT" + echo "other_deleted_files=$OTHER_DELETED" >>"$GITHUB_OUTPUT" fi elif [[ -n "${DELETED}" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then echo "::set-output name=only_deleted::true" else - echo "only_deleted=true" >> "$GITHUB_OUTPUT" + echo "only_deleted=true" >>"$GITHUB_OUTPUT" fi fi if [[ "$INPUT_JSON" == "false" ]]; then @@ -411,7 +415,7 @@ if [[ -z "$GITHUB_OUTPUT" ]]; then echo "::set-output name=all_changed_files::$ALL_CHANGED" echo "::set-output name=all_modified_files::$ALL_MODIFIED" else - cat <> "$GITHUB_OUTPUT" + cat <>"$GITHUB_OUTPUT" added_files=$ADDED copied_files=$COPIED deleted_files=$DELETED @@ -430,7 +434,7 @@ if [[ $INPUT_INCLUDE_ALL_OLD_NEW_RENAMED_FILES == "true" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then echo "::set-output name=all_old_new_renamed_files::$ALL_OLD_NEW_RENAMED" else - echo "all_old_new_renamed_files=$ALL_OLD_NEW_RENAMED" >> "$GITHUB_OUTPUT" + echo "all_old_new_renamed_files=$ALL_OLD_NEW_RENAMED" >>"$GITHUB_OUTPUT" fi fi From 967c8a0609144c64f86562e06f4c2770fac345e2 Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 19:00:52 -0700 Subject: [PATCH 12/22] Updated get-changed-paths.sh --- get-changed-paths.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index d94403ef..00f37552 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -25,12 +25,10 @@ if [[ -n $INPUT_DIFF_RELATIVE ]]; then fi function get_dirname_max_depth() { - local depth=0 - local dir="" - local dirs=() while IFS='' read -r line; do - dir="$line" + local dir="$line" + local dirs=() IFS='/' read -ra dirs <<<"$dir" local max_depth=${#dirs[@]} From 54b7c1b8d2c2f895f1b57f194002c02fd4ef408d Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 19:01:02 -0700 Subject: [PATCH 13/22] Updated get-changed-paths.sh --- get-changed-paths.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index 00f37552..b85116a0 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -25,7 +25,6 @@ if [[ -n $INPUT_DIFF_RELATIVE ]]; then fi function get_dirname_max_depth() { - while IFS='' read -r line; do local dir="$line" local dirs=() From 386cb933d41087b7726c7aea76a6c7d3ea646353 Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 19:08:10 -0700 Subject: [PATCH 14/22] Updated get-changed-paths.sh --- get-changed-paths.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index b85116a0..e4c3ddd4 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -set -euo pipefail +set -euxo pipefail INPUT_SEPARATOR="${INPUT_SEPARATOR//'%'/'%25'}" INPUT_SEPARATOR="${INPUT_SEPARATOR//'.'/'%2E'}" From d127e3518013aee6a2a584cc4327a0fb15b3df42 Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 19:22:38 -0700 Subject: [PATCH 15/22] Updated get-changed-paths.sh --- get-changed-paths.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index e4c3ddd4..93da7127 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -41,6 +41,7 @@ function get_dirname_max_depth() { local depth=2 while [ $depth -le "$max_depth" ]; do + echo "${dirs[*]}" if [[ -n "${dirs[$depth]}" ]]; then output="$output/${dirs[$depth]}" else From 1c9a614a4f3558039458ab8ec3d33227d2049df4 Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 19:26:31 -0700 Subject: [PATCH 16/22] Updated get-changed-paths.sh --- get-changed-paths.sh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index 93da7127..72cf6d22 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -41,12 +41,7 @@ function get_dirname_max_depth() { local depth=2 while [ $depth -le "$max_depth" ]; do - echo "${dirs[*]}" - if [[ -n "${dirs[$depth]}" ]]; then - output="$output/${dirs[$depth]}" - else - break - fi + output="$output/${dirs[$depth]}" depth=$((depth + 1)) done From 3840bc84e62dd2631d868c55359fdf0aa46eac8c Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 19:30:57 -0700 Subject: [PATCH 17/22] Update get-changed-paths.sh --- get-changed-paths.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index 72cf6d22..1a29a448 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -38,9 +38,9 @@ function get_dirname_max_depth() { fi local output=${dirs[1]} - local depth=2 + local depth="2" - while [ $depth -le "$max_depth" ]; do + while [ "$depth" -le "$max_depth" ]; do output="$output/${dirs[$depth]}" depth=$((depth + 1)) done From 3d4693183926b51d7a4139f710c58480a34cfbd3 Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 19:38:21 -0700 Subject: [PATCH 18/22] Update get-changed-paths.sh --- get-changed-paths.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index 1a29a448..90d2adcc 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -41,7 +41,7 @@ function get_dirname_max_depth() { local depth="2" while [ "$depth" -le "$max_depth" ]; do - output="$output/${dirs[$depth]}" + output="$output/${dirs[${depth}]}" depth=$((depth + 1)) done From 63f38f9f4104b0f0b5a8bea2d7c293853c16f5c4 Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 19:46:28 -0700 Subject: [PATCH 19/22] Update get-changed-paths.sh --- get-changed-paths.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index 90d2adcc..af5fab8c 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -41,6 +41,7 @@ function get_dirname_max_depth() { local depth="2" while [ "$depth" -le "$max_depth" ]; do + current_dir="${dirs[2]}" output="$output/${dirs[${depth}]}" depth=$((depth + 1)) done From 65688ba5c8f79a9ca6f774d67b0a5b3da0ac4b33 Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 19:56:19 -0700 Subject: [PATCH 20/22] Update get-changed-paths.sh --- get-changed-paths.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index af5fab8c..da6ab6e8 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -37,11 +37,10 @@ function get_dirname_max_depth() { max_depth="$input_dir_names_max_depth" fi - local output=${dirs[1]} - local depth="2" + local output="${dirs[0]}" + local depth="1" - while [ "$depth" -le "$max_depth" ]; do - current_dir="${dirs[2]}" + while [ "$depth" -lt "$max_depth" ]; do output="$output/${dirs[${depth}]}" depth=$((depth + 1)) done From 637cb57c282eea47c397cf60a9e663356d6c1ed7 Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 20:05:28 -0700 Subject: [PATCH 21/22] Update get-changed-paths.sh --- get-changed-paths.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/get-changed-paths.sh b/get-changed-paths.sh index da6ab6e8..746737ca 100755 --- a/get-changed-paths.sh +++ b/get-changed-paths.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -set -euxo pipefail +set -euo pipefail INPUT_SEPARATOR="${INPUT_SEPARATOR//'%'/'%25'}" INPUT_SEPARATOR="${INPUT_SEPARATOR//'.'/'%2E'}" From a262e55d0d22941f2b521e63d85fd0c5250bcd2c Mon Sep 17 00:00:00 2001 From: Tonye Jack Date: Wed, 23 Nov 2022 20:08:09 -0700 Subject: [PATCH 22/22] Update action.yml --- action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/action.yml b/action.yml index 89e4d66a..c5232984 100644 --- a/action.yml +++ b/action.yml @@ -74,7 +74,7 @@ inputs: description: "Output unique changed directories instead of filenames. **NOTE:** This returns `.` for changed files located in the root of the project." required: false dir_names_max_depth: - description: "Maximum depth of directories to output." + description: "Maximum depth of directories to output. e.g test/test1/test2 with max depth of 2 returns test/test1" required: false json: description: "Output list of changed files in a JSON formatted string which can be used for matrix jobs."