postgresql/doc/src/sgml/xmltools_dep_wrapper

55 lines
1.8 KiB
Python

#!/usr/bin/env python3
# A small wrapper around xmllint and xsltproc that collects dependency
# information (in gcc's format) using --load-trace.
import argparse
import re
import subprocess
import sys
parser = argparse.ArgumentParser(
description='generate dependency file for docs')
parser.add_argument('--targetname', type=str, required=False, nargs='+')
parser.add_argument('--depfile', type=str, required=False)
parser.add_argument('--tool', type=str, required=True)
parser.add_argument('flags', nargs='*')
args = parser.parse_args()
if args.depfile:
command = [args.tool, '--load-trace'] + args.flags
# list of targets that depend on the loaded files we see via --load-trace
line_start = ' '.join(args.targetname) + ': '
# --load-trace flag displays all the documents loaded during the processing
# to stderr
res = subprocess.run(command, stderr=subprocess.PIPE,
universal_newlines=True)
line_re = re.compile('^Loaded URL="([^"]+)"')
with open(args.depfile, 'w') as f:
for line in res.stderr.splitlines():
m = re.match(line_re, line)
# continue to show errors
if m is None:
print(line, file=sys.stderr)
continue
# Absolute paths are printed as file://, relative paths as-is. We
# don't care about http://, as a) those will be printed even if
# resolved locally b) we couldn't have a dependency anyway.
fname = m.group(1)
if fname.startswith('http://'):
continue
if fname.startswith('file://'):
fname = fname.split('file://')[1]
f.write(line_start + fname + '\n')
else:
command = [args.tool] + args.flags
res = subprocess.run(command)
exit(res.returncode)