3 # convert-ly.py -- Update old LilyPond input files (fix name?)
5 # source file of the GNU LilyPond music typesetter
7 # (c) 1998--2006 Han-Wen Nienhuys <hanwen@cs.uu.nl>
8 # Jan Nieuwenhuizen <janneke@gnu.org>
10 # converting rules are found in python/convertrules.py
19 datadir = '@local_lilypond_datadir@'
20 if not os.path.isdir (datadir):
21 datadir = '@lilypond_datadir@'
22 if os.environ.has_key ('LILYPONDPREFIX'):
23 datadir = os.environ['LILYPONDPREFIX']
24 while datadir[-1] == os.sep:
25 datadir = datadir[:-1]
27 if os.path.exists (os.path.join (datadir, 'share/lilypond/@TOPLEVEL_VERSION@/')):
28 datadir = os.path.join (datadir, 'share/lilypond/@TOPLEVEL_VERSION@/')
30 sys.path.insert (0, os.path.join (datadir, 'python'))
37 from convertrules import *
41 '''Update LilyPond input to newer version. By default, update from the
42 version taken from the \\version command, to the current LilyPond version.
47 convert-ly --from=2.3.28 --to 2.5.21 foobar.ly
50 copyright = ('Jan Nieuwenhuizen <janneke@gnu.org>',
51 'Han-Wen Nienhuys <hanwen@cs.uu.nl>')
53 option_definitions = [
54 ('', 'e', 'edit',_('edit in place')),
55 (_('VERSION'), 'f', 'from',
56 _('start from VERSION [default: \\version found in file]')),
57 ('', 'h', 'help',_('print this help')),
58 ('', 'n', 'no-version',_ ('do not add \\version command if missing')),
59 ('','s', 'show-rules', _('print rules [default: --from=0, --to=@TOPLEVEL_VERSION@]')),
60 (_('VERSION'), 't', 'to',_('convert to VERSION [default: @TOPLEVEL_VERSION@]')),
61 ('','v','version',_('print program version"'))
64 program_name = os.path.basename (sys.argv[0])
65 program_version = '@TOPLEVEL_VERSION@'
70 return tuple (map (string.atoi, string.split (s, '.')))
73 return string.join (map (lambda x: '%s' % x, list (t)), '.')
75 def version_cmp (t1, t2):
81 def get_conversions (from_version, to_version):
82 def is_applicable (v, f = from_version, t = to_version):
83 return version_cmp (v[0], f) > 0 and version_cmp (v[0], t) <= 0
84 return filter (is_applicable, conversions)
86 def latest_version ():
87 return conversions[-1][0]
89 def show_rules (file, from_version, to_version):
91 if (not from_version or x[0] > from_version) \
92 and (not to_version or x[0] <= to_version):
93 file.write ('%s: %s\n' % (tup_to_str (x[0]), x[2]))
95 def do_conversion (str, from_version, to_version):
96 """Apply conversions from FROM_VERSION to TO_VERSION. Return
97 tuple (LAST,STR), with the last succesful conversion and the resulting
99 conv_list = get_conversions (from_version, to_version)
102 error_file.write (_ ("Applying conversion: "))
107 error_file.write (tup_to_str (x[0]))
108 if x != conv_list[-1]:
109 error_file.write (', ')
111 last_conversion = x[0]
113 except FatalConversionError:
114 error_file.write (_ ("error while converting"))
115 error_file.write ('\n')
116 error_file.write (_ ("Aborting"))
117 error_file.write ('\n')
121 return (last_conversion, str)
125 def guess_lilypond_version (filename):
126 s = open (filename).read ()
127 m = lilypond_version_re.search (s)
133 class FatalConversionError:
136 class UnknownVersion:
139 def do_one_file (infile_name):
140 sys.stderr.write (_ ("Processing `%s\'... ") % infile_name)
141 sys.stderr.write ('\n')
144 outfile_name = infile_name + '.NEW'
145 elif __main__.outfile_name:
146 outfile_name = __main__.outfile_name
148 if __main__.from_version:
149 from_version = __main__.from_version
151 guess = guess_lilypond_version (infile_name)
153 raise UnknownVersion ()
154 from_version = str_to_tuple (guess)
156 if __main__.to_version:
157 to_version = __main__.to_version
159 to_version = latest_version ()
163 infile = open (infile_name, 'r')
168 (last, result) = do_conversion (infile.read (), from_version, to_version)
172 newversion = r'\version "%s"' % tup_to_str (last)
173 if lilypond_version_re.search (result):
174 result = re.sub (lilypond_version_re_str,
175 '\\' + newversion, result)
177 result = newversion + '\n' + result
179 error_file.write ('\n')
183 os.remove(infile_name + '~')
186 os.rename (infile_name, infile_name + '~')
187 outfile = open (infile_name, 'w')
192 outfile.write (result)
203 global from_version, to_version, edit, show_rules_p, add_version
205 (sh, long) = ly.getopt_args (option_definitions)
207 (options, files) = getopt.getopt (sys.argv[1:], sh, long)
208 except getopt.error, s:
209 sys.stderr.write ('\n')
210 ly.error (_ ("getopt says: `%s'" % s))
211 sys.stderr.write ('\n')
219 if o == '--help' or o == '-h':
222 elif o == '--version' or o == '-v':
223 ly.identify (sys.stdout)
225 elif o== '--from' or o=='-f':
226 from_version = str_to_tuple (a)
227 elif o== '--to' or o=='-t':
228 to_version = str_to_tuple (a)
229 elif o== '--edit' or o == '-e':
231 elif o== '--show-rules' or o == '-s':
233 elif o == '--no-version' or o == '-n':
243 files = do_options ()
245 # should parse files[] to read \version?
247 show_rules (sys.stdout, from_version, to_version)
250 ly.identify (sys.stderr)
259 elif not os.path.isfile (f):
260 ly.error (_ ("can't open file: `%s'") % f)
266 except UnknownVersion:
267 ly.error (_ ("can't determine version for `%s'. Skipping") % f)
269 sys.stderr.write ('\n')