Selaa lähdekoodia

Bug 572: Amazon S3 protocol (renaming/moving)

https://winscp.net/tracker/572

- Change: Scripting command "mv" now checks for source file existence (to determine if it is a folder or file), so error message changes

Source commit: 747e51794ef409f3878a890c8a3729ba6d97cdff
Martin Prikryl 8 vuotta sitten
vanhempi
sitoutus
df8226b6df

+ 1 - 1
source/core/FileSystems.h

@@ -74,7 +74,7 @@ public:
     TRemoteFile *& File) = 0;
   virtual void __fastcall ReadSymlink(TRemoteFile * SymLinkFile,
     TRemoteFile *& File) = 0;
-  virtual void __fastcall RenameFile(const UnicodeString FileName,
+  virtual void __fastcall RenameFile(const UnicodeString FileName, const TRemoteFile * File,
     const UnicodeString NewName) = 0;
   virtual void __fastcall CopyFile(const UnicodeString FileName, const TRemoteFile * File,
     const UnicodeString NewName) = 0;

+ 1 - 1
source/core/FtpFileSystem.cpp

@@ -2896,7 +2896,7 @@ void __fastcall TFTPFileSystem::ReadSymlink(TRemoteFile * SymlinkFile,
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TFTPFileSystem::RenameFile(const UnicodeString AFileName,
+void __fastcall TFTPFileSystem::RenameFile(const UnicodeString AFileName, const TRemoteFile * /*File*/,
   const UnicodeString ANewName)
 {
   UnicodeString FileName = AbsolutePath(AFileName, false);

+ 1 - 1
source/core/FtpFileSystem.h

@@ -67,7 +67,7 @@ public:
     TRemoteFile *& File);
   virtual void __fastcall ReadSymlink(TRemoteFile * SymlinkFile,
     TRemoteFile *& File);
-  virtual void __fastcall RenameFile(const UnicodeString FileName,
+  virtual void __fastcall RenameFile(const UnicodeString FileName, const TRemoteFile * File,
     const UnicodeString NewName);
   virtual void __fastcall CopyFile(const UnicodeString FileName, const TRemoteFile * File,
     const UnicodeString NewName);

+ 7 - 4
source/core/S3FileSystem.cpp

@@ -565,10 +565,10 @@ bool __fastcall TS3FileSystem::IsCapable(int Capability) const
     // instead of trying to open it as directory
     case fcResolveSymlink:
     case fcRemoteCopy:
-      return true;
-
     case fcRename:
     case fcRemoteMove:
+      return true;
+
     case fcMoveToQueue:
     case fcPreservingTimestampUpload:
     case fcCheckingSpaceAvailable:
@@ -906,10 +906,13 @@ void __fastcall TS3FileSystem::DeleteFile(const UnicodeString AFileName,
   CheckLibS3Error(Data);
 }
 //---------------------------------------------------------------------------
-void __fastcall TS3FileSystem::RenameFile(const UnicodeString FileName,
+void __fastcall TS3FileSystem::RenameFile(const UnicodeString FileName, const TRemoteFile * File,
   const UnicodeString NewName)
 {
-  throw Exception(L"Not implemented");
+  CopyFile(FileName, File, NewName);
+  TRmSessionAction DummyAction(FTerminal->ActionLog, FileName);
+  DeleteFile(FileName, File, dfForceDelete, DummyAction);
+  DummyAction.Cancel();
 }
 //---------------------------------------------------------------------------
 void __fastcall TS3FileSystem::CopyFile(const UnicodeString AFileName, const TRemoteFile * File,

+ 1 - 1
source/core/S3FileSystem.h

@@ -75,7 +75,7 @@ public:
     TRemoteFile *& File);
   virtual void __fastcall ReadSymlink(TRemoteFile * SymLinkFile,
     TRemoteFile *& File);
-  virtual void __fastcall RenameFile(const UnicodeString FileName,
+  virtual void __fastcall RenameFile(const UnicodeString FileName, const TRemoteFile * File,
     const UnicodeString NewName);
   virtual void __fastcall CopyFile(const UnicodeString FileName, const TRemoteFile * File,
     const UnicodeString NewName);

+ 1 - 1
source/core/ScpFileSystem.cpp

@@ -1160,7 +1160,7 @@ void __fastcall TSCPFileSystem::DeleteFile(const UnicodeString FileName,
   ExecCommand(fsDeleteFile, ARRAYOFCONST((DelimitStr(FileName))));
 }
 //---------------------------------------------------------------------------
-void __fastcall TSCPFileSystem::RenameFile(const UnicodeString FileName,
+void __fastcall TSCPFileSystem::RenameFile(const UnicodeString FileName, const TRemoteFile * /*File*/,
   const UnicodeString NewName)
 {
   ExecCommand(fsRenameFile, ARRAYOFCONST((DelimitStr(FileName), DelimitStr(NewName))));

+ 1 - 1
source/core/ScpFileSystem.h

@@ -57,7 +57,7 @@ public:
     TRemoteFile *& File);
   virtual void __fastcall ReadSymlink(TRemoteFile * SymlinkFile,
     TRemoteFile *& File);
-  virtual void __fastcall RenameFile(const UnicodeString FileName,
+  virtual void __fastcall RenameFile(const UnicodeString FileName, const TRemoteFile * File,
     const UnicodeString NewName);
   virtual void __fastcall CopyFile(const UnicodeString FileName, const TRemoteFile * File,
     const UnicodeString NewName);

+ 4 - 4
source/core/Script.cpp

@@ -1332,7 +1332,7 @@ void __fastcall TScript::RmDirProc(TScriptProcParams * Parameters)
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TScript::DoMvOrCp(TScriptProcParams * Parameters, TFSCapability Capability, bool Cp, TFileListType FileListMask)
+void __fastcall TScript::DoMvOrCp(TScriptProcParams * Parameters, TFSCapability Capability, bool Cp)
 {
   CheckSession();
 
@@ -1342,7 +1342,7 @@ void __fastcall TScript::DoMvOrCp(TScriptProcParams * Parameters, TFSCapability
   }
 
   TStrings * FileList =
-    CreateFileList(Parameters, 1, Parameters->ParamCount - 1, TFileListType(fltMask | FileListMask));
+    CreateFileList(Parameters, 1, Parameters->ParamCount - 1, TFileListType(fltMask | fltQueryServer));
   try
   {
     DebugAssert(Parameters->ParamCount >= 1);
@@ -1369,12 +1369,12 @@ void __fastcall TScript::DoMvOrCp(TScriptProcParams * Parameters, TFSCapability
 //---------------------------------------------------------------------------
 void __fastcall TScript::MvProc(TScriptProcParams * Parameters)
 {
-  DoMvOrCp(Parameters, fcRemoteMove, false, fltDefault);
+  DoMvOrCp(Parameters, fcRemoteMove, false);
 }
 //---------------------------------------------------------------------------
 void __fastcall TScript::CpProc(TScriptProcParams * Parameters)
 {
-  DoMvOrCp(Parameters, fcRemoteCopy, true, fltQueryServer);
+  DoMvOrCp(Parameters, fcRemoteCopy, true);
 }
 //---------------------------------------------------------------------------
 void __fastcall TScript::ChModProc(TScriptProcParams * Parameters)

+ 1 - 1
source/core/Script.h

@@ -180,7 +180,7 @@ private:
   void __fastcall NotSupported();
   void __fastcall CheckMultiFilesToOne(TStrings * FileList, const UnicodeString & Target, bool Unix);
   void __fastcall LogOption(const UnicodeString & LogStr);
-  void __fastcall DoMvOrCp(TScriptProcParams * Parameters, TFSCapability Capability, bool Cp, TFileListType FileListMask);
+  void __fastcall DoMvOrCp(TScriptProcParams * Parameters, TFSCapability Capability, bool Cp);
 };
 //---------------------------------------------------------------------------
 typedef void __fastcall (__closure *TScriptInputEvent)(TScript * Script, const UnicodeString Prompt, UnicodeString & Str);

+ 2 - 2
source/core/SftpFileSystem.cpp

@@ -3696,7 +3696,7 @@ void __fastcall TSFTPFileSystem::DeleteFile(const UnicodeString FileName,
   DoDeleteFile(FileName, Type);
 }
 //---------------------------------------------------------------------------
-void __fastcall TSFTPFileSystem::RenameFile(const UnicodeString FileName,
+void __fastcall TSFTPFileSystem::RenameFile(const UnicodeString FileName, const TRemoteFile * /*File*/,
   const UnicodeString NewName)
 {
   TSFTPPacket Packet(SSH_FXP_RENAME);
@@ -4911,7 +4911,7 @@ void __fastcall TSFTPFileSystem::SFTPSource(const UnicodeString FileName,
         // on VShell it failed
         FILE_OPERATION_LOOP_BEGIN
         {
-          RenameFile(OpenParams.RemoteFileName, DestFileName);
+          RenameFile(OpenParams.RemoteFileName, NULL, DestFileName);
         }
         FILE_OPERATION_LOOP_END_CUSTOM(
           FMTLOAD(RENAME_AFTER_RESUME_ERROR,

+ 1 - 1
source/core/SftpFileSystem.h

@@ -68,7 +68,7 @@ public:
     TRemoteFile *& File);
   virtual void __fastcall ReadSymlink(TRemoteFile * SymlinkFile,
     TRemoteFile *& File);
-  virtual void __fastcall RenameFile(const UnicodeString FileName,
+  virtual void __fastcall RenameFile(const UnicodeString FileName, const TRemoteFile * File,
     const UnicodeString NewName);
   virtual void __fastcall CopyFile(const UnicodeString FileName, const TRemoteFile * File,
     const UnicodeString NewName);

+ 4 - 4
source/core/Terminal.cpp

@@ -4377,12 +4377,12 @@ void __fastcall TTerminal::RenameFile(const TRemoteFile * File,
   {
     FileModified(File, File->FileName);
     LogEvent(FORMAT(L"Renaming file \"%s\" to \"%s\".", (File->FileName, NewName)));
-    DoRenameFile(File->FileName, NewName, false);
+    DoRenameFile(File->FileName, File, NewName, false);
     ReactOnCommand(fsRenameFile);
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TTerminal::DoRenameFile(const UnicodeString FileName,
+void __fastcall TTerminal::DoRenameFile(const UnicodeString FileName, const TRemoteFile * File,
   const UnicodeString NewName, bool Move)
 {
   TRetryOperationLoop RetryLoop(this);
@@ -4392,7 +4392,7 @@ void __fastcall TTerminal::DoRenameFile(const UnicodeString FileName,
     try
     {
       DebugAssert(FFileSystem);
-      FFileSystem->RenameFile(FileName, NewName);
+      FFileSystem->RenameFile(FileName, File, NewName);
     }
     catch(Exception & E)
     {
@@ -4413,7 +4413,7 @@ void __fastcall TTerminal::MoveFile(const UnicodeString FileName,
     MaskFileName(UnixExtractFileName(FileName), Params.FileMask);
   LogEvent(FORMAT(L"Moving file \"%s\" to \"%s\".", (FileName, NewName)));
   FileModified(File, FileName);
-  DoRenameFile(FileName, NewName, true);
+  DoRenameFile(FileName, File, NewName, true);
   ReactOnCommand(fsMoveFile);
 }
 //---------------------------------------------------------------------------

+ 1 - 1
source/core/Terminal.h

@@ -260,7 +260,7 @@ protected:
     int Params);
   void __fastcall DoCustomCommandOnFile(UnicodeString FileName,
     const TRemoteFile * File, UnicodeString Command, int Params, TCaptureOutputEvent OutputEvent);
-  void __fastcall DoRenameFile(const UnicodeString FileName,
+  void __fastcall DoRenameFile(const UnicodeString FileName, const TRemoteFile * File,
     const UnicodeString NewName, bool Move);
   void __fastcall DoCopyFile(const UnicodeString FileName, const TRemoteFile * File, const UnicodeString NewName);
   void __fastcall DoChangeFileProperties(const UnicodeString FileName,

+ 1 - 1
source/core/WebDAVFileSystem.cpp

@@ -1031,7 +1031,7 @@ int __fastcall TWebDAVFileSystem::RenameFileInternal(const UnicodeString & FileN
   return ne_move(FNeonSession, 0, PathToNeon(FileName), PathToNeon(NewName));
 }
 //---------------------------------------------------------------------------
-void __fastcall TWebDAVFileSystem::RenameFile(const UnicodeString FileName,
+void __fastcall TWebDAVFileSystem::RenameFile(const UnicodeString FileName, const TRemoteFile * /*File*/,
   const UnicodeString NewName)
 {
   ClearNeonError();

+ 1 - 1
source/core/WebDAVFileSystem.h

@@ -66,7 +66,7 @@ public:
     TRemoteFile *& File);
   virtual void __fastcall ReadSymlink(TRemoteFile * SymlinkFile,
     TRemoteFile *& File);
-  virtual void __fastcall RenameFile(const UnicodeString FileName,
+  virtual void __fastcall RenameFile(const UnicodeString FileName, const TRemoteFile * File,
     const UnicodeString NewName);
   virtual void __fastcall CopyFile(const UnicodeString FileName, const TRemoteFile * File,
     const UnicodeString NewName);