]> git.donarmstrong.com Git - lilypond.git/blob - scripts/convert-ly.py
* scripts/convert-ly.py: cleanup. Use lilylib. Use convertrules.
[lilypond.git] / scripts / convert-ly.py
1 #!@PYTHON@
2 #
3 # convert-ly.py -- Update old LilyPond input files (fix name?)
4 #
5 # source file of the GNU LilyPond music typesetter
6 #
7 # (c) 1998--2005  Han-Wen Nienhuys <hanwen@cs.uu.nl>
8 #                 Jan Nieuwenhuizen <janneke@gnu.org>
9
10 import os
11 import sys
12 import __main__
13 import getopt
14 import string
15
16 datadir = '@local_lilypond_datadir@'
17 if not os.path.isdir (datadir):
18         datadir = '@lilypond_datadir@'
19 if os.environ.has_key ('LILYPONDPREFIX'):
20         datadir = os.environ['LILYPONDPREFIX']
21         while datadir[-1] == os.sep:
22                 datadir= datadir[:-1]
23
24 sys.path.insert (0, os.path.join (datadir, 'python'))
25
26 import lilylib as ly
27 import fontextract
28 global _;_=ly._
29 global re;re = ly.re
30
31 from convertrules import *
32
33
34 help_summary = _ (
35 '''Update LilyPond input to newer version.  By default, update from the
36 version taken from the \\version command, to the current LilyPond version.
37
38 Examples:
39
40   convert-ly -e old.ly
41   convert-ly --from=2.3.28 --to 2.5.21 foobar.ly
42 ''')
43
44 copyright = ('Jan Nieuwenhuizen <janneke@gnu.org>',
45              'Han-Wen Nienhuys <hanwen@cs.uu.nl>')
46
47 option_definitions = [
48         ('', 'e', 'edit',_('edit in place')),
49         (_('VERSION'), 'f', 'from',
50          _('start from VERSION [default: \\version found in file]')),
51         ('', 'h', 'help',_('print this help')),
52         ('',  'n', 'no-version',_ ('do not add \\version command if missing')),
53         ('','s', 'show-rules', _('print rules [default: --from=0, --to=@TOPLEVEL_VERSION@]')),
54         (_('VERSION'), 't', 'to',_('convert to VERSION [default: @TOPLEVEL_VERSION@]')),
55         ('','v','version',_('print program version"'))
56 ]       
57
58 program_name = os.path.basename (sys.argv[0])
59 program_version = '@TOPLEVEL_VERSION@'
60
61
62 add_version = 1
63
64 def guess_lilypond_version (filename):
65         s = open (filename).read ()
66         m = lilypond_version_re.search (s)
67         if m:
68                 return m.group (1)
69         else:
70                 return ''
71
72 class FatalConversionError:
73         pass
74
75 conversions = []
76
77 class UnknownVersion:
78         pass
79
80 def do_one_file (infile_name):
81         sys.stderr.write (_ ("Processing `%s\'... ") % infile_name)
82         sys.stderr.write ('\n')
83         outfile_name = ''
84         if __main__.edit:
85                 outfile_name = infile_name + '.NEW'
86         elif __main__.outfile_name:
87                 outfile_name = __main__.outfile_name
88
89         if __main__.from_version:
90                 from_version = __main__.from_version
91         else:
92                 guess = guess_lilypond_version (infile_name)
93                 if not guess:
94                         raise UnknownVersion ()
95                 from_version = str_to_tuple (guess)
96
97         if __main__.to_version:
98                 to_version = __main__.to_version
99         else:
100                 to_version = latest_version ()
101
102
103         if infile_name:
104                 infile = open (infile_name, 'r')
105         else:
106                 infile = sys.stdin
107
108
109         (last, result) = do_conversion (infile.read (), from_version, to_version)
110         infile.close ()
111
112
113         if last:
114                 newversion = r'\version "%s"' % tup_to_str (last)
115                 if lilypond_version_re.search (result):
116                         result = re.sub (lilypond_version_re_str,
117                                          '\\' + newversion, result)
118                 elif add_version:
119                         result = newversion + '\n' + result
120                         
121                 error_file.write ('\n')                 
122         
123                 if __main__.edit:
124                         try:
125                                 os.remove(infile_name + '~')
126                         except:
127                                 pass
128                         os.rename (infile_name, infile_name + '~')
129                         outfile = open (infile_name, 'w')
130                 else:
131                         outfile = sys.stdout
132
133
134                 outfile.write (result)
135
136         sys.stderr.flush ()
137
138 edit = 0
139 to_version = ()
140 from_version = ()
141 outfile_name = ''
142 show_rules_p = 0
143
144 def do_options ():
145         global from_version, to_version, edit, show_rules_p, add_version
146
147         (sh, long) = ly.getopt_args (option_definitions)
148         try:
149                 (options, files) = getopt.getopt (sys.argv[1:], sh, long)
150         except getopt.error, s:
151                 sys.stderr.write ('\n')
152                 ly.error (_ ("getopt says: `%s'" % s))
153                 sys.stderr.write ('\n')
154                 ly.help ()
155                 ly.exit (2)
156
157         for opt in options:
158                 o = opt[0]
159                 a = opt[1]
160
161                 if o == '--help' or o == '-h':
162                         ly.help ()
163                         sys.exit (0)
164                 elif o == '--version' or o == '-v':
165                         print_version ()
166                         sys.exit (0)
167                 elif o== '--from' or o=='-f':
168                         from_version = str_to_tuple (a)
169                 elif o== '--to' or o=='-t':
170                         to_version = str_to_tuple (a)
171                 elif o== '--edit' or o == '-e':
172                         edit = 1
173                 elif o== '--show-rules' or o == '-s':
174                         show_rules_p = 1
175                 elif o == '--no-version' or o == '-n':
176                         add_version = 0
177                 else:
178                         print o
179                         raise getopt.error
180
181         return files
182
183
184 def main ():
185         files = do_options ()
186
187         # should parse files[] to read \version?
188         if show_rules_p:
189                 show_rules (sys.stdout, from_version, to_version)
190                 sys.exit (0)
191
192         ly.identify (sys.stderr)
193
194         if not files:
195                 ly.help ()
196                 sys.exit (2)
197
198         for f in files:
199                 if f == '-':
200                         f = ''
201                 elif not os.path.isfile (f):
202                         ly.error (_ ("can't open file: `%s'") % f)
203                         if len (files) == 1:
204                                 sys.exit (1)
205                         continue
206                 try:
207                         do_one_file (f)
208                 except UnknownVersion:
209                         ly.error (_ ("can't determine version for `%s'. Skipping") % f)
210
211         sys.stderr.write ('\n')
212
213 main ()