]> git.donarmstrong.com Git - lilypond.git/blobdiff - scripts/lilypond-book.py
Merge branch 'jneeman' of git+ssh://jneem@git.sv.gnu.org/srv/git/lilypond into jneeman
[lilypond.git] / scripts / lilypond-book.py
index f64deb6343354e89fd342e895737472bb80c2fee..6699ba2dcb8b5a269536238c32f4331b6c5f92cb 100644 (file)
@@ -35,6 +35,7 @@ import commands
 import os
 import sys
 import re
+import md5
 
 ################
 # RELOCATION
@@ -156,8 +157,8 @@ def get_option_parser ():
                   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",
@@ -1066,46 +1067,52 @@ class Lilypond_snippet (Snippet):
         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')
@@ -1127,6 +1134,7 @@ class Lilypond_snippet (Snippet):
         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'))
@@ -1279,11 +1287,6 @@ class Lilypond_file_snippet (Lilypond_snippet):
     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))
 
@@ -1766,6 +1769,7 @@ def do_options ():
     return args
 
 def main ():
+    # FIXME: 85 lines of `main' macramee??
     files = do_options ()
 
     file = files[0]