Updated install script to store current Arch project version into a log file.
[confparser-old] / install
1 #!/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
104         if g_verbose or g_pretend :
105                 print 'Creating directory %s' % myPrefix
106         if not g_pretend :
107                 try :
108                         os.makedirs( myPrefix )
109                 except OSError , e :
110                         if e[ 0 ] == errno.EEXIST :
111                                 pass
112                         else :
113                                 raise
114
115         if g_verbose or g_pretend :
116                 print 'Creating module %s' % g_globalModule
117         if not g_pretend :
118                 p = myPrefix + '/__init__.py'
119                 try :
120                         touch( p )
121                 except IOError :
122                         print '** Error touching %s' % p
123                 else :
124                         byteCompile( p )
125         for module in g_modules :
126                 if g_verbose or g_pretend :
127                         print 'Copying module %s -> %s' % ( module , myPrefix + '/' )
128                 if not g_pretend :
129                         mod = open( module ).read()
130                         try :
131                                 createFile( myPrefix + '/' + module , mod )
132                         except IOError , e :
133                                 print '** Error copying %s -> %s' % ( module , myPrefix + '/' )
134                                 print e
135                         else :
136                                 byteCompile( myPrefix + '/' + module )
137
138         if g_verbose or g_pretend :
139                 print 'Storing Arch version'
140
141         currentVersion = archVersion()
142         if currentVersion is None :
143                 print '  Unable to compute Arch version'
144         else :
145                 logFilename = myPrefix + '/install.log'
146                 try :
147                         f = open( logFilename , 'a+' )
148                         f.write( isoDate() + ' Version %s installed.\n' % currentVersion )
149                         f.write( isoDate() + '   including files: %r\n' % ( g_modules , ) )
150                         f.close()
151                 except IOError , OSError :
152                         print '** Error updating log file %s' % logFilename
153
154 def usage() :
155
156         print '''Usage: install [OPTIONS]
157
158  -h, --help     Print this help.
159  -n, --pretend  Display operations, but do nothing.
160  -v, --verbose  Verbose output.
161      --pth      Install Python path (.pth) only.
162
163 Report bugs to <fj@tuxee.net>.'''
164
165 def main() :
166
167         global g_verbose
168         global g_pretend
169
170         try :
171                 options , paramaters = getopt( sys.argv[ 1 : ] ,
172                         'hnv' , ( 'help' , 'pth' , 'pretend' , 'verbose' ) )
173         except GetoptError , e :
174                 print 'install:' , e
175                 print 'Try `install --help\' for more information.'
176                 sys.exit( 1 )
177
178         pathOnly = False
179
180         for option , argument in options :
181                 if option in [ '-h' , '--help' ] :
182                         usage()
183                         sys.exit( 0 )
184                 elif option in [ '-v' , '--verbose' ] :
185                         g_verbose = True
186                 elif option in [ '-n' , '--pretend' ] :
187                         g_pretend = True
188                 elif option in [ '--pth' ] :
189                         pathOnly = True
190
191         installPath()
192         if not pathOnly :
193                 installModule()
194
195 if __name__ == '__main__' :
196         main()
197
198 # Local Variables:
199 # tab-width: 4
200 # python-indent: 4
201 # End: