]> git.donarmstrong.com Git - lilypond.git/blob - stepmake/bin/package-diff.py
*** empty log message ***
[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 = os.getcwd ()
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         return flags.package.name + '-' + version_tuple_to_str (v)
139
140 def tarball(v):
141         return dirname (v)  + '.tar.gz'
142
143 def released_tarball(v):
144         return flags.package.release_dir + tarball (v)
145
146
147 def remove_configure (dir):
148         os.chdir (dir)
149
150         # ugh
151         os.system ('rm -f *.ly')
152
153         # should do 'make distclean ?'
154         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')
155
156         # ugh: symlinks
157         os.system ('rm -f stepmake/stepmake/stepmake stepmake/stepmake/bin')
158
159
160 # ugh, how to get rid of .tex files generated by lily?
161 pats = ['configure', '*.diff', '*.diff.gz', '*.pyc',  '*.txt']
162
163 header = """Generated by %s,
164 From = %s, To = %s
165
166 usage 
167
168     cd %s-source-dir; patch -E -p1 < %s
169
170 Patches do not contain automatically generated files 
171 or (urg) empty directories, 
172 i.e., you should run
173
174         ./autogen.sh
175         ./configure [your options.]
176
177         
178 """
179
180
181 def makediff (fromdir, todir, patch_name):
182         remove_automatic ([fromdir, todir])
183         
184         # ugh
185         remove_configure (fromdir)
186         remove_configure (todir)
187         os.chdir (todir)
188         
189         fromname = fromdir
190         toname = todir
191         if os.path.dirname (fromname) == os.path.dirname (toname):
192                 fromname = os.path.basename (fromname)
193                 toname = os.path.basename (toname)
194                 fromdir = '../' + fromname
195
196         f = open (patch_name, 'wb')
197         f.write (header %
198                 (mailaddress (),   fromname, toname, 
199                  flags.package.name, os.path.basename (patch_name)))
200
201         f.close ()
202                         
203         sys.stderr.write ('diffing to %s... ' % patch_name)
204         os.system ('pwd')
205         print ('diff -purN %s . >> %s' % (fromdir, patch_name))
206         os.system ('diff -purN %s . >> %s' % (fromdir, patch_name))
207         os.system ('gzip --quiet -9f %s' % patch_name)
208    
209
210 os.environ['GZIP'] = '-q'
211 print 'argv: ' + string.join (sys.argv[1:])
212 (options, files) = getopt.getopt (sys.argv[1:], 
213         'hF:f:o:p:rT:t:', ['conf=', 'from=', 'dir-from=', 'dir-to=', 'help', 'outdir=', 'output=', 'package=', 'release', 'to='])
214
215 patch_name = ''
216 conf = ''
217 outdir = ''
218 from_src = ''
219 to_src = ''
220 release=0
221 from_version=0
222 to_version=0
223 for opt in options:
224         o = opt[0]
225         a = opt[1]
226         if o == '--from' or o == '-f':
227                  from_version = a
228         elif o == '--to' or o == '-t':
229                  to_version = a
230         elif o == '--dir-from' or o == '-F':
231                  from_src = a;
232         elif o == '--dir-to' or o == '-T':
233                  to_src = a;
234         elif o == '--help' or o == '-h':
235                 help ()
236                 sys.exit (0)
237         elif o == '--outdir':
238                 outdir = a
239         elif o == '--conf':
240                 conf = a
241         elif o == '--output' or o == '-o':
242                 patch_name = a
243         elif o == '-p' or o == '--package':
244                 topdir = a
245         elif o == '--release' or o == '-r':
246                 release=1
247         else:
248                 raise getopt.error
249
250 sys.path.append (topdir + '/stepmake/bin')
251 from packagepython import *
252 package = Package (topdir)
253 flags.package = package
254 packager = Packager ()
255
256 if from_src:
257         from_package = Package (from_src)
258         flags.from_version = from_package.version
259 if from_version:
260         flags.from_version = version_str_to_tuple (from_version)
261         from_src = ''
262
263 if to_src:
264         to_package = Package (to_src)
265         flags.to_version = to_package.version
266 if to_version:
267         flags.to_version = version_str_to_tuple (to_version)
268         to_src = ''
269
270 if not flags.to_version:
271         flags.to_version = package.version
272
273 if not flags.from_version:
274         flags.from_version = prev_version (flags.to_version)
275
276 # urg
277 if release:
278         flags.from_version = (flags.from_version[0], 
279                 flags.from_version[1], flags.from_version[2], '');
280
281 import tempfile
282 original_dir = os.getcwd ();
283
284 os.system ('rm -rf /tmp/package-diff') 
285 try:
286         os.mkdir ('/tmp/package-diff')
287 except:
288         pass
289
290 from_diff = dirname (flags.from_version)
291 to_diff =  dirname (flags.to_version)
292 if to_diff == from_diff:
293         if from_src:
294               from_diff = from_diff + '.src'
295         elif to_src:
296               to_diff = to_diff + '.src'
297         else:
298               sys.stderr.write (patch_name + ': nothing to do: to == from = ' + from_diff + '\n')
299               sys.exit (1)
300
301 def compat_abspath (path):
302         return os.path.normpath (os.path.join (os.getcwd (), path))
303
304 if conf and not outdir:
305         outdir = 'out-' + conf
306
307 if not patch_name:
308         patch_name = os.path.join (outdir, '%s-%s-%s.diff' % (package.name,
309                                                               version_tuple_to_str (flags.from_version),
310                                                               version_tuple_to_str (flags.to_version)))
311
312         patch_name = compat_abspath (patch_name)
313
314 from_diff = '/tmp/package-diff/' + from_diff
315 to_diff =  '/tmp/package-diff/' + to_diff
316
317 if not from_src:
318         os.chdir ('/tmp/package-diff')
319         untar (released_tarball (flags.from_version))
320         os.chdir (original_dir)
321 else:
322         sys.stderr.write ('copying ' + from_src + ' to ' + from_diff + '\n')
323         # os.system ('cp -pr %s %s' % (srcdir, from_diff))
324         os.system ('mkdir -p %s '% (from_diff))
325         os.chdir (from_src)
326         os.system ('tar cf - --exclude out --exclude out-www . \
327                 | tar -xf - -C %s' % from_diff)
328
329
330 if not to_src:
331         os.chdir ('/tmp/package-diff')
332         untar (released_tarball (flags.to_version))
333         os.chdir (original_dir)
334 else:
335         sys.stderr.write ('copying ' + to_src + ' to ' + to_diff + '\n')
336         os.system ('mkdir -p %s '% (to_diff))
337         # os.system ('cp -pr %s %s'  (to_src, to_diff))%
338         os.chdir (to_src)
339         os.system ('tar -cf - --exclude out --exclude out-www . \
340                 . | tar -xf - -C %s ' % to_diff)
341
342 os.chdir (to_diff)
343 makediff (from_diff, to_diff, patch_name) 
344
345 cleanup ()
346