def _open_file(fs, path, mode): try: return open(str(path), mode) except (IOError, OSError) as error: if error.errno == exceptions.FileNotFound.errno: raise exceptions.FileNotFound(path) elif error.errno == exceptions.SymbolicLoop.errno: raise exceptions.SymbolicLoop(path) raise
def _list_directory(fs, path): try: return os.listdir(str(path)) except (IOError, OSError) as error: if error.errno == exceptions.FileNotFound.errno: raise exceptions.FileNotFound(path) elif error.errno == exceptions.NotADirectory.errno: raise exceptions.NotADirectory(path) elif error.errno == exceptions.SymbolicLoop.errno: raise exceptions.SymbolicLoop(path) raise
def realpath(self, path): real = Path.root() for segment in path.segments: seen = current, = {real.descendant(segment)} while self.is_link(path=current): current = self._links[current].relative_to(current.parent()) if current in seen: raise exceptions.SymbolicLoop(current) seen.add(current) real = current return real
def _remove_empty_directory(fs, path): try: os.rmdir(str(path)) except (IOError, OSError) as error: if error.errno == exceptions.DirectoryNotEmpty.errno: raise exceptions.DirectoryNotEmpty(path) elif error.errno == exceptions.FileNotFound.errno: raise exceptions.FileNotFound(path) elif error.errno == exceptions.NotADirectory.errno: raise exceptions.NotADirectory(path) elif error.errno == exceptions.SymbolicLoop.errno: raise exceptions.SymbolicLoop(path.parent()) raise
def _link(fs, source, to): try: os.symlink(str(source), str(to)) except (IOError, OSError) as error: if error.errno == exceptions.FileExists.errno: raise exceptions.FileExists(to) elif error.errno == exceptions.FileNotFound.errno: raise exceptions.FileNotFound(to.parent()) elif error.errno == exceptions.NotADirectory.errno: raise exceptions.NotADirectory(to.parent()) elif error.errno == exceptions.SymbolicLoop.errno: raise exceptions.SymbolicLoop(to.parent()) raise
def _create_file(fs, path): try: fd = os.open(str(path), _CREATE_FLAGS) except (IOError, OSError) as error: if error.errno == exceptions.FileNotFound.errno: raise exceptions.FileNotFound(path) elif error.errno == exceptions.FileExists.errno: raise exceptions.FileExists(path) elif error.errno == exceptions.SymbolicLoop.errno: raise exceptions.SymbolicLoop(path.parent()) raise return os.fdopen(fd, "w+b")
def _remove_file(fs, path): try: os.remove(str(path)) except (IOError, OSError) as error: if error.errno == exceptions.FileNotFound.errno: raise exceptions.FileNotFound(path) elif error.errno == exceptions.IsADirectory.errno: raise exceptions.IsADirectory(path) elif error.errno == exceptions.NotADirectory.errno: raise exceptions.NotADirectory(path) elif error.errno == exceptions.PermissionError.errno: raise exceptions.PermissionError(path) elif error.errno == exceptions.SymbolicLoop.errno: raise exceptions.SymbolicLoop(path.parent()) raise
def _open_file(fs, path, mode): mode = common._parse_mode(mode) try: return io.open(str(path), mode.io_open_string()) except (IOError, OSError) as error: if error.errno == exceptions.FileNotFound.errno: raise exceptions.FileNotFound(path) elif error.errno == exceptions.IsADirectory.errno: raise exceptions.IsADirectory(path) elif error.errno == exceptions.NotADirectory.errno: raise exceptions.NotADirectory(path) elif error.errno == exceptions.SymbolicLoop.errno: raise exceptions.SymbolicLoop(path) raise
def _readlink(fs, path): try: value = os.readlink(str(path)) except (IOError, OSError) as error: if error.errno == exceptions.FileNotFound.errno: raise exceptions.FileNotFound(path) elif error.errno == exceptions.NotADirectory.errno: raise exceptions.NotADirectory(path) elif error.errno == exceptions.NotASymlink.errno: raise exceptions.NotASymlink(path) elif error.errno == exceptions.SymbolicLoop.errno: raise exceptions.SymbolicLoop(path) raise else: return Path.from_string(value)
def _create_directory(fs, path, with_parents): try: if with_parents: os.makedirs(str(path)) else: os.mkdir(str(path)) except (IOError, OSError) as error: if error.errno == exceptions.FileExists.errno: raise exceptions.FileExists(path) elif error.errno == exceptions.FileNotFound.errno: raise exceptions.FileNotFound(path.parent()) elif error.errno == exceptions.NotADirectory.errno: raise exceptions.NotADirectory(path.parent()) elif error.errno == exceptions.SymbolicLoop.errno: raise exceptions.SymbolicLoop(path.parent()) raise
def _realpath(fs, path): """ .. warning:: The ``os.path`` module's realpath does not error or warn about loops, but we do, following the behavior of GNU ``realpath(1)``! """ real = Path.root() for segment in path.segments: seen = current, = {str(real.descendant(segment))} while os.path.islink(current): current = os.path.join( os.path.dirname(current), os.readlink(current), ) if current in seen: raise exceptions.SymbolicLoop(current) seen.add(current) real = Path.from_string(current) return real
def _realpath(fs, path, seen=pset()): """ .. warning:: The ``os.path`` module's realpath does not error or warn about loops, but we do, following the behavior of GNU ``realpath(1)``! """ real = Path.root() for segment in path.segments: current = real / segment seen = seen.add(current) while True: try: current = fs.readlink(current) except (exceptions.FileNotFound, exceptions.NotASymlink): break else: current = current.relative_to(real) if current in seen: raise exceptions.SymbolicLoop(path) current = fs.realpath(current, seen=seen) real = current return real