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