Skip to content

Commit

Permalink
Version 13.5 (2024-04-01)
Browse files Browse the repository at this point in the history
  • Loading branch information
hkneptune committed Apr 10, 2024
1 parent fdbcfd1 commit ee1f88c
Show file tree
Hide file tree
Showing 24 changed files with 404 additions and 271 deletions.
2 changes: 1 addition & 1 deletion Bugs.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ the ones mentioned below. The remaining issues that are yet to be fixed are list


----------------
| libcurl 8.4.0|
| libcurl 8.7.0|
----------------
__________________________________________________________________________________________________________
/lib/ftp.c
Expand Down
9 changes: 9 additions & 0 deletions Changelog.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
FreeFileSync 13.5 [2024-04-01]
------------------------------
Wrap file grid folder paths instead of truncate
Fixed sync operation arrows for RTL layout
Fixed FTP hang during connection (libcurl regression)
Consider user-defined file time tolerance for DB comparisons
Don't log folder pair paths if nothing to sync


FreeFileSync 13.4 [2024-02-16]
------------------------------
Ignore leading/trailing space when matching file names
Expand Down
51 changes: 49 additions & 2 deletions FreeFileSync/Build/Resources/cacert.pem
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
##
## Bundle of CA Root Certificates
##
## Certificate data from Mozilla as of: Tue Dec 12 04:12:04 2023 GMT
## Certificate data from Mozilla as of: Mon Mar 11 15:25:27 2024 GMT
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
Expand All @@ -14,7 +14,7 @@
## Just configure this file as the SSLCACertificateFile.
##
## Conversion done with mk-ca-bundle.pl version 1.29.
## SHA256: 1970dd65858925d68498d2356aea6d03f764422523c5887deca8ce3ba9e1f845
## SHA256: 4d96bd539f4719e9ace493757afbe4a23ee8579de1c97fbebc50bba3c12e8c1e
##


Expand Down Expand Up @@ -3532,3 +3532,50 @@ dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ
iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN
lM47ni3niAIi9G7oyOzWPPO5std3eqx7
-----END CERTIFICATE-----

Telekom Security TLS ECC Root 2020
==================================
-----BEGIN CERTIFICATE-----
MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE
RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl
a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz
NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg
R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG
SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1
2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC
MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ
Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU
ga/sf+Rn27iQ7t0l
-----END CERTIFICATE-----

Telekom Security TLS RSA Root 2023
==================================
-----BEGIN CERTIFICATE-----
MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQG
EwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJU
ZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAyMDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMy
NzIzNTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJp
dHkgR21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9cUD/h3VC
KSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHVcp6R+SPWcHu79ZvB7JPP
GeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMAU6DksquDOFczJZSfvkgdmOGjup5czQRx
UX11eKvzWarE4GC+j4NSuHUaQTXtvPM6Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWo
l8hHD/BeEIvnHRz+sTugBTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9
FIS3R/qy8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73Jco4v
zLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg8qKrBC7m8kwOFjQg
rIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8rFEz0ciD0cmfHdRHNCk+y7AO+oML
KFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7S
WWO/gLCMk3PLNaaZlSJhZQNg+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNV
HQ4EFgQUtqeXgj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2
p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQpGv7qHBFfLp+
sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm9S3ul0A8Yute1hTWjOKWi0Fp
kzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErwM807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy
/SKE8YXJN3nptT+/XOR0so8RYgDdGGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4
mZqTuXNnQkYRIer+CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtz
aL1txKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+w6jv/naa
oqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aKL4x35bcF7DvB7L6Gs4a8
wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+ljX273CXE2whJdV/LItM3z7gLfEdxquVeE
HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0
o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
-----END CERTIFICATE-----
2 changes: 1 addition & 1 deletion FreeFileSync/Source/RealTimeSync/application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ int Application::OnExit()
}


