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