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