wxLayoutDirection Application::GetLayoutDirection() const { return fff::getLayoutDirection(); }
wxLayoutDirection Application::GetLayoutDirection() const { return languageLayoutIsRtl() ? wxLayout_RightToLeft : wxLayout_LeftToRight; }


int Application::OnRun()
Expand Down
2 changes: 1 addition & 1 deletion FreeFileSync/Source/application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ int Application::OnExit()
}


wxLayoutDirection Application::GetLayoutDirection() const { return getLayoutDirection(); }
wxLayoutDirection Application::GetLayoutDirection() const { return languageLayoutIsRtl() ? wxLayout_RightToLeft : wxLayout_LeftToRight; }


int Application::OnRun()
Expand Down
49 changes: 25 additions & 24 deletions FreeFileSync/Source/base/algorithm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,8 @@ bool fff::allElementsEqual(const FolderComparison& folderCmp)
namespace
{
template <SelectSide side> inline
CudAction compareDbEntry(const FilePair& file, const InSyncFile* dbFile, const std::vector<unsigned int>& ignoreTimeShiftMinutes, bool renamedOrMoved)
CudAction compareDbEntry(const FilePair& file, const InSyncFile* dbFile, unsigned int fileTimeTolerance,
const std::vector<unsigned int>& ignoreTimeShiftMinutes, bool renamedOrMoved)
{
if (file.isEmpty<side>())
return dbFile ? (renamedOrMoved ? CudAction::update: CudAction::delete_) : CudAction::noChange;
Expand All @@ -227,8 +228,7 @@ CudAction compareDbEntry(const FilePair& file, const InSyncFile* dbFile, const s

const InSyncDescrFile& descrDb = selectParam<side>(dbFile->left, dbFile->right);

return sameFileTime(file.getLastWriteTime<side>(), descrDb.modTime, FAT_FILE_TIME_PRECISION_SEC, ignoreTimeShiftMinutes) &&
//- we're not interested in "fileTimeTolerance"!
return sameFileTime(file.getLastWriteTime<side>(), descrDb.modTime, fileTimeTolerance, ignoreTimeShiftMinutes) &&
//- we do *not* consider file ID, but only *user-visual* changes. E.g. user moving data to some other medium should not be considered a change!
file.getFileSize<side>() == dbFile->fileSize ?
CudAction::noChange : CudAction::update;
Expand All @@ -237,7 +237,7 @@ CudAction compareDbEntry(const FilePair& file, const InSyncFile* dbFile, const s

//check whether database entry is in sync considering *current* comparison settings
inline
bool stillInSync(const InSyncFile& dbFile, CompareVariant compareVar, int fileTimeTolerance, const std::vector<unsigned int>& ignoreTimeShiftMinutes)
bool stillInSync(const InSyncFile& dbFile, CompareVariant compareVar, unsigned int fileTimeTolerance, const std::vector<unsigned int>& ignoreTimeShiftMinutes)
{
switch (compareVar)
{
Expand All @@ -263,7 +263,8 @@ bool stillInSync(const InSyncFile& dbFile, CompareVariant compareVar, int fileTi

//check whether database entry and current item match: *irrespective* of current comparison settings
template <SelectSide side> inline
CudAction compareDbEntry(const SymlinkPair& symlink, const InSyncSymlink* dbSymlink, const std::vector<unsigned int>& ignoreTimeShiftMinutes, bool renamedOrMoved)
CudAction compareDbEntry(const SymlinkPair& symlink, const InSyncSymlink* dbSymlink, unsigned int fileTimeTolerance,
const std::vector<unsigned int>& ignoreTimeShiftMinutes, bool renamedOrMoved)
{
if (symlink.isEmpty<side>())
return dbSymlink ? (renamedOrMoved ? CudAction::update: CudAction::delete_) : CudAction::noChange;
Expand All @@ -272,14 +273,14 @@ CudAction compareDbEntry(const SymlinkPair& symlink, const InSyncSymlink* dbSyml

const InSyncDescrLink& descrDb = selectParam<side>(dbSymlink->left, dbSymlink->right);

return sameFileTime(symlink.getLastWriteTime<side>(), descrDb.modTime, FAT_FILE_TIME_PRECISION_SEC, ignoreTimeShiftMinutes) ?
return sameFileTime(symlink.getLastWriteTime<side>(), descrDb.modTime, fileTimeTolerance, ignoreTimeShiftMinutes) ?
CudAction::noChange : CudAction::update;
}


//check whether database entry is in sync considering *current* comparison settings
inline
bool stillInSync(const InSyncSymlink& dbLink, CompareVariant compareVar, int fileTimeTolerance, const std::vector<unsigned int>& ignoreTimeShiftMinutes)
bool stillInSync(const InSyncSymlink& dbLink, CompareVariant compareVar, unsigned int fileTimeTolerance, const std::vector<unsigned int>& ignoreTimeShiftMinutes)
{
switch (compareVar)
{
Expand Down Expand Up @@ -534,7 +535,7 @@ class DetectMovedFiles
}

const CompareVariant cmpVar_;
const int fileTimeTolerance_;
const unsigned int fileTimeTolerance_;
const std::vector<unsigned int> ignoreTimeShiftMinutes_;

std::vector<FilePair*> filesL_; //collection of *all* file items (with non-null filePrint)
Expand Down Expand Up @@ -649,8 +650,8 @@ class SetSyncDirViaChanges
}
return false;
}();
const CudAction changeL = compareDbEntry<SelectSide::left >(file, dbEntryL, ignoreTimeShiftMinutes_, renamedOrMoved);
const CudAction changeR = compareDbEntry<SelectSide::right>(file, dbEntryR, ignoreTimeShiftMinutes_, renamedOrMoved);
const CudAction changeL = compareDbEntry<SelectSide::left >(file, dbEntryL, fileTimeTolerance_, ignoreTimeShiftMinutes_, renamedOrMoved);
const CudAction changeR = compareDbEntry<SelectSide::right>(file, dbEntryR, fileTimeTolerance_, ignoreTimeShiftMinutes_, renamedOrMoved);

setSyncDirForChange(file, changeL, changeR);
}
Expand Down Expand Up @@ -686,8 +687,8 @@ class SetSyncDirViaChanges
return symlink.setSyncDirConflict(txtDbNotInSync_);

const bool renamedOrMoved = cat == SYMLINK_RENAMED;
const CudAction changeL = compareDbEntry<SelectSide::left >(symlink, dbEntryL, ignoreTimeShiftMinutes_, renamedOrMoved);
const CudAction changeR = compareDbEntry<SelectSide::right>(symlink, dbEntryR, ignoreTimeShiftMinutes_, renamedOrMoved);
const CudAction changeL = compareDbEntry<SelectSide::left >(symlink, dbEntryL, fileTimeTolerance_, ignoreTimeShiftMinutes_, renamedOrMoved);
const CudAction changeR = compareDbEntry<SelectSide::right>(symlink, dbEntryR, fileTimeTolerance_, ignoreTimeShiftMinutes_, renamedOrMoved);

setSyncDirForChange(symlink, changeL, changeR);
}
Expand Down Expand Up @@ -800,7 +801,7 @@ class SetSyncDirViaChanges

const DirectionByChange dirs_;
const CompareVariant cmpVar_;
const int fileTimeTolerance_;
const unsigned int fileTimeTolerance_;
const std::vector<unsigned int> ignoreTimeShiftMinutes_;
};
}
Expand Down Expand Up @@ -1206,7 +1207,7 @@ std::optional<PathDependency> fff::getPathDependency(const AbstractPath& itemPat
relDirPath = appendPath(relDirPath, itemName);
});

return PathDependency{leftParent ? itemPathL : itemPathR, relDirPath};
return PathDependency{leftParent ? itemPathL : itemPathR, relDirPath};
}
}
}
Expand All @@ -1215,18 +1216,18 @@ std::optional<PathDependency> fff::getPathDependency(const AbstractPath& itemPat


std::optional<PathDependency> fff::getFolderPathDependency(const AbstractPath& folderPathL, const PathFilter& filterL,
const AbstractPath& folderPathR, const PathFilter& filterR)
const AbstractPath& folderPathR, const PathFilter& filterR)
{
if (std::optional<PathDependency> pd = getPathDependency(folderPathL, folderPathR))
{
const PathFilter& filterP = pd->itemPathParent == folderPathL ? filterL : filterR;
//if there's a dependency, check if the sub directory is (fully) excluded via filter
//=> easy to check but still insufficient in general:
// - one folder may have a *.txt include-filter, the other a *.lng include filter => no dependencies, but "childItemMightMatch = true" below!
// - user may have manually excluded the conflicting items or changed the filter settings without running a re-compare
bool childItemMightMatch = true;
if (pd->relPath.empty() || filterP.passDirFilter(pd->relPath, &childItemMightMatch) || childItemMightMatch)
return pd;
{
const PathFilter& filterP = pd->itemPathParent == folderPathL ? filterL : filterR;
//if there's a dependency, check if the sub directory is (fully) excluded via filter
//=> easy to check but still insufficient in general:
// - one folder may have a *.txt include-filter, the other a *.lng include filter => no dependencies, but "childItemMightMatch = true" below!
// - user may have manually excluded the conflicting items or changed the filter settings without running a re-compare
bool childItemMightMatch = true;
if (pd->relPath.empty() || filterP.passDirFilter(pd->relPath, &childItemMightMatch) || childItemMightMatch)
return pd;
}
return {};
}
Expand Down
2 changes: 1 addition & 1 deletion FreeFileSync/Source/base/algorithm.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ struct PathDependency
};
std::optional<PathDependency> getPathDependency(const AbstractPath& itemPathL, const AbstractPath& itemPathR);
std::optional<PathDependency> getFolderPathDependency(const AbstractPath& folderPathL, const PathFilter& filterL,
const AbstractPath& folderPathR, const PathFilter& filterR);
const AbstractPath& folderPathR, const PathFilter& filterR);

