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