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