diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-05-04 09:44:15 +0200 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-05-19 17:54:19 +0200 |
commit | 8696a2eb073217516c7c4c22437d2e59868e4440 (patch) | |
tree | fe470a07e456e46412d7af16d5ad34a537489a74 | |
parent | d53d1e8f366ca8682a3957199f3b90a9481b6108 (diff) |
QFile::moveToTrash: use $XDG_DATA_HOME/Trash as the trash directory
The code assumed that files in $HOME should be moved into $HOME/.Trash,
which is not what the spec says. The "home trash" is defined to be
$XDG_DATA_HOME/Trash, and we can expect $XDG_DATA_HOME to exist. If it
doesn't, then we can safely fail, as the environment is not compliant
with the Desktop Base Directory Specification [1] anyway.
[1] http://www.freedesktop.org/Standards/basedir-spec
This will make the tests fail on such non-compliant environments, such
as server versions of the distribution. That's acceptable.
[ChangeLog][QtCore][QFile] moveToTrash now creates the trash folder on
Linux as $XDG_DATA_HOME/Trash, as required by the freedesktop.org spec.
Change-Id: I7ef73c0c268ef5ea4df141bb7831b93a65ad213a
Fixes: QTBUG-83933
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: David Faure <david.faure@kdab.com>
(cherry picked from commit 112c285fcc065d07734b30ba49a62ead3be3d2c4)
-rw-r--r-- | src/corelib/io/qfilesystemengine_unix.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp index 67cff7c68c..196081eaa2 100644 --- a/src/corelib/io/qfilesystemengine_unix.cpp +++ b/src/corelib/io/qfilesystemengine_unix.cpp @@ -48,6 +48,9 @@ #include <QtCore/qoperatingsystemversion.h> #include <QtCore/private/qcore_unix_p.h> #include <QtCore/qvarlengtharray.h> +#ifndef QT_BOOTSTRAPPED +# include <QtCore/qstandardpaths.h> +#endif // QT_BOOTSTRAPPED #include <pwd.h> #include <stdlib.h> // for realpath() @@ -1213,6 +1216,7 @@ static QString freeDesktopTrashLocation(const QString &sourcePath) | QFileDevice::WriteOwner | QFileDevice::ExeOwner; QString targetDir = topDir.filePath(trashDir); + // deliberately not using mkpath, since we want to fail if topDir doesn't exist if (topDir.mkdir(trashDir)) QFile::setPermissions(targetDir, ownerPerms); if (QFileInfo(targetDir).isDir()) @@ -1228,11 +1232,11 @@ static QString freeDesktopTrashLocation(const QString &sourcePath) }; QString trash; - const QLatin1String dotTrash(".Trash"); const QStorageInfo sourceStorage(sourcePath); const QStorageInfo homeStorage(QDir::home()); // We support trashing of files outside the users home partition if (sourceStorage != homeStorage) { + const QLatin1String dotTrash(".Trash"); QDir topDir(sourceStorage.rootPath()); /* Method 1: @@ -1289,13 +1293,17 @@ static QString freeDesktopTrashLocation(const QString &sourcePath) file into the user's “home trash” or refuse to trash it." We trash the file into the user's home trash. + + "Its name and location are $XDG_DATA_HOME/Trash"; $XDG_DATA_HOME is what + QStandardPaths returns for GenericDataLocation. If that doesn't exist, then + we are not running on a freedesktop.org-compliant environment, and give up. */ if (trash.isEmpty()) { - QDir topDir = QDir::home(); - trash = makeTrashDir(topDir, dotTrash); + QDir topDir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); + trash = makeTrashDir(topDir, QLatin1String("Trash")); if (!QFileInfo(trash).isDir()) { - qWarning("Unable to establish trash directory %s in %s", - dotTrash.latin1(), topDir.path().toLocal8Bit().constData()); + qWarning("Unable to establish trash directory in %s", + topDir.path().toLocal8Bit().constData()); } } |