]> git.donarmstrong.com Git - lilypond.git/blob - bin/lilypython.py
5b68b9773928fbf3afdcc82fd17f6823269572d0
[lilypond.git] / bin / lilypython.py
1 #!@PYTHON@
2
3
4 # lily-python.py --  implement general LilyPond-wide python stuff
5
6 # source file of the GNU LilyPond music typesetter
7
8 # (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
9
10
11 import posix
12 import pwd
13 import regex
14 import regsub
15 from string import *
16 import sys
17 import os
18 import getopt
19
20
21
22
23 version_re = regex.compile('\\version *\"\(.*\)\"')
24 make_assign_re = regex.compile('^\([A-Z_]*\) *= *\(.*\)$')
25
26 def version_tuple(file):
27     lines = file.readlines()
28
29     mi = pa = mj = 0
30     mp = ''
31     
32     for l in lines:
33         if make_assign_re.search(l) <> -1:
34             nm = make_assign_re.group(1)
35             val = make_assign_re.group(2)
36             if nm == 'TOPLEVEL_MAJOR_VERSION':
37                 mj = atoi(val)
38             elif nm == 'TOPLEVEL_MINOR_VERSION':
39                 mi = atoi(val)
40             elif nm == 'TOPLEVEL_PATCH_LEVEL':
41                 pa = atoi(val)
42             elif nm == 'TOPLEVEL_MY_PATCH_LEVEL':
43                 mp = val
44     return (mj,mi,pa,mp)
45
46 def next_version(tup):
47     return (tup[0], tup[1], tup[2] + 1, tup[3]);
48
49 def prev_version(tup):
50     t = tup
51     if t[3]:
52         return (tup[0], tup[1], tup[2], '');
53     elif t[2] == 0 :
54         return (tup[0], tup[1] -1, tup[2], ''); 
55     else:       
56         return (tup[0], tup[1], tup[2] - 1, '');
57
58
59 def dirname(v):
60     return 'lilypond-' + version_tuple_to_str(v)
61
62 def tarball(v):
63     return dirname(v)  + '.tar.gz'
64
65 def released_tarball(v):
66     return lilydirs.release_dir + tarball(v)
67
68
69 def tuple_to_list(tup):
70     l=[]
71     for x in tup:
72         l.append[x]
73     return l
74
75 def version_str_to_tuple(str):
76     t = split(str, '.')
77     try:
78         mypatch = t[3]
79     except IndexError:
80         mypatch = ''
81         
82     return (atoi(t[0]), atoi(t[1]), atoi(t[2]), mypatch)
83
84
85
86 def guess_mudela_version(filename):
87     f = open (filename)
88     lines = f.readlines()
89     f.close()
90     for l in lines:
91         if version_re.search(l) <> -1:
92             return version_re.group(1)
93     
94     return ''
95
96 def version_tuple_to_str(tup):
97     mypatch =''
98     if tup[3]:
99         mypatch = '.' + tup[3]
100     
101     return ('%d.%d.%d' % tup[0:3]) + mypatch
102
103 class Lilydirs:
104     def __init__(self):
105         try:
106             self.topdir = os.environ['LILYPOND_SOURCEDIR'] + '/'
107         except IndexError:
108             self.topdir = os.environ['HOME'] + 'musix/current'
109             
110         self.release_dir = self.topdir + '../releases/'
111         self.patch_dir = self.topdir + '../patches/'
112
113     def version_tuple(self):
114         f = open (self.topdir + 'VERSION')
115         v = version_tuple(f)
116         f.close ()
117         return v
118
119
120
121 lilydirs = Lilydirs()
122
123 if __name__ == '__main__':
124     v= lilydirs.version_tuple()
125     print v, prev_version(v), next_version(v)
126     mv =  guess_mudela_version(lilydirs.topdir + 'init/symbol.ly')
127     pv=(0,1,1,'jcn4')
128     print version_tuple_to_str(pv), prev_version(pv), next_version(pv)
129     print version_tuple_to_str((0,1,1,''))    
130     print mv, version_str_to_tuple(mv)
131
132
133     
134 def dump_file(f, s):
135     i = open(f, 'w')
136     i.write(s)
137     i.close ()
138
139 def gulp_file(f):
140     i = open(f)
141     i.seek (0, 2)
142     len = i.tell ()
143     i.seek (0,0)
144     return i.read (len)
145
146
147 header_regex = regex.compile('\\header[ \t\n]*{\([^}]*\)}')
148 header_entry_regex = regex.compile('[\n\t ]*\([^\n\t ]+\)[\n\t ]*=[\n \t]*\([^;]+\)[\n \t]*;')
149
150 #
151 # FIXME breaks on multiple strings.
152 #
153 def read_mudela_header (fn):
154     s = gulp_file(fn)
155     s = regsub.gsub('%.*$', '', s)
156     s = regsub.gsub('\n', ' ', s)    
157
158     dict = {}
159     if header_regex.search(s) <> -1:
160         h = header_regex.group(1)
161     else:
162         return dict
163
164     while regex.search('=', h) <> -1: 
165
166         if header_entry_regex.search (h) == -1:
167
168             raise 'format error'
169
170         h = regsub.sub(header_entry_regex, '', h)
171         left = header_entry_regex.group(1)
172         right = header_entry_regex.group(2)
173
174         right = regsub.gsub('\([^\\]\)\"', '\\1', right)
175         right = regsub.gsub('^"', '', right)    
176         left = regsub.gsub('\([^\\]\)\"', '', left)
177         left = regsub.gsub('^"', '', left)
178
179         dict[left] = right
180
181     return dict
182    
183