Improved the 'listdir()' remote server method in order to report issues. server

Mon, 05 Feb 2024 13:46:48 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 05 Feb 2024 13:46:48 +0100
branch
server
changeset 10548
d3e21f44887b
parent 10547
a357729cb749
child 10549
517cc9f5a908

Improved the 'listdir()' remote server method in order to report issues.

src/eric7/RemoteServer/EricServerFileSystemRequestHandler.py file | annotate | diff | comparison | revisions
src/eric7/RemoteServerInterface/EricServerFileDialog.py file | annotate | diff | comparison | revisions
src/eric7/RemoteServerInterface/EricServerFileSystemInterface.py file | annotate | diff | comparison | revisions
--- 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):

eric ide

mercurial