1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-12-09 02:21:02 +01:00

doc: make manpage URLs configurable based on release type

Add configurable documentation URLs that change based on whether this is
an official release or development build:

- Nix builds:
  - Development (officialRelease = false): Use /latest/ URLs
  - Official releases (officialRelease = true): Use versioned URLs with
    MAJOR.MINOR only (e.g., /2.33/ instead of /2.33.0/)
- Plain meson builds: Default to versioned URLs (official-release = true)

Changes:
- Add --doc-url parameter to expand-includes.py
- Add meson option 'official-release' (defaults to true for Meson builds)
- Compute doc_url in meson.build based on version and official-release
- Forward Nix officialRelease variable to Meson in package.nix
- Update render-manpage.sh to pass doc-url parameter

This allows distros (Fedora, etc.) to have stable versioned URLs by default,
while Nix development builds point to /latest/ for up-to-date documentation.
This commit is contained in:
Robert Hensing 2025-12-06 19:53:57 +01:00
parent d007b4e81b
commit cca8b5ca60
5 changed files with 45 additions and 11 deletions

View file

@ -91,7 +91,7 @@ def expand_includes(
return ''.join(lines) return ''.join(lines)
def resolve_docroot(content: str, current_file: Path, source_root: Path) -> str: def resolve_docroot(content: str, current_file: Path, source_root: Path, docroot_url: str) -> str:
""" """
Replace @docroot@ with nix.dev URL and convert .md to .html. Replace @docroot@ with nix.dev URL and convert .md to .html.
@ -99,10 +99,6 @@ def resolve_docroot(content: str, current_file: Path, source_root: Path) -> str:
manpages are viewed standalone. lowdown will display these as proper manpages are viewed standalone. lowdown will display these as proper
references in the manpage output. references in the manpage output.
""" """
# Use the latest nix.dev documentation URL
# This matches what users would actually want to reference from a manpage
docroot_url = "https://nix.dev/manual/nix/latest"
# Replace @docroot@ with the base URL # Replace @docroot@ with the base URL
content = content.replace("@docroot@", docroot_url) content = content.replace("@docroot@", docroot_url)
@ -126,6 +122,7 @@ def process_file(
input_file: Path, input_file: Path,
source_root: Path, source_root: Path,
generated_root: Path | None, generated_root: Path | None,
docroot_url: str,
) -> str: ) -> str:
"""Process a single markdown file.""" """Process a single markdown file."""
content = input_file.read_text() content = input_file.read_text()
@ -134,7 +131,7 @@ def process_file(
content = expand_includes(content, input_file, source_root, generated_root) content = expand_includes(content, input_file, source_root, generated_root)
# Resolve @docroot@ references # Resolve @docroot@ references
content = resolve_docroot(content, input_file, source_root) content = resolve_docroot(content, input_file, source_root, docroot_url)
# Resolve @_at_ escapes # Resolve @_at_ escapes
content = resolve_at_escapes(content) content = resolve_at_escapes(content)
@ -181,6 +178,12 @@ Examples:
type=Path, type=Path,
help="Output file (default: stdout)", help="Output file (default: stdout)",
) )
parser.add_argument(
"-u", "--doc-url",
type=str,
default="https://nix.dev/manual/nix/latest",
help="Base URL for documentation links (default: https://nix.dev/manual/nix/latest)",
)
args = parser.parse_args() args = parser.parse_args()
@ -199,7 +202,7 @@ Examples:
try: try:
# Process the file # Process the file
output = process_file(args.input_file, args.source_root, args.generated_root) output = process_file(args.input_file, args.source_root, args.generated_root, args.doc_url)
# Write output # Write output
if args.output: if args.output:

View file

@ -5,6 +5,20 @@ project(
license : 'LGPL-2.1-or-later', license : 'LGPL-2.1-or-later',
) )
# Compute documentation URL based on version and release type
version = meson.project_version()
official_release = get_option('official-release')
if official_release
# For official releases, use versioned URL (dropping patch version)
version_parts = version.split('.')
major_minor = '@0@.@1@'.format(version_parts[0], version_parts[1])
doc_url = 'https://nix.dev/manual/nix/@0@'.format(major_minor)
else
# For development builds, use /latest
doc_url = 'https://nix.dev/manual/nix/latest'
endif
nix = find_program('nix', native : true) nix = find_program('nix', native : true)
mdbook = find_program('mdbook', native : true) mdbook = find_program('mdbook', native : true)
@ -215,6 +229,7 @@ foreach command : nix_nested_manpages
section, section,
meson.current_source_dir() / 'source', meson.current_source_dir() / 'source',
meson.current_build_dir() / 'source', meson.current_build_dir() / 'source',
doc_url,
meson.current_source_dir() / 'source/command-ref' / command[0] / (page + '.md'), meson.current_source_dir() / 'source/command-ref' / command[0] / (page + '.md'),
'@OUTPUT0@', '@OUTPUT0@',
], ],
@ -334,6 +349,7 @@ foreach page : nix3_manpages
section, section,
meson.current_source_dir() / 'source', meson.current_source_dir() / 'source',
meson.current_build_dir() / 'source', meson.current_build_dir() / 'source',
doc_url,
meson.current_build_dir() / 'source/command-ref/new-cli/@0@.md'.format( meson.current_build_dir() / 'source/command-ref/new-cli/@0@.md'.format(
page, page,
), ),
@ -390,6 +406,7 @@ foreach entry : nix_manpages
section, section,
meson.current_source_dir() / 'source', meson.current_source_dir() / 'source',
meson.current_build_dir() / 'source', meson.current_build_dir() / 'source',
doc_url,
input_file, input_file,
'@OUTPUT@', '@OUTPUT@',
], ],

6
doc/manual/meson.options Normal file
View file

@ -0,0 +1,6 @@
option(
'official-release',
type : 'boolean',
value : true,
description : 'Whether this is an official release build (affects documentation URLs)',
)

View file

@ -81,6 +81,10 @@ mkMesonDerivation (finalAttrs: {
changelog-d changelog-d
]; ];
mesonFlags = [
(lib.mesonBool "official-release" officialRelease)
];
preConfigure = '' preConfigure = ''
chmod u+w ./.version chmod u+w ./.version
echo ${finalAttrs.version} > ./.version echo ${finalAttrs.version} > ./.version

View file

@ -15,20 +15,22 @@ if [ "$1" = --out-no-smarty ]; then
shift shift
fi fi
[ "$#" = 6 ] || { [ "$#" = 7 ] || {
cat >&2 <<EOF cat >&2 <<EOF
Usage: $0 [--out-no-smarty] <title> <section> <source-root> <generated-root> <infile> <outfile> Usage: $0 [--out-no-smarty] <title> <section> <source-root> <generated-root> <doc-url> <infile> <outfile>
Arguments: Arguments:
title - Manpage title (e.g., "nix-env --install") title - Manpage title (e.g., "nix-env --install")
section - Manpage section number (1, 5, 8, etc.) section - Manpage section number (1, 5, 8, etc.)
source-root - Root directory of markdown sources source-root - Root directory of markdown sources
generated-root - Root directory of generated markdown files generated-root - Root directory of generated markdown files
doc-url - Base URL for documentation links
infile - Input markdown file (relative to build directory) infile - Input markdown file (relative to build directory)
outfile - Output manpage file outfile - Output manpage file
Examples: Examples:
$0 "nix-store --query" 1 doc/manual/source build/doc/manual/source \\ $0 "nix-store --query" 1 doc/manual/source build/doc/manual/source \\
https://nix.dev/manual/nix/latest \\
build/doc/manual/source/command-ref/nix-store/query.md nix-store-query.1 build/doc/manual/source/command-ref/nix-store/query.md nix-store-query.1
EOF EOF
exit 1 exit 1
@ -38,8 +40,9 @@ title="$1"
section="$2" section="$2"
source_root="$3" source_root="$3"
generated_root="$4" generated_root="$4"
infile="$5" doc_url="$5"
outfile="$6" infile="$6"
outfile="$7"
# Expand includes and pipe to lowdown # Expand includes and pipe to lowdown
( (
@ -47,5 +50,6 @@ outfile="$6"
python3 "$script_dir/expand-includes.py" \ python3 "$script_dir/expand-includes.py" \
--source-root "$source_root" \ --source-root "$source_root" \
--generated-root "$generated_root" \ --generated-root "$generated_root" \
--doc-url "$doc_url" \
"$infile" "$infile"
) | lowdown -sT man --nroff-nolinks $lowdown_args -M section="$section" -o "$outfile" ) | lowdown -sT man --nroff-nolinks $lowdown_args -M section="$section" -o "$outfile"