Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exclude files and folders #183

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/push.yml
Expand Up @@ -17,8 +17,10 @@ jobs:
uses: ./
with:
# Add a test to restrict the test to just dir4 and dir5.
folder-path: './md/dir4, ./md/dir5'
folder-path: '.'
file-path: './md/AdditionalFileTest1.md, ./md/AdditionalFileTest2.md'
exclude-folder-path: './md/dir3, ./md/dir4'
exclude-file: './md/dir1/level-1a.md, ./md/dir2/dir2level2/level-2b.md'
shellcheck:
runs-on: [ubuntu-latest]
steps:
Expand Down
22 changes: 16 additions & 6 deletions action.yml
Expand Up @@ -2,23 +2,23 @@ name: 'markdown-link-check'
description: 'Check if all links are valid in markdown files.'
author: 'Gaurav Nelson'
branding:
icon: 'link'
icon: 'link'
color: 'green'
inputs:
use-quiet-mode:
description: 'Use yes to enable markdown-link-check quiet mode which only list errors.'
description: 'Use yes to enable markdown-link-check quiet mode which only lists errors.'
required: true
default: 'no'
use-verbose-mode:
description: 'Use yes to enable markdown-link-check verbose mode which lists additional details.'
required: true
default: 'no'
config-file:
description: 'Specify path to a markdown-link-check JSON configuration file.'
description: 'Specify the path to a markdown-link-check JSON configuration file.'
required: true
default: 'mlc_config.json'
folder-path:
description: 'Specify path to a custom folder where your markdown files are located.'
description: 'Specify the path to a custom folder where your markdown files are located.'
required: true
default: '.'
max-depth:
Expand All @@ -30,17 +30,25 @@ inputs:
required: true
default: 'no'
base-branch:
description: 'Use this to specify the base branch against which the action finds the modififed files.'
description: 'Use this to specify the base branch against which the action finds the modified files.'
required: true
default: 'master'
file-extension:
description: 'Use this to specify the file extension of Markdown files.'
required: true
default: '.md'
file-path:
description: 'Specify additional files you want to check'
description: 'Specify additional files you want to check.'
required: true
default: ''
exclude-folder-path:
description: 'Specify the path to exclude folders from the search.'
required: false
default: ''
exclude-file:
description: 'Specify additional files to exclude from the check.'
required: false
default: ''

runs:
using: 'docker'
Expand All @@ -55,3 +63,5 @@ runs:
- ${{ inputs.base-branch }}
- ${{ inputs.file-extension }}
- ${{ inputs.file-path }}
- ${{ inputs.exclude-folder-path }}
- ${{ inputs.exclude-file }}
203 changes: 95 additions & 108 deletions entrypoint.sh
Expand Up @@ -13,9 +13,10 @@ echo "::group::Debug information"
npm -g list --depth=1
echo "::endgroup::"

declare -a FIND_CALL
declare -a COMMAND_DIRS COMMAND_FILES
declare -a COMMAND_FILES
declare -a COMMANDS
declare -a FOLDERS
declare -a EXCLUDE_DIRS
declare -a EXCLUDE_FILES

USE_QUIET_MODE="$1"
USE_VERBOSE_MODE="$2"
Expand All @@ -30,6 +31,8 @@ else
FILE_EXTENSION="$8"
fi
FILE_PATH="$9"
EXCLUDE_FOLDERS="${10:-}"
EXCLUDE_FILES="${11:-}"

if [ -f "$CONFIG_FILE" ]; then
echo -e "${BLUE}Using markdown-link-check configuration file: ${YELLOW}$CONFIG_FILE${NC}"
Expand All @@ -39,55 +42,73 @@ else
echo -e "customizing markdown-link-check by using a configuration file.${NC}"
fi

FOLDERS=""
FILES=""

echo -e "${BLUE}USE_QUIET_MODE: $1${NC}"
echo -e "${BLUE}USE_VERBOSE_MODE: $2${NC}"
echo -e "${BLUE}FOLDER_PATH: $4${NC}"
echo -e "${BLUE}MAX_DEPTH: $5${NC}"
echo -e "${BLUE}CHECK_MODIFIED_FILES: $6${NC}"
echo -e "${BLUE}FILE_EXTENSION: $8${NC}"
echo -e "${BLUE}FILE_PATH: $9${NC}"

echo -e "${BLUE}USE_QUIET_MODE: $USE_QUIET_MODE${NC}"
echo -e "${BLUE}USE_VERBOSE_MODE: $USE_VERBOSE_MODE${NC}"
echo -e "${BLUE}FOLDER_PATH: $FOLDER_PATH${NC}"
echo -e "${BLUE}MAX_DEPTH: $MAX_DEPTH${NC}"
echo -e "${BLUE}CHECK_MODIFIED_FILES: $CHECK_MODIFIED_FILES${NC}"
echo -e "${BLUE}FILE_EXTENSION: $FILE_EXTENSION${NC}"
echo -e "${BLUE}FILE_PATH: $FILE_PATH${NC}"
echo -e "${BLUE}EXCLUDE_FOLDERS: $EXCLUDE_FOLDERS${NC}"
echo -e "${BLUE}EXCLUDE_FILES: $EXCLUDE_FILES${NC}"

# Helper function to handle directory paths
handle_dirs () {
IFS=',' read -r -a DIRLIST <<< "$FOLDER_PATH"

IFS=', ' read -r -a DIRLIST <<< "$FOLDER_PATH"

for index in "${!DIRLIST[@]}"
do
for index in "${!DIRLIST[@]}"; do
if [ ! -d "${DIRLIST[index]}" ]; then
echo -e "${RED}ERROR [鉁朷 Can't find the directory: ${YELLOW}${DIRLIST[index]}${NC}"
exit 2
fi
COMMAND_DIRS+=("${DIRLIST[index]}")
# Add directory paths to the array
FOLDERS+=("${DIRLIST[index]}")
done
FOLDERS="${COMMAND_DIRS[*]}"
}

# Helper function to handle excluded directory paths
handle_exclude_dirs () {
IFS=',' read -r -a EXCLUDE_DIRLIST <<< "$EXCLUDE_FOLDERS"

for index in "${!EXCLUDE_DIRLIST[@]}"; do
if [ ! -d "${EXCLUDE_DIRLIST[index]}" ]; then
echo -e "${RED}ERROR [鉁朷 Can't find the directory: ${YELLOW}${EXCLUDE_DIRLIST[index]}${NC}"
exit 2
fi
# Add exclusion rules for directories to the array
EXCLUDE_DIRS+=("-not -path '${EXCLUDE_DIRLIST[index]}'")
done
}

# Helper function to handle file paths
handle_files () {
IFS=',' read -r -a FILELIST <<< "$FILE_PATH"

IFS=', ' read -r -a FILELIST <<< "$FILE_PATH"

for index in "${!FILELIST[@]}"
do
for index in "${!FILELIST[@]}"; do
if [ ! -f "${FILELIST[index]}" ]; then
echo -e "${RED}ERROR [鉁朷 Can't find the file: ${YELLOW}${FILELIST[index]}${NC}"
exit 2
fi
if [ "$index" == 0 ]; then
COMMAND_FILES+=("-wholename ${FILELIST[index]}")
else
COMMAND_FILES+=("-o -wholename ${FILELIST[index]}")
fi
# Add file paths to the array
COMMANDS+=("${FILELIST[index]}")
done
FILES="${COMMAND_FILES[*]}"
}

# Helper function to handle excluded file paths
handle_exclude_files () {
IFS=',' read -r -a EXCLUDE_FILELIST <<< "$EXCLUDE_FILES"

for index in "${!EXCLUDE_FILELIST[@]}"; do
if [ ! -f "${EXCLUDE_FILELIST[index]}" ]; then
echo -e "${RED}ERROR [鉁朷 Can't find the file: ${YELLOW}${EXCLUDE_FILELIST[index]}${NC}"
exit 2
fi
# Add exclusion rules for files to the array
EXCLUDE_FILES+=("-not -name '${EXCLUDE_FILELIST[index]}'")
done
}

