2033 @param fileTypeFilter filter to be used by the add file dialog |
2033 @param fileTypeFilter filter to be used by the add file dialog |
2034 @type str |
2034 @type str |
2035 @param startdir start directory for the selection dialog |
2035 @param startdir start directory for the selection dialog |
2036 @type str |
2036 @type str |
2037 """ |
2037 """ |
2038 # TODO: adapt to remote server |
|
2039 from .AddFileDialog import AddFileDialog |
2038 from .AddFileDialog import AddFileDialog |
2040 |
2039 |
2041 if not startdir: |
2040 if not startdir: |
2042 startdir = self.ppath |
2041 startdir = self.ppath |
2043 |
2042 |
2044 dlg = AddFileDialog(self, self.parent(), fileTypeFilter, startdir=startdir) |
2043 dlg = AddFileDialog(self, self.parent(), fileTypeFilter, startdir=startdir) |
2045 if dlg.exec() == QDialog.DialogCode.Accepted: |
2044 if dlg.exec() == QDialog.DialogCode.Accepted: |
2046 fnames, target, isSource = dlg.getData() |
2045 fnames, target, isSource = dlg.getData() |
2047 if target != "": |
2046 if target != "": |
|
2047 isRemote = FileSystemUtilities.isRemoteFileName(target) |
2048 for fn in fnames: |
2048 for fn in fnames: |
2049 targetfile = os.path.join(target, os.path.basename(fn)) |
2049 targetfile = ( |
2050 if not FileSystemUtilities.samepath(os.path.dirname(fn), target): |
2050 self.__remotefsInterface.join( |
|
2051 target, self.__remotefsInterface.basename(fn) |
|
2052 ) |
|
2053 if isRemote |
|
2054 else os.path.join(target, os.path.basename(fn)) |
|
2055 ) |
|
2056 if not FileSystemUtilities.samepath( |
|
2057 self.__remotefsInterface.dirname(fn) |
|
2058 if isRemote |
|
2059 else os.path.dirname(fn), |
|
2060 target |
|
2061 ): |
2051 try: |
2062 try: |
2052 if not os.path.isdir(target): |
2063 if isRemote: |
2053 os.makedirs(target) |
2064 if not self.__remotefsInterface.isdir(target): |
2054 |
2065 self.__remotefsInterface.makedirs(target) |
2055 if os.path.exists(targetfile): |
2066 else: |
|
2067 if not os.path.isdir(target): |
|
2068 os.makedirs(target) |
|
2069 |
|
2070 if ( |
|
2071 not isRemote and os.path.exists(targetfile) |
|
2072 ) or ( |
|
2073 isRemote and self.__remotefsInterface.exists(targetfile) |
|
2074 ): |
2056 res = EricMessageBox.yesNo( |
2075 res = EricMessageBox.yesNo( |
2057 self.ui, |
2076 self.ui, |
2058 self.tr("Add file"), |
2077 self.tr("Add File"), |
2059 self.tr( |
2078 self.tr( |
2060 "<p>The file <b>{0}</b> already" |
2079 "<p>The file <b>{0}</b> already" |
2061 " exists.</p><p>Overwrite it?</p>" |
2080 " exists.</p><p>Overwrite it?</p>" |
2062 ).format(targetfile), |
2081 ).format(targetfile), |
2063 icon=EricMessageBox.Warning, |
2082 icon=EricMessageBox.Warning, |
2064 ) |
2083 ) |
2065 if not res: |
2084 if not res: |
2066 return # don't overwrite |
2085 return # don't overwrite |
2067 |
2086 |
2068 shutil.copy(fn, target) |
2087 if isRemote: |
|
2088 self.__remotefsInterface.shutilCopy(fn, target) |
|
2089 else: |
|
2090 shutil.copy(fn, target) |
2069 except OSError as why: |
2091 except OSError as why: |
2070 EricMessageBox.critical( |
2092 EricMessageBox.critical( |
2071 self.ui, |
2093 self.ui, |
2072 self.tr("Add file"), |
2094 self.tr("Add File"), |
2073 self.tr( |
2095 self.tr( |
2074 "<p>The selected file <b>{0}</b> could" |
2096 "<p>The selected file <b>{0}</b> could" |
2075 " not be added to <b>{1}</b>.</p>" |
2097 " not be added to <b>{1}</b>.</p>" |
2076 "<p>Reason: {2}</p>" |
2098 "<p>Reason: {2}</p>" |
2077 ).format(fn, target, str(why)), |
2099 ).format(fn, target, str(why)), |
2109 patterns.append(pattern) |
2131 patterns.append(pattern) |
2110 elif patterntype == "__IGNORE__": |
2132 elif patterntype == "__IGNORE__": |
2111 ignorePatterns.append(pattern) |
2133 ignorePatterns.append(pattern) |
2112 |
2134 |
2113 files = [] |
2135 files = [] |
|
2136 isRemote = FileSystemUtilities.isRemoteFileName(target) |
2114 for pattern in patterns: |
2137 for pattern in patterns: |
2115 sstring = "{0}{1}{2}".format(source, os.sep, pattern) |
2138 if isRemote: |
2116 files.extend(glob.glob(sstring)) |
2139 sstring = self.__remotefsInterface.join(source, pattern) |
|
2140 files.extend(self.__remotefsInterface.glob(sstring)) |
|
2141 else: |
|
2142 sstring = os.path.join(source, pattern) |
|
2143 files.extend(glob.glob(sstring)) |
2117 |
2144 |
2118 if len(files) == 0: |
2145 if len(files) == 0: |
2119 if not quiet: |
2146 if not quiet: |
2120 EricMessageBox.information( |
2147 EricMessageBox.information( |
2121 self.ui, |
2148 self.ui, |
2122 self.tr("Add directory"), |
2149 self.tr("Add Directory"), |
2123 self.tr( |
2150 self.tr( |
2124 "<p>The source directory doesn't contain" |
2151 "<p>The source directory doesn't contain" |
2125 " any files belonging to the selected category.</p>" |
2152 " any files belonging to the selected category.</p>" |
2126 ), |
2153 ), |
2127 ) |
2154 ) |
2128 return |
2155 return |
2129 |
2156 |
2130 if not FileSystemUtilities.samepath(target, source) and not os.path.isdir( |
2157 if not FileSystemUtilities.samepath(target, source) and not ( |
2131 target |
2158 (not isRemote and os.path.isdir(target)) or ( |
|
2159 isRemote and self.__remotefsInterface.isdir(target) |
|
2160 ) |
2132 ): |
2161 ): |
2133 try: |
2162 try: |
2134 os.makedirs(target) |
2163 if isRemote: |
|
2164 self.__remotefsInterface.makedirs(target) |
|
2165 else: |
|
2166 os.makedirs(target) |
2135 except OSError as why: |
2167 except OSError as why: |
2136 EricMessageBox.critical( |
2168 EricMessageBox.critical( |
2137 self.ui, |
2169 self.ui, |
2138 self.tr("Add directory"), |
2170 self.tr("Add Directory"), |
2139 self.tr( |
2171 self.tr( |
2140 "<p>The target directory <b>{0}</b> could not be" |
2172 "<p>The target directory <b>{0}</b> could not be" |
2141 " created.</p><p>Reason: {1}</p>" |
2173 " created.</p><p>Reason: {1}</p>" |
2142 ).format(target, str(why)), |
2174 ).format(target, str(why)), |
2143 ) |
2175 ) |
2146 for file in files: |
2178 for file in files: |
2147 for pattern in ignorePatterns: |
2179 for pattern in ignorePatterns: |
2148 if fnmatch.fnmatch(file, pattern): |
2180 if fnmatch.fnmatch(file, pattern): |
2149 continue |
2181 continue |
2150 |
2182 |
2151 targetfile = os.path.join(target, os.path.basename(file)) |
2183 targetfile = ( |
|
2184 self.__remotefsInterface.join( |
|
2185 target, self.__remotefsInterface.basename(file) |
|
2186 ) |
|
2187 if isRemote |
|
2188 else os.path.join(target, os.path.basename(file)) |
|
2189 ) |
2152 if not FileSystemUtilities.samepath(target, source): |
2190 if not FileSystemUtilities.samepath(target, source): |
2153 try: |
2191 try: |
2154 if os.path.exists(targetfile): |
2192 if ( |
|
2193 not isRemote and os.path.exists(targetfile) |
|
2194 ) or ( |
|
2195 isRemote and self.__remotefsInterface.exists(targetfile) |
|
2196 ): |
2155 res = EricMessageBox.yesNo( |
2197 res = EricMessageBox.yesNo( |
2156 self.ui, |
2198 self.ui, |
2157 self.tr("Add directory"), |
2199 self.tr("Add Directory"), |
2158 self.tr( |
2200 self.tr( |
2159 "<p>The file <b>{0}</b> already exists.</p>" |
2201 "<p>The file <b>{0}</b> already exists.</p>" |
2160 "<p>Overwrite it?</p>" |
2202 "<p>Overwrite it?</p>" |
2161 ).format(targetfile), |
2203 ).format(targetfile), |
2162 icon=EricMessageBox.Warning, |
2204 icon=EricMessageBox.Warning, |
2163 ) |
2205 ) |
2164 if not res: |
2206 if not res: |
2165 continue |
2207 continue |
2166 # don't overwrite, carry on with next file |
2208 # don't overwrite, carry on with next file |
2167 |
2209 |
2168 shutil.copy(file, target) |
2210 if isRemote: |
|
2211 self.__remotefsInterface.shutilCopy(file,target ) |
|
2212 else: |
|
2213 shutil.copy(file, target) |
2169 except OSError: |
2214 except OSError: |
2170 continue |
2215 continue |
2171 self.appendFile(targetfile) |
2216 self.appendFile(targetfile) |
2172 |
2217 |
2173 def __addRecursiveDirectory(self, filetype, source, target): |
2218 def __addRecursiveDirectory(self, filetype, source, target): |
2200 pattern |
2245 pattern |
2201 for pattern, filetype in self.__pdata["FILETYPES"].items() |
2246 for pattern, filetype in self.__pdata["FILETYPES"].items() |
2202 if filetype == "__IGNORE__" |
2247 if filetype == "__IGNORE__" |
2203 ] |
2248 ] |
2204 |
2249 |
2205 # now recurse into subdirectories |
2250 # now recurs into subdirectories |
2206 with os.scandir(source) as dirEntriesIterator: |
2251 if FileSystemUtilities.isRemoteFileName(target): |
2207 for dirEntry in dirEntriesIterator: |
2252 for entry in self.__remotefsInterface.listdir(source)[2]: |
2208 if dirEntry.is_dir() and not any( |
2253 if entry["is_dir"] and not any( |
2209 fnmatch.fnmatch(dirEntry.name, ignore_pattern) |
2254 fnmatch.fnmatch(entry["name"], ignore_pattern) |
2210 for ignore_pattern in ignore_patterns |
2255 for ignore_pattern in ignore_patterns |
2211 ): |
2256 ): |
2212 self.__addRecursiveDirectory( |
2257 self.__addRecursiveDirectory( |
2213 filetype, dirEntry.path, os.path.join(target, dirEntry.name) |
2258 filetype, |
|
2259 entry["path"], |
|
2260 self.__remotefsInterface.join(target, entry["name"]), |
2214 ) |
2261 ) |
|
2262 else: |
|
2263 with os.scandir(source) as dirEntriesIterator: |
|
2264 for dirEntry in dirEntriesIterator: |
|
2265 if dirEntry.is_dir() and not any( |
|
2266 fnmatch.fnmatch(dirEntry.name, ignore_pattern) |
|
2267 for ignore_pattern in ignore_patterns |
|
2268 ): |
|
2269 self.__addRecursiveDirectory( |
|
2270 filetype, dirEntry.path, os.path.join(target, dirEntry.name) |
|
2271 ) |
2215 |
2272 |
2216 @pyqtSlot() |
2273 @pyqtSlot() |
2217 def addDirectory(self, fileTypeFilter=None, startdir=None): |
2274 def addDirectory(self, fileTypeFilter=None, startdir=None): |
2218 """ |
2275 """ |
2219 Public method used to add all files of a directory to the project. |
2276 Public method used to add all files of a directory to the project. |