forked from qt-creator/qt-creator
Git - added submoduleDataMap to handle submodule data
Change-Id: I8462ed07f3d1edce5c7f5ab8c166ce8c68b6d4b3 Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
@@ -511,21 +511,19 @@ void GerritPlugin::fetch(const QSharedPointer<Gerrit::Internal::GerritChange> &c
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!verifiedRepository && QFile::exists(repository + QLatin1String("/.gitmodules"))) {
|
if (!verifiedRepository) {
|
||||||
QMap<QString,QString> submodules = gitClient->synchronousSubmoduleList(repository);
|
Git::Internal::SubmoduleDataMap submodules = gitClient->submoduleList(repository);
|
||||||
|
foreach (const Git::Internal::SubmoduleData &submoduleData, submodules) {
|
||||||
QMap<QString,QString>::const_iterator i = submodules.constBegin();
|
QString remote = submoduleData.url;
|
||||||
while (i != submodules.constEnd()) {
|
|
||||||
QString remote = i.value();
|
|
||||||
if (remote.endsWith(QLatin1String(".git")))
|
if (remote.endsWith(QLatin1String(".git")))
|
||||||
remote.chop(4);
|
remote.chop(4);
|
||||||
if (remote.contains(m_parameters->host) && remote.endsWith(change->project)
|
if (remote.contains(m_parameters->host) && remote.endsWith(change->project)
|
||||||
&& QFile::exists(repository + QLatin1Char('/') + i.key())) {
|
&& QFile::exists(repository + QLatin1Char('/') + submoduleData.dir)) {
|
||||||
repository = QDir::cleanPath(repository + QLatin1Char('/') + i.key());
|
repository = QDir::cleanPath(repository + QLatin1Char('/')
|
||||||
|
+ submoduleData.dir);
|
||||||
verifiedRepository = true;
|
verifiedRepository = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
++i;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1962,22 +1962,60 @@ QMap<QString,QString> GitClient::synchronousRemotesList(const QString &workingDi
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// function returns submodules in format path=url
|
SubmoduleDataMap GitClient::submoduleList(const QString &workingDirectory)
|
||||||
QMap<QString,QString> GitClient::synchronousSubmoduleList(const QString &workingDirectory)
|
|
||||||
{
|
{
|
||||||
QMap<QString,QString> result;
|
SubmoduleDataMap result;
|
||||||
if (!QFile::exists(workingDirectory + QLatin1String("/.gitmodules")))
|
QString gitmodulesFileName = workingDirectory + QLatin1String("/.gitmodules");
|
||||||
|
if (!QFile::exists(gitmodulesFileName))
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
QSettings gitmodulesFile(workingDirectory + QLatin1String("/.gitmodules"), QSettings::IniFormat);
|
static QMap<QString, SubmoduleDataMap> cachedSubmoduleData;
|
||||||
|
|
||||||
foreach (const QString &submoduleGroup, gitmodulesFile.childGroups()) {
|
if (cachedSubmoduleData.contains(workingDirectory))
|
||||||
gitmodulesFile.beginGroup(submoduleGroup);
|
return cachedSubmoduleData.value(workingDirectory);
|
||||||
result.insertMulti(gitmodulesFile.value(QLatin1String("path")).toString(),
|
QStringList args(QLatin1String("-l"));
|
||||||
gitmodulesFile.value(QLatin1String("url")).toString());
|
|
||||||
gitmodulesFile.endGroup();
|
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];
|
||||||
|
|
||||||
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2172,7 +2210,7 @@ void GitClient::submoduleUpdate(const QString &workingDirectory)
|
|||||||
|
|
||||||
void GitClient::promptSubmoduleUpdate(const QString &workingDirectory)
|
void GitClient::promptSubmoduleUpdate(const QString &workingDirectory)
|
||||||
{
|
{
|
||||||
if (!QFile::exists(workingDirectory + QLatin1String("/.gitmodules")))
|
if (submoduleList(workingDirectory).isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (QMessageBox::question(Core::ICore::mainWindow(), tr("Submodules Found"),
|
if (QMessageBox::question(Core::ICore::mainWindow(), tr("Submodules Found"),
|
||||||
|
|||||||
@@ -86,6 +86,16 @@ enum StashFlag {
|
|||||||
NoPrompt = 0x02
|
NoPrompt = 0x02
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SubmoduleData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QString dir;
|
||||||
|
QString url;
|
||||||
|
QString ignore;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef QMap<QString, SubmoduleData> SubmoduleDataMap;
|
||||||
|
|
||||||
class GitClient : public QObject
|
class GitClient : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -200,7 +210,7 @@ public:
|
|||||||
|
|
||||||
QMap<QString,QString> synchronousRemotesList(const QString &workingDirectory,
|
QMap<QString,QString> synchronousRemotesList(const QString &workingDirectory,
|
||||||
QString *errorMessage = 0);
|
QString *errorMessage = 0);
|
||||||
QMap<QString,QString> synchronousSubmoduleList(const QString &workingDirectory);
|
SubmoduleDataMap submoduleList(const QString &workingDirectory);
|
||||||
bool synchronousShow(const QString &workingDirectory, const QString &id,
|
bool synchronousShow(const QString &workingDirectory, const QString &id,
|
||||||
QString *output, QString *errorMessage);
|
QString *output, QString *errorMessage);
|
||||||
|
|
||||||
|
|||||||
@@ -1323,8 +1323,9 @@ void GitPlugin::updateActions(VcsBase::VcsBasePlugin::ActionState as)
|
|||||||
|
|
||||||
foreach (QAction *repositoryAction, m_repositoryActions)
|
foreach (QAction *repositoryAction, m_repositoryActions)
|
||||||
repositoryAction->setEnabled(repositoryEnabled);
|
repositoryAction->setEnabled(repositoryEnabled);
|
||||||
|
|
||||||
m_submoduleUpdateAction->setVisible(repositoryEnabled
|
m_submoduleUpdateAction->setVisible(repositoryEnabled
|
||||||
&& QFile::exists(currentState().topLevel() + QLatin1String("/.gitmodules")));
|
&& !m_gitClient->submoduleList(currentState().topLevel()).isEmpty());
|
||||||
|
|
||||||
updateContinueAndAbortCommands();
|
updateContinueAndAbortCommands();
|
||||||
updateRepositoryBrowserAction();
|
updateRepositoryBrowserAction();
|
||||||
|
|||||||
Reference in New Issue
Block a user