#!/usr/bin/env python
import os
import shutil
import subprocess
import sys
import hashlib
import re
def hash_rst_includes(incdir,txt):
h = ""
for fn in re.findall(br"^..\s+include::\s+(.*)$", txt, flags=re.MULTILINE):
with open(os.path.join(incdir,fn.decode()),"rb") as F:
h = h + hashlib.sha1(F.read()).hexdigest();
return h.encode();
def get_id(SRC):
"""Return a unique ID for the SRC file. For simplicity and robustness we just
content hash it"""
incdir = os.path.dirname(SRC)
with open(SRC,"rb") as F:
txt = F.read();
if SRC.endswith(".rst"):
txt = txt + hash_rst_includes(incdir,txt);
return hashlib.sha1(txt).hexdigest();
def do_retrieve(src_root,SRC):
"""Retrieve the file from the prebuild cache and write it to DEST"""
prebuilt = os.path.join(src_root,"buildlib","pandoc-prebuilt",get_id(SRC))
sys.stdout.write(prebuilt);
def do_build_pandoc(build_root,pandoc,SRC,DEST):
"""Build the markdown into a man page with pandoc and then keep a copy of the
output under build/pandoc-prebuilt"""
try:
subprocess.check_call([pandoc,"-s","-t","man",SRC,"-o",DEST]);
except subprocess.CalledProcessError:
sys.exit(100);
shutil.copy(DEST,os.path.join(build_root,"pandoc-prebuilt",get_id(SRC)));
def do_build_rst2man(build_root,rst2man,SRC,DEST):
"""Build the markdown into a man page with pandoc and then keep a copy of the
output under build/pandoc-prebuilt"""
try:
subprocess.check_call([rst2man,SRC,DEST]);
except subprocess.CalledProcessError:
sys.exit(100);
shutil.copy(DEST,os.path.join(build_root,"pandoc-prebuilt",get_id(SRC)));
# We support python 2.6 so argparse is not available.
if len(sys.argv) == 4:
assert(sys.argv[1] == "--retrieve");
do_retrieve(sys.argv[2],sys.argv[3]);
elif len(sys.argv) == 7:
assert(sys.argv[1] == "--build");
if sys.argv[3] == "--pandoc":
do_build_pandoc(sys.argv[2],sys.argv[4],sys.argv[5],sys.argv[6]);
elif sys.argv[3] == "--rst":
do_build_rst2man(sys.argv[2],sys.argv[4],sys.argv[5],sys.argv[6]);
else:
raise ValueError("Bad sys.argv[3]");
else:
raise ValueError("Must provide --build or --retrieve");