Git: Suggest branch name based on the commit subject

... when the checked out commit is not a remote branch.

Fixes: QTCREATORBUG-24006
Change-Id: I175a3aedba88bd9e3b5cf298c5c161c56e9d0acd
Reviewed-by: André Hartmann <aha_1980@gmx.de>
This commit is contained in:
Orgad Shaneh
2020-08-02 00:37:53 +03:00
committed by Orgad Shaneh
parent 5299e58cea
commit 14e3a379c1
3 changed files with 33 additions and 12 deletions

View File

@@ -320,10 +320,11 @@ bool BranchView::add()
const QStringList localNames = m_model->localBranchNames();
BranchAddDialog branchAddDialog(localNames, BranchAddDialog::Type::AddBranch, this);
if (isTracked) {
const QString suggestedName = GitClient::suggestedLocalBranchName(localNames, trackedBranch);
branchAddDialog.setBranchName(suggestedName);
}
const QString suggestedName = GitClient::suggestedLocalBranchName(
m_repository, localNames, trackedBranch,
isTracked ? GitClient::BranchTargetType::Remote : GitClient::BranchTargetType::Commit);
branchAddDialog.setBranchName(suggestedName);
branchAddDialog.setTrackedBranchName(isTracked ? trackedBranch : QString(), !isLocal);
branchAddDialog.setCheckoutVisible(true);

View File

@@ -1348,7 +1348,14 @@ QStringList GitClient::setupCheckoutArguments(const QString &workingDirectory,
}
}
const QString suggestedName = suggestedLocalBranchName(localBranches, remoteBranch);
QString target = remoteBranch;
BranchTargetType targetType = BranchTargetType::Remote;
if (remoteBranch.isEmpty()) {
target = ref;
targetType = BranchTargetType::Commit;
}
const QString suggestedName = suggestedLocalBranchName(
workingDirectory, localBranches, target, targetType);
BranchAddDialog branchAddDialog(localBranches, BranchAddDialog::Type::AddBranch, ICore::dialogParent());
branchAddDialog.setBranchName(suggestedName);
branchAddDialog.setTrackedBranchName(remoteBranch, true);
@@ -3679,14 +3686,25 @@ GitRemote::GitRemote(const QString &location) : Core::IVersionControl::RepoUrl(l
isValid = QDir(path).exists() || QDir(path + ".git").exists();
}
QString GitClient::suggestedLocalBranchName(const QStringList localNames,
const QString trackedBranch)
QString GitClient::suggestedLocalBranchName(
const QString &workingDirectory,
const QStringList &localNames,
const QString &target,
BranchTargetType targetType)
{
const QString suggestedNameBase = trackedBranch.mid(trackedBranch.lastIndexOf('/') + 1);
QString suggestedName = suggestedNameBase;
QString initialName;
if (targetType == BranchTargetType::Remote) {
initialName = target.mid(target.lastIndexOf('/') + 1);
} else {
QString subject;
instance()->synchronousLog(workingDirectory, {"-n", "1", "--format=%s", target},
&subject, nullptr, VcsCommand::NoOutput);
initialName = subject.trimmed();
}
QString suggestedName = initialName;
int i = 2;
while (localNames.contains(suggestedName)) {
suggestedName = suggestedNameBase + QString::number(i);
suggestedName = initialName + QString::number(i);
++i;
}

View File

@@ -361,8 +361,10 @@ public:
VcsBase::VcsCommand *asyncUpstreamStatus(const QString &workingDirectory,
const QString &branch, const QString &upstream);
static QString suggestedLocalBranchName(const QStringList existingLocalNames,
const QString trackedBranch);
enum class BranchTargetType { Remote, Commit };
static QString suggestedLocalBranchName(
const QString &workingDirectory, const QStringList &existingLocalNames,
const QString &target, BranchTargetType targetType);
static void addChangeActions(QMenu *menu, const QString &workingDir, const QString &change);
private: