1
0
mirror of https://github.com/rclone/rclone.git synced 2025-12-06 00:03:32 +00:00
Files
rclone/bin/make_backend_docs.py
albertony 0f3aa17fb6 build: improve backend docs autogenerated marker line
Replace custom rem hugo shortcode template with HTML comment. HTML comments are now
allowed in Hugo without enabling unsafe HTML parsing.

Improve the text in the comment: Remove unnecessary quoting, and avoid impression that
make backenddocs has to be run and results committed, since we have a lint check which
will then report error because we want to prevent manual changes in autogenerated sections.

Disable the markdownlint rule line-length on the autogenerated marker line.

Make the autogenerated marker detection a bit more robust.

See #8942 for more details.
2025-11-04 21:56:01 +01:00

91 lines
3.3 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Make backend documentation
"""
import sys
import os
import io
import subprocess
from pathlib import Path
begin = "<!-- "
end = " -->"
marker = "autogenerated options"
line_marker_start_prefix = begin + marker + " start "
line_marker_stop = begin + marker + " stop" + end
markdownlint_disable = begin + "markdownlint-disable-line line-length" + end
def find_backends():
"""Return a list of all backends"""
return [ x for x in os.listdir("backend") if x not in ("all",) ]
def output_docs(backend, out, cwd):
"""Output documentation for backend options to out"""
out.flush()
subprocess.check_call(["./rclone", "--config=/notfound", "help", "backend", backend], stdout=out)
def output_backend_tool_docs(backend, out, cwd):
"""Output documentation for backend tool to out"""
out.flush()
subprocess.call(["./rclone", "--config=/notfound", "backend", "help", backend], stdout=out, stderr=subprocess.DEVNULL)
def alter_doc(backend):
"""Alter the documentation for backend"""
rclone_bin_dir = Path(sys.path[0]).parent.absolute()
doc_file = "docs/content/"+backend+".md"
doc_file2 = "docs/content/"+backend+"/_index.md"
if not os.path.exists(doc_file) and os.path.exists(doc_file2):
doc_file = doc_file2
if not os.path.exists(doc_file):
raise ValueError("Didn't find doc file %s" % (doc_file,))
new_file = doc_file+"~new~"
altered = False
with open(doc_file, "r", encoding="utf_8") as in_file, open(new_file, "w", encoding="utf_8") as out_file:
in_docs = False
for line in in_file:
if not in_docs:
if line.lstrip().startswith(line_marker_start_prefix):
in_docs = True
line_marker_start = (line_marker_start_prefix + "- DO NOT EDIT - instead edit fs.RegInfo in backend/%s/%s.go and run make backenddocs to verify" + end) % (backend, backend)
out_file.write(line_marker_start + " " + markdownlint_disable + "\n")
output_docs(backend, out_file, rclone_bin_dir)
output_backend_tool_docs(backend, out_file, rclone_bin_dir)
out_file.write(line_marker_stop + "\n")
altered = True
if not in_docs:
out_file.write(line)
if in_docs:
if line.strip() == line_marker_stop:
in_docs = False
os.rename(doc_file, doc_file+"~")
os.rename(new_file, doc_file)
if not altered:
raise ValueError("Didn't find '%s' markers in %s" % (line_marker_start_prefix, doc_file))
def main(args):
# single backend
if (len(args) == 2):
try:
alter_doc(args[1])
print("Added docs for %s backend" % args[1])
except Exception as e:
print("Failed adding docs for %s backend: %s" % (args[1], e))
return
# all backends
failed, success = 0, 0
for backend in find_backends():
try:
alter_doc(backend)
except Exception as e:
print("Failed adding docs for %s backend: %s" % (backend, e))
failed += 1
else:
success += 1
print("Added docs for %d backends with %d failures" % (success, failed))
if __name__ == "__main__":
main(sys.argv)