'''
+import glob
import md5
import os
import re
action='store', dest='output_dir',
default='')
+ p.add_option ('--skip-lily-check',
+ help=_ ("do not fail if no lilypond output is found."),
+ metavar=_ ("DIR"),
+ action='store_true', dest='skip_lilypond_run',
+ default=False)
+
+ p.add_option ('--skip-png-check',
+ help=_ ("do not fail if no PNG images are found for EPS files"),
+ metavar=_ ("DIR"),
+ action='store_true', dest='skip_png_check',
+ default=False)
+
p.add_option ('--lily-output-dir',
help=_ ("write lily-XXX files to DIR, link into --output dir."),
metavar=_ ("DIR"),
return self.checksum
def basename (self):
- if FILENAME in self.option_dict:
- return self.option_dict[FILENAME]
-
cs = self.get_checksum ()
-
- # TODO: use xx/xxxxx directory layout.
- name = 'lily-%s' % cs[:10]
+ name = '%s/lily-%s' % (cs[:2], cs[2:10])
return name
def write_ly (self):
base = self.basename ()
path = os.path.join (global_options.lily_output_dir, base)
-
+ directory = os.path.split(path)[0]
+ if not os.path.isdir (directory):
+ os.makedirs (directory)
out = file (path + '.ly', 'w')
out.write (self.full_ly ())
file (path + '.txt', 'w').write ('image of music')
return re.sub (r'\\(version|sourcefileline|sourcefilename)[^\n]*\n', '', ly)
def link_all_output_files (self, output_dir, output_dir_files, destination):
- existing = self.all_output_files (output_dir, output_dir_files)
+ existing, missing = self.all_output_files (output_dir, output_dir_files)
+ if missing:
+ print '\nMissing', missing
+ raise CompileError(self.basename())
for name in existing:
try:
os.unlink (os.path.join (destination, name))
src = os.path.join (output_dir, name)
dst = os.path.join (destination, name)
+ dst_path = os.path.split(dst)[0]
+ if not os.path.isdir (dst_path):
+ os.makedirs (dst_path)
os.link (src, dst)
output_dir_files is the list of files in the output directory.
"""
- class Missing(Exception):
- pass
-
- result = set()
+ result = set ()
+ missing = set ()
base = self.basename()
full = os.path.join (output_dir, base)
def consider_file (name):
if name in output_dir_files:
result.add (name)
-
+
def require_file (name):
- if name not in output_dir_files:
- raise Missing
- result.add (name)
-
- try:
- for required in [base + '.ly',
- base + '.txt',
- base + '-systems.count']:
- require_file (required)
-
- map (consider_file, [base + '.tex',
- base + '.eps',
- base + '.texidoc',
- base + '-systems.texi',
- base + '-systems.tex',
- base + '-systems.pdftexi'])
-
- if base + '.eps' in result and self.format in (HTML, TEXINFO):
- page_count = ps_page_count (full + '.eps')
- if page_count <= 1:
- require_file (base + '.png')
- else:
- for page in range (1, page_count + 1):
- require_file (base + '-page%d.png' % page)
+ if name in output_dir_files:
+ result.add (name)
+ else:
+ missing.add (name)
+
+ # UGH - junk global_options
+ skip_lily = global_options.skip_lilypond_run
+ for required in [base + '.ly',
+ base + '.txt']:
+ require_file (required)
+ if not skip_lily:
+ require_file (base + '-systems.count')
+
+ map (consider_file, [base + '.tex',
+ base + '.eps',
+ base + '.texidoc',
+ base + '-systems.texi',
+ base + '-systems.tex',
+ base + '-systems.pdftexi'])
+
+ # UGH - junk global_options
+ if (base + '.eps' in result and self.format in (HTML, TEXINFO)
+ and not global_options.skip_png_check):
+ page_count = ps_page_count (full + '.eps')
+ if page_count <= 1:
+ require_file (base + '.png')
+ else:
+ for page in range (1, page_count + 1):
+ require_file (base + '-page%d.png' % page)
+ system_count = 0
+ if not skip_lily and not missing:
system_count = int(file (full + '-systems.count').read())
- for number in range(1, system_count + 1):
- systemfile = '%s-%d' % (base, number)
- require_file (systemfile + '.eps')
- consider_file (systemfile + '.pdf')
- except Missing:
- return None
+ for number in range(1, system_count + 1):
+ systemfile = '%s-%d' % (base, number)
+ require_file (systemfile + '.eps')
+ consider_file (systemfile + '.pdf')
- return result
+ return (result, missing)
def is_outdated (self, output_dir, current_files):
- return self.all_output_files (output_dir, current_files) is None
+ found, missing = self.all_output_files (output_dir, current_files)
+ return missing
def filter_text (self):
"""Run snippet bodies through a command (say: convert-ly).
This functionality is rarely used, and this code must have bitrot.
"""
-
code = self.substring ('code')
s = filter_pipe (code, global_options.filter_cmd)
d = {
def find_toplevel_snippets (input_string, format, types):
res = {}
for t in types:
- res[t] = ly.re.compile (snippet_res[format][t])
+ res[t] = re.compile (snippet_res[format][t])
snippets = []
index = 0
checksum = snippet_list_checksum (snippets)
contents = '\n'.join (['snippet-map-%d.ly' % checksum]
- + [snip.basename() for snip in snippets])
+ + [snip.basename() + '.ly' for snip in snippets])
name = os.path.join (lily_output_dir,
- 'snippet-names-%d' % checksum)
+ 'snippet-names-%d.ly' % checksum)
file (name, 'wb').write (contents)
system_in_directory (' '.join ([cmd, name]),
#(define output-empty-score-list #f)
#(ly:add-file-name-alist '(%s
))\n
-""" % '\n'.join('("%s.ly" . "%s")\n' % (ly.basename (), name)
- for ly in lys))
+""" % '\n'.join(['("%s.ly" . "%s")\n' % (ly.basename (), name)
+ for ly in lys]))
+
+def split_output_files(directory):
+ """Returns directory entries in DIRECTORY/XX/ , where XX are hex digits.
+
+ Return value is a set of strings.
+ """
+ files = []
+ for subdir in glob.glob (os.path.join (directory, '[a-f0-9][a-f0-9]')):
+ base_subdir = os.path.split (subdir)[1]
+ sub_files = [os.path.join (base_subdir, name)
+ for name in os.listdir (subdir)]
+ files += sub_files
+ return set (files)
def do_process_cmd (chunks, input_name, options):
snippets = [c for c in chunks if isinstance (c, LilypondSnippet)]
-
- output_files = set(os.listdir(options.lily_output_dir))
+ output_files = split_output_files (options.lily_output_dir)
outdated = [c for c in snippets if c.is_outdated (options.lily_output_dir, output_files)]
write_file_map (outdated, input_name)
progress (_ ("All snippets are up to date..."))
if options.lily_output_dir != options.output_dir:
- output_files = set(os.listdir(options.lily_output_dir))
+ output_files = split_output_files (options.lily_output_dir)
for snippet in snippets:
snippet.link_all_output_files (options.lily_output_dir,
output_files,
if global_options.padding_mm:
global_options.process_cmd += " -deps-box-padding=%f " % global_options.padding_mm
- global_options.process_cmd += " -dread-file-list "
+ global_options.process_cmd += " -dread-file-list -dno-strip-output-dir"
if global_options.lily_output_dir:
global_options.lily_output_dir = os.path.abspath(global_options.lily_output_dir)