Utils: Replace Environment::find iterator use

Task-number: QTCREATORBUG-28357
Change-Id: I2723ffd6b7842f88009701eccea9aacac8cbf516
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2023-03-02 13:26:26 +01:00
parent 21de068c14
commit 3e5d14b020
4 changed files with 37 additions and 24 deletions

View File

@@ -362,12 +362,12 @@ static QStringList splitArgsUnix(const QString &args, bool abortOnMeta,
if (var == pwdName && pwd && !pwd->isEmpty()) { if (var == pwdName && pwd && !pwd->isEmpty()) {
cret += *pwd; cret += *pwd;
} else { } else {
Environment::const_iterator vit = env->constFind(var); const Environment::FindResult res = env->find(var);
if (vit == env->constEnd()) { if (!res) {
if (abortOnMeta) if (abortOnMeta)
goto metaerr; // Assume this is a shell builtin goto metaerr; // Assume this is a shell builtin
} else { } else {
cret += env->expandedValueForKey(env->key(vit)); cret += env->expandedValueForKey(res->key);
} }
} }
if (!braced) if (!braced)
@@ -412,12 +412,12 @@ static QStringList splitArgsUnix(const QString &args, bool abortOnMeta,
if (var == pwdName && pwd && !pwd->isEmpty()) { if (var == pwdName && pwd && !pwd->isEmpty()) {
val = *pwd; val = *pwd;
} else { } else {
Environment::const_iterator vit = env->constFind(var); const Environment::FindResult res = env->find(var);
if (vit == env->constEnd()) { if (!res) {
if (abortOnMeta) if (abortOnMeta)
goto metaerr; // Assume this is a shell builtin goto metaerr; // Assume this is a shell builtin
} else { } else {
val = env->expandedValueForKey(env->key(vit)); val = env->expandedValueForKey(res->key);
} }
} }
for (int i = 0; i < val.length(); i++) { for (int i = 0; i < val.length(); i++) {

View File

@@ -24,6 +24,14 @@ NameValueItems Environment::diff(const Environment &other, bool checkAppendPrepe
return m_dict.diff(other.m_dict, checkAppendPrepend); return m_dict.diff(other.m_dict, checkAppendPrepend);
} }
Environment::FindResult Environment::find(const QString &name) const
{
const auto it = m_dict.constFind(name);
if (it == m_dict.constEnd())
return {};
return Entry{it.key().name, it.value().first, it.value().second};
}
void Environment::forEachEntry(const std::function<void(const QString &, const QString &, bool)> &callBack) const void Environment::forEachEntry(const std::function<void(const QString &, const QString &, bool)> &callBack) const
{ {
for (auto it = m_dict.m_values.constBegin(); it != m_dict.m_values.constEnd(); ++it) for (auto it = m_dict.m_values.constBegin(); it != m_dict.m_values.constEnd(); ++it)
@@ -356,28 +364,30 @@ QString Environment::expandVariables(const QString &input) const
} }
} else if (state == BRACEDVARIABLE) { } else if (state == BRACEDVARIABLE) {
if (c == '}') { if (c == '}') {
const_iterator it = constFind(result.mid(vStart, i - 1 - vStart)); const QString key = result.mid(vStart, i - 1 - vStart);
if (it != constEnd()) { const Environment::FindResult res = find(key);
result.replace(vStart - 2, i - vStart + 2, it->first); if (res) {
i = vStart - 2 + it->first.length(); result.replace(vStart - 2, i - vStart + 2, res->value);
i = vStart - 2 + res->value.length();
} }
state = BASE; state = BASE;
} }
} else if (state == VARIABLE) { } else if (state == VARIABLE) {
if (!c.isLetterOrNumber() && c != '_') { if (!c.isLetterOrNumber() && c != '_') {
const_iterator it = constFind(result.mid(vStart, i - vStart - 1)); const QString key = result.mid(vStart, i - vStart - 1);
if (it != constEnd()) { const Environment::FindResult res = find(key);
result.replace(vStart - 1, i - vStart, it->first); if (res) {
i = vStart - 1 + it->first.length(); result.replace(vStart - 1, i - vStart, res->value);
i = vStart - 1 + res->value.length();
} }
state = BASE; state = BASE;
} }
} }
} }
if (state == VARIABLE) { if (state == VARIABLE) {
const_iterator it = constFind(result.mid(vStart)); const Environment::FindResult res = find(result.mid(vStart));
if (it != constEnd()) if (res)
result.replace(vStart - 1, result.length() - vStart + 1, it->first); result.replace(vStart - 1, result.length() - vStart + 1, res->value);
} }
} }
return result; return result;

View File

@@ -91,7 +91,10 @@ public:
const_iterator constBegin() const { return m_dict.constBegin(); } // FIXME: avoid const_iterator constBegin() const { return m_dict.constBegin(); } // FIXME: avoid
const_iterator constEnd() const { return m_dict.constEnd(); } // 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
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 forEachEntry(const std::function<void (const QString &, const QString &, bool)> &callBack) const; void forEachEntry(const std::function<void (const QString &, const QString &, bool)> &callBack) const;

View File

@@ -270,8 +270,9 @@ void tst_Environment::incrementalChanges()
newEnv.modify(changes); newEnv.modify(changes);
QVERIFY(!newEnv.hasKey("VAR1")); QVERIFY(!newEnv.hasKey("VAR1"));
QCOMPARE(newEnv.value("VAR2"), QString()); QCOMPARE(newEnv.value("VAR2"), QString());
QCOMPARE(newEnv.constFind("VAR2")->first, "VALUE2"); Environment::FindResult res = newEnv.find("VAR2");
QVERIFY(!newEnv.isEnabled(newEnv.constFind("VAR2"))); QCOMPARE(res->value, "VALUE2");
QVERIFY(!res->enabled);
const QChar sep = HostOsInfo::pathListSeparator(); const QChar sep = HostOsInfo::pathListSeparator();
QCOMPARE(newEnv.value("PATH"), QCOMPARE(newEnv.value("PATH"),
QString("/tmp").append(sep).append("/usr/bin").append(sep).append("/usr/local/bin")); QString("/tmp").append(sep).append("/usr/bin").append(sep).append("/usr/local/bin"));
@@ -317,13 +318,12 @@ void tst_Environment::find()
Environment env(QStringList({"Foo=bar", "Hi=HO"}), osType); Environment env(QStringList({"Foo=bar", "Hi=HO"}), osType);
auto end = env.constEnd(); Environment::FindResult res = env.find(variable);
auto it = env.constFind(variable);
QCOMPARE((end != it), contains); QCOMPARE(bool(res), contains);
if (contains) if (contains)
QCOMPARE(env.value(it), QString("bar")); QCOMPARE(res->value, QString("bar"));
} }