|
Gaudi Framework, version v21r6 |
| Home | Generated: 11 Nov 2009 |
Classes | |
| class | LogFile |
Functions | |
| def | main |
| def | filename_match |
| def | expand_source_dir |
| def | remove |
| def | getCommonPath |
| def | getRelativePath |
| def | update |
| def | install |
| def | uninstall |
Variables | |
| string | _version = "$Id: install.py,v 1.15 2008/10/28 17:24:39 marcocle Exp $" |
| def install::expand_source_dir | ( | source, | ||
| destination, | ||||
exclusions = [], |
||||
destname = None, |
||||
logdir = realpath(".") | ||||
| ) |
Generate the list of copies.
Definition at line 124 of file install.py.
00125 : 00126 """ 00127 Generate the list of copies. 00128 """ 00129 expansion = {} 00130 src_path,src_name = split(source) 00131 if destname: 00132 to_replace = source 00133 replacement = join(destination,destname) 00134 else: 00135 to_replace = src_path 00136 replacement = destination 00137 00138 for dirname, dirs, files in walk(source): 00139 if to_replace: 00140 dest_path=dirname.replace(to_replace,replacement) 00141 else: 00142 dest_path=join(destination,dirname) 00143 # remove excluded dirs from the list 00144 dirs[:] = [ d for d in dirs if not filename_match(d,exclusions) ] 00145 # loop over files 00146 for f in files: 00147 if filename_match(f,exclusions): continue 00148 key = getRelativePath(dest_path, join(dirname,f)) 00149 value = getRelativePath(logdir, join(dest_path,f)) 00150 expansion[key] = value 00151 return expansion 00152 def remove(file, logdir):
| def install::filename_match | ( | name, | ||
| patterns, | ||||
default = False | ||||
| ) |
Check if the name is matched by any of the patterns in exclusions.
Definition at line 115 of file install.py.
00115 : 00116 """ 00117 Check if the name is matched by any of the patterns in exclusions. 00118 """ 00119 for x in patterns: 00120 if fnmatch(name,x): 00121 return True 00122 return default 00123 def expand_source_dir(source, destination, exclusions = [],
| def install::getCommonPath | ( | dirname, | ||
| filename | ||||
| ) |
Definition at line 176 of file install.py.
00176 : 00177 # if the 2 components are on different drives (windows) 00178 if splitdrive(dirname)[0] != splitdrive(filename)[0]: 00179 return None 00180 dirl = dirname.split(sep) 00181 filel = filename.split(sep) 00182 commpth = [] 00183 for d, f in itertools.izip(dirl, filel): 00184 if d == f : 00185 commpth.append(d) 00186 else : 00187 break 00188 commpth = sep.join(commpth) 00189 if not commpth: 00190 commpth = sep 00191 elif commpth[-1] != sep: 00192 commpth += sep 00193 return commpth 00194 def getRelativePath(dirname, filename):
| def install::getRelativePath | ( | dirname, | ||
| filename | ||||
| ) |
calculate the relative path of filename with regards to dirname
Definition at line 195 of file install.py.
00195 : 00196 """ calculate the relative path of filename with regards to dirname """ 00197 # Translate the filename to the realpath of the parent directory + basename 00198 filepath,basename = os.path.split(filename) 00199 filename = os.path.join(os.path.realpath(filepath),basename) 00200 # Get the absolute pathof the destination directory 00201 dirname = os.path.realpath(dirname) 00202 commonpath = getCommonPath(dirname, filename) 00203 # for windows if the 2 components are on different drives 00204 if not commonpath: 00205 return filename 00206 relname = filename[len(commonpath):] 00207 reldir = dirname[len(commonpath):] 00208 if reldir: 00209 relname = (os.path.pardir+os.path.sep)*len(reldir.split(os.path.sep)) \ 00210 + relname 00211 return relname 00212 def update(src,dest,old_dest = None, syml = False, logdir = realpath(".")):
| def install::install | ( | sources, | ||
| destination, | ||||
| logfile, | ||||
exclusions = [], |
||||
destname = None, |
||||
syml = False, |
||||
logdir = realpath(".") | ||||
| ) |
Copy sources to destination keeping track of what has been done in logfile. The destination must be a directory and sources are copied into it. If exclusions is not empty, the files matching one of its elements are not copied.
Definition at line 240 of file install.py.
00241 : 00242 """ 00243 Copy sources to destination keeping track of what has been done in logfile. 00244 The destination must be a directory and sources are copied into it. 00245 If exclusions is not empty, the files matching one of its elements are not 00246 copied. 00247 """ 00248 for s in sources: 00249 src_path, src_name = split(s) 00250 if not exists(s): 00251 continue # silently ignore missing sources 00252 elif not isdir(s): # copy the file, without logging (?) 00253 if destname is None: 00254 dest = join(destination,src_name) 00255 else: 00256 dest = join(destination,destname) 00257 src = getRelativePath(destination,s) 00258 dest = getRelativePath(logdir,dest) 00259 old_dest = logfile.get_dest(src) 00260 update(src,dest,old_dest,syml,logdir) 00261 logfile.set_dest(src,dest) # update log 00262 else: # for directories 00263 # expand the content of the directory as a dictionary 00264 # mapping sources to destinations 00265 to_do = expand_source_dir(s,destination,exclusions,destname, logdir) 00266 src = getRelativePath(destination,s) 00267 last_done = logfile.get_dest(src) 00268 if last_done is None: last_done = {} 00269 for k in to_do: 00270 try: 00271 old_dest = last_done[k] 00272 del last_done[k] 00273 except KeyError: 00274 old_dest = None 00275 update(k,to_do[k],old_dest,syml,logdir) 00276 # remove files that were copied but are not anymore in the list 00277 for old_dest in last_done.values(): 00278 remove(old_dest,logdir) 00279 logfile.set_dest(src,to_do) # update log 00280 def uninstall(logfile, destinations = [], logdir=realpath(".")):
| def install::main | ( | ) |
Definition at line 27 of file install.py.
00027 : 00028 from optparse import OptionParser 00029 parser = OptionParser() 00030 parser.add_option("-x","--exclude",action="append", 00031 metavar="PATTERN", default = [], 00032 dest="exclusions", help="which files/directories to avoid to install") 00033 parser.add_option("-l","--log",action="store", 00034 dest="logfile", default="install.log", 00035 help="where to store the informations about installed files [default: %default]") 00036 parser.add_option("-d","--destname",action="store", 00037 dest="destname", default=None, 00038 help="name to use when installing the source into the destination directory [default: source name]") 00039 parser.add_option("-u","--uninstall",action="store_true", 00040 dest="uninstall", default=False, 00041 help="do uninstall") 00042 parser.add_option("-s","--symlink",action="store_true", 00043 dest="symlink", default=False, 00044 help="create symlinks instead of copy") 00045 #parser.add_option("-p","--permission",action="store", 00046 # metavar="PERM", 00047 # dest="permission", 00048 # help="modify the permission of the destination file (see 'man chown'). Unix only.") 00049 (opts,args) = parser.parse_args() 00050 00051 # options consistency check 00052 if opts.uninstall: 00053 if opts.exclusions: 00054 parser.error("Exclusion list does not make sense for uninstall") 00055 opts.destination = args 00056 try: 00057 log = load(open(opts.logfile,"rb")) 00058 except: 00059 log = LogFile() 00060 uninstall(log,opts.destination,realpath(dirname(opts.logfile))) 00061 if log: 00062 dump(log,open(opts.logfile,"wb")) 00063 else: 00064 from os import remove 00065 try: 00066 remove(opts.logfile) 00067 except OSError, x: 00068 if x.errno != 2 : raise 00069 else : # install mode 00070 if len(args) < 2: 00071 parser.error("Specify at least one source and (only) one destination") 00072 opts.destination = args[-1] 00073 opts.sources = args[:-1] 00074 try: 00075 log = load(open(opts.logfile,"rb")) 00076 except: 00077 log = LogFile() 00078 if opts.symlink : 00079 if len(opts.sources) != 1: 00080 parser.error("no more that 2 args with --symlink") 00081 opts.destination, opts.destname = split(opts.destination) 00082 install(opts.sources,opts.destination, 00083 log,opts.exclusions,opts.destname, 00084 opts.symlink, realpath(dirname(opts.logfile))) 00085 dump(log,open(opts.logfile,"wb")) 00086 class LogFile:
| def install::remove | ( | file, | ||
| logdir | ||||
| ) |
Definition at line 153 of file install.py.
00153 : 00154 file = normpath(join(logdir, file)) 00155 try: 00156 print "Remove '%s'"%file 00157 os.remove(file) 00158 # For python files, remove the compiled versions too 00159 if splitext(file)[-1] == ".py": 00160 for c in ['c', 'o']: 00161 if exists(file + c): 00162 print "Remove '%s'" % (file+c) 00163 os.remove(file+c) 00164 file_path = split(file)[0] 00165 while file_path and (len(listdir(file_path)) == 0): 00166 print "Remove empty dir '%s'"%file_path 00167 rmdir(file_path) 00168 file_path = split(file_path)[0] 00169 except OSError, x: # ignore file-not-found errors 00170 if x.errno in [2, 13] : 00171 print "Previous removal ignored" 00172 else: 00173 raise 00174 00175 def getCommonPath(dirname, filename):
| def install::uninstall | ( | logfile, | ||
destinations = [], |
||||
logdir = realpath(".") | ||||
| ) |
Remove copied files using logfile to know what to remove. If destinations is not empty, only the files/directories specified are removed.
Definition at line 281 of file install.py.
00281 : 00282 """ 00283 Remove copied files using logfile to know what to remove. 00284 If destinations is not empty, only the files/directories specified are 00285 removed. 00286 """ 00287 for s in logfile.get_sources(): 00288 dest = logfile.get_dest(s) 00289 if type(dest) is str: 00290 if filename_match(dest,destinations,default=True): 00291 remove(dest, logdir) 00292 logfile.remove(s) 00293 else: 00294 for subs in dest.keys(): 00295 subdest = dest[subs] 00296 if filename_match(subdest,destinations,default=True): 00297 remove(subdest,logdir) 00298 del dest[subs] 00299 if not dest: 00300 logfile.remove(s) 00301 if __name__ == "__main__":
| def install::update | ( | src, | ||
| dest, | ||||
old_dest = None, |
||||
syml = False, |
||||
logdir = realpath(".") | ||||
| ) |
Definition at line 213 of file install.py.
00213 : 00214 realdest = normpath(join(logdir, dest)) 00215 dest_path = split(realdest)[0] 00216 realsrc = normpath(join(dest_path,src)) 00217 # The modification time is compared only with the precision of the second 00218 # to avoid a bug in Python 2.5 + Win32 (Fixed in Python 2.5.1). 00219 # See: 00220 # http://bugs.python.org/issue1671965 00221 # http://bugs.python.org/issue1565150 00222 if (not exists(realdest)) or (int(getmtime(realsrc)) > int(getmtime(realdest))): 00223 if not isdir(dest_path): 00224 print "Create dir '%s'"%(dest_path) 00225 makedirs(dest_path) 00226 # the destination file is missing or older than the source 00227 if syml and sys.platform != "win32" : 00228 if exists(realdest): 00229 remove(realdest,logdir) 00230 print "Create Link to '%s' in '%s'"%(src,dest_path) 00231 os.symlink(src,realdest) 00232 else: 00233 print "Copy '%s' -> '%s'"%(src,realdest) 00234 shutil.copy2(realsrc,realdest) # do the copy (cp -p src dest) 00235 #if old_dest != dest: # the file was installed somewhere else 00236 # # remove the old destination 00237 # if old_dest is not None: 00238 # remove(old_dest,logdir) 00239 def install(sources, destination, logfile, exclusions = [],
| string install::_version = "$Id: install.py,v 1.15 2008/10/28 17:24:39 marcocle Exp $" |
Definition at line 17 of file install.py.