Fixed / overloading when enabling true division.
[tx] / install
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 #
5 # TuxeeNet installer
6 # Copyright (C) 2005  Frédéric Jolliton <frederic@jolliton.com>
7 #
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 2 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21 #
22
23 #--[ Configuration ]----------------------------------------------------------
24
25 from install_conf import *
26
27 #--[ Global variables ]-------------------------------------------------------
28
29 g_verbose = False
30 g_pretend = False
31
32 #-----------------------------------------------------------------------------
33
34 import sys
35 import os
36 import errno
37 import time
38 import py_compile
39
40 from getopt import GetoptError
41 try :
42         from getopt import gnu_getopt as getopt
43 except :
44         from getopt import getopt
45
46 from distutils.sysconfig import get_python_lib
47
48 def isoDate() :
49
50         return '%04d-%02d-%02dT%02d:%02d:%02dZ' % time.gmtime()[ : 6 ]
51
52 def archVersion() :
53
54         try :
55                 treeVersion = os.popen( 'tla tree-version' ).read().splitlines()[ 0 ]
56                 patchLevel = os.popen( 'tla logs' ).read().splitlines()
57                 if patchLevel :
58                         patchLevel = patchLevel[ -1 ]
59                 else :
60                         patchLevel = 'empty'
61                 result = treeVersion + '--' + patchLevel
62         except :
63                 result = None
64         return result
65
66 def touch( filename ) :
67
68         open( filename , 'a+' ).close()
69
70 def createFile( filename , contents ) :
71
72         f = open( filename , 'w' )
73         f.write( contents )
74         f.close()
75
76 def byteCompile( filename ) :
77
78         if g_verbose :
79                 print 'Byte-compiling %s' % filename
80         py_compile.compile( filename )
81
82 def installPath() :
83
84         '''Install Python path.'''
85
86         path = get_python_lib()
87         path += '/' + g_globalModule + '.pth'
88         target = g_targetPrefix
89         if g_verbose or g_pretend :
90                 print 'Creating Python path from %s to %s.' %  ( path , target )
91         if not g_pretend :
92                 try :
93                         createFile( path , target )
94                 except IOError , e :
95                         print '** Error creating Python path into %s' % path
96                         print e
97
98 def installModule() :
99
100         '''Install modules.'''
101
102         myPrefix = g_targetPrefix + '/' + g_globalModule
103         if g_subModule :
104                 myFullPrefix = myPrefix + '/' + g_subModule
105         else :
106                 myFullPrefix = myPrefix
107
108         if g_verbose or g_pretend :
109                 print 'Creating directory %s' % myFullPrefix
110         if not g_pretend :
111                 try :
112                         os.makedirs( myFullPrefix )
113                 except OSError , e :
114                         if e[ 0 ] == errno.EEXIST :
115                                 pass
116                         else :
117                                 raise
118
119         if g_subModule :
120                 base = g_targetPrefix + '/' + g_globalModule
121                 for part in g_subModule.split( '/' ) :
122                         base += '/' + part
123                         if g_verbose or g_pretend :
124                                 print 'Creating __init__.py in %s' % base
125                         if not g_pretend :
126                                 createFile( base + '/__init__.py' , '' )
127
128         if g_verbose or g_pretend :
129                 print 'Creating module %s' % g_globalModule
130         if not g_pretend :
131                 p = myFullPrefix + '/__init__.py'
132                 try :
133                         touch( p )
134                 except IOError :
135                         print '** Error touching %s' % p
136                 else :
137                         byteCompile( p )
138         modulesInstalled = []
139         for module in g_modules :
140                 flags = ''
141                 symlink = None
142                 if isinstance( module , ( tuple , list ) ) :
143                         if len( module ) >= 3 :
144                                 module , flags , symlink = module[ : 3 ]
145                         elif len( module ) >= 2 :
146                                 module , flags = module[ : 2 ]
147                         elif module :
148                                 module = module[ 0 ]
149                         else :
150                                 continue
151                 targetFilename = myFullPrefix + '/' + module
152                 if g_verbose or g_pretend :
153                         print 'Copying module %s -> %s' % ( module , myFullPrefix + '/' )
154                 if not g_pretend :
155                         mod = open( module ).read()
156                         try :
157                                 createFile( targetFilename , mod )
158                         except IOError , e :
159                                 print '** Error copying %s -> %s' % ( module , myFullPrefix + '/' )
160                                 print e
161                         else :
162                                 modulesInstalled.append( module )
163                                 if 'x' in flags :
164                                         if g_verbose :
165                                                 print 'Changing file mode of %s (+x)' % targetFilename
166                                         try :
167                                                 os.chmod( targetFilename , 0755 )
168                                         except :
169                                                 print '** Error changing mode of file %s' % targetFilename
170                                 byteCompile( targetFilename )
171                 if symlink :
172                         if g_verbose or g_pretend :
173                                 print 'Creating symbolic link %s -> %s' % ( symlink , targetFilename )
174                         if not g_pretend :
175                                 try :
176                                         try :
177                                                 os.unlink( symlink )
178                                         except :
179                                                 pass
180                                         os.symlink( targetFilename , symlink )
181                                 except :
182                                         print '** Error creating symbolic link %s -> %s' % ( symlink , targetFilename )
183
184         if g_verbose or g_pretend :
185                 print 'Storing Arch version'
186
187         if not g_pretend :
188                 currentVersion = archVersion()
189                 if currentVersion is None :
190                         print '  Unable to compute Arch version'
191                 else :
192                         logFilename = myPrefix + '/install.log'
193                         try :
194                                 f = open( logFilename , 'a+' )
195                                 f.write( isoDate() + ' Version %s installed.\n' % currentVersion )
196                                 f.write( isoDate() + '   including files: %r\n' % modulesInstalled )
197                                 f.close()
198                         except ( IOError , OSError ) :
199                                 print '** Error updating log file %s' % logFilename
200
201 def usage() :
202
203         print '''Usage: install [OPTIONS]
204
205  -h, --help     Print this help.
206  -n, --pretend  Display operations, but do nothing.
207  -v, --verbose  Verbose output.
208      --pth      Install Python path (.pth) only.
209
210 Report bugs to <fj@tuxee.net>.'''
211
212 def main() :
213
214         global g_verbose
215         global g_pretend
216
217         try :
218                 options , paramaters = getopt( sys.argv[ 1 : ] ,
219                         'hnv' , ( 'help' , 'pth' , 'pretend' , 'verbose' ) )
220         except GetoptError , e :
221                 print 'install:' , e
222                 print 'Try `install --help\' for more information.'
223                 sys.exit( 1 )
224
225         pathOnly = False
226
227         for option , argument in options :
228                 if option in [ '-h' , '--help' ] :
229                         usage()
230                         sys.exit( 0 )
231                 elif option in [ '-v' , '--verbose' ] :
232                         g_verbose = True
233                 elif option in [ '-n' , '--pretend' ] :
234                         g_pretend = True
235                 elif option in [ '--pth' ] :
236                         pathOnly = True
237
238         installPath()
239         if not pathOnly :
240                 installModule()
241
242 if __name__ == '__main__' :
243         main()
244
245 # Local Variables:
246 # tab-width: 4
247 # python-indent: 4
248 # End: