src/eric7/Project/Project.py

branch
server
changeset 10605
b6f5e27daeb5
parent 10599
36b8c7115c32
child 10610
bb0149571d94
equal deleted inserted replaced
10604:0f4017309f35 10605:b6f5e27daeb5
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.

eric ide

mercurial