]> git.donarmstrong.com Git - lilypond.git/blob - stepmake/bin/package-diff.py
release: 1.0.2
[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 Makefile config.cache config.h config.hh config.log config.make config.status')
83         os.system ('rm -f stepmake/Makefile stepmake/config.hh stepmake/config.log 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)) + 1
144                 state_vec = state_vec[:i]
145                 f.write (state_vec)
146         f.write ('++state\n')
147         f.close ()
148                         
149         sys.stderr.write ('diffing to %s... ' % patch_name)
150         os.system ('pwd')
151         print ('diff -urN %s . >> %s' % (fromdir, patch_name))
152         os.system ('diff -urN %s . >> %s' % (fromdir, patch_name))
153         os.system ('gzip --quiet -9f %s' % patch_name)
154    
155 def main ():
156         os.environ['GZIP'] = '-q'
157         identify ()
158         print 'argv: ' + join (sys.argv[2:])
159         (options, files) = getopt.getopt (sys.argv[1:], 
160                 'hF:f:o:p:rT:t:', ['from=', 'dir-from=', 'dir-to=', 'help', 'output=', 'package=', 'release', 'to='])
161
162         patch_name = ''
163         from_src = ''
164         to_src = ''
165         release=0
166         from_version=0
167         to_version=0
168         for opt in options:
169                 o = opt[0]
170                 a = opt[1]
171                 if o == '--from' or o == '-f':
172                          from_version = a
173                 elif o == '--to' or o == '-t':
174                          to_version = a
175                 elif o == '--dir-from' or o == '-F':
176                          from_src = a;
177                 elif o == '--dir-to' or o == '-T':
178                          to_src = a;
179                 elif o == '--help' or o == '-h':
180                         help ()
181                         return 0;
182                 elif o == '--output' or o == '-o':
183                         patch_name = os.path.join (os.getcwd (), a)
184                 elif o == '-p' or o == '--package':
185                         topdir = a
186                 elif o == '--release' or o == '-r':
187                         release=1
188                 else:
189                         raise getopt.error
190
191         sys.path.append (topdir + '/stepmake/bin')
192         from packagepython import *
193         package = Package (topdir)
194         flags.package = package
195         packager = Packager ()
196         from flower import *
197
198         if from_src:
199                 from_package = Package (from_src)
200                 flags.from_version = from_package.version
201         if from_version:
202                 flags.from_version = version_str_to_tuple (from_version)
203                 from_src = ''
204                         
205         if to_src:
206                 to_package = Package (to_src)
207                 flags.to_version = to_package.version
208         if to_version:
209                 flags.to_version = version_str_to_tuple (to_version)
210                 to_src = ''
211                         
212         if not flags.to_version:
213                 flags.to_version = package.version
214
215         if not flags.from_version:
216                 flags.from_version = prev_version (flags.to_version)
217
218         # urg
219         if release:
220                 flags.from_version = (flags.from_version[0], 
221                         flags.from_version[1], flags.from_version[2], '');
222
223         import tempfile
224         prev_cwd = os.getcwd ();
225
226         os.system ('rm -rf /tmp/package-diff') 
227         try:
228                 os.mkdir ('/tmp/package-diff')
229         except:
230                 pass
231                 
232         from_diff = dirname (flags.from_version)
233         to_diff =  dirname (flags.to_version)
234         if to_diff == from_diff:
235                 if from_src:
236                       from_diff = from_diff + '.src'
237                 elif to_src:
238                       to_diff = to_diff + '.src'
239                 else:
240                       sys.stderr.write (name + ': nothing to do: to == from == ' + from_diff + '\n')
241                       sys.exit (1)
242
243         if not patch_name:
244                 pn = to_diff + '.diff'
245                 patch_name =  os.path.join (os.getcwd (), pn)
246
247         from_diff = '/tmp/package-diff/' + from_diff
248         to_diff =  '/tmp/package-diff/' + to_diff
249
250         if not from_src:
251                 os.chdir ('/tmp/package-diff')
252                 untar (released_tarball (flags.from_version))
253                 os.chdir (prev_cwd)
254         else:
255                 sys.stderr.write ('copying ' + from_src + ' to ' + from_diff + '\n')
256                 # os.system ('cp -pr %s %s' % (srcdir, from_diff))
257                 os.system ('mkdir -p %s '% (from_diff))
258                 os.chdir (from_src)
259                 os.system ('tar cf - --exclude out --exclude out-www . \
260                         | tar -xf - -C %s' % from_diff)
261
262
263         if not to_src:
264                 os.chdir ('/tmp/package-diff')
265                 untar (released_tarball (flags.to_version))
266                 os.chdir (prev_cwd)
267         else:
268                 sys.stderr.write ('copying ' + to_src + ' to ' + to_diff + '\n')
269                 os.system ('mkdir -p %s '% (to_diff))
270                 # os.system ('cp -pr %s %s'  (to_src, to_diff))%
271                 os.chdir (to_src)
272                 os.system ('tar -cf - --exclude out --exclude out-www . \
273                         . | tar -xf - -C %s ' % to_diff)
274
275         os.chdir (to_diff)
276         makediff (from_diff, to_diff, patch_name) 
277
278         os.chdir ('/tmp/package-diff')
279         sys.stderr.write ('cleaning ... ')
280         os.system ('rm -fr %s %s' % (from_diff, to_diff))
281         sys.stderr.write ('\n')
282         os.chdir (prev_cwd)
283
284 main ()