aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/settingsaccessor.cpp
diff options
context:
space:
mode:
authorTobias Hunger <tobias.hunger@qt.io>2018-01-18 11:46:41 +0100
committerTobias Hunger <tobias.hunger@qt.io>2018-02-06 13:43:35 +0000
commit79a43b4d86e0c21a0dfebf4a9baaa5ef03760d33 (patch)
tree974fb37f140d0690f202af4ce044ae18c200b1c2 /src/libs/utils/settingsaccessor.cpp
parent4f65d9a1fb09f9cca193db959412df01fea029d1 (diff)
SettingsAccessor: Unify handling of different file locations
Unify the code calculating the different file locations used by the SettingsAccessor. Change-Id: I85283f99618143ce1fbdd309bce12529cec442ca Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Diffstat (limited to 'src/libs/utils/settingsaccessor.cpp')
-rw-r--r--src/libs/utils/settingsaccessor.cpp79
1 files changed, 47 insertions, 32 deletions
diff --git a/src/libs/utils/settingsaccessor.cpp b/src/libs/utils/settingsaccessor.cpp
index e2e520e249..f867b22f29 100644
--- a/src/libs/utils/settingsaccessor.cpp
+++ b/src/libs/utils/settingsaccessor.cpp
@@ -40,15 +40,13 @@ const char SETTINGS_ID_KEY[] = "EnvironmentId";
const char USER_STICKY_KEYS_KEY[] = "UserStickyKeys";
const char VERSION_KEY[] = "Version";
-static QString generateSuffix(const QString &alt1, const QString &alt2)
+static QString generateSuffix(const QString &suffix)
{
- QString suffix = alt1;
- if (suffix.isEmpty())
- suffix = alt2;
- suffix.replace(QRegExp("[^a-zA-Z0-9_.-]"), QString('_')); // replace fishy characters:
- if (!suffix.startsWith('.'))
- suffix.prepend('.');
- return suffix;
+ QString result = suffix;
+ result.replace(QRegExp("[^a-zA-Z0-9_.-]"), QString('_')); // replace fishy characters:
+ if (!result.startsWith('.'))
+ result.prepend('.');
+ return result;
}
class Operation {
@@ -312,6 +310,8 @@ QVariantMap BasicSettingsAccessor::prepareToWriteSettings(const QVariantMap &dat
class SettingsAccessorPrivate
{
public:
+ SettingsAccessorPrivate(const FileName &projectFilePath) : m_projectFilePath(projectFilePath) { }
+
// The relevant data from the settings currently in use.
class Settings
{
@@ -338,10 +338,12 @@ public:
QByteArray m_settingsId;
std::unique_ptr<BasicSettingsAccessor> m_sharedFile;
+
+ const FileName m_projectFilePath;
};
// Return path to shared directory for .user files, create if necessary.
-static inline QString determineSharedUserFileDir()
+static inline Utils::optional<QString> defineExternalUserFileDir()
{
const char userFilePathVariable[] = "QTC_USER_FILE_PATH";
if (!qEnvironmentVariableIsSet(userFilePathVariable))
@@ -353,22 +355,16 @@ static inline QString determineSharedUserFileDir()
if (fi.exists()) {
qWarning() << userFilePathVariable << '=' << QDir::toNativeSeparators(path)
<< " points to an existing file";
- return QString();
+ return nullopt;
}
QDir dir;
if (!dir.mkpath(path)) {
qWarning() << "Cannot create: " << QDir::toNativeSeparators(path);
- return QString();
+ return nullopt;
}
return path;
}
-static QString sharedUserFileDir()
-{
- static const QString sharedDir = determineSharedUserFileDir();
- return sharedDir;
-}
-
// Return a suitable relative path to be created under the shared .user directory.
static QString makeRelative(QString path)
{
@@ -397,18 +393,18 @@ static QString makeRelative(QString path)
}
// Return complete file path of the .user file.
-static FileName userFilePath(const Utils::FileName &projectFilePath, const QString &suffix)
+static FileName externalUserFilePath(const Utils::FileName &projectFilePath, const QString &suffix)
{
FileName result;
- if (sharedUserFileDir().isEmpty()) {
- result = projectFilePath;
- } else {
+ static const optional<QString> externalUserFileDir = defineExternalUserFileDir();
+
+ if (!externalUserFileDir) {
// Recreate the relative project file hierarchy under the shared directory.
// PersistentSettingsWriter::write() takes care of creating the path.
- result = FileName::fromString(sharedUserFileDir());
+ result = FileName::fromString(externalUserFileDir.value());
result.appendString('/' + makeRelative(projectFilePath.toString()));
+ result.appendString(suffix);
}
- result.appendString(suffix);
return result;
}
@@ -465,15 +461,14 @@ QVariantMap VersionUpgrader::renameKeys(const QList<Change> &changes, QVariantMa
SettingsAccessor::SettingsAccessor(const Utils::FileName &baseFile, const QString &docType,
const QString &displayName, const QString &appDisplayName) :
BasicSettingsAccessor(docType, displayName, appDisplayName),
- d(new SettingsAccessorPrivate)
+ d(new SettingsAccessorPrivate(baseFile))
{
- Utils::FileName baseFilePath = userFilePath(baseFile, generateSuffix(QString::fromLocal8Bit(qgetenv("QTC_EXTENSION")), ".user"));
- setBaseFilePath(baseFilePath);
+ const FileName externalUser = externalUserFile();
+ const FileName projectUser = projectUserFile();
+ setBaseFilePath(externalUser.isEmpty() ? projectUser : externalUser);
- Utils::FileName sharedFilePath = baseFile;
- sharedFilePath.appendString(generateSuffix(QString::fromLocal8Bit(qgetenv("QTC_SHARED_EXTENSION")), ".shared"));
d->m_sharedFile = std::make_unique<BasicSettingsAccessor>(docType, displayName, appDisplayName);
- d->m_sharedFile->setBaseFilePath(sharedFilePath);
+ d->m_sharedFile->setBaseFilePath(sharedFile());
}
SettingsAccessor::~SettingsAccessor()
@@ -679,6 +674,25 @@ bool SettingsAccessor::addVersionUpgrader(std::unique_ptr<VersionUpgrader> upgra
return true;
}
+FileName SettingsAccessor::projectUserFile() const
+{
+ FileName projectUserFile = d->m_projectFilePath;
+ projectUserFile.appendString(generateSuffix(qEnvironmentVariable("QTC_EXTENSION", ".user")));
+ return projectUserFile;
+}
+
+FileName SettingsAccessor::externalUserFile() const
+{
+ return externalUserFilePath(d->m_projectFilePath, generateSuffix(qEnvironmentVariable("QTC_EXTENSION", ".user")));
+}
+
+FileName SettingsAccessor::sharedFile() const
+{
+ FileName sharedFile = d->m_projectFilePath;
+ sharedFile.appendString(generateSuffix(qEnvironmentVariable("QTC_SHARED_EXTENSION", ".shared")));
+ return sharedFile;
+}
+
BasicSettingsAccessor::RestoreData SettingsAccessor::readData(const FileName &path,
QWidget *parent) const
{
@@ -725,9 +739,10 @@ FileNameList SettingsAccessor::settingsFiles() const
const QFileInfo pfi = baseFilePath().toFileInfo();
const QStringList filter(pfi.fileName() + '*');
- if (!sharedUserFileDir().isEmpty()) {
- const QString sharedPath = sharedUserFileDir() + '/' + makeRelative(pfi.absolutePath());
- list.append(QDir(sharedPath).entryInfoList(filter, QDir::Files | QDir::Hidden | QDir::System));
+ const FileName externalUser = externalUserFile();
+ if (!externalUser.isEmpty()) {
+ const QString externalPath = externalUser.toString() + '/' + makeRelative(pfi.absolutePath());
+ list.append(QDir(externalPath).entryInfoList(filter, QDir::Files | QDir::Hidden | QDir::System));
}
list.append(QDir(pfi.dir()).entryInfoList(filter, QDir::Files | QDir::Hidden | QDir::System));