import os
import sys
import re
+import md5
################
# RELOCATION
default=False)
p.add_option ('', '--psfonts', action="store_true", dest="psfonts",
- help=_ ('''extract all PostScript fonts into INPUT.psfonts for LaTeX'''
- '''must use this with dvips -h INPUT.psfonts'''),
+ help=_ ('''extract all PostScript fonts into INPUT.psfonts for LaTeX
+must use this with dvips -h INPUT.psfonts'''),
default=None)
p.add_option ('-V', '--verbose', help=_("be verbose"),
action="store_true",
d.update (locals())
return (PREAMBLE_LY + body) % d
- # TODO: Use md5?
def get_hash (self):
if not self.hash:
- self.hash = abs (hash (self.full_ly ()))
+ hash = md5.md5 (self.relevant_contents (self.full_ly ()))
+
+ ## let's not create too long names.
+ self.hash = hash.hexdigest ()[:10]
+
return self.hash
def basename (self):
if FILENAME in self.option_dict:
return self.option_dict[FILENAME]
if global_options.use_hash:
- return 'lily-%d' % self.get_hash ()
+ return 'lily-%s' % self.get_hash ()
raise 'to be done'
def write_ly (self):
outf = open (self.basename () + '.ly', 'w')
outf.write (self.full_ly ())
-
open (self.basename () + '.txt', 'w').write ('image of music')
+ def relevant_contents (self, ly):
+ return re.sub (r'\\(version|sourcefileline)[^\n]*\n', '', ly)
+
def ly_is_outdated (self):
base = self.basename ()
-
- tex_file = '%s.tex' % base
- eps_file = '%s.eps' % base
- system_file = '%s-systems.tex' % base
- ly_file = '%s.ly' % base
- ok = os.path.exists (ly_file) \
- and os.path.exists (system_file)\
- and os.stat (system_file)[stat.ST_SIZE] \
- and re.match ('% eof', open (system_file).readlines ()[-1])
- if ok and (not global_options.use_hash or FILENAME in self.option_dict):
- ok = (self.full_ly () == open (ly_file).read ())
- if ok:
- # TODO: Do something smart with target formats
- # (ps, png) and m/ctimes.
+ ly_file = base + '.ly'
+ tex_file = base + '.tex'
+ eps_file = base + '.eps'
+ systems_file = base + '-systems.tex'
+
+ if (os.path.exists (ly_file)
+ and os.path.exists (systems_file)
+ and os.stat (systems_file)[stat.ST_SIZE]
+ and re.match ('% eof', open (systems_file).readlines ()[-1])
+ and (global_options.use_hash or FILENAME in self.option_dict)
+ and (self.relevant_contents (self.full_ly ())
+ == self.relevant_contents (open (ly_file).read ()))):
return None
+ if global_options.verbose:
+ print 'OUT OF DATE: ', ly_file
return self
def png_is_outdated (self):
base = self.basename ()
+ # FIXME: refactor stupid OK stuff
ok = not self.ly_is_outdated ()
if global_options.format in (HTML, TEXINFO):
ok = ok and os.path.exists (base + '.eps')
if backend == 'ps':
return 0
+ # FIXME: refactor stupid OK stuff
base = self.basename ()
ok = self.ly_is_outdated ()
ok = ok and (os.path.exists (base + '.texstr'))
def ly (self):
name = self.substring ('filename')
contents = open (find_file (name)).read ()
-
- ## strip version string to make automated regtest comparisons
- ## across versions easier.
- contents = re.sub (r'\\version *"[^"]*"', '', contents)
-
return ('\\sourcefilename \"%s\"\n\\sourcefileline 0\n%s'
% (name, contents))
return args
def main ():
+ # FIXME: 85 lines of `main' macramee??
files = do_options ()
file = files[0]