]> git.donarmstrong.com Git - lilypond.git/blob - bin/make-patch.py
release: 0.1.43
[lilypond.git] / bin / make-patch.py
1 #!@PYTHON@
2
3 import sys
4 import os
5
6 lilypath =''
7 try:
8     lilypath = os.environ['LILYPOND_SOURCEDIR'] + '/'
9 except IndexError:
10     lilypath = os.environ['HOME'] + 'musix/current'
11 lilypath = lilypath + '/bin/'
12 sys.path.append(lilypath)
13
14
15 from lilypython import *
16 import getopt
17 import pipes
18
19
20 mp_version = '0.3'
21
22 class Options:
23     def __init__(self):
24         self.to_version = lilydirs.version_tuple()
25         self.from_version = prev_version(self.to_version)
26
27 options = Options()
28         
29
30 def help():
31     sys.stdout.write(
32         'Generate a patch to go to this version.\n'
33         '  --from=FROM, -f FROM    old is FROM\n'
34         '  --to=TO, -t TO          to version TO\n'  
35         
36         )
37
38
39
40 def untar(fn):
41     # os.system('pwd');
42     sys.stderr.write('untarring ' + fn)
43 # can't seem to fix errors:
44 # gzip: stdout: Broken pipe
45 # tar: Child returned status 1
46 #   os.system ('tar xzf ' + fn)
47 #   sys.stderr.write('\n')
48 # ugh, even this does not work, but one error message less :-)
49     os.system ('gzip --quiet -dc ' + fn + '| tar xf - ')
50 # so print soothing message:
51     sys.stderr.write('make-patch:ugh: Please ignore error: gzip: stdout: Broken pipe\n');
52     sys.stderr.flush()
53
54
55 header = 'Generated by make-patch, old = %s, new = %s\n\
56 \n\
57 usage \n\
58 \n\
59         cd lilypond-source-dir; patch -E -p0 < %s\n\
60 \n\
61 Patches do not contain automatically generated files, \n\
62 i.e. you should rerun configure\n\n'
63
64 import fnmatch
65 import os
66
67 _debug = 0
68
69 _prune = ['(*)']
70
71
72 def my_find(patterns, dir = os.curdir):
73         list = []
74         names = os.listdir(dir)
75         names.sort()
76         for name in names:
77                 if name in (os.curdir, os.pardir):
78                         continue
79                 fullname = os.path.join(dir, name)
80                 for pat in patterns:
81                     if fnmatch.fnmatch(name, pat):
82                         list.append(fullname)
83                 if os.path.isdir(fullname) and not os.path.islink(fullname):
84                         for p in _prune:
85                                 if fnmatch.fnmatch(name, p):
86                                         if _debug: print "skip", `fullname`
87                                         break
88                         else:
89                                 if _debug: print "descend into", `fullname`
90                                 found = my_find(patterns, fullname)
91                                 if found:
92                                     list = list + found
93         return list
94
95 def multiple_find(pats, dirnames):
96     from find import find
97     l = []
98     for d in dirnames:
99         l = l + my_find(pats,  d)
100     return l
101
102 pats = ['*.lsm', 'configure', '*.txt', 'lilypond.spec']
103 def remove_automatic(dirnames):
104     files = []
105     files = files + multiple_find(pats, dirnames)
106
107     for f in files:
108         os.remove(f)
109
110 def makepatch(fv, tv, patfile_nm):
111     import tempfile
112     prev_cwd = os.getcwd();
113     os.chdir ('/tmp')
114     untar(released_tarball(fv))
115     untar(released_tarball(tv))
116     remove_automatic([dirname(fv), dirname(tv)])
117
118     os.chdir(dirname(tv))
119     
120     if not patfile_nm:
121         patfile_nm = '../patch-%s' % version_tuple_to_str(tv)
122
123     f = open(patfile_nm, 'w')
124     f.write(header %\
125             (version_tuple_to_str(fv), version_tuple_to_str(tv), \
126              os.path.basename(patfile_nm)))
127     f.close()
128             
129     sys.stderr.write('diffing to %s... ' % patfile_nm)
130     os.system('diff -urN ../%s . >> %s' % (dirname(fv), patfile_nm))
131     #os.system('gzip -9f %s' % patfile_nm)
132     os.chdir('/tmp')
133
134     sys.stderr.write('cleaning ... ')
135     os.system('rm -fr %s %s' % (dirname(tv), dirname(fv)))
136     sys.stderr.write('\n')
137     os.chdir(prev_cwd)
138     
139 def main():
140     sys.stderr.write('This is make-patch version %s\n' % mp_version)
141     (cl_options, files) = getopt.getopt(sys.argv[1:], 
142                                         'hf:o:t:', ['output=', 'help', 'from=', 'to='])
143     outfn = ''
144     for opt in cl_options:
145         o = opt[0]
146         a = opt[1]
147         if o == '--from' or o == '-f':
148              options.from_version = version_str_to_tuple(a)
149         elif o == '--to' or o == '-t':
150             options.to_version = version_str_to_tuple(a)
151         elif o== '--help' or o == '-h':
152             help()
153             return 0;
154         elif o == '--output' or o == '-o':
155             outfn = os.path.join(os.getcwd(), a)
156         else:
157             raise getopt.error
158
159     if not outfn:
160         pn = 'patch-%s' % version_tuple_to_str(options.to_version)
161         outfn =  os.path.join(os.getcwd(), pn)
162
163     makepatch(options.from_version, options.to_version, outfn)
164
165 if __name__ == '__main__':
166     main()