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