forked from qt-creator/qt-creator
Mercurial plugin, merge request with suggested fixes.
This commit is contained in:
27
src/plugins/mercurial/Mercurial.pluginspec
Normal file
27
src/plugins/mercurial/Mercurial.pluginspec
Normal file
@@ -0,0 +1,27 @@
|
||||
<plugin name="Mercurial" version="1.2.91" compatVersion="1.2.91">
|
||||
<vendor>Brian McGillion</vendor>
|
||||
<copyright>(C) 2008-2009 Brian McGillion</copyright>
|
||||
<license>
|
||||
Commercial Usage
|
||||
|
||||
Licensees holding valid Qt Commercial licenses may use this plugin in
|
||||
accordance with the Qt Commercial License Agreement provided with the
|
||||
Software or, alternatively, in accordance with the terms contained in
|
||||
a written agreement between you and Nokia.
|
||||
|
||||
GNU Lesser General Public License Usage
|
||||
|
||||
Alternatively, this plugin may be used under the terms of the GNU Lesser
|
||||
General Public License version 2.1 as published by the Free Software
|
||||
Foundation. Please review the following information to
|
||||
ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.</license>
|
||||
<description>Mercurial integration.</description>
|
||||
<url>http://www.qtsoftware.com</url>
|
||||
<dependencyList>
|
||||
<dependency name="TextEditor" version="1.2.91"/>
|
||||
<dependency name="ProjectExplorer" version="1.2.91"/>
|
||||
<dependency name="Core" version="1.2.91"/>
|
||||
<dependency name="VCSBase" version="1.2.91"/>
|
||||
</dependencyList>
|
||||
</plugin>
|
||||
19
src/plugins/mercurial/annotationhighlighter.cpp
Normal file
19
src/plugins/mercurial/annotationhighlighter.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "annotationhighlighter.h"
|
||||
#include "constants.h"
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
using namespace Mercurial;
|
||||
|
||||
MercurialAnnotationHighlighter::MercurialAnnotationHighlighter(const ChangeNumbers &changeNumbers,
|
||||
QTextDocument *document)
|
||||
: VCSBase::BaseAnnotationHighlighter(changeNumbers, document),
|
||||
changeset(Constants::CHANGESETID12)
|
||||
{
|
||||
}
|
||||
|
||||
QString MercurialAnnotationHighlighter::changeNumber(const QString &block) const
|
||||
{
|
||||
if (changeset.indexIn(block) != -1)
|
||||
return changeset.cap(1);
|
||||
return QString();
|
||||
}
|
||||
22
src/plugins/mercurial/annotationhighlighter.h
Normal file
22
src/plugins/mercurial/annotationhighlighter.h
Normal file
@@ -0,0 +1,22 @@
|
||||
#ifndef ANNOTATIONHIGHLIGHTER_H
|
||||
#define ANNOTATIONHIGHLIGHTER_H
|
||||
|
||||
#include <vcsbase/baseannotationhighlighter.h>
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
class MercurialAnnotationHighlighter : public VCSBase::BaseAnnotationHighlighter
|
||||
{
|
||||
public:
|
||||
explicit MercurialAnnotationHighlighter(const ChangeNumbers &changeNumbers,
|
||||
QTextDocument *document = 0);
|
||||
|
||||
private:
|
||||
virtual QString changeNumber(const QString &block) const;
|
||||
QRegExp changeset;
|
||||
};
|
||||
|
||||
} //namespace Internal
|
||||
}// namespace Mercurial
|
||||
#endif // ANNOTATIONHIGHLIGHTER_H
|
||||
59
src/plugins/mercurial/clonewizard.cpp
Normal file
59
src/plugins/mercurial/clonewizard.cpp
Normal file
@@ -0,0 +1,59 @@
|
||||
#include "clonewizard.h"
|
||||
#include "clonewizardpage.h"
|
||||
#include "mercurialplugin.h"
|
||||
#include "mercurialsettings.h"
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
|
||||
CloneWizard::CloneWizard(QObject *parent)
|
||||
: VCSBase::BaseCheckoutWizard(parent),
|
||||
m_icon(QIcon(":/mercurial/images/hg.png"))
|
||||
{
|
||||
}
|
||||
|
||||
QIcon CloneWizard::icon() const
|
||||
{
|
||||
return m_icon;
|
||||
}
|
||||
|
||||
QString CloneWizard::description() const
|
||||
{
|
||||
return tr("Clone a Mercurial repository");
|
||||
}
|
||||
|
||||
QString CloneWizard::name() const
|
||||
{
|
||||
return tr("Mercurial Clone");
|
||||
}
|
||||
|
||||
QList<QWizardPage*> CloneWizard::createParameterPages(const QString &path)
|
||||
{
|
||||
QList<QWizardPage*> wizardPageList;
|
||||
CloneWizardPage *page = new CloneWizardPage;
|
||||
page->setPath(path);
|
||||
wizardPageList.push_back(page);
|
||||
return wizardPageList;
|
||||
}
|
||||
|
||||
QSharedPointer<VCSBase::AbstractCheckoutJob> CloneWizard::createJob(const QList<QWizardPage *> ¶meterPages,
|
||||
QString *checkoutPath)
|
||||
{
|
||||
const CloneWizardPage *page = qobject_cast<const CloneWizardPage *>(parameterPages.front());
|
||||
|
||||
if (!page)
|
||||
return QSharedPointer<VCSBase::AbstractCheckoutJob>();
|
||||
|
||||
MercurialSettings *settings = MercurialPlugin::instance()->settings();
|
||||
|
||||
QStringList args = settings->standardArguments();
|
||||
QString path = page->path();
|
||||
QString directory = page->directory();
|
||||
|
||||
args << "clone" << page->repository() << directory;
|
||||
*checkoutPath = path + "/" + directory;
|
||||
|
||||
return QSharedPointer<VCSBase::AbstractCheckoutJob>(new VCSBase::ProcessCheckoutJob(settings->binary(),
|
||||
args, path));
|
||||
}
|
||||
33
src/plugins/mercurial/clonewizard.h
Normal file
33
src/plugins/mercurial/clonewizard.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef CLONEWIZARD_H
|
||||
#define CLONEWIZARD_H
|
||||
|
||||
#include <vcsbase/basecheckoutwizard.h>
|
||||
#include <vcsbase/checkoutjobs.h>
|
||||
|
||||
#include <QtGui/QIcon>
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
class CloneWizard : public VCSBase::BaseCheckoutWizard
|
||||
{
|
||||
public:
|
||||
CloneWizard(QObject *parent = 0);
|
||||
|
||||
QIcon icon() const;
|
||||
QString description() const;
|
||||
QString name() const;
|
||||
|
||||
protected:
|
||||
QList<QWizardPage *> createParameterPages(const QString &path);
|
||||
QSharedPointer<VCSBase::AbstractCheckoutJob> createJob(const QList<QWizardPage *> ¶meterPages,
|
||||
QString *checkoutPath);
|
||||
|
||||
private:
|
||||
QIcon m_icon;
|
||||
};
|
||||
|
||||
} //namespace Internal
|
||||
} //namespace Mercurial
|
||||
|
||||
#endif // CLONEWIZARD_H
|
||||
21
src/plugins/mercurial/clonewizardpage.cpp
Normal file
21
src/plugins/mercurial/clonewizardpage.cpp
Normal file
@@ -0,0 +1,21 @@
|
||||
#include "clonewizardpage.h"
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
|
||||
CloneWizardPage::CloneWizardPage(QWidget *parent)
|
||||
: VCSBase::BaseCheckoutWizardPage(parent)
|
||||
{
|
||||
setRepositoryLabel("Clone URL:");
|
||||
}
|
||||
|
||||
QString CloneWizardPage::directoryFromRepository(const QString &repository) const
|
||||
{
|
||||
//mercruial repositories are generally of the form protocol://repositoryUrl/repository/
|
||||
//we are just looking for repository.
|
||||
QString repo = repository.trimmed();
|
||||
if (repo.endsWith('/'))
|
||||
repo = repo.remove(-1, 1);
|
||||
|
||||
//Take the basename or the repository url
|
||||
return repo.mid(repo.lastIndexOf('/') + 1);
|
||||
}
|
||||
22
src/plugins/mercurial/clonewizardpage.h
Normal file
22
src/plugins/mercurial/clonewizardpage.h
Normal file
@@ -0,0 +1,22 @@
|
||||
#ifndef CLONEWIZARDPAGE_H
|
||||
#define CLONEWIZARDPAGE_H
|
||||
|
||||
#include <vcsbase/basecheckoutwizardpage.h>
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
class CloneWizardPage : public VCSBase::BaseCheckoutWizardPage
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
CloneWizardPage(QWidget *parent = 0);
|
||||
|
||||
protected:
|
||||
QString directoryFromRepository(const QString &rrepository) const;
|
||||
};
|
||||
|
||||
} //namespace Internal
|
||||
} //namespace Mercurial
|
||||
|
||||
#endif // CLONEWIZARDPAGE_H
|
||||
68
src/plugins/mercurial/commiteditor.cpp
Normal file
68
src/plugins/mercurial/commiteditor.cpp
Normal file
@@ -0,0 +1,68 @@
|
||||
#include "commiteditor.h"
|
||||
#include "mercurialcommitwidget.h"
|
||||
|
||||
#include <vcsbase/submitfilemodel.h>
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
#include <QDir> //TODO REMOVE WHEN BASE FILE CHANGES ARE PULLED
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
|
||||
CommitEditor::CommitEditor(const VCSBase::VCSBaseSubmitEditorParameters *parameters, QWidget *parent)
|
||||
: VCSBase::VCSBaseSubmitEditor(parameters, new MercurialCommitWidget(parent)),
|
||||
fileModel(0)
|
||||
{
|
||||
setDisplayName(tr("Commit Editor"));
|
||||
}
|
||||
|
||||
MercurialCommitWidget *CommitEditor::commitWidget()
|
||||
{
|
||||
return static_cast<MercurialCommitWidget *>(widget());
|
||||
}
|
||||
|
||||
void CommitEditor::setFields(const QFileInfo &repositoryRoot, const QString &branch,
|
||||
const QString &userName, const QString &email,
|
||||
const QList<QPair<QString, QString> > &repoStatus)
|
||||
{
|
||||
MercurialCommitWidget *mercurialWidget = commitWidget();
|
||||
if (!mercurialWidget)
|
||||
return;
|
||||
|
||||
mercurialWidget->setFields(repositoryRoot.absoluteFilePath(), branch, userName, email);
|
||||
|
||||
fileModel = new VCSBase::SubmitFileModel(this);
|
||||
|
||||
//TODO Messy tidy this up
|
||||
typedef QPair<QString, QString> PAIR;
|
||||
QStringList shouldTrack;
|
||||
|
||||
foreach (PAIR status, repoStatus) {
|
||||
if (status.first == "Untracked")
|
||||
shouldTrack.append(status.second);
|
||||
else
|
||||
fileModel->addFile(status.second, status.first, false);
|
||||
}
|
||||
|
||||
VCSBase::VCSBaseSubmitEditor::filterUntrackedFilesOfProject(repositoryRoot.absoluteFilePath(),
|
||||
&shouldTrack);
|
||||
|
||||
foreach (QString track, shouldTrack) {
|
||||
foreach (PAIR status, repoStatus) {
|
||||
if (status.second == track)
|
||||
fileModel->addFile(status.second, status.first, false);
|
||||
}
|
||||
}
|
||||
|
||||
setFileModel(fileModel);
|
||||
}
|
||||
|
||||
QString CommitEditor::committerInfo()
|
||||
{
|
||||
return commitWidget()->committer();
|
||||
}
|
||||
|
||||
QString CommitEditor::repoRoot()
|
||||
{
|
||||
return commitWidget()->repoRoot();
|
||||
}
|
||||
40
src/plugins/mercurial/commiteditor.h
Normal file
40
src/plugins/mercurial/commiteditor.h
Normal file
@@ -0,0 +1,40 @@
|
||||
#ifndef COMMITEDITOR_H
|
||||
#define COMMITEDITOR_H
|
||||
|
||||
#include <vcsbase/vcsbasesubmiteditor.h>
|
||||
|
||||
#include <QtCore/QFileInfo>
|
||||
|
||||
namespace VCSBase {
|
||||
class SubmitFileModel;
|
||||
}
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
class MercurialCommitWidget;
|
||||
|
||||
class CommitEditor : public VCSBase::VCSBaseSubmitEditor
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit CommitEditor(const VCSBase::VCSBaseSubmitEditorParameters *parameters,
|
||||
QWidget *parent);
|
||||
|
||||
void setFields(const QFileInfo &repositoryRoot, const QString &branch,
|
||||
const QString &userName, const QString &email,
|
||||
const QList<QPair<QString, QString> > &repoStatus);
|
||||
|
||||
QString committerInfo();
|
||||
QString repoRoot();
|
||||
|
||||
|
||||
private:
|
||||
inline MercurialCommitWidget *commitWidget();
|
||||
VCSBase::SubmitFileModel *fileModel;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
#endif // COMMITEDITOR_H
|
||||
103
src/plugins/mercurial/constants.h
Normal file
103
src/plugins/mercurial/constants.h
Normal file
@@ -0,0 +1,103 @@
|
||||
#ifndef CONSTANTS_H
|
||||
#define CONSTANTS_H
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Constants {
|
||||
|
||||
enum { debug = 1 };
|
||||
const char * const MERCURIAL = "mercurial";
|
||||
const char * const MECURIALREPO = ".hg";
|
||||
const char * const MERCURIALDEFAULT = "hg";
|
||||
|
||||
//options page items
|
||||
const char * const MERCURIALPATH = "Mercurial_Path";
|
||||
const char * const MERCURIALUSERNAME = "Mercurial_Username";
|
||||
const char * const MERCURIALEMAIL = "Mercurial_Email";
|
||||
const char * const MERCURIALLOGCOUNT = "Mercurial_LogCount";
|
||||
const char * const MERCURIALTIMEOUT = "Mercurial_Timeout";
|
||||
const char * const MERCURIALPROMPTSUBMIT = "Mercurial_PromptOnSubmit";
|
||||
|
||||
//changeset identifiers
|
||||
const char * const CHANGESETID12 = " ([a-f0-9]{12,12}) "; //match 12 hex chars and capture
|
||||
const char * const CHANGESETID40 = " ([a-f0-9]{40,40}) ";
|
||||
const char * const CHANGEIDEXACT12 = "[a-f0-9]{12,12}"; //match 12 hex chars a
|
||||
const char * const CHANGEIDEXACT40 = "[a-f0-9]{40,40}";
|
||||
const char * const DIFFIDENTIFIER = "^[-+]{3,3} [ab]{1,1}.*"; // match e.g. +++ b/filename
|
||||
//Errors
|
||||
const char * const ERRORSTARTING = "Unable to start Mercurial Process";
|
||||
const char * const TIMEDOUT = "Timed out waiting for Mercurail Process to Finish";
|
||||
|
||||
//BaseEditorParameters
|
||||
const char * const COMMANDLOG = "Mercurial Command Log Editor";
|
||||
const char * const COMMANDAPP = "application/vnd.nokia.text.scs_mercurial_commandlog";
|
||||
const char * const COMMANDEXT = "vcsMercurialCommand";
|
||||
|
||||
const char * const FILELOG = "Mercurial File Log Editor";
|
||||
const char * const LOGAPP = "application/vnd.nokia.text.scs_mercurial_log";
|
||||
const char * const LOGEXT = "vcsMercurialLog";
|
||||
|
||||
const char * const ANNOTATELOG = "Mercurial Annotation Editor";
|
||||
const char * const ANNOTATEAPP = "application/vnd.nokia.text.scs_mercurial_annotatelog";
|
||||
const char * const ANNOTATEEXT = "vcsMercurialAnnotate";
|
||||
|
||||
const char * const DIFFLOG = "Mercurial Diff Editor";
|
||||
const char * const DIFFAPP = "text/x-patch";
|
||||
const char * const DIFFEXT = "diff";
|
||||
|
||||
//SubmitEditorParameters
|
||||
const char * const COMMITKIND = "Mercurial Commit Log Editor";
|
||||
const char * const COMMITMIMETYPE = "application/vnd.nokia.text.scs_mercurial_commitlog";
|
||||
|
||||
#ifndef Q_WS_MAC
|
||||
const char * const MODIFIER = "Alt+";
|
||||
const char * const MENUKEY = "Alt+H, ";
|
||||
#else
|
||||
const char * const MODIFIER = "Meta+";
|
||||
const char * const MENUKEY = "Meta+H, ";
|
||||
#endif
|
||||
|
||||
//menu items
|
||||
//File menu actions
|
||||
const char * const ANNOTATE = "Mercurial.Annotate";
|
||||
const char * const DIFF = "Mercurial.DiffSingleFile";
|
||||
const char * const LOG = "Mercurial.LogSingleFile";
|
||||
const char * const REVERT = "Mercurial.RevertSingleFile";
|
||||
const char * const STATUS = "Mercurial.Status";
|
||||
|
||||
//directory menu Actions
|
||||
const char * const DIFFMULTI = "Mercurial.Action.DiffMulti";
|
||||
const char * const REVERTMULTI = "Mercurial.Action.RevertMulti";
|
||||
const char * const STATUSMULTI = "Mercurial.Action.StatusMulti";
|
||||
const char * const LOGMULTI = "Mercurial.Action.Logmulti";
|
||||
|
||||
//repository menu actions
|
||||
const char * const PULL = "Mercurial.Action.Pull";
|
||||
const char * const PUSH = "Mercurial.Action.Push";
|
||||
const char * const UPDATE = "Mercurial.Action.Update";
|
||||
const char * const IMPORT = "Mercurial.Action.Import";
|
||||
const char * const INCOMING = "Mercurial.Action.Incoming";
|
||||
const char * const OUTGOING = "Mercurial.Action.Outgoing";
|
||||
const char * const COMMIT = "Mercurial.Action.Commit";
|
||||
|
||||
//Repository Management
|
||||
const char * const MERGE = "Mercurial.Action.Merge";
|
||||
const char * const BRANCH = "Mercurial.Action.Branch";
|
||||
const char * const HEADS = "Mercurial.Action.Heads";
|
||||
const char * const PARENTS = "Mercurial.Action.Parents";
|
||||
const char * const TAGS = "Mercurial.Action.Tags";
|
||||
const char * const TIP = "Mercurial.Action.TIP";
|
||||
const char * const PATHS = "Mercurial.Action.Paths";
|
||||
|
||||
//Less commonly used menu actions
|
||||
const char * const CLONE = "Mercurial.Action.Clone";
|
||||
const char * const INIT = "Mercurial.Action.Init";
|
||||
const char * const SERVE = "Mercurial.Action.Serve";
|
||||
|
||||
//submit editor actions
|
||||
const char * const COMMITEDITOR = "Mercurial.Action.Editor.Commit";
|
||||
const char * const DIFFEDITOR = "Mercurial.Action.Editor.Diff";
|
||||
|
||||
} // namespace Constants
|
||||
} // namespace mercurial
|
||||
|
||||
#endif // CONSTANTS_H
|
||||
BIN
src/plugins/mercurial/images/hg.png
Normal file
BIN
src/plugins/mercurial/images/hg.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.1 KiB |
41
src/plugins/mercurial/mercurial.pro
Normal file
41
src/plugins/mercurial/mercurial.pro
Normal file
@@ -0,0 +1,41 @@
|
||||
TARGET = Mercurial
|
||||
TEMPLATE = lib
|
||||
include(../../qtcreatorplugin.pri)
|
||||
include(mercurial_dependencies.pri)
|
||||
SOURCES += mercurialplugin.cpp \
|
||||
optionspage.cpp \
|
||||
mercurialoutputwindow.cpp \
|
||||
mercurialcontrol.cpp \
|
||||
mercurialclient.cpp \
|
||||
mercurialjobrunner.cpp \
|
||||
annotationhighlighter.cpp \
|
||||
mercurialeditor.cpp \
|
||||
revertdialog.cpp \
|
||||
srcdestdialog.cpp \
|
||||
mercurialcommitwidget.cpp \
|
||||
commiteditor.cpp \
|
||||
clonewizardpage.cpp \
|
||||
clonewizard.cpp \
|
||||
mercurialsettings.cpp
|
||||
HEADERS += mercurialplugin.h \
|
||||
constants.h \
|
||||
optionspage.h \
|
||||
mercurialoutputwindow.h \
|
||||
mercurialcontrol.h \
|
||||
mercurialclient.h \
|
||||
mercurialjobrunner.h \
|
||||
annotationhighlighter.h \
|
||||
mercurialeditor.h \
|
||||
revertdialog.h \
|
||||
srcdestdialog.h \
|
||||
mercurialcommitwidget.h \
|
||||
commiteditor.h \
|
||||
clonewizardpage.h \
|
||||
clonewizard.h \
|
||||
mercurialsettings.h
|
||||
OTHER_FILES += Mercurial.pluginspec
|
||||
FORMS += optionspage.ui \
|
||||
revertdialog.ui \
|
||||
srcdestdialog.ui \
|
||||
mercurialcommitpanel.ui
|
||||
RESOURCES += mercurial.qrc
|
||||
5
src/plugins/mercurial/mercurial.qrc
Normal file
5
src/plugins/mercurial/mercurial.qrc
Normal file
@@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/mercurial" >
|
||||
<file>images/hg.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
5
src/plugins/mercurial/mercurial_dependencies.pri
Normal file
5
src/plugins/mercurial/mercurial_dependencies.pri
Normal file
@@ -0,0 +1,5 @@
|
||||
include(../../plugins/projectexplorer/projectexplorer.pri)
|
||||
include(../../plugins/texteditor/texteditor.pri)
|
||||
include(../../plugins/coreplugin/coreplugin.pri)
|
||||
include(../../plugins/vcsbase/vcsbase.pri)
|
||||
include(../../libs/utils/utils.pri)
|
||||
414
src/plugins/mercurial/mercurialclient.cpp
Normal file
414
src/plugins/mercurial/mercurialclient.cpp
Normal file
@@ -0,0 +1,414 @@
|
||||
#include "mercurialclient.h"
|
||||
#include "mercurialjobrunner.h"
|
||||
#include "constants.h"
|
||||
#include "mercurialsettings.h"
|
||||
#include "mercurialplugin.h"
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <coreplugin/editormanager/editormanager.h>
|
||||
|
||||
#include <utils/qtcassert.h>
|
||||
#include <vcsbase/vcsbaseeditor.h>
|
||||
|
||||
#include <QtCore/QStringList>
|
||||
#include <QtCore/QSharedPointer>
|
||||
#include <QtCore/QDir>
|
||||
#include <QtCore/QProcess>
|
||||
#include <QtCore/QTextCodec>
|
||||
#include <QtCore/QtDebug>
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
using namespace Mercurial;
|
||||
|
||||
inline Core::IEditor* locateEditor(const Core::ICore *core, const char *property, const QString &entry)
|
||||
{
|
||||
foreach (Core::IEditor *ed, core->editorManager()->openedEditors())
|
||||
if (ed->file()->property(property).toString() == entry)
|
||||
return ed;
|
||||
return 0;
|
||||
}
|
||||
|
||||
MercurialClient::MercurialClient()
|
||||
: core(Core::ICore::instance())
|
||||
{
|
||||
jobManager = new MercurialJobRunner();
|
||||
jobManager->start();
|
||||
}
|
||||
|
||||
MercurialClient::~MercurialClient()
|
||||
{
|
||||
if (jobManager) {
|
||||
delete jobManager;
|
||||
jobManager = 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool MercurialClient::add(const QString &filename)
|
||||
{
|
||||
QFileInfo file(filename);
|
||||
QStringList args;
|
||||
args << "add" << file.absoluteFilePath();
|
||||
|
||||
return hgProcessSync(file, args);
|
||||
}
|
||||
|
||||
bool MercurialClient::remove(const QString &filename)
|
||||
{
|
||||
QFileInfo file(filename);
|
||||
QStringList args;
|
||||
args << "remove" << file.absoluteFilePath();
|
||||
|
||||
return hgProcessSync(file, args);
|
||||
}
|
||||
|
||||
bool MercurialClient::manifestSync(const QString &filename)
|
||||
{
|
||||
QFileInfo file(filename);
|
||||
QStringList args("manifest");
|
||||
|
||||
QByteArray output;
|
||||
hgProcessSync(file, args, &output);
|
||||
|
||||
QStringList files = QString::fromLocal8Bit(output).split('\n');
|
||||
|
||||
foreach (QString fileName, files) {
|
||||
QFileInfo managedFile(filename);
|
||||
if (file == managedFile)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MercurialClient::hgProcessSync(const QFileInfo &file, const QStringList &args,
|
||||
QByteArray *output) const
|
||||
{
|
||||
QProcess hgProcess;
|
||||
hgProcess.setWorkingDirectory(file.isDir() ? file.absoluteFilePath() : file.absolutePath());
|
||||
|
||||
MercurialSettings *settings = MercurialPlugin::instance()->settings();
|
||||
QStringList arguments = settings->standardArguments();
|
||||
arguments << args;
|
||||
|
||||
hgProcess.start(settings->binary(), arguments);
|
||||
|
||||
if (!hgProcess.waitForStarted())
|
||||
return false;
|
||||
|
||||
hgProcess.closeWriteChannel();
|
||||
|
||||
if (!hgProcess.waitForFinished(settings->timeout())) {
|
||||
hgProcess.terminate();
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((hgProcess.exitStatus() == QProcess::NormalExit) && (hgProcess.exitCode() == 0)) {
|
||||
if (output)
|
||||
*output = hgProcess.readAllStandardOutput();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
QString MercurialClient::branchQuerySync(const QFileInfo &repositoryRoot)
|
||||
{
|
||||
QByteArray output;
|
||||
if (hgProcessSync(repositoryRoot, QStringList("branch"), &output))
|
||||
return QTextCodec::codecForLocale()->toUnicode(output).trimmed();
|
||||
|
||||
return QString("Unknown Branch");
|
||||
}
|
||||
|
||||
void MercurialClient::annotate(const QFileInfo &file)
|
||||
{
|
||||
QStringList args;
|
||||
args << "annotate" << "-u" << "-c" << "-d" << file.absoluteFilePath();
|
||||
|
||||
const QString kind = Constants::ANNOTATELOG;
|
||||
const QString title = tr("Hg Annotate %1").arg(file.fileName());
|
||||
|
||||
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, file.absolutePath(), true,
|
||||
"annotate", file.absoluteFilePath());
|
||||
|
||||
QSharedPointer<HgTask> job(new HgTask(file.absolutePath(), args, editor));
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
void MercurialClient::diff(const QFileInfo &fileOrDir)
|
||||
{
|
||||
QStringList args;
|
||||
QString id;
|
||||
QString workingPath;
|
||||
|
||||
args << "diff" << "-g" << "-p" << "-U 8";
|
||||
|
||||
if (!fileOrDir.isDir()) {
|
||||
args.append(fileOrDir.absoluteFilePath());
|
||||
id = fileOrDir.absoluteFilePath();
|
||||
workingPath = fileOrDir.absolutePath();
|
||||
} else {
|
||||
id = MercurialPlugin::instance()->currentProjectName();
|
||||
workingPath = fileOrDir.absoluteFilePath();
|
||||
}
|
||||
|
||||
const QString kind = Constants::DIFFLOG;
|
||||
const QString title = tr("Hg diff %1").arg(fileOrDir.isDir() ? id : fileOrDir.fileName());
|
||||
|
||||
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, workingPath, true,
|
||||
"diff", id);
|
||||
|
||||
QSharedPointer<HgTask> job(new HgTask(workingPath, args, editor));
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
void MercurialClient::log(const QFileInfo &fileOrDir)
|
||||
{
|
||||
QStringList args;
|
||||
QString id;
|
||||
QString workingDir;
|
||||
|
||||
args << "log";
|
||||
|
||||
if (!fileOrDir.isDir()) {
|
||||
args.append(fileOrDir.absoluteFilePath());
|
||||
id = fileOrDir.absoluteFilePath();
|
||||
workingDir = fileOrDir.absolutePath();
|
||||
} else {
|
||||
id = MercurialPlugin::instance()->currentProjectName();
|
||||
workingDir = fileOrDir.absoluteFilePath();
|
||||
}
|
||||
|
||||
const QString kind = Constants::FILELOG;
|
||||
const QString title = tr("Hg log %1").arg(fileOrDir.isDir() ? id : fileOrDir.fileName());
|
||||
|
||||
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, workingDir, true,
|
||||
"log", id);
|
||||
|
||||
QSharedPointer<HgTask> job(new HgTask(workingDir, args, editor));
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
void MercurialClient::revert(const QFileInfo &fileOrDir, const QString &revision)
|
||||
{
|
||||
QStringList args;
|
||||
args << "revert";
|
||||
|
||||
if (!revision.isEmpty())
|
||||
args << "-r" << revision;
|
||||
if (!fileOrDir.isDir())
|
||||
args.append(fileOrDir.absoluteFilePath());
|
||||
else
|
||||
args.append("--all");
|
||||
|
||||
QSharedPointer<HgTask> job(new HgTask(fileOrDir.isDir() ? fileOrDir.absoluteFilePath() :
|
||||
fileOrDir.absolutePath(), args, false));
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
void MercurialClient::status(const QFileInfo &fileOrDir)
|
||||
{
|
||||
QStringList args;
|
||||
args << "status";
|
||||
if (!fileOrDir.isDir())
|
||||
args.append(fileOrDir.absoluteFilePath());
|
||||
|
||||
QSharedPointer<HgTask> job(new HgTask(fileOrDir.isDir() ? fileOrDir.absoluteFilePath() :
|
||||
fileOrDir.absolutePath(), args, false));
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
void MercurialClient::statusWithSignal(const QFileInfo &repositoryRoot)
|
||||
{
|
||||
QStringList args;
|
||||
args << "status";
|
||||
|
||||
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, true));
|
||||
connect(job.data(), SIGNAL(rawData(const QByteArray &)),
|
||||
this, SLOT(statusParser(const QByteArray &)));
|
||||
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
void MercurialClient::statusParser(const QByteArray &data)
|
||||
{
|
||||
QList<QPair<QString, QString> > statusList;
|
||||
|
||||
QStringList rawStatusList = QTextCodec::codecForLocale()->toUnicode(data).split(QLatin1Char('\n'));
|
||||
|
||||
foreach (QString string, rawStatusList) {
|
||||
QPair<QString, QString> status;
|
||||
|
||||
if (string.startsWith('M'))
|
||||
status.first = "Modified";
|
||||
else if (string.startsWith('A'))
|
||||
status.first = "Added";
|
||||
else if (string.startsWith('R'))
|
||||
status.first = "Removed";
|
||||
else if (string.startsWith('!'))
|
||||
status.first = "Deleted";
|
||||
else if (string.startsWith('?'))
|
||||
status.first = "Untracked";
|
||||
else
|
||||
continue;
|
||||
|
||||
//the status string should be similar to "M file_with_Changes"
|
||||
//so just should take the file name part and store it
|
||||
status.second = string.mid(2);
|
||||
statusList.append(status);
|
||||
}
|
||||
|
||||
emit parsedStatus(statusList);
|
||||
}
|
||||
|
||||
void MercurialClient::import(const QFileInfo &repositoryRoot, const QStringList &files)
|
||||
{
|
||||
QStringList args;
|
||||
args << "import" << "--no-commit";
|
||||
|
||||
foreach (QString file, files)
|
||||
args.append(file);
|
||||
|
||||
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
void MercurialClient::pull(const QFileInfo &repositoryRoot, const QString &repository)
|
||||
{
|
||||
QStringList args;
|
||||
args << "pull";
|
||||
if (!repository.isEmpty())
|
||||
args.append(repository);
|
||||
|
||||
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
void MercurialClient::push(const QFileInfo &repositoryRoot, const QString &repository)
|
||||
{
|
||||
QStringList args;
|
||||
args << "push";
|
||||
if (!repository.isEmpty())
|
||||
args.append(repository);
|
||||
|
||||
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
void MercurialClient::incoming(const QFileInfo &repositoryRoot, const QString &repository)
|
||||
{
|
||||
QStringList args;
|
||||
args << "incoming" << "-g" << "-p";
|
||||
if (!repository.isEmpty())
|
||||
args.append(repository);
|
||||
|
||||
QString id = MercurialPlugin::instance()->currentProjectName();
|
||||
|
||||
const QString kind = Constants::DIFFLOG;
|
||||
const QString title = tr("Hg incoming %1").arg(id);
|
||||
|
||||
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, repositoryRoot.absoluteFilePath(),
|
||||
true, "incoming", id);
|
||||
|
||||
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, editor));
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
void MercurialClient::outgoing(const QFileInfo &repositoryRoot)
|
||||
{
|
||||
QStringList args;
|
||||
args << "outgoing" << "-g" << "-p";
|
||||
|
||||
QString id = MercurialPlugin::instance()->currentProjectName();
|
||||
|
||||
const QString kind = Constants::DIFFLOG;
|
||||
const QString title = tr("Hg outgoing %1").arg(id);
|
||||
|
||||
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, repositoryRoot.absoluteFilePath(), true,
|
||||
"outgoing", id);
|
||||
|
||||
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, editor));
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
void MercurialClient::view(const QString &source, const QString &id)
|
||||
{
|
||||
QStringList args;
|
||||
args << "log" << "-p" << "-g" << "-r" << id;
|
||||
|
||||
const QString kind = Constants::DIFFLOG;
|
||||
const QString title = tr("Hg log %1").arg(id);
|
||||
|
||||
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, source,
|
||||
true, "view", id);
|
||||
|
||||
QSharedPointer<HgTask> job(new HgTask(source, args, editor));
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
void MercurialClient::update(const QFileInfo &repositoryRoot, const QString &revision)
|
||||
{
|
||||
QStringList args;
|
||||
|
||||
args << "update";
|
||||
if (!revision.isEmpty())
|
||||
args << revision;
|
||||
|
||||
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
void MercurialClient::commit(const QFileInfo &repositoryRoot, const QStringList &files,
|
||||
const QString &commiterInfo, const QString &commitMessageFile)
|
||||
{
|
||||
QStringList args;
|
||||
|
||||
args << "commit" << "-u" << commiterInfo << "-l" << commitMessageFile << files;
|
||||
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
|
||||
jobManager->enqueueJob(job);
|
||||
}
|
||||
|
||||
QString MercurialClient::findTopLevelForFile(const QFileInfo &file)
|
||||
{
|
||||
const QString repositoryTopDir = QLatin1String(Constants::MECURIALREPO);
|
||||
QDir dir = file.isDir() ? QDir(file.absoluteFilePath()) : QDir(file.absolutePath());
|
||||
|
||||
do {
|
||||
if (QFileInfo(dir, repositoryTopDir).exists())
|
||||
return dir.absolutePath();
|
||||
} while (dir.cdUp());
|
||||
|
||||
return QString();
|
||||
}
|
||||
|
||||
void MercurialClient::settingsChanged()
|
||||
{
|
||||
if (jobManager)
|
||||
jobManager->restart();
|
||||
}
|
||||
|
||||
VCSBase::VCSBaseEditor *MercurialClient::createVCSEditor(const QString &kind, QString title,
|
||||
const QString &source, bool setSourceCodec,
|
||||
const char *registerDynamicProperty,
|
||||
const QString &dynamicPropertyValue) const
|
||||
{
|
||||
VCSBase::VCSBaseEditor *baseEditor = 0;
|
||||
Core::IEditor* outputEditor = locateEditor(core, registerDynamicProperty, dynamicPropertyValue);
|
||||
if (outputEditor) {
|
||||
// Exists already
|
||||
outputEditor->createNew(tr("Working..."));
|
||||
baseEditor = VCSBase::VCSBaseEditor::getVcsBaseEditor(outputEditor);
|
||||
QTC_ASSERT(baseEditor, return 0);
|
||||
} else {
|
||||
outputEditor = core->editorManager()->openEditorWithContents(kind, &title, tr("Working..."));
|
||||
outputEditor->file()->setProperty(registerDynamicProperty, dynamicPropertyValue);
|
||||
baseEditor = VCSBase::VCSBaseEditor::getVcsBaseEditor(outputEditor);
|
||||
QTC_ASSERT(baseEditor, return 0);
|
||||
baseEditor->setSource(source);
|
||||
if (setSourceCodec)
|
||||
baseEditor->setCodec(VCSBase::VCSBaseEditor::getCodec(source));
|
||||
}
|
||||
|
||||
core->editorManager()->activateEditor(outputEditor);
|
||||
return baseEditor;
|
||||
}
|
||||
75
src/plugins/mercurial/mercurialclient.h
Normal file
75
src/plugins/mercurial/mercurialclient.h
Normal file
@@ -0,0 +1,75 @@
|
||||
#ifndef MERCURIALCLIENT_H
|
||||
#define MERCURIALCLIENT_H
|
||||
|
||||
#include <QtCore/QObject>
|
||||
#include <QtCore/QFileInfo>
|
||||
#include <QtCore/QByteArray>
|
||||
#include <QtCore/QPair>
|
||||
|
||||
namespace Core {
|
||||
class ICore;
|
||||
}
|
||||
|
||||
namespace VCSBase{
|
||||
class VCSBaseEditor;
|
||||
}
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
class MercurialJobRunner;
|
||||
|
||||
class MercurialClient : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MercurialClient();
|
||||
~MercurialClient();
|
||||
bool add(const QString &fileName);
|
||||
bool remove(const QString &fileName);
|
||||
bool manifestSync(const QString &filename);
|
||||
QString branchQuerySync(const QFileInfo &repositoryRoot);
|
||||
void annotate(const QFileInfo &file);
|
||||
void diff(const QFileInfo &fileOrDir);
|
||||
void log(const QFileInfo &fileOrDir);
|
||||
void import(const QFileInfo &repositoryRoot, const QStringList &files);
|
||||
void pull(const QFileInfo &repositoryRoot, const QString &repository);
|
||||
void push(const QFileInfo &repositoryRoot, const QString &repository);
|
||||
void incoming(const QFileInfo &repositoryRoot, const QString &repository);
|
||||
void outgoing(const QFileInfo &repositoryRoot);
|
||||
void status(const QFileInfo &fileOrDir);
|
||||
void statusWithSignal(const QFileInfo &fileOrDir);
|
||||
void revert(const QFileInfo &fileOrDir, const QString &revision);
|
||||
void update(const QFileInfo &repositoryRoot, const QString &revision);
|
||||
void commit(const QFileInfo &repositoryRoot, const QStringList &files,
|
||||
const QString &commiterInfo, const QString &commitMessageFile);
|
||||
|
||||
static QString findTopLevelForFile(const QFileInfo &file);
|
||||
|
||||
signals:
|
||||
void parsedStatus(const QList<QPair<QString, QString> > &statusList);
|
||||
|
||||
public slots:
|
||||
void view(const QString &source, const QString &id);
|
||||
void settingsChanged();
|
||||
|
||||
private slots:
|
||||
void statusParser(const QByteArray &data);
|
||||
|
||||
private:
|
||||
bool hgProcessSync(const QFileInfo &file, const QStringList &args,
|
||||
QByteArray *output=0) const;
|
||||
|
||||
MercurialJobRunner *jobManager;
|
||||
Core::ICore *core;
|
||||
|
||||
VCSBase::VCSBaseEditor *createVCSEditor(const QString &kind, QString title,
|
||||
const QString &source, bool setSourceCodec,
|
||||
const char *registerDynamicProperty,
|
||||
const QString &dynamicPropertyValue) const;
|
||||
};
|
||||
|
||||
} //namespace Internal
|
||||
} //namespace Mercurial
|
||||
|
||||
#endif // MERCURIALCLIENT_H
|
||||
107
src/plugins/mercurial/mercurialcommitpanel.ui
Normal file
107
src/plugins/mercurial/mercurialcommitpanel.ui
Normal file
@@ -0,0 +1,107 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Mercurial::Internal::MercurialCommitPanel</class>
|
||||
<widget class="QWidget" name="Mercurial::Internal::MercurialCommitPanel">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>374</width>
|
||||
<height>229</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="margin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="infoGroup">
|
||||
<property name="title">
|
||||
<string>General Information</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="infoFormLayout">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::ExpandingFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="repositoryLabelLabel">
|
||||
<property name="text">
|
||||
<string>Repository:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="repositoryLabel">
|
||||
<property name="text">
|
||||
<string>repository</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="branchLabelLabel">
|
||||
<property name="text">
|
||||
<string>Branch:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="branchLabel">
|
||||
<property name="text">
|
||||
<string>branch</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="editGroup">
|
||||
<property name="title">
|
||||
<string>Commit Information</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="authorLabel">
|
||||
<property name="text">
|
||||
<string>Author:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="authorLineEdit"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="emailLabel">
|
||||
<property name="text">
|
||||
<string>Email:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="emailLineEdit"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>161</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
117
src/plugins/mercurial/mercurialcommitwidget.cpp
Normal file
117
src/plugins/mercurial/mercurialcommitwidget.cpp
Normal file
@@ -0,0 +1,117 @@
|
||||
#include "mercurialcommitwidget.h"
|
||||
|
||||
#include <texteditor/texteditorsettings.h>
|
||||
#include <texteditor/fontsettings.h>
|
||||
#include <texteditor/texteditorconstants.h>
|
||||
|
||||
#include <QtGui/QSyntaxHighlighter>
|
||||
#include <QtGui/QTextEdit>
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QRegExp>
|
||||
|
||||
//see the git submit widget for details of the syntax Highlighter
|
||||
|
||||
//TODO Check to see when the Highlighter has been moved to a base class and use that instead
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
// Retrieve the comment char format from the text editor.
|
||||
static QTextCharFormat commentFormat()
|
||||
{
|
||||
const TextEditor::FontSettings settings = TextEditor::TextEditorSettings::instance()->fontSettings();
|
||||
return settings.toTextCharFormat(QLatin1String(TextEditor::Constants::C_COMMENT));
|
||||
}
|
||||
|
||||
// Highlighter for Mercurial submit messages. Make the first line bold, indicates
|
||||
// comments as such (retrieving the format from the text editor) and marks up
|
||||
// keywords (words in front of a colon as in 'Task: <bla>').
|
||||
class MercurialSubmitHighlighter : QSyntaxHighlighter
|
||||
{
|
||||
public:
|
||||
explicit MercurialSubmitHighlighter(QTextEdit *parent);
|
||||
virtual void highlightBlock(const QString &text);
|
||||
|
||||
private:
|
||||
enum State { Header, Comment, Other };
|
||||
const QTextCharFormat m_commentFormat;
|
||||
const QRegExp m_keywordPattern;
|
||||
const QChar m_hashChar;
|
||||
};
|
||||
|
||||
MercurialSubmitHighlighter::MercurialSubmitHighlighter(QTextEdit * parent) :
|
||||
QSyntaxHighlighter(parent),
|
||||
m_commentFormat(commentFormat()),
|
||||
m_keywordPattern(QLatin1String("^\\w+:")),
|
||||
m_hashChar(QLatin1Char('#'))
|
||||
{
|
||||
Q_ASSERT(m_keywordPattern.isValid());
|
||||
}
|
||||
|
||||
void MercurialSubmitHighlighter::highlightBlock(const QString &text)
|
||||
{
|
||||
// figure out current state
|
||||
State state = Other;
|
||||
const QTextBlock block = currentBlock();
|
||||
if (block.position() == 0) {
|
||||
state = Header;
|
||||
} else {
|
||||
if (text.startsWith(m_hashChar))
|
||||
state = Comment;
|
||||
}
|
||||
// Apply format.
|
||||
switch (state) {
|
||||
case Header: {
|
||||
QTextCharFormat charFormat = format(0);
|
||||
charFormat.setFontWeight(QFont::Bold);
|
||||
setFormat(0, text.size(), charFormat);
|
||||
}
|
||||
break;
|
||||
case Comment:
|
||||
setFormat(0, text.size(), m_commentFormat);
|
||||
break;
|
||||
case Other:
|
||||
// Format key words ("Task:") italic
|
||||
if (m_keywordPattern.indexIn(text, 0, QRegExp::CaretAtZero) == 0) {
|
||||
QTextCharFormat charFormat = format(0);
|
||||
charFormat.setFontItalic(true);
|
||||
setFormat(0, m_keywordPattern.matchedLength(), charFormat);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MercurialCommitWidget::MercurialCommitWidget(QWidget *parent) :
|
||||
Core::Utils::SubmitEditorWidget(parent),
|
||||
mercurialCommitPanel(new QWidget)
|
||||
{
|
||||
mercurialCommitPanelUi.setupUi(mercurialCommitPanel);
|
||||
insertTopWidget(mercurialCommitPanel);
|
||||
new MercurialSubmitHighlighter(descriptionEdit());
|
||||
}
|
||||
|
||||
void MercurialCommitWidget::setFields(const QString &repositoryRoot, const QString &branch,
|
||||
const QString &userName, const QString &email)
|
||||
{
|
||||
mercurialCommitPanelUi.repositoryLabel->setText(repositoryRoot);
|
||||
mercurialCommitPanelUi.branchLabel->setText(branch);
|
||||
mercurialCommitPanelUi.authorLineEdit->setText(userName);
|
||||
mercurialCommitPanelUi.emailLineEdit->setText(email);
|
||||
}
|
||||
|
||||
QString MercurialCommitWidget::committer()
|
||||
{
|
||||
QString user = mercurialCommitPanelUi.authorLineEdit->text() + QLatin1String(" <") +
|
||||
mercurialCommitPanelUi.emailLineEdit->text() + QLatin1String(">");
|
||||
return user;
|
||||
}
|
||||
|
||||
QString MercurialCommitWidget::repoRoot()
|
||||
{
|
||||
return mercurialCommitPanelUi.repositoryLabel->text();
|
||||
}
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Mercurial
|
||||
35
src/plugins/mercurial/mercurialcommitwidget.h
Normal file
35
src/plugins/mercurial/mercurialcommitwidget.h
Normal file
@@ -0,0 +1,35 @@
|
||||
#ifndef MERCURIALCOMMITWIDGET_H
|
||||
#define MERCURIALCOMMITWIDGET_H
|
||||
|
||||
#include "ui_mercurialcommitpanel.h"
|
||||
|
||||
#include <utils/submiteditorwidget.h>
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
/*submit editor widget based on git SubmitEditor
|
||||
Some extra fields have been added to the standard SubmitEditorWidget,
|
||||
to help to conform to the commit style that is used by both git and Mercurial*/
|
||||
|
||||
class MercurialCommitWidget : public Core::Utils::SubmitEditorWidget
|
||||
{
|
||||
|
||||
public:
|
||||
explicit MercurialCommitWidget(QWidget *parent = 0);
|
||||
|
||||
void setFields(const QString &repositoryRoot, const QString &branch,
|
||||
const QString &userName, const QString &email);
|
||||
|
||||
QString committer();
|
||||
QString repoRoot();
|
||||
|
||||
private:
|
||||
QWidget *mercurialCommitPanel;
|
||||
Ui::MercurialCommitPanel mercurialCommitPanelUi;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Mercurial
|
||||
|
||||
#endif // MERCURIALCOMMITWIDGET_H
|
||||
80
src/plugins/mercurial/mercurialcontrol.cpp
Normal file
80
src/plugins/mercurial/mercurialcontrol.cpp
Normal file
@@ -0,0 +1,80 @@
|
||||
#include "mercurialcontrol.h"
|
||||
#include "mercurialclient.h"
|
||||
|
||||
#include <QtCore/QFileInfo>
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
|
||||
MercurialControl::MercurialControl(MercurialClient *client)
|
||||
: mercurialClient(client),
|
||||
mercurialEnabled(true)
|
||||
{
|
||||
}
|
||||
|
||||
QString MercurialControl::name() const
|
||||
{
|
||||
return tr("Mercurial");
|
||||
}
|
||||
|
||||
bool MercurialControl::isEnabled() const
|
||||
{
|
||||
return mercurialEnabled;
|
||||
}
|
||||
|
||||
void MercurialControl::setEnabled(bool enabled)
|
||||
{
|
||||
if (mercurialEnabled != enabled) {
|
||||
mercurialEnabled = enabled;
|
||||
emit enabledChanged(mercurialEnabled);
|
||||
}
|
||||
}
|
||||
|
||||
bool MercurialControl::managesDirectory(const QString &directory) const
|
||||
{
|
||||
QFileInfo dir(directory);
|
||||
return !mercurialClient->findTopLevelForFile(dir).isEmpty();
|
||||
}
|
||||
|
||||
QString MercurialControl::findTopLevelForDirectory(const QString &directory) const
|
||||
{
|
||||
QFileInfo dir(directory);
|
||||
return mercurialClient->findTopLevelForFile(dir);
|
||||
}
|
||||
|
||||
bool MercurialControl::supportsOperation(Operation operation) const
|
||||
{
|
||||
bool supported = true;
|
||||
|
||||
switch (operation) {
|
||||
case Core::IVersionControl::AddOperation:
|
||||
case Core::IVersionControl::DeleteOperation:
|
||||
break;
|
||||
case Core::IVersionControl::OpenOperation:
|
||||
default:
|
||||
supported = false;
|
||||
break;
|
||||
}
|
||||
|
||||
return supported;
|
||||
}
|
||||
|
||||
bool MercurialControl::vcsOpen(const QString &filename)
|
||||
{
|
||||
Q_UNUSED(filename)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MercurialControl::vcsAdd(const QString &filename)
|
||||
{
|
||||
return mercurialClient->add(filename);
|
||||
}
|
||||
|
||||
bool MercurialControl::vcsDelete(const QString &filename)
|
||||
{
|
||||
return mercurialClient->remove(filename);
|
||||
}
|
||||
|
||||
bool MercurialControl::sccManaged(const QString &filename)
|
||||
{
|
||||
return mercurialClient->manifestSync(filename);
|
||||
}
|
||||
41
src/plugins/mercurial/mercurialcontrol.h
Normal file
41
src/plugins/mercurial/mercurialcontrol.h
Normal file
@@ -0,0 +1,41 @@
|
||||
#ifndef MERCURIALCONTROL_H
|
||||
#define MERCURIALCONTROL_H
|
||||
|
||||
#include <coreplugin/iversioncontrol.h>
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
class MercurialClient;
|
||||
|
||||
//Implements just the basics of the Version Control Interface
|
||||
//MercurialClient handles all the work
|
||||
class MercurialControl: public Core::IVersionControl
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit MercurialControl(MercurialClient *mercurialClient);
|
||||
|
||||
QString name() const;
|
||||
bool isEnabled() const;
|
||||
void setEnabled(bool enabled);
|
||||
bool managesDirectory(const QString &filename) const;
|
||||
QString findTopLevelForDirectory(const QString &directory) const;
|
||||
bool supportsOperation(Operation operation) const;
|
||||
bool vcsOpen(const QString &fileName);
|
||||
bool vcsAdd(const QString &filename);
|
||||
bool vcsDelete(const QString &filename);
|
||||
bool sccManaged(const QString &filename);
|
||||
|
||||
signals:
|
||||
void enabledChanged(bool);
|
||||
|
||||
private:
|
||||
MercurialClient *mercurialClient;
|
||||
bool mercurialEnabled;
|
||||
};
|
||||
|
||||
} //namespace Internal
|
||||
} //namespace Mercurial
|
||||
|
||||
#endif // MERCURIALCONTROL_H
|
||||
85
src/plugins/mercurial/mercurialeditor.cpp
Normal file
85
src/plugins/mercurial/mercurialeditor.cpp
Normal file
@@ -0,0 +1,85 @@
|
||||
#include "mercurialeditor.h"
|
||||
#include "annotationhighlighter.h"
|
||||
#include "constants.h"
|
||||
#include "mercurialclient.h"
|
||||
|
||||
#include <coreplugin/editormanager/editormanager.h>
|
||||
#include <vcsbase/diffhighlighter.h>
|
||||
|
||||
#include <QtCore/QSet>
|
||||
#include <QtCore/QString>
|
||||
#include <QtGui/QTextCursor>
|
||||
#include <QtGui/QTextBlock>
|
||||
#include <QtCore/QDir>
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
using namespace Mercurial;
|
||||
|
||||
MercurialEditor::MercurialEditor(const VCSBase::VCSBaseEditorParameters *type, QWidget *parent)
|
||||
: VCSBase::VCSBaseEditor(type, parent),
|
||||
exactIdentifier12(Constants::CHANGEIDEXACT12),
|
||||
exactIdentifier40(Constants::CHANGEIDEXACT40),
|
||||
changesetIdentifier12(Constants::CHANGESETID12),
|
||||
changesetIdentifier40(Constants::CHANGESETID40),
|
||||
diffIdentifier(Constants::DIFFIDENTIFIER)
|
||||
{
|
||||
}
|
||||
|
||||
QSet<QString> MercurialEditor::annotationChanges() const
|
||||
{
|
||||
QSet<QString> changes;
|
||||
const QString data = toPlainText();
|
||||
if (data.isEmpty())
|
||||
return changes;
|
||||
|
||||
int position = 0;
|
||||
while ((position = changesetIdentifier12.indexIn(data, position)) != -1) {
|
||||
changes.insert(changesetIdentifier12.cap(1));
|
||||
position += changesetIdentifier12.matchedLength();
|
||||
}
|
||||
|
||||
return changes;
|
||||
}
|
||||
|
||||
QString MercurialEditor::changeUnderCursor(const QTextCursor &cursorIn) const
|
||||
{
|
||||
QTextCursor cursor = cursorIn;
|
||||
cursor.select(QTextCursor::WordUnderCursor);
|
||||
if (cursor.hasSelection()) {
|
||||
const QString change = cursor.selectedText();
|
||||
if (exactIdentifier12.exactMatch(change))
|
||||
return change;
|
||||
if (exactIdentifier40.exactMatch(change))
|
||||
return change;
|
||||
}
|
||||
return QString();
|
||||
}
|
||||
|
||||
VCSBase::DiffHighlighter *MercurialEditor::createDiffHighlighter() const
|
||||
{
|
||||
return new VCSBase::DiffHighlighter(diffIdentifier);
|
||||
}
|
||||
|
||||
VCSBase::BaseAnnotationHighlighter *MercurialEditor::createAnnotationHighlighter(const QSet<QString> &changes) const
|
||||
{
|
||||
return new MercurialAnnotationHighlighter(changes);
|
||||
}
|
||||
|
||||
QString MercurialEditor::fileNameFromDiffSpecification(const QTextBlock &diffFileSpec) const
|
||||
{
|
||||
QString filechangeId("+++ b/");
|
||||
QTextBlock::iterator iterator;
|
||||
for (iterator = diffFileSpec.begin(); !(iterator.atEnd()); iterator++) {
|
||||
QTextFragment fragment = iterator.fragment();
|
||||
if(fragment.isValid()) {
|
||||
if (fragment.text().startsWith(filechangeId)) {
|
||||
QFileInfo sourceFile(source());
|
||||
QDir repository(MercurialClient::findTopLevelForFile(sourceFile));
|
||||
QString filename = fragment.text().remove(0, filechangeId.size());
|
||||
return repository.absoluteFilePath(filename);
|
||||
}
|
||||
}
|
||||
}
|
||||
return QString();
|
||||
}
|
||||
32
src/plugins/mercurial/mercurialeditor.h
Normal file
32
src/plugins/mercurial/mercurialeditor.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#ifndef MERCURIALEDITOR_H
|
||||
#define MERCURIALEDITOR_H
|
||||
|
||||
#include <vcsbase/vcsbaseeditor.h>
|
||||
|
||||
#include <QtCore/QRegExp>
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
class MercurialEditor : public VCSBase::VCSBaseEditor
|
||||
{
|
||||
public:
|
||||
explicit MercurialEditor(const VCSBase::VCSBaseEditorParameters *type, QWidget *parent);
|
||||
|
||||
private:
|
||||
virtual QSet<QString> annotationChanges() const;
|
||||
virtual QString changeUnderCursor(const QTextCursor &cursor) const;
|
||||
virtual VCSBase::DiffHighlighter *createDiffHighlighter() const;
|
||||
virtual VCSBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes) const;
|
||||
virtual QString fileNameFromDiffSpecification(const QTextBlock &diffFileSpec) const;
|
||||
|
||||
const QRegExp exactIdentifier12;
|
||||
const QRegExp exactIdentifier40;
|
||||
const QRegExp changesetIdentifier12;
|
||||
const QRegExp changesetIdentifier40;
|
||||
const QRegExp diffIdentifier;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Mercurial
|
||||
#endif // MERCURIALEDITOR_H
|
||||
176
src/plugins/mercurial/mercurialjobrunner.cpp
Normal file
176
src/plugins/mercurial/mercurialjobrunner.cpp
Normal file
@@ -0,0 +1,176 @@
|
||||
#include "mercurialjobrunner.h"
|
||||
#include "mercurialplugin.h"
|
||||
#include "mercurialoutputwindow.h"
|
||||
#include "constants.h"
|
||||
#include "mercurialsettings.h"
|
||||
|
||||
#include <vcsbase/vcsbaseeditor.h>
|
||||
|
||||
#include <QtCore/QProcess>
|
||||
#include <QtCore/QTime>
|
||||
#include <QtCore/QString>
|
||||
#include <QtCore/QSettings>
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
using namespace Mercurial;
|
||||
|
||||
HgTask::HgTask(const QString &repositoryRoot, QStringList &arguments, bool emitRaw)
|
||||
: m_repositoryRoot(repositoryRoot),
|
||||
arguments(arguments),
|
||||
emitRaw(emitRaw),
|
||||
editor(0)
|
||||
{
|
||||
}
|
||||
|
||||
HgTask::HgTask(const QString &repositoryRoot, QStringList &arguments, VCSBase::VCSBaseEditor *editor)
|
||||
: m_repositoryRoot(repositoryRoot),
|
||||
arguments(arguments),
|
||||
emitRaw(false),
|
||||
editor(editor)
|
||||
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
MercurialJobRunner::MercurialJobRunner()
|
||||
: keepRunning(true)
|
||||
{
|
||||
plugin = MercurialPlugin::instance();
|
||||
connect(this, SIGNAL(error(const QByteArray &)), plugin->outputPane(), SLOT(append(const QByteArray &)));
|
||||
connect(this, SIGNAL(info(const QString &)), plugin->outputPane(), SLOT(append(const QString &)));
|
||||
}
|
||||
|
||||
MercurialJobRunner::~MercurialJobRunner()
|
||||
{
|
||||
stop();
|
||||
}
|
||||
|
||||
void MercurialJobRunner::stop()
|
||||
{
|
||||
mutex.lock();
|
||||
keepRunning = false;
|
||||
//Create a dummy task to break the cycle
|
||||
QSharedPointer<HgTask> job(0);
|
||||
jobs.enqueue(job);
|
||||
waiter.wakeAll();
|
||||
mutex.unlock();
|
||||
|
||||
wait();
|
||||
}
|
||||
|
||||
void MercurialJobRunner::restart()
|
||||
{
|
||||
stop();
|
||||
mutex.lock();
|
||||
keepRunning = true;
|
||||
mutex.unlock();
|
||||
start();
|
||||
}
|
||||
|
||||
void MercurialJobRunner::getSettings()
|
||||
{
|
||||
MercurialSettings *settings = MercurialPlugin::instance()->settings();
|
||||
binary = settings->binary();
|
||||
timeout = settings->timeout();
|
||||
standardArguments = settings->standardArguments();
|
||||
}
|
||||
|
||||
void MercurialJobRunner::enqueueJob(QSharedPointer<HgTask> &job)
|
||||
{
|
||||
mutex.lock();
|
||||
jobs.enqueue(job);
|
||||
waiter.wakeAll();
|
||||
mutex.unlock();
|
||||
}
|
||||
|
||||
void MercurialJobRunner::run()
|
||||
{
|
||||
getSettings();
|
||||
forever {
|
||||
mutex.lock();
|
||||
while (jobs.count() == 0)
|
||||
waiter.wait(&mutex);
|
||||
|
||||
if (!keepRunning) {
|
||||
jobs.clear();
|
||||
mutex.unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
QSharedPointer<HgTask> job = jobs.dequeue();
|
||||
mutex.unlock();
|
||||
|
||||
task(job);
|
||||
}
|
||||
}
|
||||
|
||||
void MercurialJobRunner::task(QSharedPointer<HgTask> &job)
|
||||
{
|
||||
HgTask *taskData = job.data();
|
||||
|
||||
if (taskData->shouldEmit())
|
||||
//Call the job's signal so the Initator of the job can process the data
|
||||
//Because the QSharedPointer that holds the HgTask will go out of scope and hence be deleted
|
||||
//we have to block and wait until the signal is delivered
|
||||
connect(this, SIGNAL(output(const QByteArray&)), taskData, SIGNAL(rawData(const QByteArray&)),
|
||||
Qt::BlockingQueuedConnection);
|
||||
else if (taskData->displayEditor())
|
||||
//An editor has been created to display the data so send it there
|
||||
connect(this, SIGNAL(output(const QByteArray&)), taskData->displayEditor(), SLOT(setPlainTextData(const QByteArray&)));
|
||||
else
|
||||
//Just output the data to the Mercurial output window
|
||||
connect(this, SIGNAL(output(const QByteArray &)), plugin->outputPane(), SLOT(append(const QByteArray &)));
|
||||
|
||||
QString time = QTime::currentTime().toString(QLatin1String("HH:mm"));
|
||||
QString starting = tr("%1 Calling: %2 %3\n").arg(time, "hg", taskData->args().join(" "));
|
||||
|
||||
//infom the user of what we are going to try and perform
|
||||
emit info(starting);
|
||||
|
||||
if (Constants::debug)
|
||||
qDebug() << Q_FUNC_INFO << "Repository root is " << taskData->repositoryRoot();
|
||||
|
||||
QProcess hgProcess;
|
||||
hgProcess.setWorkingDirectory(taskData->repositoryRoot());
|
||||
|
||||
QStringList args = standardArguments;
|
||||
args << taskData->args();
|
||||
|
||||
hgProcess.start(binary, args);
|
||||
|
||||
if (!hgProcess.waitForStarted()) {
|
||||
QByteArray errorArray(Constants::ERRORSTARTING);
|
||||
emit error(errorArray);
|
||||
return;
|
||||
}
|
||||
|
||||
hgProcess.closeWriteChannel();
|
||||
|
||||
if (!hgProcess.waitForFinished(timeout)) {
|
||||
hgProcess.terminate();
|
||||
QByteArray errorArray(Constants::TIMEDOUT);
|
||||
emit error(errorArray);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((hgProcess.exitStatus() == QProcess::NormalExit) && (hgProcess.exitCode() == 0)) {
|
||||
QByteArray stdout = hgProcess.readAllStandardOutput();
|
||||
/*
|
||||
* sometimes success means output is actually on error channel (stderr)
|
||||
* e.g. "hg revert" outputs "no changes needed to 'file'" on stderr if file has not changed
|
||||
* from revision specified
|
||||
*/
|
||||
if (stdout == "")
|
||||
stdout = hgProcess.readAllStandardError();
|
||||
emit output(stdout);
|
||||
} else {
|
||||
QByteArray stderr = hgProcess.readAllStandardError();
|
||||
emit error(stderr);
|
||||
}
|
||||
|
||||
hgProcess.close();
|
||||
//the signal connection is to last only for the duration of a job/task. next time a new
|
||||
//output signal connection must be made
|
||||
disconnect(this, SIGNAL(output(const QByteArray &)), 0, 0);
|
||||
}
|
||||
79
src/plugins/mercurial/mercurialjobrunner.h
Normal file
79
src/plugins/mercurial/mercurialjobrunner.h
Normal file
@@ -0,0 +1,79 @@
|
||||
#ifndef MERCURIALJOBRUNNER_H
|
||||
#define MERCURIALJOBRUNNER_H
|
||||
|
||||
#include <QtCore/QThread>
|
||||
#include <QtCore/QQueue>
|
||||
#include <QtCore/QMutex>
|
||||
#include <QtCore/QWaitCondition>
|
||||
#include <QtCore/QStringList>
|
||||
#include <QtCore/QSharedPointer>
|
||||
#include <QtCore/QString>
|
||||
|
||||
namespace VCSBase {
|
||||
class VCSBaseEditor;
|
||||
}
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
class MercurialPlugin;
|
||||
|
||||
class HgTask : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
HgTask(const QString &workingDir, QStringList &arguments, bool emitRaw=false);
|
||||
HgTask(const QString &workingDir, QStringList &arguments,
|
||||
VCSBase::VCSBaseEditor *editor);
|
||||
|
||||
bool shouldEmit() { return emitRaw; }
|
||||
VCSBase::VCSBaseEditor* displayEditor() { return editor; }
|
||||
QStringList args() { return arguments; }
|
||||
QString repositoryRoot() { return m_repositoryRoot; }
|
||||
|
||||
signals:
|
||||
void rawData(const QByteArray &data);
|
||||
|
||||
private:
|
||||
QString m_repositoryRoot;
|
||||
QStringList arguments;
|
||||
bool emitRaw;
|
||||
VCSBase::VCSBaseEditor *editor;
|
||||
};
|
||||
|
||||
|
||||
class MercurialJobRunner : public QThread
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MercurialJobRunner();
|
||||
~MercurialJobRunner();
|
||||
void enqueueJob(QSharedPointer<HgTask> &job);
|
||||
void restart();
|
||||
|
||||
protected:
|
||||
void run();
|
||||
|
||||
signals:
|
||||
void error(const QByteArray &error);
|
||||
void info(const QString ¬ice);
|
||||
void output(const QByteArray &output);
|
||||
|
||||
private:
|
||||
void task(QSharedPointer<HgTask> &job);
|
||||
void stop();
|
||||
void getSettings();
|
||||
|
||||
QQueue<QSharedPointer<HgTask> > jobs;
|
||||
QMutex mutex;
|
||||
QWaitCondition waiter;
|
||||
MercurialPlugin *plugin;
|
||||
bool keepRunning;
|
||||
QString binary;
|
||||
QStringList standardArguments;
|
||||
int timeout;
|
||||
};
|
||||
|
||||
} //namespace Internal
|
||||
} //namespace Mercurial
|
||||
#endif // MERCURIALJOBRUNNER_H
|
||||
102
src/plugins/mercurial/mercurialoutputwindow.cpp
Normal file
102
src/plugins/mercurial/mercurialoutputwindow.cpp
Normal file
@@ -0,0 +1,102 @@
|
||||
#include "mercurialoutputwindow.h"
|
||||
|
||||
#include <QtGui/QListWidget>
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QTextCodec>
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
|
||||
MercurialOutputWindow::MercurialOutputWindow()
|
||||
{
|
||||
outputListWidgets = new QListWidget;
|
||||
outputListWidgets->setWindowTitle(tr("Mercurial Output"));
|
||||
outputListWidgets->setFrameStyle(QFrame::NoFrame);
|
||||
outputListWidgets->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
}
|
||||
|
||||
MercurialOutputWindow::~MercurialOutputWindow()
|
||||
{
|
||||
delete outputListWidgets;
|
||||
outputListWidgets = 0;
|
||||
}
|
||||
|
||||
QWidget *MercurialOutputWindow::outputWidget(QWidget *parent)
|
||||
{
|
||||
outputListWidgets->setParent(parent);
|
||||
return outputListWidgets;
|
||||
}
|
||||
|
||||
QList<QWidget*> MercurialOutputWindow::toolBarWidgets() const
|
||||
{
|
||||
return QList<QWidget *>();
|
||||
}
|
||||
|
||||
QString MercurialOutputWindow::name() const
|
||||
{
|
||||
return tr("Mercurial");
|
||||
}
|
||||
|
||||
int MercurialOutputWindow::priorityInStatusBar() const
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
void MercurialOutputWindow::clearContents()
|
||||
{
|
||||
outputListWidgets->clear();
|
||||
}
|
||||
|
||||
void MercurialOutputWindow::visibilityChanged(bool visible)
|
||||
{
|
||||
if (visible)
|
||||
outputListWidgets->setFocus();
|
||||
}
|
||||
|
||||
void MercurialOutputWindow::setFocus()
|
||||
{
|
||||
}
|
||||
|
||||
bool MercurialOutputWindow::hasFocus()
|
||||
{
|
||||
return outputListWidgets->hasFocus();
|
||||
}
|
||||
|
||||
bool MercurialOutputWindow::canFocus()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MercurialOutputWindow::canNavigate()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MercurialOutputWindow::canNext()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MercurialOutputWindow::canPrevious()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void MercurialOutputWindow::goToNext()
|
||||
{
|
||||
}
|
||||
|
||||
void MercurialOutputWindow::goToPrev()
|
||||
{
|
||||
}
|
||||
|
||||
void MercurialOutputWindow::append(const QString &text)
|
||||
{
|
||||
outputListWidgets->addItems(text.split(QLatin1Char('\n')));
|
||||
outputListWidgets->scrollToBottom();
|
||||
popup(true);
|
||||
}
|
||||
|
||||
void MercurialOutputWindow::append(const QByteArray &array)
|
||||
{
|
||||
append(QTextCodec::codecForLocale()->toUnicode(array));
|
||||
}
|
||||
49
src/plugins/mercurial/mercurialoutputwindow.h
Normal file
49
src/plugins/mercurial/mercurialoutputwindow.h
Normal file
@@ -0,0 +1,49 @@
|
||||
#ifndef MERCURIALOUTPUTWINDOW_H
|
||||
#define MERCURIALOUTPUTWINDOW_H
|
||||
|
||||
#include <coreplugin/ioutputpane.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QListWidget;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#include <QtCore/QByteArray>
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
class MercurialOutputWindow: public Core::IOutputPane
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MercurialOutputWindow();
|
||||
~MercurialOutputWindow();
|
||||
|
||||
QWidget *outputWidget(QWidget *parent);
|
||||
QList<QWidget*> toolBarWidgets() const;
|
||||
QString name() const;
|
||||
int priorityInStatusBar() const;
|
||||
void clearContents();
|
||||
void visibilityChanged(bool visible);
|
||||
void setFocus();
|
||||
bool hasFocus();
|
||||
bool canFocus();
|
||||
bool canNavigate();
|
||||
bool canNext();
|
||||
bool canPrevious();
|
||||
void goToNext();
|
||||
void goToPrev();
|
||||
|
||||
public slots:
|
||||
void append(const QString &text);
|
||||
void append(const QByteArray &array);
|
||||
|
||||
private:
|
||||
QListWidget *outputListWidgets;
|
||||
};
|
||||
|
||||
} //namespace Internal
|
||||
} //namespace Mercurial
|
||||
|
||||
#endif // MERCURIALOUTPUTWINDOW_H
|
||||
669
src/plugins/mercurial/mercurialplugin.cpp
Normal file
669
src/plugins/mercurial/mercurialplugin.cpp
Normal file
@@ -0,0 +1,669 @@
|
||||
#include "mercurialplugin.h"
|
||||
#include "optionspage.h"
|
||||
#include "mercurialoutputwindow.h"
|
||||
#include "constants.h"
|
||||
#include "mercurialclient.h"
|
||||
#include "mercurialcontrol.h"
|
||||
#include "mercurialeditor.h"
|
||||
#include "revertdialog.h"
|
||||
#include "srcdestdialog.h"
|
||||
#include "commiteditor.h"
|
||||
#include "clonewizard.h"
|
||||
#include "mercurialsettings.h"
|
||||
|
||||
#include <coreplugin/actionmanager/actionmanager.h>
|
||||
#include <coreplugin/basemode.h>
|
||||
#include <coreplugin/coreconstants.h>
|
||||
#include <coreplugin/icore.h>
|
||||
#include <coreplugin/modemanager.h>
|
||||
#include <coreplugin/uniqueidmanager.h>
|
||||
#include <coreplugin/filemanager.h>
|
||||
#include <coreplugin/editormanager/editormanager.h>
|
||||
|
||||
|
||||
#include <projectexplorer/projectexplorer.h>
|
||||
#include <utils/parameteraction.h>
|
||||
|
||||
#include <vcsbase/basevcseditorfactory.h>
|
||||
#include <vcsbase/basevcssubmiteditorfactory.h>
|
||||
#include <vcsbase/vcsbaseeditor.h>
|
||||
|
||||
#include <QtCore/QtPlugin>
|
||||
#include <QtGui/QAction>
|
||||
#include <QtGui/QMenu>
|
||||
#include <QtGui/QMainWindow>
|
||||
#include <QtCore/QtDebug>
|
||||
#include <QtCore/QtGlobal>
|
||||
#include <QtCore/QDir>
|
||||
#include <QtGui/QDialog>
|
||||
#include <QtGui/QFileDialog>
|
||||
#include <QtCore/QTemporaryFile>
|
||||
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
using namespace Mercurial;
|
||||
|
||||
bool ListenForClose::editorAboutToClose(Core::IEditor *editor)
|
||||
{
|
||||
return MercurialPlugin::instance()->closeEditor(editor);
|
||||
}
|
||||
|
||||
static const VCSBase::VCSBaseEditorParameters editorParameters[] = {
|
||||
{
|
||||
VCSBase::RegularCommandOutput, //type
|
||||
Constants::COMMANDLOG, // kind
|
||||
Constants::COMMANDLOG, // context
|
||||
Constants::COMMANDAPP, // mime type
|
||||
Constants::COMMANDEXT}, //extension
|
||||
|
||||
{ VCSBase::LogOutput,
|
||||
Constants::FILELOG,
|
||||
Constants::FILELOG,
|
||||
Constants::LOGAPP,
|
||||
Constants::LOGEXT},
|
||||
|
||||
{ VCSBase::AnnotateOutput,
|
||||
Constants::ANNOTATELOG,
|
||||
Constants::ANNOTATELOG,
|
||||
Constants::ANNOTATEAPP,
|
||||
Constants::ANNOTATEEXT},
|
||||
|
||||
{ VCSBase::DiffOutput,
|
||||
Constants::DIFFLOG,
|
||||
Constants::DIFFLOG,
|
||||
Constants::DIFFAPP,
|
||||
Constants::DIFFEXT}
|
||||
};
|
||||
|
||||
static const VCSBase::VCSBaseSubmitEditorParameters submitEditorParameters = {
|
||||
Constants::COMMITMIMETYPE,
|
||||
Constants::COMMITKIND,
|
||||
Constants::COMMITKIND
|
||||
};
|
||||
|
||||
// Utility to find a parameter set by type
|
||||
static inline const VCSBase::VCSBaseEditorParameters *findType(int ie)
|
||||
{
|
||||
const VCSBase::EditorContentType et = static_cast<VCSBase::EditorContentType>(ie);
|
||||
return VCSBase::VCSBaseEditor::findType(editorParameters,
|
||||
sizeof(editorParameters)/sizeof(VCSBase::VCSBaseEditorParameters), et);
|
||||
}
|
||||
|
||||
MercurialPlugin *MercurialPlugin::m_instance = 0;
|
||||
|
||||
MercurialPlugin::MercurialPlugin()
|
||||
: mercurialSettings(new MercurialSettings),
|
||||
outputWindow(0),
|
||||
optionsPage(0),
|
||||
client(0),
|
||||
mercurialVC(0),
|
||||
projectExplorer(0),
|
||||
changeLog(0)
|
||||
{
|
||||
m_instance = this;
|
||||
}
|
||||
|
||||
MercurialPlugin::~MercurialPlugin()
|
||||
{
|
||||
if (client) {
|
||||
delete client;
|
||||
client = 0;
|
||||
}
|
||||
|
||||
if (mercurialSettings) {
|
||||
delete mercurialSettings;
|
||||
mercurialSettings = 0;
|
||||
}
|
||||
|
||||
deleteCommitLog();
|
||||
|
||||
m_instance = 0;
|
||||
}
|
||||
|
||||
bool MercurialPlugin::initialize(const QStringList &arguments, QString *error_message)
|
||||
{
|
||||
Q_UNUSED(arguments)
|
||||
Q_UNUSED(error_message)
|
||||
|
||||
typedef VCSBase::VCSEditorFactory<MercurialEditor> MercurialEditorFactory;
|
||||
|
||||
core = Core::ICore::instance();
|
||||
actionManager = core->actionManager();
|
||||
|
||||
optionsPage = new OptionsPage();
|
||||
addAutoReleasedObject(optionsPage);
|
||||
|
||||
outputWindow = new MercurialOutputWindow();
|
||||
addAutoReleasedObject(outputWindow);
|
||||
|
||||
client = new MercurialClient();
|
||||
connect(optionsPage, SIGNAL(settingsChanged()), client, SLOT(settingsChanged()));
|
||||
|
||||
mercurialVC = new MercurialControl(client);
|
||||
addAutoReleasedObject(mercurialVC);
|
||||
|
||||
static const char *describeSlot = SLOT(view(QString,QString));
|
||||
const int editorCount = sizeof(editorParameters)/sizeof(VCSBase::VCSBaseEditorParameters);
|
||||
for (int i = 0; i < editorCount; i++)
|
||||
addAutoReleasedObject(new MercurialEditorFactory(editorParameters + i, client, describeSlot));
|
||||
|
||||
addAutoReleasedObject(new VCSBase::VCSSubmitEditorFactory<CommitEditor>(&submitEditorParameters));
|
||||
|
||||
addAutoReleasedObject(new CloneWizard);
|
||||
|
||||
addAutoReleasedObject(new ListenForClose);
|
||||
|
||||
createMenu();
|
||||
|
||||
createSubmitEditorActions();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void MercurialPlugin::extensionsInitialized()
|
||||
{
|
||||
projectExplorer = ProjectExplorer::ProjectExplorerPlugin::instance();
|
||||
if (projectExplorer)
|
||||
connect(projectExplorer, SIGNAL(currentProjectChanged(ProjectExplorer::Project *)),
|
||||
this, SLOT(currentProjectChanged(ProjectExplorer::Project *)));
|
||||
}
|
||||
|
||||
MercurialOutputWindow *MercurialPlugin::outputPane()
|
||||
{
|
||||
return outputWindow;
|
||||
}
|
||||
|
||||
MercurialSettings *MercurialPlugin::settings()
|
||||
{
|
||||
return mercurialSettings;
|
||||
}
|
||||
|
||||
void MercurialPlugin::createMenu()
|
||||
{
|
||||
QList<int> context = QList<int>()<< core->uniqueIDManager()->uniqueIdentifier(Core::Constants::C_GLOBAL);
|
||||
|
||||
// Create menu item for Mercurial
|
||||
mercurialContainer = actionManager->createMenu("Mercurial.MercurialMenu");
|
||||
QMenu *menu = mercurialContainer->menu();
|
||||
menu->setTitle(tr("Mercurial"));
|
||||
|
||||
if (QAction *visibleAction = menu->menuAction()) {
|
||||
visibleAction->setEnabled(mercurialVC->isEnabled());
|
||||
connect(mercurialVC, SIGNAL(enabledChanged(bool)), visibleAction, SLOT(setVisible(bool)));
|
||||
}
|
||||
|
||||
createFileActions(context);
|
||||
createSeparator(context, "FileDirSeperator");
|
||||
createDirectoryActions(context);
|
||||
createSeparator(context, "DirRepoSeperator");
|
||||
createRepositoryActions(context);
|
||||
createSeparator(context, "Repository Management");
|
||||
createRepositoryManagementActions(context);
|
||||
createSeparator(context, "LessUsedfunctionality");
|
||||
createLessUsedActions(context);
|
||||
|
||||
// Request the Tools menu and add the Mercurial menu to it
|
||||
Core::ActionContainer *toolsMenu = actionManager->actionContainer(Core::Constants::M_TOOLS);
|
||||
toolsMenu->addMenu(mercurialContainer);
|
||||
|
||||
connect(core, SIGNAL(contextChanged(Core::IContext *)), this, SLOT(updateActions()));
|
||||
connect(core->fileManager(), SIGNAL(currentFileChanged(const QString &)),
|
||||
this, SLOT(updateActions()));
|
||||
|
||||
}
|
||||
|
||||
void MercurialPlugin::createFileActions(QList<int> &context)
|
||||
{
|
||||
Core::Command *command;
|
||||
|
||||
annotateFile = new Core::Utils::ParameterAction(tr("Annotate Current File"), tr("Annotate \"%1\""), Core::Utils::ParameterAction::AlwaysEnabled, this);
|
||||
command = actionManager->registerAction(annotateFile, Constants::ANNOTATE, context);
|
||||
command->setAttribute(Core::Command::CA_UpdateText);
|
||||
connect(annotateFile, SIGNAL(triggered()), this, SLOT(annotateCurrentFile()));
|
||||
mercurialContainer->addAction(command);
|
||||
|
||||
diffFile = new Core::Utils::ParameterAction(tr("Diff Current File"), tr("Diff \"%1\""), Core::Utils::ParameterAction::AlwaysEnabled, this);
|
||||
command = actionManager->registerAction(diffFile, Constants::DIFF, context);
|
||||
command->setAttribute(Core::Command::CA_UpdateText);
|
||||
command->setDefaultKeySequence(QKeySequence(tr(Constants::MENUKEY) + tr(Constants::MODIFIER) + "D"));
|
||||
connect(diffFile, SIGNAL(triggered()), this, SLOT(diffCurrentFile()));
|
||||
mercurialContainer->addAction(command);
|
||||
|
||||
logFile = new Core::Utils::ParameterAction(tr("Log Current File"), tr("Log \"%1\""), Core::Utils::ParameterAction::AlwaysEnabled, this);
|
||||
command = actionManager->registerAction(logFile, Constants::LOG, context);
|
||||
command->setAttribute(Core::Command::CA_UpdateText);
|
||||
command->setDefaultKeySequence(QKeySequence(tr(Constants::MENUKEY) + tr(Constants::MODIFIER) + "L"));
|
||||
connect(logFile, SIGNAL(triggered()), this, SLOT(logCurrentFile()));
|
||||
mercurialContainer->addAction(command);
|
||||
|
||||
revertFile = new Core::Utils::ParameterAction(tr("Revert Current File"), tr("Revert \"%1\""), Core::Utils::ParameterAction::AlwaysEnabled, this);
|
||||
command = actionManager->registerAction(revertFile, Constants::REVERT, context);
|
||||
command->setAttribute(Core::Command::CA_UpdateText);
|
||||
connect(revertFile, SIGNAL(triggered()), this, SLOT(revertCurrentFile()));
|
||||
mercurialContainer->addAction(command);
|
||||
|
||||
statusFile = new Core::Utils::ParameterAction(tr("Status Current File"), tr("Status \"%1\""), Core::Utils::ParameterAction::AlwaysEnabled, this);
|
||||
command = actionManager->registerAction(statusFile, Constants::STATUS, context);
|
||||
command->setAttribute(Core::Command::CA_UpdateText);
|
||||
command->setDefaultKeySequence(QKeySequence(tr(Constants::MENUKEY) + tr(Constants::MODIFIER) + "S"));
|
||||
connect(statusFile, SIGNAL(triggered()), this, SLOT(statusCurrentFile()));
|
||||
mercurialContainer->addAction(command);
|
||||
}
|
||||
|
||||
void MercurialPlugin::annotateCurrentFile()
|
||||
{
|
||||
client->annotate(currentFile());
|
||||
}
|
||||
|
||||
void MercurialPlugin::diffCurrentFile()
|
||||
{
|
||||
client->diff(currentFile());
|
||||
}
|
||||
|
||||
void MercurialPlugin::logCurrentFile()
|
||||
{
|
||||
client->log(currentFile());
|
||||
}
|
||||
|
||||
void MercurialPlugin::revertCurrentFile()
|
||||
{
|
||||
RevertDialog reverter;
|
||||
if (reverter.exec() != QDialog::Accepted)
|
||||
return;
|
||||
const QString revision = reverter.m_ui->revisionLineEdit->text();
|
||||
client->revert(currentFile(), revision);
|
||||
}
|
||||
|
||||
void MercurialPlugin::statusCurrentFile()
|
||||
{
|
||||
client->status(currentFile());
|
||||
}
|
||||
|
||||
void MercurialPlugin::createDirectoryActions(QList<int> &context)
|
||||
{
|
||||
QAction *action;
|
||||
Core::Command *command;
|
||||
|
||||
action = new QAction(tr("Diff"), this);
|
||||
actionList.append(action);
|
||||
command = actionManager->registerAction(action, Constants::DIFFMULTI, context);
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(diffRepository()));
|
||||
mercurialContainer->addAction(command);
|
||||
|
||||
action = new QAction(tr("Log"), this);
|
||||
actionList.append(action);
|
||||
command = actionManager->registerAction(action, Constants::LOGMULTI, context);
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(logRepository()));
|
||||
mercurialContainer->addAction(command);
|
||||
|
||||
action = new QAction(tr("Revert"), this);
|
||||
actionList.append(action);
|
||||
command = actionManager->registerAction(action, Constants::REVERTMULTI, context);
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(revertMulti()));
|
||||
mercurialContainer->addAction(command);
|
||||
|
||||
action = new QAction(tr("Status"), this);
|
||||
actionList.append(action);
|
||||
command = actionManager->registerAction(action, Constants::STATUSMULTI, context);
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(statusMulti()));
|
||||
mercurialContainer->addAction(command);
|
||||
}
|
||||
|
||||
void MercurialPlugin::diffRepository()
|
||||
{
|
||||
client->diff(currentProjectRoot());
|
||||
}
|
||||
|
||||
void MercurialPlugin::logRepository()
|
||||
{
|
||||
client->log(currentProjectRoot());
|
||||
}
|
||||
|
||||
void MercurialPlugin::revertMulti()
|
||||
{
|
||||
RevertDialog reverter;
|
||||
if (reverter.exec() != QDialog::Accepted)
|
||||
return;
|
||||
const QString revision = reverter.m_ui->revisionLineEdit->text();
|
||||
client->revert(currentProjectRoot(), revision);
|
||||
}
|
||||
|
||||
void MercurialPlugin::statusMulti()
|
||||
{
|
||||
client->status(currentProjectRoot());
|
||||
}
|
||||
|
||||
void MercurialPlugin::createRepositoryActions(QList<int> &context)
|
||||
{
|
||||
QAction *action = new QAction(tr("Pull"), this);
|
||||
actionList.append(action);
|
||||
Core::Command *command = actionManager->registerAction(action, Constants::PULL, context);
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(pull()));
|
||||
mercurialContainer->addAction(command);
|
||||
|
||||
action = new QAction(tr("Push"), this);
|
||||
actionList.append(action);
|
||||
command = actionManager->registerAction(action, Constants::PUSH, context);
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(push()));
|
||||
mercurialContainer->addAction(command);
|
||||
|
||||
action = new QAction(tr("Update"), this);
|
||||
actionList.append(action);
|
||||
command = actionManager->registerAction(action, Constants::UPDATE, context);
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(update()));
|
||||
mercurialContainer->addAction(command);
|
||||
|
||||
action = new QAction(tr("Import"), this);
|
||||
actionList.append(action);
|
||||
command = actionManager->registerAction(action, Constants::IMPORT, context);
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(import()));
|
||||
mercurialContainer->addAction(command);
|
||||
|
||||
action = new QAction(tr("Incoming"), this);
|
||||
actionList.append(action);
|
||||
command = actionManager->registerAction(action, Constants::INCOMING, context);
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(incoming()));
|
||||
mercurialContainer->addAction(command);
|
||||
|
||||
action = new QAction(tr("Outgoing"), this);
|
||||
actionList.append(action);
|
||||
command = actionManager->registerAction(action, Constants::OUTGOING, context);
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(outgoing()));
|
||||
mercurialContainer->addAction(command);
|
||||
|
||||
action = new QAction(tr("Commit"), this);
|
||||
actionList.append(action);
|
||||
command = actionManager->registerAction(action, Constants::COMMIT, context);
|
||||
command->setDefaultKeySequence(QKeySequence(tr(Constants::MENUKEY) + tr(Constants::MODIFIER) + "C"));
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(commit()));
|
||||
mercurialContainer->addAction(command);
|
||||
}
|
||||
|
||||
void MercurialPlugin::pull()
|
||||
{
|
||||
SrcDestDialog dialog;
|
||||
dialog.setWindowTitle("Pull Source");
|
||||
if (dialog.exec() != QDialog::Accepted)
|
||||
return;
|
||||
QString repository = dialog.getRepositoryString();
|
||||
client->pull(currentProjectRoot(), repository);
|
||||
}
|
||||
|
||||
void MercurialPlugin::push()
|
||||
{
|
||||
SrcDestDialog dialog;
|
||||
dialog.setWindowTitle("Push Destination");
|
||||
if (dialog.exec() != QDialog::Accepted)
|
||||
return;
|
||||
QString repository = dialog.getRepositoryString();
|
||||
client->push(currentProjectRoot(), repository);
|
||||
}
|
||||
|
||||
void MercurialPlugin::update()
|
||||
{
|
||||
RevertDialog updateDialog;
|
||||
updateDialog.setWindowTitle("Update");
|
||||
if (updateDialog.exec() != QDialog::Accepted)
|
||||
return;
|
||||
const QString revision = updateDialog.m_ui->revisionLineEdit->text();
|
||||
client->update(currentProjectRoot(), revision);
|
||||
}
|
||||
|
||||
void MercurialPlugin::import()
|
||||
{
|
||||
QFileDialog importDialog;
|
||||
importDialog.setFileMode(QFileDialog::ExistingFiles);
|
||||
importDialog.setViewMode(QFileDialog::Detail);
|
||||
|
||||
if (importDialog.exec() != QDialog::Accepted)
|
||||
return;
|
||||
|
||||
const QStringList fileNames = importDialog.selectedFiles();
|
||||
client->import(currentProjectRoot(), fileNames);
|
||||
}
|
||||
|
||||
void MercurialPlugin::incoming()
|
||||
{
|
||||
SrcDestDialog dialog;
|
||||
dialog.setWindowTitle("Incoming Source");
|
||||
if (dialog.exec() != QDialog::Accepted)
|
||||
return;
|
||||
QString repository = dialog.getRepositoryString();
|
||||
client->incoming(currentProjectRoot(), repository);
|
||||
}
|
||||
|
||||
void MercurialPlugin::outgoing()
|
||||
{
|
||||
client->outgoing(currentProjectRoot());
|
||||
}
|
||||
|
||||
void MercurialPlugin::createSubmitEditorActions()
|
||||
{
|
||||
QList<int> context = QList<int>()<< core->uniqueIDManager()->uniqueIdentifier(Constants::COMMITKIND);
|
||||
Core::Command *command;
|
||||
|
||||
editorCommit = new QAction(VCSBase::VCSBaseSubmitEditor::submitIcon(), tr("Commit"), this);
|
||||
command = actionManager->registerAction(editorCommit, Constants::COMMIT, context);
|
||||
connect(editorCommit, SIGNAL(triggered()), this, SLOT(commitFromEditor()));
|
||||
|
||||
editorDiff = new QAction(VCSBase::VCSBaseSubmitEditor::diffIcon(), tr("Diff Selected Files"), this);
|
||||
command = actionManager->registerAction(editorDiff, Constants::DIFFEDITOR, context);
|
||||
|
||||
editorUndo = new QAction(tr("&Undo"), this);
|
||||
command = actionManager->registerAction(editorUndo, Core::Constants::UNDO, context);
|
||||
|
||||
editorRedo = new QAction(tr("&Redo"), this);
|
||||
command = actionManager->registerAction(editorRedo, Core::Constants::REDO, context);
|
||||
}
|
||||
|
||||
void MercurialPlugin::commit()
|
||||
{
|
||||
if (VCSBase::VCSBaseSubmitEditor::raiseSubmitEditor())
|
||||
return;
|
||||
|
||||
connect(client, SIGNAL(parsedStatus(const QList<QPair<QString,QString> > &)),
|
||||
this, SLOT(showCommitWidget(const QList<QPair<QString,QString> > &)));
|
||||
client->statusWithSignal(currentProjectRoot());
|
||||
}
|
||||
|
||||
void MercurialPlugin::showCommitWidget(const QList<QPair<QString, QString> > &status)
|
||||
{
|
||||
//Once we receive our data release the connection so it can be reused elsewhere
|
||||
disconnect(client, SIGNAL(parsedStatus(const QList<QPair<QString,QString> > &)),
|
||||
this, SLOT(showCommitWidget(const QList<QPair<QString,QString> > &)));
|
||||
|
||||
if (status.isEmpty()) {
|
||||
outputWindow->append(tr("There are no changes to commit"));
|
||||
return;
|
||||
}
|
||||
|
||||
deleteCommitLog();
|
||||
|
||||
changeLog = new QTemporaryFile(this);
|
||||
if (!changeLog->open()) {
|
||||
outputWindow->append(tr("Unable to generate a Tempory File for the Commit Editor"));
|
||||
return;
|
||||
}
|
||||
|
||||
Core::IEditor *editor = core->editorManager()->openEditor(changeLog->fileName(),
|
||||
Constants::COMMITKIND);
|
||||
if (!editor) {
|
||||
outputWindow->append(tr("Unable to generate an Editor for the commit"));
|
||||
return;
|
||||
}
|
||||
|
||||
core->editorManager()->ensureEditorManagerVisible();
|
||||
|
||||
CommitEditor *commitEditor = qobject_cast<CommitEditor *>(editor);
|
||||
|
||||
if (!commitEditor) {
|
||||
outputWindow->append(tr("Unable to generate a Commit Editor"));
|
||||
return;
|
||||
}
|
||||
|
||||
commitEditor->setDisplayName(tr("Commit changes for \"") + currentProjectName() + tr("\""));
|
||||
|
||||
QString branch = client->branchQuerySync(currentProjectRoot());
|
||||
|
||||
commitEditor->setFields(currentProjectRoot(), branch, mercurialSettings->userName(),
|
||||
mercurialSettings->email(), status);
|
||||
|
||||
commitEditor->registerActions(editorUndo, editorRedo, editorCommit, editorDiff);
|
||||
connect(commitEditor, SIGNAL(diffSelectedFiles(const QStringList &)),
|
||||
this, SLOT(diffFromEditorSelected(const QStringList &)));
|
||||
}
|
||||
|
||||
void MercurialPlugin::diffFromEditorSelected(const QStringList &files)
|
||||
{
|
||||
foreach (QString file, files) {
|
||||
QFileInfo toDiff(QDir(currentProjectRoot().absoluteFilePath()).absoluteFilePath(file));
|
||||
client->diff(toDiff);
|
||||
}
|
||||
}
|
||||
|
||||
void MercurialPlugin::commitFromEditor()
|
||||
{
|
||||
if (!changeLog)
|
||||
return;
|
||||
|
||||
//use the same functionality than if the user closes the file without completing the commit
|
||||
core->editorManager()->closeEditors(core->editorManager()->editorsForFileName(changeLog->fileName()));
|
||||
}
|
||||
|
||||
bool MercurialPlugin::closeEditor(Core::IEditor *editor)
|
||||
{
|
||||
if (!changeLog || !editor || qstrcmp(editor->kind(), Constants::COMMITKIND))
|
||||
return true;
|
||||
Core::IFile *editorFile = editor->file();
|
||||
CommitEditor *commitEditor = qobject_cast<CommitEditor *>(editor);
|
||||
if (!editorFile || !commitEditor)
|
||||
return true;
|
||||
|
||||
bool dummyPrompt = settings()->prompt();
|
||||
const VCSBase::VCSBaseSubmitEditor::PromptSubmitResult response =
|
||||
commitEditor->promptSubmit(tr("Close commit editor"), tr("Do you want to commit the changes?"),
|
||||
tr("Message check failed. Do you want to proceed?"),
|
||||
&dummyPrompt, settings()->prompt());
|
||||
|
||||
switch (response) {
|
||||
case VCSBase::VCSBaseSubmitEditor::SubmitCanceled:
|
||||
return false;
|
||||
case VCSBase::VCSBaseSubmitEditor::SubmitDiscarded:
|
||||
deleteCommitLog();
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
const QStringList files = commitEditor->checkedFiles();
|
||||
if (!files.empty()) {
|
||||
//save the commit message
|
||||
core->fileManager()->blockFileChange(editorFile);
|
||||
editorFile->save();
|
||||
core->fileManager()->unblockFileChange(editorFile);
|
||||
|
||||
const QFileInfo repoRoot(commitEditor->repoRoot());
|
||||
client->commit(repoRoot, files, commitEditor->committerInfo(),
|
||||
editorFile->fileName());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
void MercurialPlugin::deleteCommitLog()
|
||||
{
|
||||
if (changeLog) {
|
||||
delete changeLog;
|
||||
changeLog = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void MercurialPlugin::createRepositoryManagementActions(QList<int> &context)
|
||||
{
|
||||
//TODO create menu for these options
|
||||
Q_UNUSED(context);
|
||||
return;
|
||||
// QAction *action = new QAction(tr("Branch"), this);
|
||||
// actionList.append(action);
|
||||
// Core::Command *command = actionManager->registerAction(action, Constants::BRANCH, context);
|
||||
// // connect(action, SIGNAL(triggered()), this, SLOT(branch()));
|
||||
// mercurialContainer->addAction(command);
|
||||
}
|
||||
|
||||
void MercurialPlugin::createLessUsedActions(QList<int> &context)
|
||||
{
|
||||
//TODO create menue for these options
|
||||
Q_UNUSED(context);
|
||||
return;
|
||||
}
|
||||
|
||||
void MercurialPlugin::createSeparator(const QList<int> &context, const QString &id)
|
||||
{
|
||||
QAction *action = new QAction(this);
|
||||
action->setSeparator(true);
|
||||
mercurialContainer->addAction(actionManager->registerAction(action, id, context));
|
||||
}
|
||||
|
||||
void MercurialPlugin::updateActions()
|
||||
{
|
||||
const QFileInfo file = currentFile();
|
||||
const QString filename = file.fileName();
|
||||
const QString repoRoot = client->findTopLevelForFile(file);
|
||||
bool enable = false;
|
||||
|
||||
//File menu Items should only be enabled for files that are below a mercurial repository
|
||||
enable = !repoRoot.isEmpty();
|
||||
annotateFile->setParameter(filename);
|
||||
annotateFile->setEnabled(enable);
|
||||
diffFile->setParameter(filename);
|
||||
diffFile->setEnabled(enable);
|
||||
logFile->setParameter(filename);
|
||||
logFile->setEnabled(enable);
|
||||
revertFile->setParameter(filename);
|
||||
revertFile->setEnabled(enable);
|
||||
statusFile->setParameter(filename);
|
||||
statusFile->setEnabled(enable);
|
||||
|
||||
//repository actions
|
||||
if (projectMapper.contains(currentProjectName()))
|
||||
enable = true;
|
||||
else
|
||||
enable = false;
|
||||
|
||||
foreach (QAction *action, actionList)
|
||||
action->setEnabled(enable);
|
||||
}
|
||||
|
||||
QFileInfo MercurialPlugin::currentFile()
|
||||
{
|
||||
QString fileName = core->fileManager()->currentFile();
|
||||
QFileInfo fileInfo(fileName);
|
||||
return fileInfo;
|
||||
}
|
||||
|
||||
QString MercurialPlugin::currentProjectName()
|
||||
{
|
||||
if (projectExplorer)
|
||||
if (projectExplorer->currentProject())
|
||||
return projectExplorer->currentProject()->name();
|
||||
return QString();
|
||||
}
|
||||
|
||||
void MercurialPlugin::currentProjectChanged(ProjectExplorer::Project *project)
|
||||
{
|
||||
if (!project)
|
||||
return;
|
||||
|
||||
if (projectMapper.contains(project->name()))
|
||||
return;
|
||||
|
||||
QString repoRoot = client->findTopLevelForFile(QFileInfo(project->file()->fileName()));
|
||||
|
||||
if (!repoRoot.isEmpty())
|
||||
projectMapper.insert(project->name(), QFileInfo(repoRoot));
|
||||
}
|
||||
|
||||
QFileInfo MercurialPlugin::currentProjectRoot()
|
||||
{
|
||||
return projectMapper.value(currentProjectName());
|
||||
}
|
||||
|
||||
Q_EXPORT_PLUGIN(MercurialPlugin)
|
||||
165
src/plugins/mercurial/mercurialplugin.h
Normal file
165
src/plugins/mercurial/mercurialplugin.h
Normal file
@@ -0,0 +1,165 @@
|
||||
#ifndef MERCURIALPLUGIN_H
|
||||
#define MERCURIALPLUGIN_H
|
||||
|
||||
#include <extensionsystem/iplugin.h>
|
||||
#include <coreplugin/icorelistener.h>
|
||||
|
||||
#include <QtCore/QFileInfo>
|
||||
#include <QtCore/QHash>
|
||||
#include <QtCore/qglobal.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QAction;
|
||||
class QTemporaryFile;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
namespace Core {
|
||||
class ActionManager;
|
||||
class ActionContainer;
|
||||
class ICore;
|
||||
class IVersionControl;
|
||||
class IEditorFactory;
|
||||
class IEditor;
|
||||
|
||||
namespace Utils {
|
||||
class ParameterAction;
|
||||
} //namespace Utils
|
||||
} // namespace Core
|
||||
|
||||
namespace ProjectExplorer {
|
||||
class ProjectExplorerPlugin;
|
||||
class Project;
|
||||
}
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
class MercurialOutputWindow;
|
||||
class OptionsPage;
|
||||
class MercurialClient;
|
||||
class MercurialControl;
|
||||
class MercurialEditor;
|
||||
class MercurialSettings;
|
||||
|
||||
class MercurialPlugin : public ExtensionSystem::IPlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MercurialPlugin();
|
||||
virtual ~MercurialPlugin();
|
||||
bool initialize(const QStringList &arguments, QString *error_message);
|
||||
void extensionsInitialized();
|
||||
static MercurialPlugin *instance() { return m_instance; }
|
||||
QFileInfo currentFile();
|
||||
QString currentProjectName();
|
||||
QFileInfo currentProjectRoot();
|
||||
bool closeEditor(Core::IEditor *editor);
|
||||
|
||||
MercurialSettings *settings();
|
||||
MercurialOutputWindow *outputPane();
|
||||
|
||||
|
||||
private slots:
|
||||
// File menu action Slots
|
||||
void annotateCurrentFile();
|
||||
void diffCurrentFile();
|
||||
void logCurrentFile();
|
||||
void revertCurrentFile();
|
||||
void statusCurrentFile();
|
||||
|
||||
//Directory menu Action slots
|
||||
void diffRepository();
|
||||
void logRepository();
|
||||
void revertMulti();
|
||||
void statusMulti();
|
||||
|
||||
//repository menu action slots
|
||||
void pull();
|
||||
void push();
|
||||
void update();
|
||||
void import();
|
||||
void incoming();
|
||||
void outgoing();
|
||||
void commit();
|
||||
void showCommitWidget(const QList<QPair<QString, QString> > &status);
|
||||
void commitFromEditor();
|
||||
void diffFromEditorSelected(const QStringList &files);
|
||||
|
||||
//TODO implement
|
||||
/* //repository management action slots
|
||||
void merge();
|
||||
void branch();
|
||||
void heads();
|
||||
void parents();
|
||||
void tags();
|
||||
void tip();
|
||||
void paths();
|
||||
|
||||
//less used repository action
|
||||
void init();
|
||||
void serve();*/
|
||||
|
||||
//change the sates of the actions in the Mercurial Menu i.e. 2 be context sensitive
|
||||
void updateActions();
|
||||
void currentProjectChanged(ProjectExplorer::Project *project);
|
||||
|
||||
|
||||
private:
|
||||
//methods
|
||||
void createMenu();
|
||||
void createSubmitEditorActions();
|
||||
void createSeparator(const QList<int> &context, const QString &id);
|
||||
void createFileActions(QList<int> &context);
|
||||
void createDirectoryActions(QList<int> &context);
|
||||
void createRepositoryActions(QList<int> &context);
|
||||
void createRepositoryManagementActions(QList<int> &context);
|
||||
void createLessUsedActions(QList<int> &context);
|
||||
void deleteCommitLog();
|
||||
//QString getSettingsByKey(const char * const key);
|
||||
|
||||
//Variables
|
||||
static MercurialPlugin *m_instance;
|
||||
MercurialSettings *mercurialSettings;
|
||||
MercurialOutputWindow *outputWindow;
|
||||
OptionsPage *optionsPage;
|
||||
MercurialClient *client;
|
||||
|
||||
Core::IVersionControl *mercurialVC;
|
||||
Core::ICore *core;
|
||||
Core::ActionManager *actionManager;
|
||||
Core::ActionContainer *mercurialContainer;
|
||||
ProjectExplorer::ProjectExplorerPlugin *projectExplorer;
|
||||
|
||||
//provide a mapping of projectName -> repositoryRoot for each project
|
||||
QHash<QString, QFileInfo> projectMapper;
|
||||
QList<QAction *> actionList;
|
||||
QTemporaryFile *changeLog;
|
||||
|
||||
//Menu Items (file actions)
|
||||
Core::Utils::ParameterAction *annotateFile;
|
||||
Core::Utils::ParameterAction *diffFile;
|
||||
Core::Utils::ParameterAction *logFile;
|
||||
Core::Utils::ParameterAction *renameFile;
|
||||
Core::Utils::ParameterAction *revertFile;
|
||||
Core::Utils::ParameterAction *statusFile;
|
||||
|
||||
//submit editor actions
|
||||
QAction *editorCommit;
|
||||
QAction *editorDiff;
|
||||
QAction *editorUndo;
|
||||
QAction *editorRedo;
|
||||
};
|
||||
|
||||
class ListenForClose : public Core::ICoreListener
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ListenForClose(QObject *parent=0) : Core::ICoreListener(parent) {}
|
||||
bool editorAboutToClose(Core::IEditor *editor);
|
||||
};
|
||||
|
||||
} //namespace Internal
|
||||
} //namespace Mercurial
|
||||
|
||||
#endif // MERCURIALPLUGIN_H
|
||||
114
src/plugins/mercurial/mercurialsettings.cpp
Normal file
114
src/plugins/mercurial/mercurialsettings.cpp
Normal file
@@ -0,0 +1,114 @@
|
||||
#include "mercurialsettings.h"
|
||||
#include "constants.h"
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
|
||||
#include <QtCore/QSettings>
|
||||
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
|
||||
MercurialSettings::MercurialSettings()
|
||||
{
|
||||
readSettings();
|
||||
}
|
||||
|
||||
QString MercurialSettings::binary()
|
||||
{
|
||||
return bin;
|
||||
}
|
||||
|
||||
QString MercurialSettings::application()
|
||||
{
|
||||
return app;
|
||||
}
|
||||
|
||||
QStringList MercurialSettings::standardArguments()
|
||||
{
|
||||
return standardArgs;
|
||||
}
|
||||
|
||||
QString MercurialSettings::userName()
|
||||
{
|
||||
return user;
|
||||
}
|
||||
|
||||
QString MercurialSettings::email()
|
||||
{
|
||||
return mail;
|
||||
}
|
||||
|
||||
int MercurialSettings::logCount()
|
||||
{
|
||||
return m_logCount;
|
||||
}
|
||||
|
||||
int MercurialSettings::timeout()
|
||||
{
|
||||
//return timeout is in Ms
|
||||
return m_timeout * 1000;
|
||||
}
|
||||
|
||||
int MercurialSettings::timeoutSeconds()
|
||||
{
|
||||
//return timeout in seconds (as the user specifies on the options page
|
||||
return m_timeout;
|
||||
}
|
||||
|
||||
bool MercurialSettings::prompt()
|
||||
{
|
||||
return m_prompt;
|
||||
}
|
||||
|
||||
void MercurialSettings::writeSettings(const QString &application, const QString &userName,
|
||||
const QString &email, int logCount, int timeout, bool prompt)
|
||||
{
|
||||
QSettings *settings = Core::ICore::instance()->settings();
|
||||
if (settings) {
|
||||
settings->beginGroup("Mercurial");
|
||||
settings->setValue(Constants::MERCURIALPATH, application);
|
||||
settings->setValue(Constants::MERCURIALUSERNAME, userName);
|
||||
settings->setValue(Constants::MERCURIALEMAIL, email);
|
||||
settings->setValue(Constants::MERCURIALLOGCOUNT, logCount);
|
||||
settings->setValue(Constants::MERCURIALTIMEOUT, timeout);
|
||||
settings->setValue(Constants::MERCURIALPROMPTSUBMIT, prompt);
|
||||
settings->endGroup();
|
||||
}
|
||||
|
||||
app = application;
|
||||
user = userName;
|
||||
mail = email;
|
||||
m_logCount = logCount;
|
||||
m_timeout = timeout;
|
||||
m_prompt = prompt;
|
||||
setBinAndArgs();
|
||||
}
|
||||
|
||||
void MercurialSettings::readSettings()
|
||||
{
|
||||
QSettings *settings = Core::ICore::instance()->settings();
|
||||
if (settings) {
|
||||
settings->beginGroup("Mercurial");
|
||||
app = settings->value(Constants::MERCURIALPATH, Constants::MERCURIALDEFAULT).toString();
|
||||
user = settings->value(Constants::MERCURIALUSERNAME, "").toString();
|
||||
mail = settings->value(Constants::MERCURIALEMAIL, "").toString();
|
||||
m_logCount = settings->value(Constants::MERCURIALLOGCOUNT, 0).toInt();
|
||||
m_timeout = settings->value(Constants::MERCURIALTIMEOUT, 30).toInt();
|
||||
m_prompt = settings->value(Constants::MERCURIALPROMPTSUBMIT, true).toBool();
|
||||
settings->endGroup();
|
||||
}
|
||||
|
||||
setBinAndArgs();
|
||||
}
|
||||
|
||||
void MercurialSettings::setBinAndArgs()
|
||||
{
|
||||
standardArgs.clear();
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
bin = QLatin1String("cmd.exe");
|
||||
standardArgs << "/c" << app;
|
||||
#else
|
||||
bin = app;
|
||||
#endif
|
||||
}
|
||||
45
src/plugins/mercurial/mercurialsettings.h
Normal file
45
src/plugins/mercurial/mercurialsettings.h
Normal file
@@ -0,0 +1,45 @@
|
||||
#ifndef MERCURIALSETTINGS_H
|
||||
#define MERCURIALSETTINGS_H
|
||||
|
||||
#include <QtCore/QString>
|
||||
#include <QtCore/QStringList>
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
class MercurialSettings
|
||||
{
|
||||
public:
|
||||
MercurialSettings();
|
||||
|
||||
QString binary();
|
||||
QString application();
|
||||
QStringList standardArguments();
|
||||
QString userName();
|
||||
QString email();
|
||||
int logCount();
|
||||
int timeout();
|
||||
int timeoutSeconds();
|
||||
bool prompt();
|
||||
void writeSettings(const QString &application, const QString &userName,
|
||||
const QString &email, int logCount, int timeout, bool prompt);
|
||||
private:
|
||||
|
||||
void readSettings();
|
||||
void setBinAndArgs();
|
||||
|
||||
QString bin; // used because windows requires cmd.exe to run the mercurial binary
|
||||
// in this case the actual mercurial binary will be part of the standard args
|
||||
QString app; // this is teh actual mercurial executable
|
||||
QStringList standardArgs;
|
||||
QString user;
|
||||
QString mail;
|
||||
int m_logCount;
|
||||
int m_timeout;
|
||||
bool m_prompt;
|
||||
};
|
||||
|
||||
} //namespace Internal
|
||||
} //namespace Mercurial
|
||||
|
||||
#endif // MERCURIALSETTINGS_H
|
||||
79
src/plugins/mercurial/optionspage.cpp
Normal file
79
src/plugins/mercurial/optionspage.cpp
Normal file
@@ -0,0 +1,79 @@
|
||||
#include "optionspage.h"
|
||||
#include "mercurialsettings.h"
|
||||
#include "mercurialplugin.h"
|
||||
|
||||
#include <utils/pathchooser.h>
|
||||
#include <vcsbase/vcsbaseconstants.h>
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
using namespace Mercurial;
|
||||
|
||||
OptionsPageWidget::OptionsPageWidget(QWidget *parent) :
|
||||
QWidget(parent)
|
||||
{
|
||||
m_ui.setupUi(this);
|
||||
m_ui.commandChooser->setExpectedKind(Core::Utils::PathChooser::Command);
|
||||
m_ui.commandChooser->setPromptDialogTitle(tr("Mercurial Command"));
|
||||
}
|
||||
|
||||
void OptionsPageWidget::updateOptions()
|
||||
{
|
||||
MercurialSettings *settings = MercurialPlugin::instance()->settings();
|
||||
m_ui.commandChooser->setPath(settings->application());
|
||||
m_ui.defaultUsernameLineEdit->setText(settings->userName());
|
||||
m_ui.defaultEmailLineEdit->setText(settings->email());
|
||||
m_ui.logEntriesCount->setValue(settings->logCount());
|
||||
m_ui.timeout->setValue(settings->timeoutSeconds());
|
||||
m_ui.promptOnSubmitCheckBox->setChecked(settings->prompt());
|
||||
}
|
||||
|
||||
void OptionsPageWidget::saveOptions()
|
||||
{
|
||||
MercurialSettings *settings = MercurialPlugin::instance()->settings();
|
||||
|
||||
settings->writeSettings(m_ui.commandChooser->path(), m_ui.defaultUsernameLineEdit->text(),
|
||||
m_ui.defaultEmailLineEdit->text(), m_ui.logEntriesCount->value(),
|
||||
m_ui.timeout->value(), m_ui.promptOnSubmitCheckBox->isChecked());
|
||||
}
|
||||
|
||||
OptionsPage::OptionsPage()
|
||||
{
|
||||
}
|
||||
|
||||
QString OptionsPage::id() const
|
||||
{
|
||||
return QLatin1String("Mercurial");
|
||||
}
|
||||
|
||||
QString OptionsPage::trName() const
|
||||
{
|
||||
return tr("Mercurial");
|
||||
}
|
||||
|
||||
QString OptionsPage::category() const
|
||||
{
|
||||
return QLatin1String(VCSBase::Constants::VCS_SETTINGS_CATEGORY);
|
||||
}
|
||||
|
||||
QString OptionsPage::trCategory() const
|
||||
{
|
||||
return QCoreApplication::translate("VCSBase", VCSBase::Constants::VCS_SETTINGS_CATEGORY);
|
||||
}
|
||||
|
||||
QWidget *OptionsPage::createPage(QWidget *parent)
|
||||
{
|
||||
if (!optionsPageWidget)
|
||||
optionsPageWidget = new OptionsPageWidget(parent);
|
||||
optionsPageWidget.data()->updateOptions();
|
||||
return optionsPageWidget;
|
||||
}
|
||||
|
||||
void OptionsPage::apply()
|
||||
{
|
||||
if (!optionsPageWidget)
|
||||
return;
|
||||
optionsPageWidget.data()->saveOptions();
|
||||
//assume success and emit signal that settings are changed;
|
||||
emit settingsChanged();
|
||||
}
|
||||
|
||||
52
src/plugins/mercurial/optionspage.h
Normal file
52
src/plugins/mercurial/optionspage.h
Normal file
@@ -0,0 +1,52 @@
|
||||
#ifndef OPTIONSPAGE_H
|
||||
#define OPTIONSPAGE_H
|
||||
|
||||
#include "ui_optionspage.h"
|
||||
|
||||
#include <coreplugin/dialogs/ioptionspage.h>
|
||||
|
||||
#include <QtGui/QWidget>
|
||||
#include <QtCore/QPointer>
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
class OptionsPageWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit OptionsPageWidget(QWidget *parent = 0);
|
||||
void updateOptions();
|
||||
void saveOptions();
|
||||
|
||||
private:
|
||||
Ui::OptionsPage m_ui;
|
||||
};
|
||||
|
||||
|
||||
class OptionsPage : public Core::IOptionsPage
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
OptionsPage();
|
||||
QString id() const;
|
||||
QString trName() const;
|
||||
QString category() const;
|
||||
QString trCategory() const;
|
||||
|
||||
QWidget *createPage(QWidget *parent);
|
||||
void apply();
|
||||
void finish() { }
|
||||
|
||||
signals:
|
||||
void settingsChanged();
|
||||
|
||||
private:
|
||||
QPointer<OptionsPageWidget> optionsPageWidget;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Mercurial
|
||||
|
||||
#endif // OPTIONSPAGE_H
|
||||
126
src/plugins/mercurial/optionspage.ui
Normal file
126
src/plugins/mercurial/optionspage.ui
Normal file
@@ -0,0 +1,126 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Mercurial::Internal::OptionsPage</class>
|
||||
<widget class="QWidget" name="Mercurial::Internal::OptionsPage">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="mercurialCommandLabel">
|
||||
<property name="text">
|
||||
<string>Mercurial Command:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="Core::Utils::PathChooser" name="commandChooser" native="true"/>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="showLogEntriesLabel">
|
||||
<property name="text">
|
||||
<string>Show Log Entries:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QSpinBox" name="logEntriesCount">
|
||||
<property name="toolTip">
|
||||
<string>The number of recent commit logs to show, choose 0 to see all enteries</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="timeoutSecondsLabel">
|
||||
<property name="text">
|
||||
<string>Timeout (Seconds):</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QSpinBox" name="timeout">
|
||||
<property name="value">
|
||||
<number>30</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="promptOnSubmitLabel">
|
||||
<property name="text">
|
||||
<string>Prompt On Submit</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QCheckBox" name="promptOnSubmitCheckBox">
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="defaultUsernameLabel">
|
||||
<property name="toolTip">
|
||||
<string>Username to use by default on commit.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Default Username:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="defaultUsernameLineEdit">
|
||||
<property name="toolTip">
|
||||
<string>Username to use by default on commit.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="defaultEmailLabel">
|
||||
<property name="toolTip">
|
||||
<string>Email to use by default on commit.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Default Email:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="defaultEmailLineEdit">
|
||||
<property name="toolTip">
|
||||
<string>Email to use by default on commit.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>Core::Utils::PathChooser</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">utils/pathchooser.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
27
src/plugins/mercurial/revertdialog.cpp
Normal file
27
src/plugins/mercurial/revertdialog.cpp
Normal file
@@ -0,0 +1,27 @@
|
||||
#include "revertdialog.h"
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
|
||||
RevertDialog::RevertDialog(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
m_ui(new Ui::RevertDialog)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
}
|
||||
|
||||
RevertDialog::~RevertDialog()
|
||||
{
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
void RevertDialog::changeEvent(QEvent *e)
|
||||
{
|
||||
QDialog::changeEvent(e);
|
||||
switch (e->type()) {
|
||||
case QEvent::LanguageChange:
|
||||
m_ui->retranslateUi(this);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
31
src/plugins/mercurial/revertdialog.h
Normal file
31
src/plugins/mercurial/revertdialog.h
Normal file
@@ -0,0 +1,31 @@
|
||||
#ifndef REVERTDIALOG_H
|
||||
#define REVERTDIALOG_H
|
||||
|
||||
#include "ui_revertdialog.h"
|
||||
|
||||
#include <QtGui/QDialog>
|
||||
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
class mercurialPlugin;
|
||||
|
||||
class RevertDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
RevertDialog(QWidget *parent = 0);
|
||||
~RevertDialog();
|
||||
|
||||
protected:
|
||||
void changeEvent(QEvent *e);
|
||||
|
||||
private:
|
||||
Ui::RevertDialog *m_ui;
|
||||
friend class MercurialPlugin;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Mercurial
|
||||
#endif // REVERTDIALOG_H
|
||||
99
src/plugins/mercurial/revertdialog.ui
Normal file
99
src/plugins/mercurial/revertdialog.ui
Normal file
@@ -0,0 +1,99 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Mercurial::Internal::RevertDialog</class>
|
||||
<widget class="QDialog" name="Mercurial::Internal::RevertDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>162</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Revert</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Specify a revision other than the default?</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="formLayoutWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>30</y>
|
||||
<width>361</width>
|
||||
<height>51</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="revisionLabel">
|
||||
<property name="text">
|
||||
<string>Revision:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="revisionLineEdit"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>Mercurial::Internal::RevertDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>Mercurial::Internal::RevertDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
||||
45
src/plugins/mercurial/srcdestdialog.cpp
Normal file
45
src/plugins/mercurial/srcdestdialog.cpp
Normal file
@@ -0,0 +1,45 @@
|
||||
#include "srcdestdialog.h"
|
||||
#include "ui_srcdestdialog.h"
|
||||
|
||||
|
||||
using namespace Mercurial::Internal;
|
||||
|
||||
SrcDestDialog::SrcDestDialog(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
m_ui(new Ui::SrcDestDialog)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
m_ui->localPathChooser->setExpectedKind(Core::Utils::PathChooser::Directory);
|
||||
}
|
||||
|
||||
SrcDestDialog::~SrcDestDialog()
|
||||
{
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
void SrcDestDialog::setPathChooserKind(Core::Utils::PathChooser::Kind kind)
|
||||
{
|
||||
m_ui->localPathChooser->setExpectedKind(kind);
|
||||
}
|
||||
|
||||
QString SrcDestDialog::getRepositoryString()
|
||||
{
|
||||
if (m_ui->defaultButton->isChecked())
|
||||
return QString();
|
||||
else if (m_ui->localButton->isChecked())
|
||||
return m_ui->localPathChooser->path();
|
||||
else
|
||||
return m_ui->urlLineEdit->text();
|
||||
}
|
||||
|
||||
void SrcDestDialog::changeEvent(QEvent *e)
|
||||
{
|
||||
QDialog::changeEvent(e);
|
||||
switch (e->type()) {
|
||||
case QEvent::LanguageChange:
|
||||
m_ui->retranslateUi(this);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
33
src/plugins/mercurial/srcdestdialog.h
Normal file
33
src/plugins/mercurial/srcdestdialog.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef SRCDESTDIALOG_H
|
||||
#define SRCDESTDIALOG_H
|
||||
|
||||
#include <QtGui/QDialog>
|
||||
#include <utils/pathchooser.h>
|
||||
|
||||
namespace Mercurial {
|
||||
namespace Internal {
|
||||
|
||||
namespace Ui {
|
||||
class SrcDestDialog;
|
||||
}
|
||||
|
||||
class SrcDestDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
||||
SrcDestDialog(QWidget *parent = 0);
|
||||
~SrcDestDialog();
|
||||
void setPathChooserKind(Core::Utils::PathChooser::Kind kind);
|
||||
QString getRepositoryString();
|
||||
|
||||
protected:
|
||||
void changeEvent(QEvent *e);
|
||||
|
||||
private:
|
||||
Ui::SrcDestDialog *m_ui;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Mercurial
|
||||
#endif // SRCDESTDIALOG_H
|
||||
152
src/plugins/mercurial/srcdestdialog.ui
Normal file
152
src/plugins/mercurial/srcdestdialog.ui
Normal file
@@ -0,0 +1,152 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Mercurial::Internal::SrcDestDialog</class>
|
||||
<widget class="QDialog" name="Mercurial::Internal::SrcDestDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>187</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QRadioButton" name="defaultButton">
|
||||
<property name="text">
|
||||
<string>Default Location:</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QRadioButton" name="localButton">
|
||||
<property name="text">
|
||||
<string>Local filesystem:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QRadioButton" name="urlButton">
|
||||
<property name="toolTip">
|
||||
<string>e.g. https://[user[:pass]@]host[:port]/[path]</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Specify Url:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="Core::Utils::PathChooser" name="localPathChooser" native="true">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="urlLineEdit">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>e.g. https://[user[:pass]@]host[:port]/[path]</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>Core::Utils::PathChooser</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">utils/pathchooser.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>Mercurial::Internal::SrcDestDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>257</x>
|
||||
<y>177</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>Mercurial::Internal::SrcDestDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>325</x>
|
||||
<y>177</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>urlButton</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>urlLineEdit</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>80</x>
|
||||
<y>121</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>332</x>
|
||||
<y>123</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>localButton</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>localPathChooser</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>112</x>
|
||||
<y>81</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>346</x>
|
||||
<y>81</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
||||
@@ -34,6 +34,7 @@ SUBDIRS = plugin_coreplugin \
|
||||
plugin_genericprojectmanager \
|
||||
plugin_duieditor \
|
||||
plugin_qmlprojectmanager \
|
||||
plugin_mercurial\
|
||||
debugger/dumper.pro
|
||||
|
||||
plugin_coreplugin.subdir = coreplugin
|
||||
@@ -177,3 +178,9 @@ plugin_qmlprojectmanager.depends = plugin_texteditor
|
||||
plugin_qmlprojectmanager.depends += plugin_projectexplorer
|
||||
plugin_qmlprojectmanager.depends += plugin_help
|
||||
plugin_qmlprojectmanager.depends += plugin_duieditor
|
||||
|
||||
plugin_mercurial.subdir = mercurial
|
||||
plugin_mercurial.depends = plugin_texteditor
|
||||
plugin_mercurial.depends = plugin_vcsbase
|
||||
plugin_mercurial.depends += plugin_projectexplorer
|
||||
plugin_mercurial.depends += plugin_coreplugin
|
||||
|
||||
@@ -29,6 +29,9 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="Core::Utils::ProjectNameValidatingLineEdit" name="checkoutDirectoryLineEdit"/>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="pathLabel">
|
||||
<property name="text">
|
||||
@@ -39,9 +42,6 @@
|
||||
<item row="2" column="1">
|
||||
<widget class="Core::Utils::PathChooser" name="pathChooser"/>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="Core::Utils::ProjectNameValidatingLineEdit" name="checkoutDirectoryLineEdit"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
|
||||
Reference in New Issue
Block a user