From 1f2aa7a42f9129ab2e8a5ec5420cf98ad9ad0edd Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Thu, 4 Jun 2026 19:54:59 +0000 Subject: [PATCH 1/2] Add lychee link checker config and CI workflow Part of STF-557. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/links.yml | 32 +++++++++++++++++++ .gitignore | 1 + lychee.toml | 63 +++++++++++++++++++++++++++++++++++++ mise.lock | 28 +++++++++++++++++ mise.toml | 5 +++ 5 files changed, 129 insertions(+) create mode 100644 .github/workflows/links.yml create mode 100644 lychee.toml diff --git a/.github/workflows/links.yml b/.github/workflows/links.yml new file mode 100644 index 00000000..5e3255ba --- /dev/null +++ b/.github/workflows/links.yml @@ -0,0 +1,32 @@ +name: Links + +on: + push: + pull_request: + schedule: + - cron: "0 13 * * 1" # weekly, to catch external link rot without a commit + workflow_dispatch: + +permissions: + contents: read + +jobs: + linkChecker: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + + - name: Setup mise + uses: jdx/mise-action@6d1e696aa24c1aa1bcc1adea0212707c71ab78a8 # v3.6.1 + with: + install: false + + # Install only lychee (not the repo's full toolchain) and run the check. + - name: Check links + env: + MISE_AUTO_INSTALL: "false" + run: | + mise install lychee + mise run check-links diff --git a/.gitignore b/.gitignore index 773f5a10..4bc74769 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ target /sample/run.sh reports Test.java +.lycheecache diff --git a/lychee.toml b/lychee.toml new file mode 100644 index 00000000..cdd42143 --- /dev/null +++ b/lychee.toml @@ -0,0 +1,63 @@ +# Lychee link checker configuration +# https://lychee.cli.rs/#/usage/config +# +# Run locally with: +# lychee './**/*.md' './src/**/*.java' './pom.xml' + +# Include URL fragments in checks +include_fragments = true + +# Don't allow any redirects, so links that have moved are surfaced and updated +# to their canonical destination. +max_redirects = 0 + +# Accept these HTTP status codes +# 100-103: Informational responses +# 200-299: Success responses +# 403: Forbidden (some sites use this for rate limiting) +# 429: Too Many Requests +# 500-599: Server errors (temporary issues shouldn't fail CI) +# 999: LinkedIn's custom status code +accept = ["100..=103", "200..=299", "403", "429", "500..=599", "999"] + +# Exclude URL patterns from checking (treated as regular expressions) +exclude = [ + '^file://', + # Live / auth-gated endpoints that appear as string literals or require login + '^https://geoip\.maxmind\.com', + '^https://geolite\.info', + '^https://minfraud\.maxmind\.com', + '^https://sandbox\.maxmind\.com', + '^https://updates\.maxmind\.com', + '^https://www\.maxmind\.com/en/accounts/', + 'https://www\.maxmind\.com/en/account/login', + # XML namespace identifiers in pom.xml (not real links) + '^http://www\.w3\.org/', + '^http://maven\.apache\.org/', + '^https://maven\.apache\.org/xsd/', + '^http://java\.sun\.com/', + '^http://schemas\.', + # Maven property placeholder in a build-time download URL (not a real link) + 'japicmp\.baselineVersion', + # Placeholders / local + '^https?://example\.(com|org|net)', + '^http://localhost', + '127\.0\.0\.1', +] + +# Exclude file paths from getting checked (treated as regular expressions) +exclude_path = [ + '(^|/)node_modules/', + '(^|/)target/', + # Test fixtures (MaxMind-DB submodule) contain example URLs, not ours + '(^|/)src/test/resources/', + # Changelog: historical entries are preserved as-is, not rewritten + '(^|/)CHANGELOG\.md$', +] + +# Cache results for 1 day to speed up repeated checks +cache = true +max_cache_age = "1d" + +# Skip missing input files instead of erroring +skip_missing = true diff --git a/mise.lock b/mise.lock index 1dd4e124..fa8fae3c 100644 --- a/mise.lock +++ b/mise.lock @@ -40,6 +40,34 @@ backend = "core:java" checksum = "sha256:2f2802d57b5fc414f1ddf6648ba12cc9a6454cf67b32ac95407c018f2e6ab0b0" url = "https://download.java.net/java/GA/jdk26.0.1/458fda22e4c54d5ba572ab8d2b22eb83/8/GPL/openjdk-26.0.1_linux-x64_bin.tar.gz" +[[tools.lychee]] +version = "0.23.0" +backend = "aqua:lycheeverse/lychee" + +[tools.lychee."platforms.linux-arm64"] +checksum = "sha256:97eb93b02a7d78a752fc33e5b0983439ccaadbf3db952b68a0a4401acd92e6e0" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-aarch64-unknown-linux-gnu.tar.gz" + +[tools.lychee."platforms.linux-arm64-musl"] +checksum = "sha256:97eb93b02a7d78a752fc33e5b0983439ccaadbf3db952b68a0a4401acd92e6e0" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-aarch64-unknown-linux-gnu.tar.gz" + +[tools.lychee."platforms.linux-x64"] +checksum = "sha256:5538440d2c69a45a0a09983271e5dee0c2fe7137d8035d25b2632e10a66a090a" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-x86_64-unknown-linux-musl.tar.gz" + +[tools.lychee."platforms.linux-x64-musl"] +checksum = "sha256:5538440d2c69a45a0a09983271e5dee0c2fe7137d8035d25b2632e10a66a090a" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-x86_64-unknown-linux-musl.tar.gz" + +[tools.lychee."platforms.macos-arm64"] +checksum = "sha256:4c8034900e11083b68ac6f6582c377ff1f704e268991999e09d717973e493e7f" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-arm64-macos.dmg" + +[tools.lychee."platforms.windows-x64"] +checksum = "sha256:0fda7ff0a60c0250939fc25361c2d4e6e7853c31c996733fdd5a1dd760bcb824" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-x86_64-windows.exe" + [[tools.maven]] version = "3.9.15" backend = "aqua:apache/maven" diff --git a/mise.toml b/mise.toml index 4a11f83e..9ac550c4 100644 --- a/mise.toml +++ b/mise.toml @@ -9,6 +9,7 @@ disable_backends = [ [tools] hugo = "latest" java = "latest" +lychee = "latest" maven = "latest" [tasks.build-docs] @@ -19,6 +20,10 @@ run = "hugo --source docs --minify" description = "Serve the docs site locally with Hugo dev server" run = "hugo server --source docs" +[tasks.check-links] +description = "Check links with lychee" +run = "lychee --no-progress './**/*.md' './src/**/*.java' './pom.xml'" + [hooks] enter = "mise install --quiet --locked" From b06732b8fc3c7c69e3b4c2bd07dbdc5ed67a6732 Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Thu, 4 Jun 2026 19:56:12 +0000 Subject: [PATCH 2/2] Update stale and redirecting links - http://dev.maxmind.com/ -> https://dev.maxmind.com/ (pom.xml) - http://www.apache.org/licenses/LICENSE-2.0.html -> https://www.apache.org/licenses/LICENSE-2.0.html (pom.xml) - http://www.maxmind.com/ -> https://www.maxmind.com/en/home (pom.xml) - https://www.maxmind.com/en/support -> https://support.maxmind.com/knowledge-base (README.md, UPGRADING.md) Part of STF-557. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 2 +- UPGRADING.md | 2 +- pom.xml | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d383f40d..32a5461e 100644 --- a/README.md +++ b/README.md @@ -285,7 +285,7 @@ Please report all issues with this code using the [GitHub issue tracker](https://github.com/maxmind/MaxMind-DB-Reader-java/issues). If you are having an issue with a MaxMind database or service that is not -specific to this reader, please [contact MaxMind support](https://www.maxmind.com/en/support). +specific to this reader, please [contact MaxMind support](https://support.maxmind.com/knowledge-base). ## Requirements ## diff --git a/UPGRADING.md b/UPGRADING.md index 090205b1..3feee79d 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -252,4 +252,4 @@ To help identify code that needs updating, you can search your codebase for: If you encounter issues during the upgrade, please check: - [GitHub Issues](https://github.com/maxmind/MaxMind-DB-Reader-java/issues) -- [MaxMind Support](https://www.maxmind.com/en/support) +- [MaxMind Support](https://support.maxmind.com/knowledge-base) diff --git a/pom.xml b/pom.xml index a8ae2340..50dfd01e 100644 --- a/pom.xml +++ b/pom.xml @@ -7,17 +7,17 @@ jar MaxMind DB Reader Reader for MaxMind DB - http://dev.maxmind.com/ + https://dev.maxmind.com/ Apache License 2.0 - http://www.apache.org/licenses/LICENSE-2.0.html + https://www.apache.org/licenses/LICENSE-2.0.html repo MaxMind, Inc. - http://www.maxmind.com/ + https://www.maxmind.com/en/home https://github.com/maxmind/MaxMind-DB-Reader-java