]> git.donarmstrong.com Git - lilypond.git/blobdiff - scripts/convert-ly.py
Doc: Color the Attic link (issue 3596).
[lilypond.git] / scripts / convert-ly.py
index 8795f343aed0b599f757ec3e8420b43be1f85515..f3304315428bcce5811b620a656c7d226f728495 100644 (file)
@@ -45,6 +45,9 @@ lilypond_version_strict_re = re.compile (lilypond_version_strict_re_str)
 help_summary = (
 _ ('''Update LilyPond input to newer version.  By default, update from the
 version taken from the \\version command, to the current LilyPond version.''')
++ "\n"
++ _ ("If FILE is `-', read from standard input.")
++ "\n\n"
 + _ ("Examples:")
 + '''
   $ convert-ly -e old.ly
@@ -179,25 +182,28 @@ def show_rules (file, from_version, to_version):
 
 def do_conversion (str, from_version, to_version):
     """Apply conversions from FROM_VERSION to TO_VERSION.  Return
-tuple (LAST,STR), with the last successful conversion and the resulting
-string."""
+tuple (LAST,LASTCHANGED,STR,ERRORS), with the last applied conversion,
+the last conversion resulting in a change, the resulting
+string and the number of errors."""
     conv_list = get_conversions (from_version, to_version)
 
     ly.progress (_ ("Applying conversion: "), newline = False)
 
-    last_conversion = ()
+    last_conversion = None
+    last_change = None
     errors = 0
     try:
-        if not conv_list:
-            last_conversion = to_version
         for x in conv_list:
             if x != conv_list[-1]:
                 ly.progress (tup_to_str (x[0]), newline = False)
                 ly.progress (', ', newline = False)
             else:
                 ly.progress (tup_to_str (x[0]))
-            str = x[1] (str)
+            newstr = x[1] (str)
             last_conversion = x[0]
+            if (newstr != str):
+                last_change = last_conversion
+            str = newstr
 
     except convertrules.FatalConversionError:
         ly.error (_ ("Error while converting")
@@ -205,7 +211,7 @@ string."""
                   + _ ("Stopping at last successful rule"))
         errors += 1
 
-    return (last_conversion, str, errors)
+    return (last_conversion, last_change, str, errors)
 
 
 
@@ -258,13 +264,16 @@ def do_one_file (infile_name):
         raise InvalidVersion (".".join ([str(n) for n in from_version]))
 
 
-    (last, result, errors) = do_conversion (input, from_version, to_version)
+    (last, last_change, result, errors) = \
+        do_conversion (input, from_version, to_version)
 
+    if global_options.force_current_version and \
+            (last is None or last == to_version):
+        last = str_to_tuple (program_version)
     if last:
-        if global_options.force_current_version and last == to_version:
-            last = str_to_tuple (program_version)
-
         if global_options.diff_version_update:
+            # Note that last_change can be set even if the result is
+            # the same if two conversion rules cancelled out
             if result == input:
                 # check the y in x.y.z  (minor version number)
                 previous_stable = (last[0], 2*(last[1]/2), 0)
@@ -275,6 +284,8 @@ def do_one_file (infile_name):
                 else:
                     # make no (actual) change to the version number
                     last = from_version
+            else:
+                last = last_change
 
         newversion = r'\version "%s"' % tup_to_str (last)
         if lilypond_version_re.search (result):
@@ -283,21 +294,20 @@ def do_one_file (infile_name):
         elif not global_options.skip_version_add:
             result = newversion + '\n' + result
 
-        ly.progress ('\n')
-    
-        if global_options.edit:
-            try:
-                os.remove(infile_name + '~')
-            except:
-                pass
-            os.rename (infile_name, infile_name + '~')
-            outfile = open (infile_name, 'w')
-        else:
-            outfile = sys.stdout
+    ly.progress ('\n')
 
+    if global_options.edit:
+        try:
+            os.remove (infile_name + '~')
+        except:
+            pass
+        os.rename (infile_name, infile_name + '~')
+        outfile = open (infile_name, 'w')
+    else:
+        outfile = sys.stdout
 
-        outfile.write (result)
-
+    outfile.write (result)
+    
     sys.stderr.flush ()
 
     return errors
@@ -337,10 +347,10 @@ def main ():
 
     errors = 0
     for f in files:
-        if f == '-':
-            continue
         f = f.decode (sys.stdin.encoding or "utf-8")
-        if not os.path.isfile (f):
+        if f == '-':
+            f = ''
+        elif not os.path.isfile (f):
             ly.error (_ (u"%s: Unable to open file") % f)
             errors += 1
             continue