]> git.donarmstrong.com Git - lilypond.git/blob - bin/make-patch.py
release: 0.1.24
[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 def dirname(v):
27     return 'lilypond-' + version_tuple_to_str(v)
28
29 def tarball(v):
30     return lilydirs.release_dir + dirname(v)  + '.tar.gz'
31
32 def untar(fn):
33     sys.stderr.write('untarring ' + fn)
34     os.system ('tar xzf ' + fn)
35     sys.stderr.write('\n')
36     sys.stderr.flush()
37
38
39 header = 'Generated by make-patch, old = %s, new = %s\n\
40 \n\
41 usage \n\
42 \n\
43         cd lilypond-source-dir; patch -E -p0 < patch-$new\n\
44 \n\
45 Patches do not contain automatically generated files, \n\
46 i.e. you should rerun configure\n\n'
47
48 import fnmatch
49 import os
50
51 _debug = 0
52
53 _prune = ['(*)']
54
55
56 def my_find(patterns, dir = os.curdir):
57         list = []
58         names = os.listdir(dir)
59         names.sort()
60         for name in names:
61                 if name in (os.curdir, os.pardir):
62                         continue
63                 fullname = os.path.join(dir, name)
64                 for pat in patterns:
65                     if fnmatch.fnmatch(name, pat):
66                         list.append(fullname)
67                 if os.path.isdir(fullname) and not os.path.islink(fullname):
68                         for p in _prune:
69                                 if fnmatch.fnmatch(name, p):
70                                         if _debug: print "skip", `fullname`
71                                         break
72                         else:
73                                 if _debug: print "descend into", `fullname`
74                                 found = my_find(patterns, fullname)
75                                 if found:
76                                     list = list + found
77         return list
78
79 def multiple_find(pats, dirnames):
80     from find import find
81     l = []
82     for d in dirnames:
83         l = l + my_find(pats,  d)
84     return l
85
86 pats = ['*.lsm', 'configure', '*.text', 'lilypond.spec']
87 def remove_automatic(dirnames):
88     files = []
89     files = files + multiple_find(pats, dirnames)
90
91     for f in files:
92         os.remove(f)
93
94 def makepatch(fv, tv, patfile_nm):
95     import tempfile
96     os.chdir ('/tmp')
97     untar(tarball(fv))
98     untar(tarball(tv))
99     remove_automatic([dirname(fv), dirname(tv)])
100
101     os.chdir(dirname(tv))
102     
103     if not patfile_nm:
104         patfile_nm = '../patch-%s' % version_tuple_to_str(tv)
105
106     f = open(patfile_nm, 'w')
107     f.write(header % (version_tuple_to_str(fv), version_tuple_to_str(tv)))
108     f.close()
109             
110     sys.stderr.write('diffing ... ')
111     os.system('diff -urN ../%s . >> %s' % (dirname(fv), patfile_nm))
112     #os.system('gzip -9f %s' % patfile_nm)
113     os.chdir('/tmp')
114
115     sys.stderr.write('cleaning ... ')
116     os.system('rm -fr %s %s' % (dirname(tv), dirname(fv)))
117     sys.stderr.write('\n')
118     
119 def main():
120     sys.stderr.write('This is make-patch version %s\n' % mp_version)
121     (cl_options, files) = getopt.getopt(sys.argv[1:], 
122                                         'hf:o:t:', ['output=', 'help=', 'from=', 'to='])
123     outfn = ''
124     for opt in cl_options:
125         o = opt[0]
126         a = opt[1]
127         if o == '--from' or o == '-f':
128              options.from_version = version_str_to_tuple(a)
129         elif o == '--to' or o == '-t':
130             options.to_version = version_str_to_tuple(a)
131         elif o== '--help' or o == '-h':
132             help()
133         elif o == '--output' or o == '-o':
134             outfn = os.path.join(os.getcwd(), a)
135         else:
136             raise getopt.error
137
138     if not outfn:
139         pn = 'patch-%s' % version_tuple_to_str(options.to_version)
140         outfn =  os.path.join(os.getcwd(), pn)
141
142     makepatch(options.from_version, options.to_version, outfn)
143
144 main()