Show More
@@ -7,7 +7,7 b'' | |||||
7 |
|
7 | |||
8 | from i18n import _ |
|
8 | from i18n import _ | |
9 | import osutil |
|
9 | import osutil | |
10 | import os, sys, errno, stat, getpass, pwd, grp |
|
10 | import os, sys, errno, stat, getpass, pwd, grp, fcntl | |
11 |
|
11 | |||
12 | posixfile = open |
|
12 | posixfile = open | |
13 | nulldev = '/dev/null' |
|
13 | nulldev = '/dev/null' | |
@@ -104,6 +104,44 b' def pconvert(path):' | |||||
104 | def localpath(path): |
|
104 | def localpath(path): | |
105 | return path |
|
105 | return path | |
106 |
|
106 | |||
|
107 | if sys.platform == 'darwin': | |||
|
108 | def realpath(path): | |||
|
109 | ''' | |||
|
110 | Returns the true, canonical file system path equivalent to the given | |||
|
111 | path. | |||
|
112 | ||||
|
113 | Equivalent means, in this case, resulting in the same, unique | |||
|
114 | file system link to the path. Every file system entry, whether a file, | |||
|
115 | directory, hard link or symbolic link or special, will have a single | |||
|
116 | path preferred by the system, but may allow multiple, differing path | |||
|
117 | lookups to point to it. | |||
|
118 | ||||
|
119 | Most regular UNIX file systems only allow a file system entry to be | |||
|
120 | looked up by its distinct path. Obviously, this does not apply to case | |||
|
121 | insensitive file systems, whether case preserving or not. The most | |||
|
122 | complex issue to deal with is file systems transparently reencoding the | |||
|
123 | path, such as the non-standard Unicode normalisation required for HFS+ | |||
|
124 | and HFSX. | |||
|
125 | ''' | |||
|
126 | # Constants copied from /usr/include/sys/fcntl.h | |||
|
127 | F_GETPATH = 50 | |||
|
128 | O_SYMLINK = 0x200000 | |||
|
129 | ||||
|
130 | try: | |||
|
131 | fd = os.open(path, O_SYMLINK) | |||
|
132 | except OSError, err: | |||
|
133 | if err.errno is errno.ENOENT: | |||
|
134 | return path | |||
|
135 | raise | |||
|
136 | ||||
|
137 | try: | |||
|
138 | return fcntl.fcntl(fd, F_GETPATH, '\0' * 1024).rstrip('\0') | |||
|
139 | finally: | |||
|
140 | os.close(fd) | |||
|
141 | else: | |||
|
142 | # Fallback to the likely inadequate Python builtin function. | |||
|
143 | realpath = os.path.realpath | |||
|
144 | ||||
107 | def shellquote(s): |
|
145 | def shellquote(s): | |
108 | if os.sys.platform == 'OpenVMS': |
|
146 | if os.sys.platform == 'OpenVMS': | |
109 | return '"%s"' % s |
|
147 | return '"%s"' % s |
@@ -126,6 +126,15 b' def localpath(path):' | |||||
126 | def normpath(path): |
|
126 | def normpath(path): | |
127 | return pconvert(os.path.normpath(path)) |
|
127 | return pconvert(os.path.normpath(path)) | |
128 |
|
128 | |||
|
129 | def realpath(path): | |||
|
130 | ''' | |||
|
131 | Returns the true, canonical file system path equivalent to the given | |||
|
132 | path. | |||
|
133 | ''' | |||
|
134 | # TODO: There may be a more clever way to do this that also handles other, | |||
|
135 | # less common file systems. | |||
|
136 | return os.path.normpath(os.path.normcase(os.path.realpath(path))) | |||
|
137 | ||||
129 | def samestat(s1, s2): |
|
138 | def samestat(s1, s2): | |
130 | return False |
|
139 | return False | |
131 |
|
140 |
General Comments 0
You need to be logged in to leave comments.
Login now