Skip to content

Commit

Permalink
Restoring consistent behavior of failing, between duplicating and mov…
Browse files Browse the repository at this point in the history
…ing/renaming files over existing file with WebDAV protocol in scripting and .NET assembly

The discrepancy was introduced by Bug 2120 cb021fe.
This restores the mv/MoveFile behavior to fail, if the target file exists with WebDAV protocol (but still allows overwrite in the GUI).
The cp/DuplicateFile behavior is unchanged, but the internal API was modified to match that of mv/MoveFile, in anticipation of aligning move/duplicate command behavior in GUI and need to keep current scripting/.NET behavior.

Source commit: 4661a3ea7ec8123231e376aae9913ce8457750dd
  • Loading branch information
martinprikryl committed Oct 24, 2023
1 parent 68db7d1 commit 700baf4
Show file tree
Hide file tree
Showing 13 changed files with 64 additions and 65 deletions.
8 changes: 4 additions & 4 deletions source/core/FileSystems.h
Expand Up @@ -91,10 +91,10 @@ class TCustomFileSystem
TRemoteFile *& File) = 0;
virtual void __fastcall ReadSymlink(TRemoteFile * SymLinkFile,
TRemoteFile *& File) = 0;
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;
virtual void __fastcall RenameFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite) = 0;
virtual void __fastcall CopyFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite) = 0;
virtual TStrings * __fastcall GetFixedPaths() = 0;
virtual void __fastcall SpaceAvailable(const UnicodeString Path,
TSpaceAvailable & ASpaceAvailable) = 0;
Expand Down
8 changes: 4 additions & 4 deletions source/core/FtpFileSystem.cpp
Expand Up @@ -2519,8 +2519,8 @@ void __fastcall TFTPFileSystem::ReadSymlink(TRemoteFile * SymlinkFile,
}
}
//---------------------------------------------------------------------------
void __fastcall TFTPFileSystem::RenameFile(const UnicodeString AFileName, const TRemoteFile * /*File*/,
const UnicodeString ANewName)
void __fastcall TFTPFileSystem::RenameFile(
const UnicodeString & AFileName, const TRemoteFile *, const UnicodeString & ANewName, bool DebugUsedArg(Overwrite))
{
UnicodeString FileName = AbsolutePath(AFileName, false);
UnicodeString NewName = AbsolutePath(ANewName, false);
Expand All @@ -2541,8 +2541,8 @@ void __fastcall TFTPFileSystem::RenameFile(const UnicodeString AFileName, const
}
}
//---------------------------------------------------------------------------
void __fastcall TFTPFileSystem::CopyFile(const UnicodeString FileName, const TRemoteFile * /*File*/,
const UnicodeString NewName)
void __fastcall TFTPFileSystem::CopyFile(
const UnicodeString & FileName, const TRemoteFile *, const UnicodeString & NewName, bool DebugUsedArg(Overwrite))
{
DebugAssert(SupportsSiteCommand(CopySiteCommand));
EnsureLocation();
Expand Down
8 changes: 4 additions & 4 deletions source/core/FtpFileSystem.h
Expand Up @@ -80,10 +80,10 @@ friend class TFileListHelper;
TRemoteFile *& File);
virtual void __fastcall ReadSymlink(TRemoteFile * SymlinkFile,
TRemoteFile *& File);
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);
virtual void __fastcall RenameFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
virtual void __fastcall CopyFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
virtual TStrings * __fastcall GetFixedPaths();
virtual void __fastcall SpaceAvailable(const UnicodeString Path,
TSpaceAvailable & ASpaceAvailable);
Expand Down
10 changes: 5 additions & 5 deletions source/core/S3FileSystem.cpp
Expand Up @@ -1356,21 +1356,21 @@ void __fastcall TS3FileSystem::DeleteFile(const UnicodeString AFileName,
}
}
//---------------------------------------------------------------------------
void __fastcall TS3FileSystem::RenameFile(const UnicodeString FileName, const TRemoteFile * File,
const UnicodeString NewName)
void __fastcall TS3FileSystem::RenameFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite)
{
if (DebugAlwaysTrue(File != NULL) && File->IsDirectory)
{
throw Exception(LoadStr(NOTSUPPORTED));
}
CopyFile(FileName, File, NewName);
CopyFile(FileName, File, NewName, Overwrite);
TRmSessionAction DummyAction(FTerminal->ActionLog, FileName);
DeleteFile(FileName, File, dfForceDelete, DummyAction);
DummyAction.Cancel();
}
//---------------------------------------------------------------------------
void __fastcall TS3FileSystem::CopyFile(const UnicodeString AFileName, const TRemoteFile * File,
const UnicodeString ANewName)
void __fastcall TS3FileSystem::CopyFile(
const UnicodeString & AFileName, const TRemoteFile * File, const UnicodeString & ANewName, bool DebugUsedArg(Overwrite))
{
if (DebugAlwaysTrue(File != NULL) && File->IsDirectory)
{
Expand Down
8 changes: 4 additions & 4 deletions source/core/S3FileSystem.h
Expand Up @@ -92,10 +92,10 @@ class TS3FileSystem : public TCustomFileSystem
TRemoteFile *& File);
virtual void __fastcall ReadSymlink(TRemoteFile * SymLinkFile,
TRemoteFile *& File);
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);
virtual void __fastcall RenameFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
virtual void __fastcall CopyFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
virtual TStrings * __fastcall GetFixedPaths();
virtual void __fastcall SpaceAvailable(const UnicodeString Path,
TSpaceAvailable & ASpaceAvailable);
Expand Down
8 changes: 4 additions & 4 deletions source/core/ScpFileSystem.cpp
Expand Up @@ -1172,14 +1172,14 @@ void __fastcall TSCPFileSystem::DeleteFile(const UnicodeString FileName,
ExecCommand(fsDeleteFile, ARRAYOFCONST((DelimitStr(FileName))));
}
//---------------------------------------------------------------------------
void __fastcall TSCPFileSystem::RenameFile(const UnicodeString FileName, const TRemoteFile * /*File*/,
const UnicodeString NewName)
void __fastcall TSCPFileSystem::RenameFile(
const UnicodeString & FileName, const TRemoteFile *, const UnicodeString & NewName, bool DebugUsedArg(Overwrite))
{
ExecCommand(fsRenameFile, ARRAYOFCONST((DelimitStr(FileName), DelimitStr(NewName))));
}
//---------------------------------------------------------------------------
void __fastcall TSCPFileSystem::CopyFile(const UnicodeString FileName, const TRemoteFile * /*File*/,
const UnicodeString NewName)
void __fastcall TSCPFileSystem::CopyFile(
const UnicodeString & FileName, const TRemoteFile *, const UnicodeString & NewName, bool DebugUsedArg(Overwrite))
{
UnicodeString DelimitedFileName = DelimitStr(FileName);
UnicodeString DelimitedNewName = DelimitStr(NewName);
Expand Down
8 changes: 4 additions & 4 deletions source/core/ScpFileSystem.h
Expand Up @@ -68,10 +68,10 @@ class TSCPFileSystem : public TCustomFileSystem
TRemoteFile *& File);
virtual void __fastcall ReadSymlink(TRemoteFile * SymlinkFile,
TRemoteFile *& File);
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);
virtual void __fastcall RenameFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
virtual void __fastcall CopyFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
virtual TStrings * __fastcall GetFixedPaths();
virtual void __fastcall SpaceAvailable(const UnicodeString Path,
TSpaceAvailable & ASpaceAvailable);
Expand Down
8 changes: 4 additions & 4 deletions source/core/SftpFileSystem.cpp
Expand Up @@ -3842,8 +3842,8 @@ void __fastcall TSFTPFileSystem::DeleteFile(const UnicodeString FileName,
DoDeleteFile(FileName, Type);
}
//---------------------------------------------------------------------------
void __fastcall TSFTPFileSystem::RenameFile(const UnicodeString FileName, const TRemoteFile * /*File*/,
const UnicodeString NewName)
void __fastcall TSFTPFileSystem::RenameFile(
const UnicodeString & FileName, const TRemoteFile *, const UnicodeString & NewName, bool DebugUsedArg(Overwrite))
{
TSFTPPacket Packet(SSH_FXP_RENAME);
UnicodeString RealName = LocalCanonify(FileName);
Expand Down Expand Up @@ -3878,7 +3878,7 @@ void TSFTPFileSystem::DoCloseRemoteIfOpened(const RawByteString & Handle)
}
//---------------------------------------------------------------------------
void __fastcall TSFTPFileSystem::CopyFile(
const UnicodeString FileName, const TRemoteFile * File, const UnicodeString NewName)
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool DebugUsedArg(Overwrite))
{
UnicodeString FileNameCanonical = Canonify(FileName);
bool Encrypted = FTerminal->IsFileEncrypted(FileNameCanonical);
Expand Down Expand Up @@ -4897,7 +4897,7 @@ void __fastcall TSFTPFileSystem::Source(
// on VShell it failed
FILE_OPERATION_LOOP_BEGIN
{
RenameFile(OpenParams.RemoteFileName, NULL, DestFileName);
RenameFile(OpenParams.RemoteFileName, NULL, DestFileName, false);
}
FILE_OPERATION_LOOP_END_CUSTOM(
FMTLOAD(RENAME_AFTER_RESUME_ERROR,
Expand Down
8 changes: 4 additions & 4 deletions source/core/SftpFileSystem.h
Expand Up @@ -83,10 +83,10 @@ friend class TSFTPBusy;
TRemoteFile *& File);
virtual void __fastcall ReadSymlink(TRemoteFile * SymlinkFile,
TRemoteFile *& File);
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);
virtual void __fastcall RenameFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
virtual void __fastcall CopyFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
virtual TStrings * __fastcall GetFixedPaths();
virtual void __fastcall SpaceAvailable(const UnicodeString Path,
TSpaceAvailable & ASpaceAvailable);
Expand Down
12 changes: 6 additions & 6 deletions source/core/Terminal.cpp
Expand Up @@ -4943,7 +4943,7 @@ bool __fastcall TTerminal::DoRenameFile(
try
{
DebugAssert(FFileSystem);
FFileSystem->RenameFile(FileName, File, NewName);
FFileSystem->RenameFile(FileName, File, NewName, !DontOverwrite);
}
catch(Exception & E)
{
Expand Down Expand Up @@ -5044,8 +5044,8 @@ bool __fastcall TTerminal::MoveFiles(
return Result;
}
//---------------------------------------------------------------------------
void __fastcall TTerminal::DoCopyFile(const UnicodeString FileName, const TRemoteFile * File,
const UnicodeString NewName)
void __fastcall TTerminal::DoCopyFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool DontOverwrite)
{
TRetryOperationLoop RetryLoop(this);
do
Expand All @@ -5066,7 +5066,7 @@ void __fastcall TTerminal::DoCopyFile(const UnicodeString FileName, const TRemot
{
FileSystem = GetFileSystemForCapability(fcRemoteCopy);
}
FileSystem->CopyFile(FileName, File, NewName);
FileSystem->CopyFile(FileName, File, NewName, !DontOverwrite);
}
catch(Exception & E)
{
Expand All @@ -5085,7 +5085,7 @@ void __fastcall TTerminal::CopyFile(const UnicodeString FileName,
UnicodeString NewName = UnixIncludeTrailingBackslash(Params.Target) +
MaskFileName(UnixExtractFileName(FileName), Params.FileMask);
LogEvent(FORMAT(L"Copying file \"%s\" to \"%s\".", (FileName, NewName)));
DoCopyFile(FileName, File, NewName);
DoCopyFile(FileName, File, NewName, Params.DontOverwrite);
ReactOnCommand(fsCopyFile);
}
//---------------------------------------------------------------------------
Expand All @@ -5095,7 +5095,7 @@ bool __fastcall TTerminal::CopyFiles(TStrings * FileList, const UnicodeString Ta
TMoveFileParams Params;
Params.Target = Target;
Params.FileMask = FileMask;
Params.DontOverwrite = false; // not used
Params.DontOverwrite = true; // not used
DirectoryModified(Target, true);
return ProcessFiles(FileList, foRemoteCopy, CopyFile, &Params);
}
Expand Down
3 changes: 2 additions & 1 deletion source/core/Terminal.h
Expand Up @@ -282,7 +282,8 @@ friend class TParallelOperation;
bool __fastcall DoRenameFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Move, bool DontOverwrite);
bool __fastcall DoMoveFile(const UnicodeString & FileName, const TRemoteFile * File, /*const TMoveFileParams*/ void * Param);
void __fastcall DoCopyFile(const UnicodeString FileName, const TRemoteFile * File, const UnicodeString NewName);
void __fastcall DoCopyFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool DontOverwrite);
void __fastcall DoChangeFileProperties(const UnicodeString FileName,
const TRemoteFile * File, const TRemoteProperties * Properties);
void __fastcall DoChangeDirectory();
Expand Down
28 changes: 13 additions & 15 deletions source/core/WebDAVFileSystem.cpp
Expand Up @@ -1096,48 +1096,46 @@ void __fastcall TWebDAVFileSystem::DeleteFile(const UnicodeString FileName,
DiscardLock(Path);
}
//---------------------------------------------------------------------------
int __fastcall TWebDAVFileSystem::RenameFileInternal(const UnicodeString & FileName,
const UnicodeString & NewName)
int __fastcall TWebDAVFileSystem::RenameFileInternal(
const UnicodeString & FileName, const UnicodeString & NewName, bool Overwrite)
{
const int Overwrite = 1;
return ne_move(FSessionContext->NeonSession, Overwrite, PathToNeon(FileName), PathToNeon(NewName));
}
//---------------------------------------------------------------------------
void __fastcall TWebDAVFileSystem::RenameFile(const UnicodeString FileName, const TRemoteFile * /*File*/,
const UnicodeString NewName)
void __fastcall TWebDAVFileSystem::RenameFile(
const UnicodeString & FileName, const TRemoteFile *, const UnicodeString & NewName, bool Overwrite)
{
ClearNeonError();
TOperationVisualizer Visualizer(FTerminal->UseBusyCursor);

UnicodeString Path = FileName;
int NeonStatus = RenameFileInternal(Path, NewName);
int NeonStatus = RenameFileInternal(Path, NewName, Overwrite);
if (IsValidRedirect(NeonStatus, Path))
{
NeonStatus = RenameFileInternal(Path, NewName);
NeonStatus = RenameFileInternal(Path, NewName, Overwrite);
}
CheckStatus(NeonStatus);
// See a comment in DeleteFile
DiscardLock(PathToNeon(Path));
}
//---------------------------------------------------------------------------
int __fastcall TWebDAVFileSystem::CopyFileInternal(const UnicodeString & FileName,
const UnicodeString & NewName)
int __fastcall TWebDAVFileSystem::CopyFileInternal(
const UnicodeString & FileName, const UnicodeString & NewName, bool Overwrite)
{
// 0 = no overwrite
return ne_copy(FSessionContext->NeonSession, 0, NE_DEPTH_INFINITE, PathToNeon(FileName), PathToNeon(NewName));
return ne_copy(FSessionContext->NeonSession, Overwrite, NE_DEPTH_INFINITE, PathToNeon(FileName), PathToNeon(NewName));
}
//---------------------------------------------------------------------------
void __fastcall TWebDAVFileSystem::CopyFile(const UnicodeString FileName, const TRemoteFile * /*File*/,
const UnicodeString NewName)
void __fastcall TWebDAVFileSystem::CopyFile(
const UnicodeString & FileName, const TRemoteFile *, const UnicodeString & NewName, bool Overwrite)
{
ClearNeonError();
TOperationVisualizer Visualizer(FTerminal->UseBusyCursor);

UnicodeString Path = FileName;
int NeonStatus = CopyFileInternal(Path, NewName);
int NeonStatus = CopyFileInternal(Path, NewName, Overwrite);
if (IsValidRedirect(NeonStatus, Path))
{
NeonStatus = CopyFileInternal(Path, NewName);
NeonStatus = CopyFileInternal(Path, NewName, Overwrite);
}
CheckStatus(NeonStatus);
}
Expand Down
12 changes: 6 additions & 6 deletions source/core/WebDAVFileSystem.h
Expand Up @@ -71,10 +71,10 @@ class TWebDAVFileSystem : public TCustomFileSystem
TRemoteFile *& File);
virtual void __fastcall ReadSymlink(TRemoteFile * SymlinkFile,
TRemoteFile *& File);
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);
virtual void __fastcall RenameFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
virtual void __fastcall CopyFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
virtual TStrings * __fastcall GetFixedPaths();
virtual void __fastcall SpaceAvailable(const UnicodeString Path,
TSpaceAvailable & ASpaceAvailable);
Expand Down Expand Up @@ -189,8 +189,8 @@ class TWebDAVFileSystem : public TCustomFileSystem
UnicodeString __fastcall GetRedirectUrl();
UnicodeString __fastcall ParsePathFromUrl(const UnicodeString & Url);
int __fastcall ReadDirectoryInternal(const UnicodeString & Path, TRemoteFileList * FileList);
int __fastcall RenameFileInternal(const UnicodeString & FileName, const UnicodeString & NewName);
int __fastcall CopyFileInternal(const UnicodeString & FileName, const UnicodeString & NewName);
int __fastcall RenameFileInternal(const UnicodeString & FileName, const UnicodeString & NewName, bool Overwrite);
int __fastcall CopyFileInternal(const UnicodeString & FileName, const UnicodeString & NewName, bool Overwrite);
bool __fastcall IsValidRedirect(int NeonStatus, UnicodeString & Path);
UnicodeString __fastcall DirectoryPath(UnicodeString Path);
UnicodeString __fastcall FilePath(const TRemoteFile * File);
Expand Down

0 comments on commit 700baf4

Please sign in to comment.