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