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