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