| 
									
										
										
										
											2000-02-04 15:39:30 +00:00
										 |  |  | """Common operations on DOS pathnames.""" | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import stat | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def normcase(s): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Normalize the case of a pathname.
 | 
					
						
							|  |  |  |     On MS-DOS it maps the pathname to lowercase, turns slashes into | 
					
						
							|  |  |  |     backslashes. | 
					
						
							|  |  |  |     Other normalizations (such as optimizing '../' away) are not allowed | 
					
						
							|  |  |  |     (this is done by normpath). | 
					
						
							|  |  |  |     Previously, this version mapped invalid consecutive characters to a  | 
					
						
							|  |  |  |     single '_', but this has been removed.  This functionality should  | 
					
						
							|  |  |  |     possibly be added as a new function."""
 | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |     return s.replace("/", "\\").lower() | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def isabs(s): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Return whether a path is absolute.
 | 
					
						
							|  |  |  |     Trivial in Posix, harder on the Mac or MS-DOS. | 
					
						
							|  |  |  |     For DOS it is absolute if it starts with a slash or backslash (current | 
					
						
							|  |  |  |     volume), or if a pathname after the volume letter and colon starts with | 
					
						
							|  |  |  |     a slash or backslash."""
 | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     s = splitdrive(s)[1] | 
					
						
							|  |  |  |     return s != '' and s[:1] in '/\\' | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-10-07 14:48:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def join(a, *p): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Join two (or more) paths.""" | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     path = a | 
					
						
							|  |  |  |     for b in p: | 
					
						
							|  |  |  |         if isabs(b): | 
					
						
							|  |  |  |             path = b | 
					
						
							| 
									
										
										
										
											2000-09-19 23:46:56 +00:00
										 |  |  |         elif path == '' or path[-1:] in '/\\:': | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |             path = path + b | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |             path = path + "\\" + b | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     return path | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-08-10 19:27:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | def splitdrive(p): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Split a path into a drive specification (a drive letter followed
 | 
					
						
							|  |  |  |     by a colon) and path specification. | 
					
						
							|  |  |  |     It is always true that drivespec + pathspec == p."""
 | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     if p[1:2] == ':': | 
					
						
							|  |  |  |         return p[0:2], p[2:] | 
					
						
							|  |  |  |     return '', p | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def split(p): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Split a path into head (everything up to the last '/') and tail
 | 
					
						
							|  |  |  |     (the rest).  After the trailing '/' is stripped, the invariant | 
					
						
							|  |  |  |     join(head, tail) == p holds. | 
					
						
							|  |  |  |     The resulting head won't end in '/' unless it is the root.""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-03-19 21:05:12 +00:00
										 |  |  |     d, p = splitdrive(p) | 
					
						
							|  |  |  |     # set i to index beyond p's last slash | 
					
						
							|  |  |  |     i = len(p) | 
					
						
							|  |  |  |     while i and p[i-1] not in '/\\': | 
					
						
							|  |  |  |         i = i - 1 | 
					
						
							|  |  |  |     head, tail = p[:i], p[i:]  # now tail has no slashes | 
					
						
							|  |  |  |     # remove trailing slashes from head, unless it's all slashes | 
					
						
							|  |  |  |     head2 = head | 
					
						
							|  |  |  |     while head2 and head2[-1] in '/\\': | 
					
						
							|  |  |  |         head2 = head2[:-1] | 
					
						
							|  |  |  |     head = head2 or head | 
					
						
							|  |  |  |     return d + head, tail | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def splitext(p): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Split a path into root and extension.
 | 
					
						
							|  |  |  |     The extension is everything starting at the first dot in the last | 
					
						
							|  |  |  |     pathname component; the root is everything before that. | 
					
						
							|  |  |  |     It is always true that root + ext == p."""
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     root, ext = '', '' | 
					
						
							|  |  |  |     for c in p: | 
					
						
							|  |  |  |         if c in '/\\': | 
					
						
							|  |  |  |             root, ext = root + ext + c, '' | 
					
						
							|  |  |  |         elif c == '.' or ext: | 
					
						
							|  |  |  |             ext = ext + c | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             root = root + c | 
					
						
							|  |  |  |     return root, ext | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def basename(p): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Return the tail (basename) part of a path.""" | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     return split(p)[1] | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def dirname(p): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Return the head (dirname) part of a path.""" | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     return split(p)[0] | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-12 16:55:57 +00:00
										 |  |  | def commonprefix(m): | 
					
						
							| 
									
										
										
										
											2000-08-22 13:01:53 +00:00
										 |  |  |     """Return the longest prefix of all list elements.""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     if not m: return '' | 
					
						
							| 
									
										
										
										
											2000-08-22 13:01:53 +00:00
										 |  |  |     prefix = m[0] | 
					
						
							|  |  |  |     for item in m: | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |         for i in range(len(prefix)): | 
					
						
							|  |  |  |             if prefix[:i+1] <> item[:i+1]: | 
					
						
							|  |  |  |                 prefix = prefix[:i] | 
					
						
							|  |  |  |                 if i == 0: return '' | 
					
						
							|  |  |  |                 break | 
					
						
							| 
									
										
										
										
											2000-08-22 13:01:53 +00:00
										 |  |  |     return prefix | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-07-24 20:49:26 +00:00
										 |  |  | # Get size, mtime, atime of files. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def getsize(filename): | 
					
						
							|  |  |  |     """Return the size of a file, reported by os.stat().""" | 
					
						
							|  |  |  |     st = os.stat(filename) | 
					
						
							|  |  |  |     return st[stat.ST_SIZE] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def getmtime(filename): | 
					
						
							|  |  |  |     """Return the last modification time of a file, reported by os.stat().""" | 
					
						
							|  |  |  |     st = os.stat(filename) | 
					
						
							|  |  |  |     return st[stat.ST_MTIME] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def getatime(filename): | 
					
						
							|  |  |  |     """Return the last access time of a file, reported by os.stat().""" | 
					
						
							|  |  |  |     st = os.stat(filename) | 
					
						
							| 
									
										
										
										
											2000-07-01 10:52:49 +00:00
										 |  |  |     return st[stat.ST_ATIME] | 
					
						
							| 
									
										
										
										
											1998-07-24 20:49:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | def islink(path): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Is a path a symbolic link?
 | 
					
						
							|  |  |  |     This will always return false on systems where posix.lstat doesn't exist.""" | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     return 0 | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def exists(path): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Does a path exist?
 | 
					
						
							|  |  |  |     This is false for dangling symbolic links."""
 | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     try: | 
					
						
							|  |  |  |         st = os.stat(path) | 
					
						
							|  |  |  |     except os.error: | 
					
						
							|  |  |  |         return 0 | 
					
						
							|  |  |  |     return 1 | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def isdir(path): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Is a path a dos directory?""" | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     try: | 
					
						
							|  |  |  |         st = os.stat(path) | 
					
						
							|  |  |  |     except os.error: | 
					
						
							|  |  |  |         return 0 | 
					
						
							|  |  |  |     return stat.S_ISDIR(st[stat.ST_MODE]) | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def isfile(path): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Is a path a regular file?""" | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     try: | 
					
						
							|  |  |  |         st = os.stat(path) | 
					
						
							|  |  |  |     except os.error: | 
					
						
							|  |  |  |         return 0 | 
					
						
							|  |  |  |     return stat.S_ISREG(st[stat.ST_MODE]) | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def ismount(path): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Is a path a mount point?""" | 
					
						
							|  |  |  |     # XXX This degenerates in: 'is this the root?' on DOS | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     return isabs(splitdrive(path)[1]) | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def walk(top, func, arg): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Directory tree walk.
 | 
					
						
							|  |  |  |     For each directory under top (including top itself, but excluding | 
					
						
							|  |  |  |     '.' and '..'), func(arg, dirname, filenames) is called, where | 
					
						
							|  |  |  |     dirname is the name of the directory and filenames is the list | 
					
						
							|  |  |  |     files files (and subdirectories etc.) in the directory. | 
					
						
							|  |  |  |     The func may modify the filenames list, to implement a filter, | 
					
						
							|  |  |  |     or to impose a different order of visiting."""
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         names = os.listdir(top) | 
					
						
							|  |  |  |     except os.error: | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     func(arg, top, names) | 
					
						
							|  |  |  |     exceptions = ('.', '..') | 
					
						
							|  |  |  |     for name in names: | 
					
						
							|  |  |  |         if name not in exceptions: | 
					
						
							|  |  |  |             name = join(top, name) | 
					
						
							|  |  |  |             if isdir(name): | 
					
						
							|  |  |  |                 walk(name, func, arg) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def expanduser(path): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Expand paths beginning with '~' or '~user'.
 | 
					
						
							|  |  |  |     '~' means $HOME; '~user' means that user's home directory. | 
					
						
							|  |  |  |     If the path doesn't begin with '~', or if the user or $HOME is unknown, | 
					
						
							|  |  |  |     the path is returned unchanged (leaving error reporting to whatever | 
					
						
							|  |  |  |     function is called with the expanded path as argument). | 
					
						
							|  |  |  |     See also module 'glob' for expansion of *, ? and [...] in pathnames. | 
					
						
							|  |  |  |     (A function should also be defined to do full *sh-style environment | 
					
						
							|  |  |  |     variable expansion.)"""
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if path[:1] <> '~': | 
					
						
							|  |  |  |         return path | 
					
						
							|  |  |  |     i, n = 1, len(path) | 
					
						
							|  |  |  |     while i < n and path[i] not in '/\\': | 
					
						
							|  |  |  |         i = i+1 | 
					
						
							|  |  |  |     if i == 1: | 
					
						
							|  |  |  |         if not os.environ.has_key('HOME'): | 
					
						
							|  |  |  |             return path | 
					
						
							|  |  |  |         userhome = os.environ['HOME'] | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         return path | 
					
						
							|  |  |  |     return userhome + path[i:] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def expandvars(path): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Expand paths containing shell variable substitutions.
 | 
					
						
							|  |  |  |     The following rules apply: | 
					
						
							|  |  |  |         - no expansion within single quotes | 
					
						
							|  |  |  |         - no escape character, except for '$$' which is translated into '$' | 
					
						
							|  |  |  |         - ${varname} is accepted. | 
					
						
							|  |  |  |         - varnames can be made out of letters, digits and the character '_'"""
 | 
					
						
							|  |  |  |     # XXX With COMMAND.COM you can use any characters in a variable name, | 
					
						
							|  |  |  |     # XXX except '^|<>='. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if '$' not in path: | 
					
						
							|  |  |  |         return path | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |     import string | 
					
						
							|  |  |  |     varchars = string.letters + string.digits + '_-' | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     res = '' | 
					
						
							|  |  |  |     index = 0 | 
					
						
							|  |  |  |     pathlen = len(path) | 
					
						
							|  |  |  |     while index < pathlen: | 
					
						
							|  |  |  |         c = path[index] | 
					
						
							|  |  |  |         if c == '\'':   # no expansion within single quotes | 
					
						
							|  |  |  |             path = path[index + 1:] | 
					
						
							|  |  |  |             pathlen = len(path) | 
					
						
							|  |  |  |             try: | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |                 index = path.index('\'') | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |                 res = res + '\'' + path[:index + 1] | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |             except ValueError: | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |                 res = res + path | 
					
						
							|  |  |  |                 index = pathlen -1 | 
					
						
							|  |  |  |         elif c == '$':  # variable or '$$' | 
					
						
							|  |  |  |             if path[index + 1:index + 2] == '$': | 
					
						
							|  |  |  |                 res = res + c | 
					
						
							|  |  |  |                 index = index + 1 | 
					
						
							|  |  |  |             elif path[index + 1:index + 2] == '{': | 
					
						
							|  |  |  |                 path = path[index+2:] | 
					
						
							|  |  |  |                 pathlen = len(path) | 
					
						
							|  |  |  |                 try: | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |                     index = path.index('}') | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |                     var = path[:index] | 
					
						
							|  |  |  |                     if os.environ.has_key(var): | 
					
						
							|  |  |  |                         res = res + os.environ[var] | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |                 except ValueError: | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |                     res = res + path | 
					
						
							|  |  |  |                     index = pathlen - 1 | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 var = '' | 
					
						
							|  |  |  |                 index = index + 1 | 
					
						
							|  |  |  |                 c = path[index:index + 1] | 
					
						
							|  |  |  |                 while c != '' and c in varchars: | 
					
						
							|  |  |  |                     var = var + c | 
					
						
							|  |  |  |                     index = index + 1 | 
					
						
							|  |  |  |                     c = path[index:index + 1] | 
					
						
							|  |  |  |                 if os.environ.has_key(var): | 
					
						
							|  |  |  |                     res = res + os.environ[var] | 
					
						
							|  |  |  |                 if c != '': | 
					
						
							|  |  |  |                     res = res + c | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             res = res + c | 
					
						
							|  |  |  |         index = index + 1 | 
					
						
							|  |  |  |     return res | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-02-15 15:57:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def normpath(path): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B.
 | 
					
						
							|  |  |  |     Also, components of the path are silently truncated to 8+3 notation."""
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |     path = path.replace("/", "\\") | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     prefix, path = splitdrive(path) | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |     while path[:1] == "\\": | 
					
						
							|  |  |  |         prefix = prefix + "\\" | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |         path = path[1:] | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |     comps = path.split("\\") | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     i = 0 | 
					
						
							|  |  |  |     while i < len(comps): | 
					
						
							|  |  |  |         if comps[i] == '.': | 
					
						
							|  |  |  |             del comps[i] | 
					
						
							|  |  |  |         elif comps[i] == '..' and i > 0 and \ | 
					
						
							|  |  |  |                       comps[i-1] not in ('', '..'): | 
					
						
							|  |  |  |             del comps[i-1:i+1] | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |             i = i - 1 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |         elif comps[i] == '' and i > 0 and comps[i-1] <> '': | 
					
						
							|  |  |  |             del comps[i] | 
					
						
							|  |  |  |         elif '.' in comps[i]: | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |             comp = comps[i].split('.') | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |             comps[i] = comp[0][:8] + '.' + comp[1][:3] | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |             i = i + 1 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |         elif len(comps[i]) > 8: | 
					
						
							|  |  |  |             comps[i] = comps[i][:8] | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |             i = i + 1 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |             i = i + 1 | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     # If the path is now empty, substitute '.' | 
					
						
							|  |  |  |     if not prefix and not comps: | 
					
						
							|  |  |  |         comps.append('.') | 
					
						
							| 
									
										
										
										
											2000-09-28 16:25:20 +00:00
										 |  |  |     return prefix + "\\".join(comps) | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-01-29 18:05:18 +00:00
										 |  |  | def abspath(path): | 
					
						
							| 
									
										
										
										
											2000-02-04 15:10:34 +00:00
										 |  |  |     """Return an absolute path.""" | 
					
						
							| 
									
										
										
										
											1999-01-29 18:05:18 +00:00
										 |  |  |     if not isabs(path): | 
					
						
							|  |  |  |         path = join(os.getcwd(), path) | 
					
						
							|  |  |  |     return normpath(path) |