summaryrefslogtreecommitdiff
path: root/src/plugins/git/gitclient.cpp
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@digia.com>2013-05-30 13:48:27 +0200
committerEike Ziller <eike.ziller@digia.com>2013-05-30 13:48:27 +0200
commit0a95b28147d9c4ea57ba9b025beec2d503399acf (patch)
tree9032878c4c1b3877167990376d3871db70eb304c /src/plugins/git/gitclient.cpp
parentcca4cbfb02da327c844c1291d43a8f7f6420e334 (diff)
parent10d7d61e263573116965b1af53cdbda0f668211d (diff)
downloadqt-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.cpp60
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"),