action.yaml 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. name: Check For Changed Files
  2. description: Checks for changed files compared to specific git reference and glob expression
  3. inputs:
  4. baseRef:
  5. description: Git reference to check against
  6. required: false
  7. ref:
  8. description: Git reference to check with
  9. required: false
  10. default: HEAD
  11. checkGlob:
  12. description: Glob expression to limit check to specific files
  13. required: false
  14. useFallback:
  15. description: Use fallback compare against prior commit
  16. required: false
  17. default: 'true'
  18. diffFilter:
  19. description: git diff-filter string to use
  20. required: false
  21. default: ''
  22. outputs:
  23. hasChangedFiles:
  24. value: ${{ steps.checks.outputs.hasChangedFiles }}
  25. description: True if specified files were changed in comparison to specified git reference
  26. changedFiles:
  27. value: ${{ steps.checks.outputs.changedFiles }}
  28. description: List of changed files
  29. runs:
  30. using: composite
  31. steps:
  32. - name: Check For Changed Files ✅
  33. shell: bash
  34. id: checks
  35. env:
  36. GIT_BASE_REF: ${{ inputs.baseRef }}
  37. GIT_REF: ${{ inputs.ref }}
  38. GITHUB_EVENT_FORCED: ${{ github.event.forced }}
  39. GITHUB_REF_BEFORE: ${{ github.event.before }}
  40. USE_FALLBACK: ${{ inputs.useFallback }}
  41. DIFF_FILTER: ${{ inputs.diffFilter }}
  42. run: |
  43. : Check for Changed Files ✅
  44. if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
  45. shopt -s extglob
  46. shopt -s dotglob
  47. # 4b825dc642cb6eb9a060e54bf8d69288fbee4904 is a "hidden" sha1 hash of
  48. # the "empty tree", retrived via 'git hash-object -t tree /dev/null',
  49. # and used here as a last-resort fallback to always provide a valid
  50. # git ref.
  51. if [[ "${GIT_BASE_REF}" ]]; then
  52. if ! git cat-file -e "${GIT_BASE_REF}" &> /dev/null; then
  53. echo "::warning::Provided base reference ${GIT_BASE_REF} is invalid"
  54. if [[ "${USE_FALLBACK}" == 'true' ]]; then
  55. GIT_BASE_REF='HEAD~1'
  56. fi
  57. fi
  58. else
  59. if ! git cat-file -e ${GITHUB_REF_BEFORE} &> /dev/null; then
  60. GITHUB_REF_BEFORE='4b825dc642cb6eb9a060e54bf8d69288fbee4904'
  61. fi
  62. GIT_BASE_REF='HEAD~1'
  63. case "${GITHUB_EVENT_NAME}" in
  64. pull_request) GIT_BASE_REF="origin/${GITHUB_BASE_REF}" ;;
  65. push) if [[ "${GITHUB_EVENT_FORCED}" != 'true' ]]; then GIT_BASE_REF="${GITHUB_REF_BEFORE}"; fi ;;
  66. *) ;;
  67. esac
  68. fi
  69. changes=($(git diff --name-only --diff-filter="${DIFF_FILTER}" ${GIT_BASE_REF} ${GIT_REF} -- ${{ inputs.checkGlob }}))
  70. if (( ${#changes[@]} )); then
  71. file_string="${changes[*]}"
  72. echo "hasChangedFiles=true" >> $GITHUB_OUTPUT
  73. echo "changedFiles=[\"${file_string// /\",\"}\"]" >> $GITHUB_OUTPUT
  74. else
  75. echo "hasChangedFiles=false" >> $GITHUB_OUTPUT
  76. echo "changedFiles=[]" >> GITHUB_OUTPUT
  77. fi