]> git.donarmstrong.com Git - lilypond.git/blob - stepmake/bin/package-diff.py
8d162c1b54b94c3456a977a78f50a133eefd9826
[lilypond.git] / stepmake / bin / package-diff.py
1 #!@PYTHON@
2
3 #
4 # TODO: CLEAN THIS UP, merge packagepython.py and release.py 
5 #
6
7
8
9 import fnmatch
10 import sys
11 import os
12 import re
13 import string
14 import getopt
15 import pipes
16
17
18 _debug = 0
19 _prune = ['(*)']
20 package_diff_dir = '/tmp/package-diff.%s/' % os.getlogin () 
21
22 def system (cmd):
23         print cmd
24         s = os.system (cmd)
25         if s:
26                 raise 'barf'
27
28         
29 def find(pattern, dir = os.curdir):
30         list = []
31         names = os.listdir(dir)
32         names.sort()
33         for name in names:
34                 if name in (os.curdir, os.pardir):
35                         continue
36                 fullname = os.path.join(dir, name)
37                 if fnmatch.fnmatch(name, pattern):
38                         list.append(fullname)
39                 if os.path.isdir(fullname) and not os.path.islink(fullname):
40                         for p in _prune:
41                                 if fnmatch.fnmatch(name, p):
42                                         if _debug: print "skip", `fullname`
43                                         break
44                         else:
45                                 if _debug: print "descend into", `fullname`
46                                 list = list + find(pattern, fullname)
47         return list
48
49
50 topdir = os.getcwd ()
51 def gulp_file(f):
52         try:
53                 i = open(f)
54                 i.seek (0, 2)
55                 n = i.tell ()
56                 i.seek (0,0)
57         except:
58                 sys.stderr.write ("can't open file: %s\n" % f)
59                 return ''
60         s = i.read (n)
61         if len (s) <= 0:
62                 sys.stderr.write ("gulped emty file: %s\n" % f)
63         i.close ()
64         return s
65
66
67 def mailaddress():
68         try:
69                 return os.environ['MAILADDRESS']
70         except KeyError:
71                 return '(address unknown)'
72
73
74
75 class Flags:
76         def __init__ (self):
77                 self.to_version = 0
78                 self.from_version = 0
79                 self.package = 0
80
81 flags = Flags ()
82
83 def help ():
84         sys.stdout.write (
85                 'Generate a patch to go to current version\n'
86                 '  -f, --from=FROM      old is FROM\n'
87                 '  -h, --help           print this help\n'
88                 '      --outdir=DIR     generate in DIR\n'
89                 '  -o, --output=NAME    write patch to NAME\n'
90                 '  -p, --package=DIR    specify package\n'
91                 '  -r, --release        diff against latest release\n'  
92                 '  -t, --to=TO          to version TO\n'  
93                 '  -F, --dir-from=FROM  diff from directory FROM\n'  
94                 '  -T, --dir-to=TO      diff to directory TO\n'  
95                 )
96
97 def cleanup ():
98         global from_diff, to_diff, original_dir
99         os.chdir (package_diff_dir)
100         sys.stderr.write ('Cleaning ... ')
101         system ('rm -fr %s %s' % (from_diff, to_diff))
102         sys.stderr.write ('\n')
103         os.chdir (original_dir)
104
105 def untar (fn):
106         # system ('pwd');
107         try:
108                 open (fn)
109         except:
110                 sys.stderr.write ("Can't find tarball: %s\n" % fn)
111                 cleanup ()
112                 sys.exit (1)
113         sys.stderr.write ("Untarring: %s\n" % fn)
114         system ('gzip --quiet -dc ' + fn + '| tar xf - ')
115         sys.stderr.flush ()
116
117 def remove_automatic (dirnames):
118         files = []
119
120         for d in dirnames:
121                 try:
122                         for p in pats:
123                                 files = files + find (p, d)
124                 except:
125                         sys.stderr.write ("Can't find dir: %s\n" % d)
126                         cleanup ()
127                         sys.exit (1)
128
129         dirs = map (lambda d: find ('out*', d), dirnames)
130         dirs = reduce (lambda x,y:  x + y, dirs)
131         
132         #print dirs
133
134         for d in dirs:
135                 if os.path.isdir (d):
136                         files = files + find ('*', d)
137                 
138         for f in files:
139                 try:
140                         os.remove (f)
141                 except:
142                         sys.stderr.write ("can't remove: `" + f + "'\n'")
143
144 def dirname (v):
145         return flags.package.name + '-' + version_tuple_to_str (v)
146
147 def tarball(v):
148         return dirname (v)  + '.tar.gz'
149
150 def released_tarball(v):
151         return flags.package.release_dir + tarball (v)
152
153
154 def remove_configure (dir):
155         os.chdir (dir)
156
157         # ugh
158         system ('rm -f *.ly')
159
160         # should do 'make distclean ?'
161         system ('rm -rf debian/out GNUmakefile config.cache config.h config.hh config.log config.make config.status configure stepmake/GNUmakefile stepmake/config.hh stepmake/config.log stepmake/config.status stepmake/config.make')
162
163         # ugh: symlinks
164         system ('rm -f stepmake/stepmake/stepmake stepmake/stepmake/bin')
165
166
167 # ugh, how to get rid of .tex files generated by lily?
168 pats = ['configure', '*.diff', '*.diff.gz', '*.pyc',  '*.txt']
169
170 header = """Generated by %s,
171 From = %s, To = %s
172
173 usage 
174
175     cd %s-source-dir; patch -E -p1 < %s
176
177 Patches do not contain automatically generated files 
178 or (urg) empty directories, 
179 i.e., you should run
180
181         ./autogen.sh
182         ./configure [your options.]
183
184         
185 """
186
187
188 def makediff (fromdir, todir, patch_name):
189         remove_automatic ([fromdir, todir])
190         
191         # ugh
192         remove_configure (fromdir)
193         remove_configure (todir)
194         os.chdir (todir)
195         
196         fromname = fromdir
197         toname = todir
198         if os.path.dirname (fromname) == os.path.dirname (toname):
199                 fromname = os.path.basename (fromname)
200                 toname = os.path.basename (toname)
201                 fromdir = '../' + fromname
202
203         f = open (patch_name, 'wb')
204         f.write (header %
205                 (mailaddress (),   fromname, toname, 
206                  flags.package.name, os.path.basename (patch_name)))
207
208         f.close ()
209                         
210         sys.stderr.write ('diffing to %s... ' % patch_name)
211         system ('pwd')
212         print ('diff -purN %s . >> %s' % (fromdir, patch_name))
213         system ('diff -purN %s . >> %s' % (fromdir, patch_name))
214         system ('gzip --quiet -9f %s' % patch_name)
215    
216
217 os.environ['GZIP'] = '-q'
218 print 'argv: ' + string.join (sys.argv[1:])
219 (options, files) = getopt.getopt (sys.argv[1:], 
220         'hF:f:o:p:rT:t:', ['conf=', 'from=', 'dir-from=', 'dir-to=', 'help', 'outdir=', 'output=', 'package=', 'release', 'to='])
221
222 patch_name = ''
223 conf = ''
224 outdir = ''
225 from_src = ''
226 to_src = ''
227 release=0
228 from_version=0
229 to_version=0
230 for opt in options:
231         o = opt[0]
232         a = opt[1]
233         if o == '--from' or o == '-f':
234                  from_version = a
235         elif o == '--to' or o == '-t':
236                  to_version = a
237         elif o == '--dir-from' or o == '-F':
238                  from_src = a;
239         elif o == '--dir-to' or o == '-T':
240                  to_src = a;
241         elif o == '--help' or o == '-h':
242                 help ()
243                 sys.exit (0)
244         elif o == '--outdir':
245                 outdir = a
246         elif o == '--conf':
247                 conf = a
248         elif o == '--output' or o == '-o':
249                 patch_name = a
250         elif o == '-p' or o == '--package':
251                 topdir = a
252         elif o == '--release' or o == '-r':
253                 release=1
254         else:
255                 raise getopt.error
256
257 sys.path.append (topdir + '/stepmake/bin')
258 from packagepython import *
259 package = Package (topdir)
260 flags.package = package
261 packager = Packager ()
262
263 if from_src:
264         from_package = Package (from_src)
265         flags.from_version = from_package.version
266 if from_version:
267         flags.from_version = version_str_to_tuple (from_version)
268         from_src = ''
269
270 if to_src:
271         to_package = Package (to_src)
272         flags.to_version = to_package.version
273 if to_version:
274         flags.to_version = version_str_to_tuple (to_version)
275         to_src = ''
276
277 if not flags.to_version:
278         flags.to_version = package.version
279
280 if not flags.from_version:
281         flags.from_version = prev_version (flags.to_version)
282
283 # urg
284 if release:
285         flags.from_version = (flags.from_version[0], 
286                 flags.from_version[1], flags.from_version[2], '');
287
288 import tempfile
289 original_dir = os.getcwd ();
290
291 system ('rm -rf %s' % package_diff_dir) 
292 try:
293         os.mkdir (package_diff_dir)
294 except:
295         pass
296
297 from_diff = dirname (flags.from_version)
298 to_diff =  dirname (flags.to_version)
299 if to_diff == from_diff:
300         if from_src:
301               from_diff = from_diff + '.src'
302         elif to_src:
303               to_diff = to_diff + '.src'
304         else:
305               sys.stderr.write (patch_name + ': nothing to do: to == from = ' + from_diff + '\n')
306               sys.exit (1)
307
308 def compat_abspath (path):
309         return os.path.normpath (os.path.join (os.getcwd (), path))
310
311 if conf and not outdir:
312         outdir = 'out-' + conf
313
314 if not patch_name:
315         patch_name = os.path.join (outdir, '%s-%s-%s.diff' % (package.name,
316                                                               version_tuple_to_str (flags.from_version),
317                                                               version_tuple_to_str (flags.to_version)))
318
319         patch_name = compat_abspath (patch_name)
320
321 from_diff = package_diff_dir + from_diff
322 to_diff =  package_diff_dir + to_diff
323
324 if not from_src:
325         os.chdir (package_diff_dir)
326         untar (released_tarball (flags.from_version))
327         os.chdir (original_dir)
328 else:
329         sys.stderr.write ('copying ' + from_src + ' to ' + from_diff + '\n')
330         # system ('cp -pr %s %s' % (srcdir, from_diff))
331         system ('mkdir -p %s '% (from_diff))
332         os.chdir (from_src)
333         system ('tar cf - --exclude out --exclude out-www . \
334                 | tar -xf - -C %s' % from_diff)
335
336
337 if not to_src:
338         os.chdir (package_diff_dir)
339         untar (released_tarball (flags.to_version))
340         os.chdir (original_dir)
341 else:
342         sys.stderr.write ('copying ' + to_src + ' to ' + to_diff + '\n')
343         system ('mkdir -p %s '% (to_diff))
344         # system ('cp -pr %s %s'  (to_src, to_diff))%
345         os.chdir (to_src)
346         system ('tar -cf - --exclude out --exclude out-www . \
347                 . | tar -xf - -C %s ' % to_diff)
348
349 os.chdir (to_diff)
350 makediff (from_diff, to_diff, patch_name) 
351
352 cleanup ()
353