]> git.donarmstrong.com Git - lilypond.git/blob - stepmake/bin/package-diff.py
d9e6cff3f363541f39727af563c8a066b4e7d0a0
[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         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: ' + string.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 ()