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