| #!/bin/bash | |
| # | |
| # This script is used to verify links in markdown docs. | |
| # | |
| # - External links are ignored in CI because these links may go down out of our control. | |
| # - Anchors are ignored | |
| # - Internal links conventions | |
| # - Must be absolute and start from repo root | |
| # - Only files in current directory and /media are allowed | |
| # - When a file was moved, all other references are required to be updated for now, even if alias are given | |
| # - This is recommended because of less redirects and better anchors support. | |
| ROOT=$(unset CDPATH && cd $(dirname "${BASH_SOURCE[0]}")/.. && pwd) | |
| cd $ROOT | |
| yarn add markdown-link-check@3.8.1 | |
| VERBOSE=${VERBOSE:-} | |
| CONFIG_TMP=$(mktemp) | |
| ERROR_REPORT=$(mktemp) | |
| trap 'rm -f $CONFIG_TMP $ERROR_REPORT' EXIT | |
| # Check all directories starting with 'v\d.*' and dev. | |
| echo "info: checking links under $ROOT directory..." | |
| sed \ | |
| -e "s#<ROOT>#$ROOT#g" \ | |
| scripts/markdown-link-check.tpl > $CONFIG_TMP | |
| if [ -n "$VERBOSE" ]; then | |
| cat $CONFIG_TMP | |
| fi | |
| # TODO simplify this if markdown-link-check can process multiple files together | |
| while read -r tasks; do | |
| for task in $tasks; do | |
| ( | |
| output=$(yarn markdown-link-check --config "$CONFIG_TMP" "$task" -q) | |
| if [ $? -ne 0 ]; then | |
| printf "$output" >> $ERROR_REPORT | |
| fi | |
| if [ -n "$VERBOSE" ]; then | |
| echo "$output" | |
| fi | |
| ) & | |
| done | |
| wait | |
| done <<<"$(find "." -type f -not -path './node_modules/*' -name '*.md' | xargs -n 10)" | |
| error_files=$(cat $ERROR_REPORT | grep 'FILE: ' | wc -l) | |
| error_output=$(cat $ERROR_REPORT) | |
| echo "" | |
| if [ "$error_files" -gt 0 ]; then | |
| echo "Link error: $error_files files have invalid links. The faulty files are listed below, please fix the wrong links!" | |
| echo "" | |
| echo "=== Hint on how to fix links === " | |
| echo "Links in TiDB documentation follow a style like '/tidb-binlog/deploy-tidb-binlog.md#服务器要求'. That is, you need to make sure that:" | |
| echo "1) Links start with a slash; 2) Anchor links are written in a '/dir/xxx.md#anchor-point' style; 3) Links don't start with a version, e.g. '/v3.0/...' is wrong and '/v3.0' should be removed." | |
| echo "" | |
| echo "=== ERROR REPORT == ": | |
| echo "$error_output" | |
| exit 1 | |
| else | |
| echo "Link check report: All files are ok. No deadlink found!" | |
| fi |