forked from qt-creator/qt-creator
Git: Offer creating remote branch if push fails due to the lack of it
If git push fails because the remote branch does not exists a dialog will be shown which will allow the creation of the remote branch without leaving the IDE (by executing the git push --set-upstream .. command suggested by the git itself). Fixes: QTCREATORBUG-21154 Change-Id: Id785fdc64e27865fba2255eafd2043367a5835ea Reviewed-by: André Hartmann <aha_1980@gmx.de>
This commit is contained in:
@@ -3127,13 +3127,33 @@ void GitClient::push(const QString &workingDirectory, const QStringList &pushArg
|
||||
VcsCommand *command = vcsExec(
|
||||
workingDirectory, QStringList({"push"}) + pushArgs, nullptr, true,
|
||||
VcsCommand::ShowSuccessMessage);
|
||||
connect(command, &VcsCommand::stdErrText, this, [command](const QString &text) {
|
||||
connect(command, &VcsCommand::stdErrText, this, [this, command](const QString &text) {
|
||||
if (text.contains("non-fast-forward"))
|
||||
command->setCookie(true);
|
||||
command->setCookie(NonFastForward);
|
||||
else if (text.contains("has no upstream branch"))
|
||||
command->setCookie(NoRemoteBranch);
|
||||
|
||||
if (command->cookie().toInt() == NoRemoteBranch) {
|
||||
const QStringList lines = text.split('\n', QString::SkipEmptyParts);
|
||||
for (const QString &line : lines) {
|
||||
/* Extract the suggested command from the git output which
|
||||
* should be similar to the following:
|
||||
*
|
||||
* git push --set-upstream origin add_set_upstream_dialog
|
||||
*/
|
||||
const QString trimmedLine = line.trimmed();
|
||||
if (trimmedLine.startsWith("git push")) {
|
||||
m_pushFallbackCommand = trimmedLine;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
connect(command, &VcsCommand::finished,
|
||||
this, [this, command, workingDirectory, pushArgs](bool success) {
|
||||
if (!success && command->cookie().toBool()) {
|
||||
if (!success) {
|
||||
switch (static_cast<PushFailure>(command->cookie().toInt())) {
|
||||
case NonFastForward: {
|
||||
const QColor warnColor = Utils::creatorTheme()->color(Theme::TextColorError);
|
||||
if (QMessageBox::question(
|
||||
Core::ICore::dialogParent(), tr("Force Push"),
|
||||
@@ -3145,6 +3165,32 @@ void GitClient::push(const QString &workingDirectory, const QStringList &pushArg
|
||||
vcsExec(workingDirectory, QStringList({"push", "--force-with-lease"}) + pushArgs,
|
||||
nullptr, true, VcsCommand::ShowSuccessMessage);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NoRemoteBranch:
|
||||
if (QMessageBox::question(
|
||||
Core::ICore::dialogParent(), tr("No Upstream Branch"),
|
||||
tr("Push failed because the local branch \"%1\" "
|
||||
"does not have an upstream branch on the remote.\n\n"
|
||||
"Would you like to create the branch \"%1\" on the "
|
||||
"remote and set it as upstream?")
|
||||
.arg(synchronousCurrentLocalBranch(workingDirectory)),
|
||||
QMessageBox::Yes | QMessageBox::No,
|
||||
QMessageBox::No) == QMessageBox::Yes) {
|
||||
|
||||
const QStringList fallbackCommandParts =
|
||||
m_pushFallbackCommand.split(' ', QString::SkipEmptyParts);
|
||||
VcsCommand *rePushCommand = vcsExec(workingDirectory,
|
||||
fallbackCommandParts.mid(1),
|
||||
nullptr, true, VcsCommand::ShowSuccessMessage);
|
||||
connect(rePushCommand, &VcsCommand::success,
|
||||
this, [workingDirectory]() {
|
||||
GitPlugin::instance()->updateBranches(workingDirectory);
|
||||
}
|
||||
);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -78,6 +78,11 @@ enum StashFlag {
|
||||
NoPrompt = 0x02
|
||||
};
|
||||
|
||||
enum PushFailure {
|
||||
NonFastForward,
|
||||
NoRemoteBranch
|
||||
};
|
||||
|
||||
class SubmoduleData
|
||||
{
|
||||
public:
|
||||
@@ -381,6 +386,7 @@ private:
|
||||
|
||||
QString m_gitQtcEditor;
|
||||
QMap<QString, StashInfo> m_stashInfo;
|
||||
QString m_pushFallbackCommand;
|
||||
QStringList m_updatedSubmodules;
|
||||
bool m_disableEditor;
|
||||
QFutureSynchronizer<void> m_synchronizer; // for commit updates
|
||||
|
||||
Reference in New Issue
Block a user