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