(dir, name, qtype, lastword, subs) = _last_res
if state < len(subs):
sn = subs[state]
- sn1 = sn.resolve('') # deref symlinks
+ sn1 = sn.try_resolve() # find the type of any symlink target
fullname = os.path.join(dir, sn.name)
if stat.S_ISDIR(sn1.mode):
ret = shquote.what_to_add(qtype, lastword, fullname+'/',
terminate=True) + ' '
return text + ret
except Exception, e:
- log('\nerror in completion: %s\n' % e)
+ if 0:
+ log('\n')
+ try:
+ import traceback
+ traceback.print_tb(sys.exc_traceback)
+ except Exception, e2:
+ log('Error printing traceback: %s\n' % e2)
+ log('\nError in completion: %s\n' % e)
optspec = """
try:
if cmd == 'ls':
for parm in (words[1:] or ['.']):
- do_ls(parm, pwd.resolve(parm))
+ do_ls(parm, pwd.try_resolve(parm))
elif cmd == 'cd':
for parm in words[1:]:
pwd = pwd.resolve(parm)
else:
return self.sub(first)
+ # walk into a given sub-path of this node. If the last element is
+ # a symlink, leave it as a symlink, don't resolve it. (like lstat())
def lresolve(self, path):
start = self
+ if not path:
+ return start
if path.startswith('/'):
start = self.top()
path = path[1:]
#log('parts: %r %r\n' % (path, parts))
return start._lresolve(parts)
- def try_lresolve(self, path):
+ # walk into the given sub-path of this node, and dereference it if it
+ # was a symlink.
+ def resolve(self, path = ''):
+ return self.lresolve(path).lresolve('.')
+
+ # like resolve(), but don't worry if the last symlink points at an
+ # invalid path.
+ # (still returns an error if any intermediate nodes were invalid)
+ def try_resolve(self, path = ''):
+ n = self.lresolve(path)
try:
- return self.lresolve(path)
+ n = n.lresolve('.')
except NoSuchFile:
- # some symlinks don't actually point at a file that exists!
- return self
-
- def resolve(self, path):
- return self.lresolve(path).lresolve('')
+ pass
+ return n
def nlinks(self):
if self._subs == None:
_symrefs += 1
try:
return self.parent.lresolve(self.readlink())
+ except NoSuchFile:
+ raise NoSuchFile("%s: broken symlink to %r"
+ % (self.fullname(), self.readlink()))
finally:
_symrefs -= 1