diff options
author | Eike Ziller <eike.ziller@digia.com> | 2013-05-30 13:48:27 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@digia.com> | 2013-05-30 13:48:27 +0200 |
commit | 0a95b28147d9c4ea57ba9b025beec2d503399acf (patch) | |
tree | 9032878c4c1b3877167990376d3871db70eb304c /src/plugins/git/gitclient.cpp | |
parent | cca4cbfb02da327c844c1291d43a8f7f6420e334 (diff) | |
parent | 10d7d61e263573116965b1af53cdbda0f668211d (diff) | |
download | qt-creator-0a95b28147d9c4ea57ba9b025beec2d503399acf.tar.gz |
Merge remote-tracking branch 'origin/2.8'
Diffstat (limited to 'src/plugins/git/gitclient.cpp')
-rw-r--r-- | src/plugins/git/gitclient.cpp | 60 |
1 files changed, 49 insertions, 11 deletions
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 15befd0406..ed2172c605 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1962,21 +1962,59 @@ QMap<QString,QString> GitClient::synchronousRemotesList(const QString &workingDi return result; } -// function returns submodules in format path=url -QMap<QString,QString> GitClient::synchronousSubmoduleList(const QString &workingDirectory) +SubmoduleDataMap GitClient::submoduleList(const QString &workingDirectory) { - QMap<QString,QString> result; - if (!QFile::exists(workingDirectory + QLatin1String("/.gitmodules"))) + SubmoduleDataMap result; + QString gitmodulesFileName = workingDirectory + QLatin1String("/.gitmodules"); + if (!QFile::exists(gitmodulesFileName)) return result; - QSettings gitmodulesFile(workingDirectory + QLatin1String("/.gitmodules"), QSettings::IniFormat); + static QMap<QString, SubmoduleDataMap> cachedSubmoduleData; + + if (cachedSubmoduleData.contains(workingDirectory)) + return cachedSubmoduleData.value(workingDirectory); + QStringList args(QLatin1String("-l")); + + QStringList allConfigs = readConfig(workingDirectory, args).split(QLatin1Char('\n')); + const QString submoduleLineStart = QLatin1String("submodule."); + foreach (const QString &configLine, allConfigs) { + if (!configLine.startsWith(submoduleLineStart)) + continue; + + int nameStart = submoduleLineStart.size(); + int nameEnd = configLine.indexOf(QLatin1Char('.'), nameStart); + + QString submoduleName = configLine.mid(nameStart, nameEnd - nameStart); + + SubmoduleData submoduleData; + if (result.contains(submoduleName)) + submoduleData = result[submoduleName]; - foreach (const QString &submoduleGroup, gitmodulesFile.childGroups()) { - gitmodulesFile.beginGroup(submoduleGroup); - result.insertMulti(gitmodulesFile.value(QLatin1String("path")).toString(), - gitmodulesFile.value(QLatin1String("url")).toString()); - gitmodulesFile.endGroup(); + if (configLine.mid(nameEnd, 5) == QLatin1String(".url=")) + submoduleData.url = configLine.mid(nameEnd + 5); + else if (configLine.mid(nameEnd, 8) == QLatin1String(".ignore=")) + submoduleData.ignore = configLine.mid(nameEnd + 8); + else + continue; + + result.insert(submoduleName, submoduleData); + } + + // if config found submodules + if (!result.isEmpty()) { + QSettings gitmodulesFile(gitmodulesFileName, QSettings::IniFormat); + + foreach (const QString &submoduleName, result.keys()) { + gitmodulesFile.beginGroup(QLatin1String("submodule \"") + + submoduleName + QLatin1Char('"')); + result[submoduleName].dir = gitmodulesFile.value(QLatin1String("path")).toString(); + QString ignore = gitmodulesFile.value(QLatin1String("ignore")).toString(); + if (!ignore.isEmpty() && result[submoduleName].ignore.isEmpty()) + result[submoduleName].ignore = ignore; + gitmodulesFile.endGroup(); + } } + cachedSubmoduleData.insert(workingDirectory, result); return result; } @@ -2172,7 +2210,7 @@ void GitClient::submoduleUpdate(const QString &workingDirectory) void GitClient::promptSubmoduleUpdate(const QString &workingDirectory) { - if (!QFile::exists(workingDirectory + QLatin1String("/.gitmodules"))) + if (submoduleList(workingDirectory).isEmpty()) return; if (QMessageBox::question(Core::ICore::mainWindow(), tr("Submodules Found"), |