| #!/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"); |