aboutsummaryrefslogtreecommitdiff
path: root/bin/make_redirects
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2023-11-06 12:20:00 +0000
committerIan Jackson <ijackson@chiark.greenend.org.uk>2023-11-06 12:40:14 +0000
commit3121c10c737a30d1288ad3955f9105dcb193df73 (patch)
tree3a2ea674921aee44d104ef0c33f5bedcc8402938 /bin/make_redirects
parent3fb917d86aad672b63005ef44e4936fe1564a8ff (diff)
downloadtorspec-3121c10c737a30d1288ad3955f9105dcb193df73.tar.gz
torspec-3121c10c737a30d1288ad3955f9105dcb193df73.zip
Remove language file extension from bin/*
Putting ".sh" or ".py" on the end of scripts is an antipattern. It makes it inconvenient to change the implementation language. Change all call sites.
Diffstat (limited to 'bin/make_redirects')
-rwxr-xr-xbin/make_redirects78
1 files changed, 78 insertions, 0 deletions
diff --git a/bin/make_redirects b/bin/make_redirects
new file mode 100755
index 0000000..ea8ea3b
--- /dev/null
+++ b/bin/make_redirects
@@ -0,0 +1,78 @@
+#!/usr/bin/env python3
+
+import yaml, os, re, sys
+
+def update_file(fname, start_marker, end_marker, replacement):
+ content = list(open(fname, 'r').readlines())
+ startline = content.index(start_marker)
+ endline = content.index(end_marker)
+ assert endline > startline
+ content[startline+1:endline] = replacement
+
+ with open(fname+".tmp", 'w') as f:
+ f.write("".join(content))
+ os.rename(fname+".tmp", fname)
+
+BOOK_START = "# BEGIN AUTO-GENERATED REDIRECTS\n"
+BOOK_END = "# END AUTO-GENERATED REDIRECTS\n"
+
+README_START = "<!-- BEGIN AUTO-GENERATED REDIRECTS -->\n"
+README_END = "<!-- END AUTO-GENERATED REDIRECTS -->\n"
+
+def book_redirects(rs, spec_dir):
+ lines = []
+ for kwd, info in rs.items():
+ if os.path.isdir(os.path.join(spec_dir, kwd)):
+ assert os.path.isfile(os.path.join(spec_dir, kwd, "index.md"))
+ assert info.get('implicit')
+ continue
+ elif any((os.path.isfile(os.path.join(spec_dir, kwd) + ext)) for ext in [".txt", ".md"]):
+ assert info.get('implicit')
+ continue
+ else:
+ assert not info.get('implicit')
+ source = kwd + ".html"
+ target = info['target']
+ lines.append(
+ f'"/{source}" = "{target}"\n'
+ )
+ return "".join(lines)
+
+def readme_redirects(rs):
+ lines = [ "<dl>\n" ]
+ for kwd, info in rs.items():
+ target = info['target']
+ desc = info['description']
+ lines.append(f'<dt><a href="/{kwd}"><code>/{kwd}</code></a></dt>\n')
+ lines.append(f'<dd><a href="{target}"><code>{target}</code> ({desc})</a></dt>\n')
+
+ lines.append("</dl>\n")
+ return "".join(lines)
+
+def proposal_redirects(proposals_dir):
+ lines = []
+ for fname in os.listdir(proposals_dir):
+ m = re.match(r'^(\d+)-.*\.(?:md|txt)$', fname)
+ if m:
+ source = m.group(1) + ".html"
+ target, targetext = os.path.splitext(fname)
+ if targetext == '.md':
+ targetext = ".html"
+ lines.append(f'"/{source}" = "./{target}{targetext}"\n')
+ lines.sort()
+ return "".join(lines)
+
+if __name__ == '__main__':
+ toplevel = os.path.join(os.path.dirname(sys.argv[0]), "..")
+ spec_book_fname = os.path.join(toplevel, "mdbook", "spec", "book.toml")
+ spec_dir = os.path.join(toplevel, "spec")
+ readme_fname = os.path.join(toplevel, "spec", "README.md")
+ prop_dir = os.path.join(toplevel, "proposals")
+ prop_book_fname = os.path.join(toplevel, "mdbook", "proposals", "book.toml")
+ yaml_fname = os.path.join(toplevel, "mdbook", "spec", "spec-redirects.yaml")
+
+ rs = yaml.load(open(yaml_fname), yaml.Loader)['redirects']
+
+ update_file(spec_book_fname, BOOK_START, BOOK_END, book_redirects(rs, spec_dir))
+ update_file(readme_fname, README_START, README_END, readme_redirects(rs))
+ update_file(prop_book_fname, BOOK_START, BOOK_END, proposal_redirects(prop_dir))