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