Mon, 05 Feb 2024 13:46:48 +0100
Improved the 'listdir()' remote server method in order to report issues.
--- a/src/eric7/RemoteServer/EricServerFileSystemRequestHandler.py Mon Feb 05 12:09:13 2024 +0100 +++ b/src/eric7/RemoteServer/EricServerFileSystemRequestHandler.py Mon Feb 05 13:46:48 2024 +0100 @@ -115,29 +115,36 @@ if not directory: directory = os.getcwd() - listing = [] - for dirEntry in os.scandir(directory): - filestat = dirEntry.stat() - entry = { - "name": dirEntry.name, - "path": dirEntry.path, - "is_dir": dirEntry.is_dir(), - "is_file": dirEntry.is_file(), - "is_link": dirEntry.is_symlink(), - "mode": filestat.st_mode, - "mode_str": stat.filemode(filestat.st_mode), - "size": filestat.st_size, - "mtime": time.strftime( - "%Y-%m-%d %H:%M:%S", time.localtime(filestat.st_mtime) - ), + try: + listing = [] + for dirEntry in os.scandir(directory): + filestat = dirEntry.stat() + entry = { + "name": dirEntry.name, + "path": dirEntry.path, + "is_dir": dirEntry.is_dir(), + "is_file": dirEntry.is_file(), + "is_link": dirEntry.is_symlink(), + "mode": filestat.st_mode, + "mode_str": stat.filemode(filestat.st_mode), + "size": filestat.st_size, + "mtime": time.strftime( + "%Y-%m-%d %H:%M:%S", time.localtime(filestat.st_mtime) + ), + } + listing.append(entry) + + return { + "ok": True, + "directory": directory, + "listing": listing, + "separator": os.sep, } - listing.append(entry) - - return { - "directory": directory, - "listing": listing, - "separator": os.sep, - } + except OSError as err: + return { + "ok": False, + "error": str(err), + } def __stat(self, params): """
--- a/src/eric7/RemoteServerInterface/EricServerFileDialog.py Mon Feb 05 12:09:13 2024 +0100 +++ b/src/eric7/RemoteServerInterface/EricServerFileDialog.py Mon Feb 05 13:46:48 2024 +0100 @@ -478,57 +478,69 @@ self.__directoryCache.clear() - directory, sep, dirListing = self.__fsInterface.listdir(directory) + try: + directory, sep, dirListing = self.__fsInterface.listdir(directory) - self.__sep = sep + self.__sep = sep - # 1. populate the directory tree combo box - self.treeCombo.blockSignals(True) - self.treeCombo.clear() - if len(directory) > 1 and directory.endswith(sep): - directory = directory[:-1] - if len(directory) > 2 and directory[1] == ":": - # starts with a Windows drive letter - directory = directory[2:] - directoryParts = directory.split(sep) - while directoryParts: - if directoryParts[-1]: - self.treeCombo.addItem(sep.join(directoryParts)) - directoryParts.pop() - self.treeCombo.addItem(sep) - self.treeCombo.blockSignals(False) + # 1. populate the directory tree combo box + self.treeCombo.blockSignals(True) + self.treeCombo.clear() + if len(directory) > 1 and directory.endswith(sep): + directory = directory[:-1] + if len(directory) > 2 and directory[1] == ":": + # starts with a Windows drive letter + directory = directory[2:] + directoryParts = directory.split(sep) + while directoryParts: + if directoryParts[-1]: + self.treeCombo.addItem(sep.join(directoryParts)) + directoryParts.pop() + self.treeCombo.addItem(sep) + self.treeCombo.blockSignals(False) - # 2. populate the directory listing - self.listing.clear() - for dirEntry in sorted( - dirListing, - key=lambda d: " " + d['name'].lower() if d["is_dir"] else d["name"].lower(), - ): - if dirEntry["is_dir"]: - type_ = self.tr("Directory") - iconName = "dirClosed" - sizeStr = "" - self.__directoryCache.append(dirEntry["name"]) - else: - type_ = self.tr("File") - iconName = self.__iconProvider.fileIconName(dirEntry["name"]) - sizeStr = dataString(dirEntry["size"], QLocale.system()) - self.__filenameCache.append(dirEntry["name"]) - itm = QTreeWidgetItem( - self.listing, - [dirEntry["name"], sizeStr, type_, dirEntry["mtime"]] - ) - itm.setIcon(0, EricPixmapCache.getIcon(iconName)) - itm.setTextAlignment(1, Qt.AlignmentFlag.AlignRight) - itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter) - itm.setData(0, EricServerFileDialog.IsDirectoryRole, dirEntry["is_dir"]) + # 2. populate the directory listing + self.listing.clear() + for dirEntry in sorted( + dirListing, + key=lambda d: " " + d['name'].lower() if d["is_dir"] else d["name"].lower(), + ): + if dirEntry["is_dir"]: + type_ = self.tr("Directory") + iconName = "dirClosed" + sizeStr = "" + self.__directoryCache.append(dirEntry["name"]) + else: + type_ = self.tr("File") + iconName = self.__iconProvider.fileIconName(dirEntry["name"]) + sizeStr = dataString(dirEntry["size"], QLocale.system()) + self.__filenameCache.append(dirEntry["name"]) + itm = QTreeWidgetItem( + self.listing, + [dirEntry["name"], sizeStr, type_, dirEntry["mtime"]] + ) + itm.setIcon(0, EricPixmapCache.getIcon(iconName)) + itm.setTextAlignment(1, Qt.AlignmentFlag.AlignRight) + itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter) + itm.setData(0, EricServerFileDialog.IsDirectoryRole, dirEntry["is_dir"]) - filters = self.__filters[self.filterCombo.currentIndex()] - self.__filterList(filters) + filters = self.__filters[self.filterCombo.currentIndex()] + self.__filterList(filters) + + # 3. add the directory to the history + self.__addToHistory(directory) - # 3. add the directory to the history - self.__addToHistory(directory) + except OSError as err: + EricMessageBox.critical( + self, + self.tr("Remote Directory Listung"), + self.tr( + "<p>The directory <b>{0}</b> could not be listed due to an error" + " reported by the eric-ide server.</p><p>Reason: {1}</p>" + ).format(directory, str(err)), + ) + # 4. update some dependent states self.nameEdit.clear()
--- a/src/eric7/RemoteServerInterface/EricServerFileSystemInterface.py Mon Feb 05 12:09:13 2024 +0100 +++ b/src/eric7/RemoteServerInterface/EricServerFileSystemInterface.py Mon Feb 05 13:46:48 2024 +0100 @@ -118,12 +118,15 @@ directory listing. Each directory listing entry contains a dictionary with the relevant data. @rtype tuple of (str, str, dict) + @exception OSError raised in case the server reported an issue """ if directory is None: # sanitize the directory in case it is None directory = "" loop = QEventLoop() + ok = False + error = "" listedDirectory = "" separator = "" listing = [] @@ -137,12 +140,16 @@ @param params dictionary containing the reply data @type dict """ - nonlocal listedDirectory, listing, separator + nonlocal listedDirectory, listing, separator, ok, error if reply == "Listdir": - listedDirectory = params["directory"] - listing = params["listing"] - separator = params["separator"] + ok = params["ok"] + if ok: + listedDirectory = params["directory"] + listing = params["listing"] + separator = params["separator"] + else: + error = params["error"] loop.quit() self.__serverInterface.sendJson( @@ -153,6 +160,9 @@ ) loop.exec() + if not ok: + raise OSError(error) + return listedDirectory, separator, listing def stat(self, filename, stNames):