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