lilypond-1.3.146
[lilypond.git] / stepmake / bin / package-diff.py
blobda16975bf0f926e417191dbb35eb534f54ebfaab
1 #!@PYTHON@
4 # TODO: CLEAN THIS UP, merge packagepython.py and release.py
8 import find
9 import fnmatch
10 import sys
11 import os
12 import re
13 import string
14 import getopt
15 import pipes
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
34 def mailaddress():
35 try:
36 return os.environ['MAILADDRESS']
37 except KeyError:
38 return '(address unknown)'
42 class Flags:
43 def __init__ (self):
44 self.to_version = 0
45 self.from_version = 0
46 self.package = 0
48 flags = Flags ()
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'
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)
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 ()
84 def remove_automatic (dirnames):
85 files = []
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)
96 dirs = map (lambda d: find.find ('out*', d), dirnames)
97 dirs = reduce (lambda x,y: x + y, dirs)
99 #print dirs
101 for d in dirs:
102 if os.path.isdir (d):
103 files = files + find.find ('*', d)
105 for f in files:
106 try:
107 os.remove (f)
108 except:
109 sys.stderr.write ("can't remove: `" + f + "'\n'")
111 def dirname (v):
112 # urg, again?
113 from packagepython import *
114 return flags.package.name + '-' + version_tuple_to_str (v)
116 def tarball(v):
117 return dirname (v) + '.tar.gz'
119 def released_tarball(v):
120 return flags.package.release_dir + tarball (v)
123 def remove_configure (dir):
124 os.chdir (dir)
126 # ugh
127 os.system ('rm -f *.ly')
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')
132 # ugh: symlinks
133 os.system ('rm -f stepmake/stepmake/stepmake stepmake/stepmake/bin')
136 # ugh, how to get rid of .tex files generated by lily?
137 pats = ['configure', '*.diff', '*.diff.gz', '*.pyc', '*.txt']
139 header = """Generated by %s,
140 From = %s, To = %s
142 usage
144 cd %s-source-dir; patch -E -p1 < %s
146 Patches do not contain automatically generated files
147 or (urg) empty directories,
148 i.e., you should rerun autoconf, configure
153 def makediff (fromdir, todir, patch_name):
154 # urg, again?
155 from packagepython import *
157 remove_automatic ([fromdir, todir])
159 # ugh
160 remove_configure (fromdir)
161 remove_configure (todir)
162 os.chdir (todir)
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
171 f = open (patch_name, 'wb')
172 f.write (header %
173 (mailaddress (), fromname, toname,
174 flags.package.name, os.path.basename (patch_name)))
176 f.close ()
178 sys.stderr.write ('diffing to %s... ' % patch_name)
179 os.system ('pwd')
180 print ('diff -urN %s . >> %s' % (fromdir, patch_name))
181 os.system ('diff -urN %s . >> %s' % (fromdir, patch_name))
182 os.system ('gzip --quiet -9f %s' % patch_name)
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='])
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
225 sys.path.append (topdir + '/stepmake/bin')
226 from packagepython import *
227 package = Package (topdir)
228 flags.package = package
229 packager = Packager ()
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 = ''
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 = ''
245 if not flags.to_version:
246 flags.to_version = package.version
248 if not flags.from_version:
249 flags.from_version = prev_version (flags.to_version)
251 # urg
252 if release:
253 flags.from_version = (flags.from_version[0],
254 flags.from_version[1], flags.from_version[2], '');
256 import tempfile
257 original_dir = os.getcwd ();
259 os.system ('rm -rf /tmp/package-diff')
260 try:
261 os.mkdir ('/tmp/package-diff')
262 except:
263 pass
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)
276 def compat_abspath (path):
277 return os.path.normpath (os.path.join (os.getcwd (), path))
279 if conf and not outdir:
280 outdir = 'out-' + conf
282 if not patch_name:
283 to_diff + '.diff'
284 patch_name = compat_abspath (os.path.join (outdir, to_diff + '.diff'))
286 from_diff = '/tmp/package-diff/' + from_diff
287 to_diff = '/tmp/package-diff/' + to_diff
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)
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)
314 os.chdir (to_diff)
315 makediff (from_diff, to_diff, patch_name)
317 cleanup ()