aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/environment.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/utils/environment.h')
-rw-r--r--src/libs/utils/environment.h127
1 files changed, 52 insertions, 75 deletions
diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h
index 2671e972cf..63fe697bd6 100644
--- a/src/libs/utils/environment.h
+++ b/src/libs/utils/environment.h
@@ -8,6 +8,7 @@
#include "environmentfwd.h"
#include "filepath.h"
#include "namevaluedictionary.h"
+#include "utiltypes.h"
#include <functional>
#include <optional>
@@ -21,28 +22,25 @@ namespace Utils {
class QTCREATOR_UTILS_EXPORT Environment final
{
public:
- Environment() : m_dict(HostOsInfo::hostOs()) {}
- explicit Environment(OsType osType) : m_dict(osType) {}
- explicit Environment(const QStringList &env, OsType osType = HostOsInfo::hostOs())
- : m_dict(env, osType) {}
- explicit Environment(const NameValuePairs &nameValues) : m_dict(nameValues) {}
- explicit Environment(const NameValueDictionary &dict) : m_dict(dict) {}
-
- QString value(const QString &key) const { return m_dict.value(key); }
- QString value_or(const QString &key, const QString &defaultValue) const
- {
- return m_dict.hasKey(key) ? m_dict.value(key) : defaultValue;
- }
- bool hasKey(const QString &key) const { return m_dict.hasKey(key); }
-
- void set(const QString &key, const QString &value, bool enabled = true) { m_dict.set(key, value, enabled); }
- void unset(const QString &key) { m_dict.unset(key); }
- void modify(const NameValueItems &items) { m_dict.modify(items); }
+ Environment();
+ explicit Environment(OsType osType);
+ explicit Environment(const QStringList &env, OsType osType = HostOsInfo::hostOs());
+ explicit Environment(const NameValuePairs &nameValues);
+ explicit Environment(const NameValueDictionary &dict);
+
+ QString value(const QString &key) const;
+ QString value_or(const QString &key, const QString &defaultValue) const;
+ bool hasKey(const QString &key) const;
+
+ void set(const QString &key, const QString &value, bool enabled = true);
+ void setFallback(const QString &key, const QString &value);
+ void unset(const QString &key);
+ void modify(const NameValueItems &items);
bool hasChanges() const;
- void clear() { return m_dict.clear(); }
- QStringList toStringList() const { return m_dict.toStringList(); }
+ OsType osType() const;
+ QStringList toStringList() const;
QProcessEnvironment toProcessEnvironment() const;
void appendOrSet(const QString &key, const QString &value, const QString &sep = QString());
@@ -54,18 +52,15 @@ public:
void prependOrSetLibrarySearchPath(const FilePath &value);
void prependOrSetLibrarySearchPaths(const FilePaths &values);
+ void prependToPath(const FilePaths &values);
+ void appendToPath(const FilePaths &values);
+
void setupEnglishOutput();
+ void setupSudoAskPass(const FilePath &askPass);
- using PathFilter = std::function<bool(const FilePath &)>;
FilePath searchInPath(const QString &executable,
const FilePaths &additionalDirs = FilePaths(),
- const PathFilter &func = PathFilter()) const;
- FilePath searchInDirectories(const QString &executable,
- const FilePaths &dirs,
- const PathFilter &func = {}) const;
- FilePaths findAllInPath(const QString &executable,
- const FilePaths &additionalDirs = {},
- const PathFilter &func = {}) const;
+ const FilePathPredicate &func = {}) const;
FilePaths path() const;
FilePaths pathListValue(const QString &varName) const;
@@ -75,80 +70,62 @@ public:
FilePath expandVariables(const FilePath &input) const;
QStringList expandVariables(const QStringList &input) const;
- OsType osType() const { return m_dict.osType(); }
- QString userName() const;
-
- using const_iterator = NameValueMap::const_iterator; // FIXME: avoid
- NameValueDictionary toDictionary() const { return m_dict; } // FIXME: avoid
+ NameValueDictionary toDictionary() const; // FIXME: avoid
NameValueItems diff(const Environment &other, bool checkAppendPrepend = false) const; // FIXME: avoid
- QString key(const_iterator it) const { return m_dict.key(it); } // FIXME: avoid
- QString value(const_iterator it) const { return m_dict.value(it); } // FIXME: avoid
- bool isEnabled(const_iterator it) const { return m_dict.isEnabled(it); } // FIXME: avoid
+ struct Entry { QString key; QString value; bool enabled; };
+ using FindResult = std::optional<Entry>;
+ FindResult find(const QString &name) const; // Note res->key may differ in case from name.
- void setCombineWithDeviceEnvironment(bool combine) { m_combineWithDeviceEnvironment = combine; }
- bool combineWithDeviceEnvironment() const { return m_combineWithDeviceEnvironment; }
+ void forEachEntry(const std::function<void (const QString &, const QString &, bool)> &callBack) const;
- const_iterator constBegin() const { return m_dict.constBegin(); } // FIXME: avoid
- const_iterator constEnd() const { return m_dict.constEnd(); } // FIXME: avoid
- const_iterator constFind(const QString &name) const { return m_dict.constFind(name); } // FIXME: avoid
-
- friend bool operator!=(const Environment &first, const Environment &second)
- {
- return first.m_dict != second.m_dict;
- }
-
- friend bool operator==(const Environment &first, const Environment &second)
- {
- return first.m_dict == second.m_dict;
- }
+ bool operator!=(const Environment &other) const;
+ bool operator==(const Environment &other) const;
static Environment systemEnvironment();
static void modifySystemEnvironment(const EnvironmentItems &list); // use with care!!!
static void setSystemEnvironment(const Environment &environment); // don't use at all!!!
-private:
- NameValueDictionary m_dict;
- bool m_combineWithDeviceEnvironment = true;
-};
-
-class QTCREATOR_UTILS_EXPORT EnvironmentChange final
-{
-public:
- EnvironmentChange() = default;
-
enum Type {
SetSystemEnvironment,
SetFixedDictionary,
SetValue,
+ SetFallbackValue,
UnsetValue,
- PrependToPath,
- AppendToPath,
+ PrependOrSet,
+ AppendOrSet,
+ Modify,
+ SetupEnglishOutput
};
using Item = std::variant<
- std::monostate, // SetSystemEnvironment dummy
- NameValueDictionary, // SetFixedDictionary
- QPair<QString, QString>, // SetValue
- QString, // UnsetValue
- FilePath, // PrependToPath
- FilePath // AppendToPath
+ std::monostate, // SetSystemEnvironment dummy
+ NameValueDictionary, // SetFixedDictionary
+ std::tuple<QString, QString, bool>, // SetValue (key, value, enabled)
+ std::tuple<QString, QString>, // SetFallbackValue (key, value)
+ QString, // UnsetValue (key)
+ std::tuple<QString, QString, QString>, // PrependOrSet (key, value, separator)
+ std::tuple<QString, QString, QString>, // AppendOrSet (key, value, separator)
+ NameValueItems, // Modify
+ std::monostate, // SetupEnglishOutput
+ FilePath // SetupSudoAskPass (file path of qtc-askpass or ssh-askpass)
>;
- static EnvironmentChange fromDictionary(const NameValueDictionary &dict);
+ void addItem(const Item &item);
- void applyToEnvironment(Environment &) const;
+ Environment appliedToEnvironment(const Environment &base) const;
- void addSetValue(const QString &key, const QString &value);
- void addUnsetValue(const QString &key);
- void addPrependToPath(const FilePaths &values);
- void addAppendToPath(const FilePaths &values);
+ const NameValueDictionary &resolved() const;
private:
- QList<Item> m_changeItems;
+ mutable QList<Item> m_changeItems;
+ mutable NameValueDictionary m_dict; // Latest resolved.
+ mutable bool m_fullDict = false;
};
+using EnviromentChange = Environment;
+
class QTCREATOR_UTILS_EXPORT EnvironmentProvider
{
public: