#!/bin/sh # # This is a script that can be used in each book's CI to validate links using # the same tool as rust-lang/rust. # # This requires the rust-docs rustup component to be installed in the nightly # toolchain. # # Usage: # ./linkcheck.sh # # Options: # # -i "Iterative" mode. The script will not clean up after it is done so # you can inspect the result, and re-run more quickly. # # --all Check all books. This can help make sure you don't break links # from other books into your book. # # --path # Path to the root directory for the book. Default to the current # working directory if omitted. set -e html_dir="$(rustc +nightly --print sysroot)/share/doc/rust/html" if [ ! -d "$html_dir" ] then echo "HTML docs are missing from sysroot: $html_dir" echo "Make sure the nightly rust-docs rustup component is installed." exit 1 fi # Avoid failure caused by newer mdbook. export MDBOOK_OUTPUT__HTML__INPUT_404="" book_name="" # Default to the current directory book_path="." # Iterative will avoid cleaning up, so you can quickly run it repeatedly. iterative=0 # If "1", test all books, else only this book. all_books=0 while [ "$1" != "" ] do case "$1" in -i) iterative=1 ;; --all) all_books=1 ;; --path) book_path="${2:-.}" shift ;; *) if [ -n "$book_name" ] then echo "only one argument allowed" exit 1 fi book_name="$1" ;; esac shift done if [ -z "$book_name" ] then echo "usage: $0 " exit 1 fi if [ ! -f "$book_path/book.toml" ] && [ ! -f "$book_path/src/SUMMARY.md" ] then echo "Run command in root directory of the book or provide a path to the book" exit 1 fi if [ ! -d "$html_dir/$book_name" ] then echo "book name \"$book_name\" not found in sysroot \"$html_dir\"" exit 1 fi if [ "$iterative" = "0" ] then echo "Cleaning old directories..." rm -rf linkcheck linkchecker fi if [ ! -e "linkchecker/main.rs" ] || [ "$iterative" = "0" ] then echo "Downloading linkchecker source..." nightly_hash=$(rustc +nightly -Vv | grep commit-hash | cut -f2 -d" ") url="https://raw.githubusercontent.com/rust-lang/rust" mkdir linkchecker curl -o linkchecker/Cargo.toml ${url}/${nightly_hash}/src/tools/linkchecker/Cargo.toml curl -o linkchecker/main.rs ${url}/${nightly_hash}/src/tools/linkchecker/main.rs fi echo "Building book \"$book_name\"..." mdbook build "$book_path" cp -R "$html_dir" linkcheck rm -rf "linkcheck/$book_name" cp -R "$book_path/book" "linkcheck/$book_name" if [ "$all_books" = "1" ] then check_path="linkcheck" else check_path="linkcheck/$book_name" fi echo "Running linkchecker on \"$check_path\"..." cargo run --release --manifest-path=linkchecker/Cargo.toml -- "$check_path" if [ "$iterative" = "0" ] then rm -rf linkcheck linkchecker fi echo "Link check completed successfully!"