diff options
author | Petar Perisin <petar.perisin@gmail.com> | 2013-06-10 23:30:03 +0200 |
---|---|---|
committer | Petar Perisin <petar.perisin@gmail.com> | 2013-06-17 22:22:31 +0200 |
commit | 159a7d61dd650524701950f9bccb3c2cfe0581fd (patch) | |
tree | b7e0fb7d97244caf3f0d5810d9f8032bda04fb1a /src/plugins/git | |
parent | dce41176d8bcdf0c06179953da150deb12e25be8 (diff) | |
download | qt-creator-159a7d61dd650524701950f9bccb3c2cfe0581fd.tar.gz |
Git - stash scope guard in submoduleUpdate
Change-Id: I888d4013e88fdc6977f29ef3e27d243e55a1f1a7
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Diffstat (limited to 'src/plugins/git')
-rw-r--r-- | src/plugins/git/gitclient.cpp | 90 | ||||
-rw-r--r-- | src/plugins/git/gitclient.h | 7 | ||||
-rw-r--r-- | src/plugins/git/gitplugin.cpp | 2 |
3 files changed, 83 insertions, 16 deletions
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 79db65edc8..3998427e46 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1237,7 +1237,7 @@ bool GitClient::synchronousCheckout(const QString &workingDirectory, outputWindow()->appendError(msg); return false; } - promptSubmoduleUpdate(workingDirectory); + updateSubmodulesIfNeeded(workingDirectory, true); return true; } @@ -1951,6 +1951,30 @@ QMap<QString,QString> GitClient::synchronousRemotesList(const QString &workingDi return result; } +QStringList GitClient::synchronousSubmoduleStatus(const QString &workingDirectory, + QString *errorMessage) +{ + QByteArray outputTextData; + QByteArray errorText; + QStringList arguments; + + // get submodule status + arguments << QLatin1String("submodule") << QLatin1String("status"); + if (!fullySynchronousGit(workingDirectory, arguments, &outputTextData, &errorText)) { + QString error = tr("Cannot retrieve submodule status of \"%1\": %2") + .arg(QDir::toNativeSeparators(workingDirectory), + commandOutputFromLocal8Bit(errorText)); + + if (errorMessage) + *errorMessage = error; + else + outputWindow()->append(error); + + return QStringList(); + } + return commandOutputLinesFromLocal8Bit(outputTextData); +} + SubmoduleDataMap GitClient::submoduleList(const QString &workingDirectory) { SubmoduleDataMap result; @@ -2201,23 +2225,63 @@ bool GitClient::fullySynchronousGit(const QString &workingDirectory, flags); } -void GitClient::submoduleUpdate(const QString &workingDirectory) +void GitClient::updateSubmodulesIfNeeded(const QString &workingDirectory, bool prompt) { + if (!m_updatedSubmodules.isEmpty() || submoduleList(workingDirectory).isEmpty()) + return; + + QStringList submoduleStatus = synchronousSubmoduleStatus(workingDirectory); + if (submoduleStatus.isEmpty()) + return; + + bool updateNeeded = false; + foreach (const QString &status, submoduleStatus) { + if (status.startsWith(QLatin1Char('+'))) { + updateNeeded = true; + break; + } + } + if (!updateNeeded) + return; + + if (prompt && QMessageBox::question(Core::ICore::mainWindow(), tr("Submodules Found"), + tr("Would you like to update submodules?"), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { + return; + } + + foreach (const QString &statusLine, submoduleStatus) { + // stash only for lines starting with + + // because only they would be updated + if (!statusLine.startsWith(QLatin1Char('+'))) + continue; + + // get submodule name + const int nameStart = statusLine.indexOf(QLatin1Char(' '), 2) + 1; + const int nameLength = statusLine.indexOf(QLatin1Char(' '), nameStart) - nameStart; + const QString submoduleDir = workingDirectory + QLatin1Char('/') + + statusLine.mid(nameStart, nameLength); + + if (beginStashScope(submoduleDir, QLatin1String("SubmoduleUpdate"))) { + m_updatedSubmodules.append(submoduleDir); + } else { + finishSubmoduleUpdate(); + return; + } + } + QStringList arguments; arguments << QLatin1String("submodule") << QLatin1String("update"); - executeGit(workingDirectory, arguments, 0, true, true); + + VcsBase::Command *cmd = executeGit(workingDirectory, arguments, 0, true, true); + connect(cmd, SIGNAL(finished(bool,int,QVariant)), this, SLOT(finishSubmoduleUpdate())); } -void GitClient::promptSubmoduleUpdate(const QString &workingDirectory) +void GitClient::finishSubmoduleUpdate() { - if (submoduleList(workingDirectory).isEmpty()) - return; - - if (QMessageBox::question(Core::ICore::mainWindow(), tr("Submodules Found"), - tr("Would you like to update submodules?"), - QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { - submoduleUpdate(workingDirectory); - } + foreach (const QString &submoduleDir, m_updatedSubmodules) + endStashScope(submoduleDir); + m_updatedSubmodules.clear(); } // Trim a git status file spec: "modified: foo .cpp" -> "modified: foo .cpp" @@ -2852,7 +2916,7 @@ bool GitClient::synchronousPull(const QString &workingDirectory, bool rebase) bool ok = executeAndHandleConflicts(workingDirectory, arguments, abortCommand); if (ok) - promptSubmoduleUpdate(workingDirectory); + updateSubmodulesIfNeeded(workingDirectory, true); return ok; } diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index cf0ead6c0d..73875499e7 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -179,8 +179,7 @@ public: bool synchronousCheckout(const QString &workingDirectory, const QString &ref, QString *errorMessage); bool synchronousCheckout(const QString &workingDirectory, const QString &ref) { return synchronousCheckout(workingDirectory, ref, 0); } - void submoduleUpdate(const QString &workingDirectory); - void promptSubmoduleUpdate(const QString &workingDirectory); + void updateSubmodulesIfNeeded(const QString &workingDirectory, bool prompt); // Do a stash and return identier. enum { StashPromptDescription = 0x1, StashImmediateRestore = 0x2, StashIgnoreUnchanged = 0x4 }; @@ -208,6 +207,8 @@ public: QMap<QString,QString> synchronousRemotesList(const QString &workingDirectory, QString *errorMessage = 0); + QStringList synchronousSubmoduleStatus(const QString &workingDirectory, + QString *errorMessage = 0); SubmoduleDataMap submoduleList(const QString &workingDirectory); bool synchronousShow(const QString &workingDirectory, const QString &id, QString *output, QString *errorMessage); @@ -324,6 +325,7 @@ private slots: void slotBlameRevisionRequested(const QString &source, QString change, int lineNumber); void appendOutputData(const QByteArray &data) const; void appendOutputDataSilently(const QByteArray &data) const; + void finishSubmoduleUpdate(); private: QTextCodec *getSourceCodec(const QString &file) const; @@ -392,6 +394,7 @@ private: GitSettings *m_settings; QString m_gitQtcEditor; QMap<QString, StashInfo> m_stashInfo; + QStringList m_updatedSubmodules; bool m_disableEditor; }; diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 80232b36b6..b7d4976978 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -1237,7 +1237,7 @@ void GitPlugin::updateSubmodules() { const VcsBase::VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); - m_gitClient->submoduleUpdate(state.topLevel()); + m_gitClient->updateSubmodulesIfNeeded(state.topLevel(), false); } // If the file is modified in an editor, make sure it is saved. |