check_errors () {

if [ -e error.txt ] ; then
if grep -q "ERROR:" error.txt; then
echo -e "${YELLOW}=========================> MARKDOWN LINK CHECK <=========================${NC}"
Expand All @@ -105,108 +126,74 @@ check_errors () {
else
echo -e "${GREEN}All good!${NC}"
fi

}

add_options () {

if [ -f "$CONFIG_FILE" ]; then
FIND_CALL+=('--config' "${CONFIG_FILE}")
fi

if [ "$USE_QUIET_MODE" = "yes" ]; then
FIND_CALL+=('-q')
fi

if [ "$USE_VERBOSE_MODE" = "yes" ]; then
FIND_CALL+=('-v')
fi

}

check_additional_files () {

if [ -n "$FILES" ]; then
if [ "$MAX_DEPTH" -ne -1 ]; then
FIND_CALL=('find' ${FOLDERS} '-type' 'f' '(' ${FILES} ')' '-not' '-path' './node_modules/*' '-maxdepth' "${MAX_DEPTH}" '-exec' 'markdown-link-check' '{}')
else
FIND_CALL=('find' ${FOLDERS} '-type' 'f' '(' ${FILES} ')' '-not' '-path' './node_modules/*' '-exec' 'markdown-link-check' '{}')
fi

add_options

FIND_CALL+=(';')

set -x
"${FIND_CALL[@]}" &>> error.txt
set +x
if [ -n "$CONFIG_FILE" ]; then
COMMANDS+=("--config" "$CONFIG_FILE")
fi

fi
if [ "$USE_QUIET_MODE" = "yes" ]; then
COMMANDS+=("-q")
fi

}
if [ "$USE_VERBOSE_MODE" = "yes" ]; then
COMMANDS+=("-v")
fi

if [ -z "$8" ]; then
FOLDERS="."
else
handle_dirs
if [ -n "$EXCLUDE_FOLDERS" ]; then
handle_exclude_dirs
fi

if [ -n "$9" ]; then
handle_files
if [ -n "$EXCLUDE_FILES" ]; then
handle_exclude_files
fi

if [ "$CHECK_MODIFIED_FILES" = "yes" ]; then

echo -e "${BLUE}BASE_BRANCH: $7${NC}"
echo -e "${BLUE}BASE_BRANCH: $BASE_BRANCH${NC}"

git config --global --add safe.directory '*'

git fetch origin "${BASE_BRANCH}" --depth=1 > /dev/null
MASTER_HASH=$(git rev-parse origin/"${BASE_BRANCH}")
git fetch origin "$BASE_BRANCH" --depth=1 > /dev/null
MASTER_HASH=$(git rev-parse origin/"$BASE_BRANCH")

if [ -z "$FOLDERS" ]; then
FOLDERS="."
if [ -z "${FOLDERS[*]}" ]; then
FOLDERS=(".")
fi

FIND_CALL=('markdown-link-check')

add_options

FOLDER_ARRAY=(${FOLDER_PATH//,/ })
mapfile -t FILE_ARRAY < <( git diff --name-only --diff-filter=AM "$MASTER_HASH" -- "${FOLDER_ARRAY[@]}")

for i in "${FILE_ARRAY[@]}"
do
if [ "${i##*.}" == "${FILE_EXTENSION#.}" ]; then
FIND_CALL+=("${i}")
COMMAND="${FIND_CALL[*]}"
$COMMAND &>> error.txt || true
unset 'FIND_CALL[${#FIND_CALL[@]}-1]'
fi
done
mapfile -t FILE_ARRAY < <(git diff --name-only --diff-filter=AM "$MASTER_HASH" -- "${FOLDER_ARRAY[@]}")

check_additional_files
for i in "${FILE_ARRAY[@]}"; do
if [ "${i##*.}" == "${FILE_EXTENSION#.}" ]; then
COMMANDS+=("$i")
markdown-link-check "${COMMANDS[@]}" >> error.txt || true
unset 'COMMANDS[${#COMMANDS[@]}-1]'
fi
done

check_errors

else

if [ "$5" -ne -1 ]; then
FIND_CALL=('find' ${FOLDERS} '-name' '*'"${FILE_EXTENSION}" '-not' '-path' './node_modules/*' '-maxdepth' "${MAX_DEPTH}" '-exec' 'markdown-link-check' '{}')
if [ "$MAX_DEPTH" -eq -1 ]; then
MAX_DEPTH=""
else
FIND_CALL=('find' ${FOLDERS} '-name' '*'"${FILE_EXTENSION}" '-not' '-path' './node_modules/*' '-exec' 'markdown-link-check' '{}')
MAX_DEPTH="-maxdepth $MAX_DEPTH"
fi

add_options
if [ -n "$FOLDER_PATH" ]; then
handle_dirs

FIND_CALL+=(';')
# Find all files with the specified extension
mapfile -t FILES < <(find "${FOLDERS[@]}" $MAX_DEPTH -type f -name "*$FILE_EXTENSION" "${EXCLUDE_DIRS[@]}" "${EXCLUDE_FILES[@]}")

set -x
"${FIND_CALL[@]}" &>> error.txt
set +x

check_additional_files

check_errors
for i in "${FILES[@]}"; do
COMMANDS+=("$i")
markdown-link-check "${COMMANDS[@]}" >> error.txt || true
unset 'COMMANDS[${#COMMANDS[@]}-1]'
done

check_errors
else
echo -e "${RED}ERROR [鉁朷 No folder path provided.${NC}"
exit 2
fi
fi