//manual copy to alternate folder:
void copyToAlternateFolder(const std::vector<const FileSystemObject*>& selectionL, //all pointers need to be bound and !isEmpty<side>!
Expand Down
7 changes: 3 additions & 4 deletions FreeFileSync/Source/base/cmp_filetime.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,9 @@
namespace fff
{
inline
bool sameFileTime(time_t lhs, time_t rhs, int tolerance, const std::vector<unsigned int>& ignoreTimeShiftMinutes)
bool sameFileTime(time_t lhs, time_t rhs, /*unsigned*/ int tolerance, const std::vector<unsigned int>& ignoreTimeShiftMinutes)
{
if (tolerance < 0) //:= unlimited tolerance by convention!
return true;
assert(tolerance >= 0);

if (lhs < rhs)
std::swap(lhs, rhs);
Expand Down Expand Up @@ -71,7 +70,7 @@ inline const time_t oneYearFromNow = std::time(nullptr) + 365 * 24 * 3600;


inline
TimeResult compareFileTime(time_t lhs, time_t rhs, int tolerance, const std::vector<unsigned int>& ignoreTimeShiftMinutes)
TimeResult compareFileTime(time_t lhs, time_t rhs, unsigned int tolerance, const std::vector<unsigned int>& ignoreTimeShiftMinutes)
{
assert(oneYearFromNow != 0);
if (sameFileTime(lhs, rhs, tolerance, ignoreTimeShiftMinutes)) //last write time may differ by up to 2 seconds (NTFS vs FAT32)
Expand Down
6 changes: 3 additions & 3 deletions FreeFileSync/Source/base/comparison.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ class ComparisonBuffer
{
public:
ComparisonBuffer(const FolderStatus& folderStatus,
int fileTimeTolerance,
unsigned int fileTimeTolerance,
ProcessCallback& callback) :
fileTimeTolerance_(fileTimeTolerance),
folderStatus_(folderStatus),
Expand Down Expand Up @@ -221,7 +221,7 @@ class ComparisonBuffer
return BaseFolderStatus::notExisting;
};

const int fileTimeTolerance_;
const unsigned int fileTimeTolerance_;
const FolderStatus& folderStatus_;
std::map<DirectoryKey, DirectoryValue> folderBuffer_; //contains entries for *all* scanned folders!
ProcessCallback& cb_;
Expand Down Expand Up @@ -1055,7 +1055,7 @@ SharedRef<BaseFolderPair> ComparisonBuffer::performComparison(const ResolvedFold


FolderComparison fff::compare(WarningDialogs& warnings,
int fileTimeTolerance,
unsigned int fileTimeTolerance,
const AFS::RequestPasswordFun& requestPassword /*throw X*/,
bool runWithBackgroundPriority,
bool createDirLocks,
Expand Down
2 changes: 1 addition & 1 deletion FreeFileSync/Source/base/comparison.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ std::vector<FolderPairCfg> extractCompareCfg(const MainConfiguration& mainCfg);

//FFS core routine: output.size() == fpCfgList.size() or 0 on fatal error
FolderComparison compare(WarningDialogs& warnings,
int fileTimeTolerance,
unsigned int fileTimeTolerance,
const AFS::RequestPasswordFun& requestPassword /*throw X*/,
bool runWithBackgroundPriority,
bool createDirLocks,
Expand Down
11 changes: 8 additions & 3 deletions FreeFileSync/Source/base/file_hierarchy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -514,6 +514,11 @@ std::wstring fff::getSyncOpDescription(const FileSystemObject& fsObj)
{
const SyncOperation op = fsObj.getSyncOperation();

const std::wstring rightArrowDown = languageLayoutIsRtl() ?
std::wstring() + RTL_MARK + LEFT_ARROW_ANTICLOCK :
std::wstring() + LTR_MARK + RIGHT_ARROW_CURV_DOWN;
//Windows bug: RIGHT_ARROW_CURV_DOWN rendering and extent calculation is buggy (see wx+\tooltip.cpp) => need LTR mark!

auto generateFooter = [&]
{
if (fsObj.hasEquivalentItemNames())
Expand All @@ -528,7 +533,7 @@ std::wstring fff::getSyncOpDescription(const FileSystemObject& fsObj)
if (dir == SyncDirection::left)
std::swap(itemNameNew, itemNameOld);

return L'\n' + fmtPath(itemNameOld) + L' ' + RIGHT_ARROW_CURV_DOWN + L'\n' + fmtPath(itemNameNew);
return L'\n' + fmtPath(itemNameOld) + L' ' + rightArrowDown + L'\n' + fmtPath(itemNameNew);
}
else
return L'\n' +
Expand Down Expand Up @@ -574,10 +579,10 @@ std::wstring fff::getSyncOpDescription(const FileSystemObject& fsObj)
(beforeLast(relPathFrom, FILE_NAME_SEPARATOR, IfNotFoundReturn::none) ==
beforeLast(relPathTo, FILE_NAME_SEPARATOR, IfNotFoundReturn::none) ?
//detected pure "rename"
fmtPath(getItemName(relPathFrom)) + L' ' + RIGHT_ARROW_CURV_DOWN + L'\n' + //show file name only
fmtPath(getItemName(relPathFrom)) + L' ' + rightArrowDown + L'\n' + //show file name only
fmtPath(getItemName(relPathTo)) :
//"move" or "move + rename"
fmtPath(relPathFrom) + L' ' + RIGHT_ARROW_CURV_DOWN + L'\n' +
fmtPath(relPathFrom) + L' ' + rightArrowDown + L'\n' +
fmtPath(relPathTo));
}
break;
Expand Down
Loading

0 comments on commit ee1f88c

Please sign in to comment.