Skip to content

Commit

Permalink
Show file conflicts and prevent to commit.
Browse files Browse the repository at this point in the history
  • Loading branch information
francescmm committed Dec 14, 2019
1 parent c90cbee commit 32d1fa2
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 30 deletions.
35 changes: 25 additions & 10 deletions app/UnstagedFilesContextMenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,49 +7,62 @@
#include <QDir>
#include <QMessageBox>

UnstagedFilesContextMenu::UnstagedFilesContextMenu(QSharedPointer<Git> git, const QString &fileName, QWidget *parent)
UnstagedFilesContextMenu::UnstagedFilesContextMenu(QSharedPointer<Git> git, const QString &fileName, bool hasConflicts,
QWidget *parent)
: QMenu(parent)
, mGit(git)
, mFileName(fileName)
{
connect(addAction("See changes"), &QAction::triggered, this, [this]() { emit signalShowDiff(mFileName); });
connect(addAction("See changes"), &QAction::triggered, this, &UnstagedFilesContextMenu::signalShowDiff);

addSeparator();

connect(addAction("Revert file changes"), &QAction::triggered, this, [this, fileName]() {
if (hasConflicts)
{
connect(addAction("Mark as resolved"), &QAction::triggered, this, [this] {
const auto ret = mGit->markFileAsResolved(mFileName);

if (ret.success)
emit signalConflictsResolved();
});

addSeparator();
}

connect(addAction("Revert file changes"), &QAction::triggered, this, [this]() {
const auto msgBoxRet
= QMessageBox::question(this, tr("Ignoring file"), tr("Are you sure you want to revert the changes?"));

if (msgBoxRet == QMessageBox::Yes)
{
const auto ret = mGit->resetFile(fileName);
const auto ret = mGit->resetFile(mFileName);

emit signalCheckedOut(ret);
}
});

connect(addAction("Blame"), &QAction::triggered, this, [this]() { emit signalShowFileHistory(mFileName); });
connect(addAction("Blame"), &QAction::triggered, this, &UnstagedFilesContextMenu::signalShowFileHistory);

connect(addAction("Ignore file name"), &QAction::triggered, this, [this, fileName]() {
connect(addAction("Ignore file"), &QAction::triggered, this, [this]() {
const auto ret = QMessageBox::question(this, tr("Ignoring file"),
tr("Are you sure you want to add the file to the black list?"));

if (ret == QMessageBox::Yes)
{
const auto gitRet = addEntryToGitIgnore(fileName);
const auto gitRet = addEntryToGitIgnore(mFileName);

if (gitRet)
emit signalCheckedOut(gitRet);
}
});

connect(addAction("Ignore file extension"), &QAction::triggered, this, [this, fileName]() {
connect(addAction("Ignore extension"), &QAction::triggered, this, [this]() {
const auto msgBoxRet = QMessageBox::question(this, tr("Ignoring file"),
tr("Are you sure you want to add the file to the black list?"));

if (msgBoxRet == QMessageBox::Yes)
{
auto fileParts = fileName.split(".");
auto fileParts = mFileName.split(".");
fileParts.takeFirst();
const auto extension = QString("*.%1").arg(fileParts.join("."));
const auto ret = addEntryToGitIgnore(extension);
Expand All @@ -59,14 +72,16 @@ UnstagedFilesContextMenu::UnstagedFilesContextMenu(QSharedPointer<Git> git, cons
}
});

/*
QAction *removeAction = nullptr;
connect(removeAction = addAction("Remove file"), &QAction::triggered, this, []() {});
removeAction->setDisabled(true);
*/

addSeparator();

connect(addAction("Add all files to commit"), &QAction::triggered, this, &UnstagedFilesContextMenu::signalCommitAll);
connect(addAction("Revert all changes"), &QAction::triggered, this, [this, fileName]() {
connect(addAction("Revert all changes"), &QAction::triggered, this, [this]() {
const auto msgBoxRet = QMessageBox::question(this, tr("Ignoring file"),
tr("Are you sure you want to add the file to the black list?"));
if (msgBoxRet == QMessageBox::Yes)
Expand Down
8 changes: 5 additions & 3 deletions app/UnstagedFilesContextMenu.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,16 @@ class UnstagedFilesContextMenu : public QMenu
Q_OBJECT

signals:
void signalShowDiff(const QString &fileName);
void signalShowDiff();
void signalCommitAll();
void signalRevertAll();
void signalCheckedOut(bool success);
void signalShowFileHistory(const QString &fileName);
void signalShowFileHistory();
void signalConflictsResolved();

public:
explicit UnstagedFilesContextMenu(QSharedPointer<Git> git, const QString &fileName, QWidget *parent = nullptr);
explicit UnstagedFilesContextMenu(QSharedPointer<Git> git, const QString &fileName, bool hasConflicts,
QWidget *parent = nullptr);

private:
QSharedPointer<Git> mGit;
Expand Down
70 changes: 53 additions & 17 deletions app/WorkInProgressWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,12 @@ void WorkInProgressWidget::configure(const QString &sha)
{
const auto shaChange = mCurrentSha != sha;
mCurrentSha = sha;

resetInfo(shaChange);
}

void WorkInProgressWidget::resetInfo(bool force)
{
mIsAmend = mCurrentSha != ZERO_SHA;

QLog_Info("UI",
Expand Down Expand Up @@ -106,12 +112,12 @@ void WorkInProgressWidget::configure(const QString &sha)

const auto files = mGit->getWipFiles();

if (!shaChange || (mIsAmend && shaChange))
if (!force || (mIsAmend && force))
prepareCache();

insertFilesInList(files, ui->unstagedFilesList);

if (!shaChange || (mIsAmend && shaChange))
if (!force || (mIsAmend && force))
clearCache();

if (mIsAmend)
Expand All @@ -135,13 +141,13 @@ void WorkInProgressWidget::configure(const QString &sha)

msg = logMessage.second.trimmed();

if (mIsAmend || shaChange)
if (mIsAmend || force)
ui->leCommitTitle->setText(logMessage.first);
}
else
msg = lastMsgBeforeError;

if (mIsAmend || shaChange)
if (mIsAmend || force)
{
ui->teDescription->setPlainText(msg);
ui->teDescription->moveCursor(QTextCursor::Start);
Expand Down Expand Up @@ -309,15 +315,23 @@ void WorkInProgressWidget::showUnstagedMenu(const QPoint &pos)
if (item)
{
const auto fileName = item->toolTip();
const auto contextMenu = new UnstagedFilesContextMenu(mGit, fileName, this);
connect(contextMenu, &UnstagedFilesContextMenu::signalShowDiff, this, &WorkInProgressWidget::signalShowDiff);
const auto unsolvedConflicts = item->data(Qt::UserRole + 1).toBool();
const auto contextMenu = new UnstagedFilesContextMenu(mGit, fileName, unsolvedConflicts, this);
connect(contextMenu, &UnstagedFilesContextMenu::signalShowDiff, this,
[this, fileName]() { signalShowDiff(fileName); });
connect(contextMenu, &UnstagedFilesContextMenu::signalCommitAll, this,
&WorkInProgressWidget::addAllFilesToCommitList);
connect(contextMenu, &UnstagedFilesContextMenu::signalRevertAll, this, &WorkInProgressWidget::revertAllChanges);
connect(contextMenu, &UnstagedFilesContextMenu::signalCheckedOut, this,
&WorkInProgressWidget::signalCheckoutPerformed);
connect(contextMenu, &UnstagedFilesContextMenu::signalShowFileHistory, this,
&WorkInProgressWidget::signalShowFileHistory);
[this, fileName]() { emit signalShowFileHistory(fileName); });
connect(contextMenu, &UnstagedFilesContextMenu::signalConflictsResolved, this, [this, item] {
item->setData(Qt::UserRole + 1, false);
item->setText(item->text().remove("(conflicts)").trimmed());
item->setForeground(GitQlientStyles::getGreen());
resetInfo();
});

const auto parentPos = ui->unstagedFilesList->mapToParent(pos);
contextMenu->popup(mapToGlobal(parentPos));
Expand Down Expand Up @@ -414,26 +428,45 @@ void WorkInProgressWidget::updateCounter(const QString &text)
ui->lCounter->setText(QString::number(kMaxTitleChars - text.count()));
}

bool WorkInProgressWidget::hasConflicts()
{
const auto files = mCurrentFilesCache.values();

for (const auto &pair : files)
{
if (pair.second->data(Qt::UserRole + 1).toBool())
return true;
}

return false;
}

bool WorkInProgressWidget::commitChanges()
{
QString msg;
QStringList selFiles = getFiles();
auto done = false;

if (!selFiles.isEmpty() && checkMsg(msg))
if (!selFiles.isEmpty())
{
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
const auto ok = mGit->commitFiles(selFiles, msg, false);
QApplication::restoreOverrideCursor();
if (hasConflicts())
QMessageBox::warning(this, tr("Impossible to commit"),
tr("There are files with conflicts. Please, resolve the conflicts first."));
else if (checkMsg(msg))
{
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
const auto ok = mGit->commitFiles(selFiles, msg, false);
QApplication::restoreOverrideCursor();

lastMsgBeforeError = (ok ? "" : msg);
lastMsgBeforeError = (ok ? "" : msg);

emit signalChangesCommitted(ok);
emit signalChangesCommitted(ok);

done = true;
done = true;

ui->leCommitTitle->clear();
ui->teDescription->clear();
ui->leCommitTitle->clear();
ui->teDescription->clear();
}
}

return done;
Expand All @@ -448,7 +481,10 @@ bool WorkInProgressWidget::amendChanges()
{
QString msg;

if (checkMsg(msg))
if (hasConflicts())
QMessageBox::warning(this, tr("Impossible to commit"),
tr("There are files with conflicts. Please, resolve the conflicts first."));
else if (checkMsg(msg))
{
const auto author = QString("%1<%2>").arg(ui->leAuthorName->text(), ui->leAuthorEmail->text());

Expand Down
2 changes: 2 additions & 0 deletions app/WorkInProgressWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ class WorkInProgressWidget : public QWidget
QStringList getFiles();
bool checkMsg(QString &msg);
void updateCounter(const QString &text);
bool hasConflicts();
void resetInfo(bool force = true);

static QString lastMsgBeforeError;
static const int kMaxTitleChars;
Expand Down
10 changes: 10 additions & 0 deletions app/git.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,16 @@ GitExecResult Git::checkoutCommit(const QString &sha)
return run(QString("git checkout %1").arg(sha));
}

GitExecResult Git::markFileAsResolved(const QString &fileName)
{
const auto ret = run(QString("git add %1").arg(fileName));

if (ret.first)
updateWipRevision();

return ret;
}

GitExecResult Git::merge(const QString &into, QStringList sources)
{
const auto ret = run(QString("git checkout -q %1").arg(into));
Expand Down
1 change: 1 addition & 0 deletions app/git.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ class Git : public QObject
bool resetCommit(const QString &sha, CommitResetType type);
bool resetCommits(int parentDepth);
GitExecResult checkoutCommit(const QString &sha);
GitExecResult markFileAsResolved(const QString &fileName);
/* END COMMIT WORK */

/* START COMMIT INFO */
Expand Down

0 comments on commit 32d1fa2

Please sign in to comment.