Commit 7abacf73 authored by Sergey Vidyuk's avatar Sergey Vidyuk Committed by Milian Wolff
Browse files

Git commit message format validation

 * Added ability to customize commit message editor settings from a VCS
plugin.
 * Added commit message highlighter and format checker for the git
plugin. It follows formatting guidelines from the same article
http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
which was used to create vim highlighter for a git commit messages.

REVIEW: 102857
parent 9bc0eb6f
......@@ -9,7 +9,7 @@ add_subdirectory(icons)
set(kdevgit_PART_SRCS
stashmanagerdialog.cpp
gitmessagehighlighter.cpp
gitclonejob.cpp
gitplugin.cpp
gitjob.cpp
......
/***************************************************************************
* Copyright 2011 Sergey Vidyuk <sir.vestnik@gmail.com> *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License or (at your option) version 3 or any later version *
* accepted by the membership of KDE e.V. (or its successor approved *
* by the membership of KDE e.V.), which shall act as a proxy *
* defined in Section 14 of version 3 of the license. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
#include "gitmessagehighlighter.h"
#include <QtCore/QString>
#include <QtGui/QTextCharFormat>
#include <QtGui/QTextEdit>
#include <KDE/KLocalizedString>
/// Recomended summary limit from http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
static const int summarySoftLimit = 50;
/// Summary length limit causing warning messages from 'git push'
static const int summaryHardLimit = 65;
/// Recommended line kength from http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
static const int lineLenLimit = 72;
static inline
void applyErrorFormat(QTextCharFormat* format, bool warning, const QString& tooltip)
{
format->setFontUnderline(true);
format->setUnderlineStyle(QTextCharFormat::SpellCheckUnderline);
format->setUnderlineColor(warning ? Qt::yellow : Qt::red);
format->setToolTip(tooltip);
}
GitMessageHighlighter::GitMessageHighlighter(QTextEdit* parent): QSyntaxHighlighter(parent)
{
}
GitMessageHighlighter::~GitMessageHighlighter()
{
}
void GitMessageHighlighter::highlightBlock(const QString& text)
{
int blockState = previousBlockState();
if (blockState < DetailedMessage)
++blockState;
const int textLength = text.length();
int startPos = 0;
int endPos = 0;
while (startPos < textLength)
{
// Switch block state for multiline blocks
if (startPos != 0 && blockState < DetailedMessage)
++blockState;
endPos = text.indexOf('\n', startPos);
if (endPos < 0)
endPos = textLength;
QTextCharFormat format;
const int lineLength = endPos - startPos;
switch (blockState)
{
case Summary:
format.setFontWeight(QFont::Bold);
if (lineLength > summarySoftLimit)
{
applyErrorFormat(
&format,
lineLength <= summaryHardLimit,
i18n("Try to keep summary length bellow %1 characters.").arg(summarySoftLimit)
);
}
break;
case SummarySeparator:
if (lineLength != 0)
{
applyErrorFormat(
&format,
false,
i18n("Separate summary from details with one empty line.")
);
}
break;
default:
if (lineLength > lineLenLimit)
{
applyErrorFormat(
&format,
false,
i18n("Try to keep line length bellow %1 characters.").arg(lineLenLimit)
);
}
break;
}
setFormat(startPos, endPos, format);
startPos = endPos;
}
setCurrentBlockState(blockState);
}
#include "gitmessagehighlighter.moc"
/***************************************************************************
* Copyright 2011 Sergey Vidyuk <sir.vestnik@gmail.com> *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License or (at your option) version 3 or any later version *
* accepted by the membership of KDE e.V. (or its successor approved *
* by the membership of KDE e.V.), which shall act as a proxy *
* defined in Section 14 of version 3 of the license. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
#ifndef GITMESSAGEHIGHLIGHTER_H
#define GITMESSAGEHIGHLIGHTER_H
#include <QtGui/QSyntaxHighlighter>
class QTextEdit;
class GitMessageHighlighter : public QSyntaxHighlighter
{
Q_OBJECT
public:
explicit GitMessageHighlighter(QTextEdit* parent);
virtual ~GitMessageHighlighter();
protected:
virtual void highlightBlock(const QString& text);
private:
enum BlockState {
NoState = -1,
Summary,
SummarySeparator,
DetailedMessage
};
};
#endif // GITMESSAGEHIGHLIGHTER_H
......@@ -50,6 +50,7 @@
#include <KMessageBox>
#include <KStandardDirs>
#include "gitjob.h"
#include "gitmessagehighlighter.h"
K_PLUGIN_FACTORY(KDevGitFactory, registerPlugin<GitPlugin>(); )
K_EXPORT_PLUGIN(KDevGitFactory(KAboutData("kdevgit","kdevgit",ki18n("Git"),"0.1",ki18n("A plugin to support git version control systems"), KAboutData::License_GPL)))
......@@ -1223,6 +1224,11 @@ VcsJob* GitPlugin::update(const KUrl::List& localLocations, const KDevelop::VcsR
}
}
void GitPlugin::setupCommitMessageEditor(const KUrl&, QTextEdit* editor) const
{
new GitMessageHighlighter(editor);
}
class GitVcsLocationWidget : public KDevelop::StandardVcsLocationWidget
{
public:
......
......@@ -88,6 +88,7 @@ public:
virtual KDevelop::VcsJob* resolve(const KUrl::List& localLocations, RecursionMode recursion);
virtual KDevelop::VcsJob* update(const KUrl::List& localLocations, const KDevelop::VcsRevision& rev, RecursionMode recursion);
KDevelop::VcsLocationWidget* vcsLocation(QWidget* parent) const;
virtual void setupCommitMessageEditor(const KUrl& localLocation, QTextEdit* editor) const;
//End of
KDevelop::VcsJob* add(const KUrl::List& localLocations,
......
......@@ -18,7 +18,14 @@ FIND_PROGRAM(GIT NAMES git
if (GIT)
set( EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR} )
set(gitInitTest_SRCS initTest.cpp ../gitplugin.cpp ../gitclonejob.cpp ../stashmanagerdialog.cpp ../gitjob.cpp)
set(gitInitTest_SRCS
initTest.cpp
../gitplugin.cpp
../gitclonejob.cpp
../stashmanagerdialog.cpp
../gitjob.cpp
../gitmessagehighlighter.cpp
)
kde4_add_ui_files(gitInitTest_SRCS ../stashmanagerdialog.ui)
kde4_add_unit_test(kdevgit-test ${gitInitTest_SRCS})
target_link_libraries(kdevgit-test
......
......@@ -47,6 +47,7 @@ set(kdevplatformvcs_LIB_SRCS
dvcs/ui/branchmanager.cpp
dvcs/ui/revhistory/commitView.cpp
dvcs/ui/revhistory/commitlogmodel.cpp
interfaces/ibasicversioncontrol.cpp
)
kde4_add_ui_files(kdevplatformvcs_LIB_SRCS ${kdevplatformvcs_UIS})
......
/* This file is part of KDevelop
*
* Copyright 2011 Sergey Vidyuk <sir.vestnik@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
#include "ibasicversioncontrol.h"
/// Default empty implementation
void KDevelop::IBasicVersionControl::setupCommitMessageEditor(const KUrl&, QTextEdit*) const
{
}
......@@ -27,6 +27,7 @@
#include "../vcsdiff.h"
class QString;
class QTextEdit;
namespace KDevelop
{
......@@ -46,7 +47,7 @@ class VcsLocationWidget;
*
*/
class IBasicVersionControl
class KDEVPLATFORMVCS_EXPORT IBasicVersionControl
{
public:
......@@ -249,6 +250,12 @@ public:
virtual VcsLocationWidget* vcsLocation(QWidget* parent) const=0;
/**
* Optionally apply VCS specific settings to the commit message editor.
* Overwrite this to set e.g. a default commit message or to setup highlighting or validation.
* The default implementation does nothing.
*/
virtual void setupCommitMessageEditor(const KUrl& localLocation, QTextEdit *editor) const;
};
}
......
......@@ -64,6 +64,7 @@ VCSCommitDiffPatchSource::VCSCommitDiffPatchSource(VCSDiffUpdater* updater, cons
m_commitMessageEdit = new QTextEdit;
m_commitMessageEdit.data()->setFont( KGlobalSettings::fixedFont() );
m_commitMessageEdit.data()->setLineWrapMode(QTextEdit::NoWrap);
m_vcs->setupCommitMessageEditor(url, m_commitMessageEdit.data());
QHBoxLayout* titleLayout = new QHBoxLayout;
titleLayout->addWidget(new QLabel(i18n("Commit Message:")));
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment