3
0
Fork 0
mirror of https://github.com/tj-actions/changed-files synced 2024-12-17 03:47:20 +00:00

Merge pull request #823 from tj-actions/feat/add-support-for-dir-names-max-depth

feat: add support for dir_names_max_depth
This commit is contained in:
repo-ranger[bot] 2022-11-24 03:27:34 +00:00 committed by GitHub
commit b383c47099
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 98 additions and 45 deletions

View file

@ -417,6 +417,27 @@ jobs:
echo '${{ toJSON(steps.changed-files-quotepath.outputs) }}' echo '${{ toJSON(steps.changed-files-quotepath.outputs) }}'
shell: shell:
bash 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 - name: Run changed-files with dir_names
id: changed-files-dir-names id: changed-files-dir-names
uses: ./ uses: ./

View file

@ -73,6 +73,9 @@ inputs:
default: "false" default: "false"
description: "Output unique changed directories instead of filenames. **NOTE:** This returns `.` for changed files located in the root of the project." description: "Output unique changed directories instead of filenames. **NOTE:** This returns `.` for changed files located in the root of the project."
required: false required: false
dir_names_max_depth:
description: "Maximum depth of directories to output. e.g test/test1/test2 with max depth of 2 returns test/test1"
required: false
json: json:
description: "Output list of changed files in a JSON formatted string which can be used for matrix jobs." description: "Output list of changed files in a JSON formatted string which can be used for matrix jobs."
required: false required: false
@ -221,6 +224,7 @@ runs:
INPUT_OLD_NEW_FILES_SEPARATOR: ${{ inputs.old_new_files_separator }} INPUT_OLD_NEW_FILES_SEPARATOR: ${{ inputs.old_new_files_separator }}
INPUT_DIFF_RELATIVE: ${{ inputs.diff_relative }} INPUT_DIFF_RELATIVE: ${{ inputs.diff_relative }}
INPUT_DIR_NAMES: ${{ inputs.dir_names }} INPUT_DIR_NAMES: ${{ inputs.dir_names }}
INPUT_DIR_NAMES_MAX_DEPTH: ${{ inputs.dir_names_max_depth }}
INPUT_JSON: ${{ inputs.json }} INPUT_JSON: ${{ inputs.json }}
INPUT_HAS_CUSTOM_PATTERNS: ${{ steps.glob.outputs.has-custom-patterns }} INPUT_HAS_CUSTOM_PATTERNS: ${{ steps.glob.outputs.has-custom-patterns }}

View file

@ -24,6 +24,31 @@ if [[ -n $INPUT_DIFF_RELATIVE ]]; then
git config --global diff.relative "$INPUT_DIFF_RELATIVE" git config --global diff.relative "$INPUT_DIFF_RELATIVE"
fi fi
function get_dirname_max_depth() {
while IFS='' read -r line; do
local dir="$line"
local dirs=()
IFS='/' read -ra dirs <<<"$dir"
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
local output="${dirs[0]}"
local depth="1"
while [ "$depth" -lt "$max_depth" ]; do
output="$output/${dirs[${depth}]}"
depth=$((depth + 1))
done
echo "$output"
done < <(uniq)
}
function get_diff() { function get_diff() {
local base="$1" local base="$1"
local sha="$2" local sha="$2"
@ -53,7 +78,7 @@ function get_diff() {
done < <(git submodule | awk '{print $2}') done < <(git submodule | awk '{print $2}')
if [[ "$INPUT_DIR_NAMES" == "true" ]]; then 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 {} | get_dirname_max_depth | uniq && exit_status=$? || exit_status=$?
if [[ $exit_status -ne 0 ]]; then if [[ $exit_status -ne 0 ]]; then
echo "::error::Failed to get changed directories between: $base$DIFF$sha" echo "::error::Failed to get changed directories between: $base$DIFF$sha"
@ -97,7 +122,7 @@ function get_renames() {
done < <(git submodule | awk '{print $2}') done < <(git submodule | awk '{print $2}')
if [[ "$INPUT_DIR_NAMES" == "true" ]]; then 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 {} | get_dirname_max_depth | uniq && exit_status=$? || exit_status=$?
if [[ $exit_status -ne 0 ]]; then if [[ $exit_status -ne 0 ]]; then
echo "::error::Failed to get renamed directories between: $base$sha" echo "::error::Failed to get renamed directories between: $base$sha"
@ -145,19 +170,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}') 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 fi
else 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 /) 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 /) 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 /) 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 /) 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 /) 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 /) 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 /) 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 /) 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_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_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 /) 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 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
fi fi
else else
@ -183,13 +208,13 @@ else
if [[ -z "$GITHUB_OUTPUT" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then
echo "::set-output name=any_changed::true" echo "::set-output name=any_changed::true"
else else
echo "any_changed=true" >> "$GITHUB_OUTPUT" echo "any_changed=true" >>"$GITHUB_OUTPUT"
fi fi
else else
if [[ -z "$GITHUB_OUTPUT" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then
echo "::set-output name=any_changed::false" echo "::set-output name=any_changed::false"
else else
echo "any_changed=false" >> "$GITHUB_OUTPUT" echo "any_changed=false" >>"$GITHUB_OUTPUT"
fi fi
fi fi
@ -216,15 +241,15 @@ else
echo "::set-output name=only_changed::false" echo "::set-output name=only_changed::false"
echo "::set-output name=other_changed_files::$OTHER_CHANGED" echo "::set-output name=other_changed_files::$OTHER_CHANGED"
else else
echo "only_changed=false" >> "$GITHUB_OUTPUT" echo "only_changed=false" >>"$GITHUB_OUTPUT"
echo "other_changed_files=$OTHER_CHANGED" >> "$GITHUB_OUTPUT" echo "other_changed_files=$OTHER_CHANGED" >>"$GITHUB_OUTPUT"
fi fi
elif [[ -n "${ALL_CHANGED}" ]]; then elif [[ -n "${ALL_CHANGED}" ]]; then
if [[ -z "$GITHUB_OUTPUT" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then
echo "::set-output name=only_changed::true" echo "::set-output name=only_changed::true"
else else
echo "only_changed=true" >> "$GITHUB_OUTPUT" echo "only_changed=true" >>"$GITHUB_OUTPUT"
fi fi
fi fi
@ -235,13 +260,13 @@ else
if [[ -z "$GITHUB_OUTPUT" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then
echo "::set-output name=any_modified::true" echo "::set-output name=any_modified::true"
else else
echo "any_modified=true" >> "$GITHUB_OUTPUT" echo "any_modified=true" >>"$GITHUB_OUTPUT"
fi fi
else else
if [[ -z "$GITHUB_OUTPUT" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then
echo "::set-output name=any_modified::false" echo "::set-output name=any_modified::false"
else else
echo "any_modified=false" >> "$GITHUB_OUTPUT" echo "any_modified=false" >>"$GITHUB_OUTPUT"
fi fi
fi fi
@ -268,14 +293,14 @@ else
echo "::set-output name=only_modified::false" echo "::set-output name=only_modified::false"
echo "::set-output name=other_modified_files::$OTHER_MODIFIED" echo "::set-output name=other_modified_files::$OTHER_MODIFIED"
else else
echo "only_modified=false" >> "$GITHUB_OUTPUT" echo "only_modified=false" >>"$GITHUB_OUTPUT"
echo "other_modified_files=$OTHER_MODIFIED" >> "$GITHUB_OUTPUT" echo "other_modified_files=$OTHER_MODIFIED" >>"$GITHUB_OUTPUT"
fi fi
elif [[ -n "${ALL_MODIFIED}" ]]; then elif [[ -n "${ALL_MODIFIED}" ]]; then
if [[ -z "$GITHUB_OUTPUT" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then
echo "::set-output name=only_modified::true" echo "::set-output name=only_modified::true"
else else
echo "only_modified=true" >> "$GITHUB_OUTPUT" echo "only_modified=true" >>"$GITHUB_OUTPUT"
fi fi
fi fi
@ -286,13 +311,13 @@ else
if [[ -z "$GITHUB_OUTPUT" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then
echo "::set-output name=any_deleted::true" echo "::set-output name=any_deleted::true"
else else
echo "any_deleted=true" >> "$GITHUB_OUTPUT" echo "any_deleted=true" >>"$GITHUB_OUTPUT"
fi fi
else else
if [[ -z "$GITHUB_OUTPUT" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then
echo "::set-output name=any_deleted::false" echo "::set-output name=any_deleted::false"
else else
echo "any_deleted=false" >> "$GITHUB_OUTPUT" echo "any_deleted=false" >>"$GITHUB_OUTPUT"
fi fi
fi fi
@ -318,14 +343,14 @@ else
echo "::set-output name=only_deleted::false" echo "::set-output name=only_deleted::false"
echo "::set-output name=other_deleted_files::$OTHER_DELETED" echo "::set-output name=other_deleted_files::$OTHER_DELETED"
else else
echo "only_deleted=false" >> "$GITHUB_OUTPUT" echo "only_deleted=false" >>"$GITHUB_OUTPUT"
echo "other_deleted_files=$OTHER_DELETED" >> "$GITHUB_OUTPUT" echo "other_deleted_files=$OTHER_DELETED" >>"$GITHUB_OUTPUT"
fi fi
elif [[ -n "${DELETED}" ]]; then elif [[ -n "${DELETED}" ]]; then
if [[ -z "$GITHUB_OUTPUT" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then
echo "::set-output name=only_deleted::true" echo "::set-output name=only_deleted::true"
else else
echo "only_deleted=true" >> "$GITHUB_OUTPUT" echo "only_deleted=true" >>"$GITHUB_OUTPUT"
fi fi
fi fi
if [[ "$INPUT_JSON" == "false" ]]; then if [[ "$INPUT_JSON" == "false" ]]; then
@ -383,7 +408,7 @@ if [[ -z "$GITHUB_OUTPUT" ]]; then
echo "::set-output name=all_changed_files::$ALL_CHANGED" echo "::set-output name=all_changed_files::$ALL_CHANGED"
echo "::set-output name=all_modified_files::$ALL_MODIFIED" echo "::set-output name=all_modified_files::$ALL_MODIFIED"
else else
cat <<EOF >> "$GITHUB_OUTPUT" cat <<EOF >>"$GITHUB_OUTPUT"
added_files=$ADDED added_files=$ADDED
copied_files=$COPIED copied_files=$COPIED
deleted_files=$DELETED deleted_files=$DELETED
@ -402,7 +427,7 @@ if [[ $INPUT_INCLUDE_ALL_OLD_NEW_RENAMED_FILES == "true" ]]; then
if [[ -z "$GITHUB_OUTPUT" ]]; then if [[ -z "$GITHUB_OUTPUT" ]]; then
echo "::set-output name=all_old_new_renamed_files::$ALL_OLD_NEW_RENAMED" echo "::set-output name=all_old_new_renamed_files::$ALL_OLD_NEW_RENAMED"
else 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
fi fi

View file

@ -1 +1 @@
This is a test file. This is a test file

1
test/test2/test.txt Normal file
View file

@ -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.

1
test/test2/test3/new.txt Normal file
View file

@ -0,0 +1 @@
Test file.

View file

@ -0,0 +1 @@
Test file.