From e0c704a49d903b98ec48fc931f8510cd94f4d340 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 21 Jul 2018 16:46:10 +0300 Subject: Change: make it possible to cache preprocssing output This should reduce rebuild times a lot. --- ql-ikiwiki-preprocess | 77 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/ql-ikiwiki-preprocess b/ql-ikiwiki-preprocess index 35174e2..03f3019 100755 --- a/ql-ikiwiki-preprocess +++ b/ql-ikiwiki-preprocess @@ -26,9 +26,7 @@ import tempfile import cliapp -def write_temp(content, suffix, tgtdir): - fd, filename = tempfile.mkstemp(dir=tgtdir, suffix=suffix) - os.close(fd) +def write_file(content, filename): with open(filename, 'w') as f: f.write(content) return filename @@ -57,15 +55,17 @@ def remove_prefixes(lines): return ''.join(result) -def process_uml(lines, tgtdir): +def process_uml(lines, tgtdir, relative, mtime): title = get_uml_title(lines) uml_text = remove_prefixes(lines) - filename = write_temp(uml_text, '.uml', tgtdir) - format_uml(filename) - prefix, _ = os.path.splitext(filename) - image = prefix + '.png' - relative = make_relative(os.path.abspath(tgtdir), image) - include = '[[!img {}]]\n'.format(relative) + uml_filename = os.path.join(tgtdir, relative + '.uml') + png_basename = os.path.join(relative + '.png') + png_filename = os.path.join(tgtdir, png_basename) + + write_file(uml_text, uml_filename) + format_uml(uml_filename) + + include = '[[!img {}]]\n'.format(png_basename) return [include] @@ -77,7 +77,7 @@ def format_roadmap(text): return '\n'.join(output_lines[1:-1]) -def process_roadmap(lines, tgtdir): +def process_roadmap(lines, tgtdir, relative, mtime): roadmap_text = remove_prefixes(lines[1:-1]) include = format_roadmap(roadmap_text) return ['[[!graph src="""\n', include, '"""]]\n'] @@ -123,19 +123,22 @@ def find_section(lines, sections): return 0, len(lines), None -def preprocess_lines(lines, tgtdir): +def preprocess_lines(lines, tgtdir, relative, mtime): sections = [ ('@startuml\n', '@enduml\n', process_uml), ('@startroadmap\n', '@endroadmap\n', process_roadmap), ] result = [] + counter = 0 while lines: start, after, func = find_section(lines, sections) result.extend(lines[:start]) section = lines[start:after] if func: - include = func(section, tgtdir) + counter += 1 + output = '{}-{}'.format(relative, counter) + include = func(section, tgtdir, output, mtime) result.extend(include) else: result.extend(section) @@ -143,28 +146,45 @@ def preprocess_lines(lines, tgtdir): return result -def preprocess_mdwn(src, tgt): - lines = read_lines(src) - tgtdir = os.path.dirname(tgt) - lines = preprocess_lines(lines, tgtdir) - write_lines(tgt, lines) - shutil.copystat(src, tgt) +def needs_preprocessing(src, tgt): + if not os.path.exists(tgt): + return True + src_mtime = os.path.getmtime(src) + tgt_mtime = os.path.getmtime(tgt) + return src_mtime != tgt_mtime + + +def preprocess_mdwn(srcdir, tgtdir, relative): + src = make_absolute(srcdir, relative) + tgt = make_absolute(tgtdir, relative) + + if needs_preprocessing(src, tgt): + src_mtime = os.path.getmtime(src) + lines = read_lines(src) + lines = preprocess_lines(lines, tgtdir, relative, src_mtime) + write_lines(tgt, lines) + shutil.copystat(src, tgt) -def copy_file(src, tgt): +def copy_file(srcdir, tgtdir, relative): + src = make_absolute(srcdir, relative) + tgt = make_absolute(tgtdir, relative) shutil.copy(src, tgt) shutil.copystat(src, tgt) -def preprocess_file(src, tgt): - if src.endswith('.mdwn'): - preprocess_mdwn(src, tgt) +def preprocess_file(srcdir, tgtdir, relative): + if relative.endswith('.mdwn'): + preprocess_mdwn(srcdir, tgtdir, relative) else: - copy_file(src, tgt) + copy_file(srcdir, tgtdir, relative) -def copy_dir(src, tgt): - os.makedirs(tgt) +def copy_dir(srcdir, tgtdir, relative): + src = make_absolute(srcdir, relative) + tgt = make_absolute(tgtdir, relative) + if not os.path.exists(tgt): + os.makedirs(tgt) return lambda: shutil.copystat(src, tgt) @@ -210,15 +230,14 @@ def preprocess(srcdir, tgtdir): ] assert os.path.isdir(srcdir) - assert not os.path.exists(tgtdir) +# assert not os.path.exists(tgtdir) todo = [] for pathname in find_relative(srcdir): src = make_absolute(srcdir, pathname) tgt = make_absolute(tgtdir, pathname) - for func, callback in preprocessors: if func(src): - do = callback(src, tgt) + do = callback(srcdir, tgtdir, pathname) if do is not None: todo.append(do) -- cgit v1.2.1