Fixes: Refactor git settings code, add some more menu options

This commit is contained in:
Friedemann Kleint
2008-12-04 11:23:03 +01:00
parent 8b018225b0
commit d63c68f39a
11 changed files with 559 additions and 241 deletions

View File

@@ -18,7 +18,8 @@ HEADERS += gitplugin.h \
annotationhighlighter.h \ annotationhighlighter.h \
gitsubmiteditorwidget.h \ gitsubmiteditorwidget.h \
gitsubmiteditor.h \ gitsubmiteditor.h \
gitversioncontrol.h gitversioncontrol.h \
gitsettings.h
SOURCES += gitplugin.cpp \ SOURCES += gitplugin.cpp \
gitoutputwindow.cpp \ gitoutputwindow.cpp \
@@ -30,7 +31,8 @@ SOURCES += gitplugin.cpp \
annotationhighlighter.cpp \ annotationhighlighter.cpp \
gitsubmiteditorwidget.cpp \ gitsubmiteditorwidget.cpp \
gitsubmiteditor.cpp \ gitsubmiteditor.cpp \
gitversioncontrol.cpp gitversioncontrol.cpp \
gitsettings.cpp
FORMS += changeselectiondialog.ui \ FORMS += changeselectiondialog.ui \
settingspage.ui \ settingspage.ui \

View File

@@ -88,6 +88,8 @@ GitClient::GitClient(GitPlugin* plugin, Core::ICore *core) :
m_plugin(plugin), m_plugin(plugin),
m_core(core) m_core(core)
{ {
if (QSettings *s = m_core->settings())
m_settings.fromSettings(s);
} }
GitClient::~GitClient() GitClient::~GitClient()
@@ -178,7 +180,7 @@ void GitClient::diff(const QString &workingDirectory, const QStringList &fileNam
const QString title = tr("Git Diff"); const QString title = tr("Git Diff");
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, workingDirectory, true, "originalFileName", workingDirectory); VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, workingDirectory, true, "originalFileName", workingDirectory);
executeGit(workingDirectory, arguments, m_plugin->m_outputWindow, editor); executeGit(workingDirectory, arguments, m_plugin->outputWindow(), editor);
} }
@@ -196,27 +198,26 @@ void GitClient::diff(const QString &workingDirectory, const QString &fileName)
const QString sourceFile = source(workingDirectory, fileName); const QString sourceFile = source(workingDirectory, fileName);
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, true, "originalFileName", sourceFile); VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, true, "originalFileName", sourceFile);
executeGit(workingDirectory, arguments, m_plugin->m_outputWindow, editor); executeGit(workingDirectory, arguments, m_plugin->outputWindow(), editor);
} }
void GitClient::status(const QString &workingDirectory) void GitClient::status(const QString &workingDirectory)
{ {
QStringList statusArgs(QLatin1String("status")); QStringList statusArgs(QLatin1String("status"));
statusArgs << QLatin1String("-u"); statusArgs << QLatin1String("-u");
executeGit(workingDirectory, statusArgs, m_plugin->m_outputWindow, 0,true); executeGit(workingDirectory, statusArgs, m_plugin->outputWindow(), 0,true);
} }
void GitClient::log(const QString &workingDirectory, const QString &fileName) void GitClient::log(const QString &workingDirectory, const QString &fileName)
{ {
if (Git::Constants::debug) if (Git::Constants::debug)
qDebug() << "log" << workingDirectory << fileName; qDebug() << "log" << workingDirectory << fileName;
QStringList arguments;
int logCount = 10;
if (m_plugin->m_settingsPage && m_plugin->m_settingsPage->logCount() > 0)
logCount = m_plugin->m_settingsPage->logCount();
arguments << QLatin1String("log") << QLatin1String("-n") QStringList arguments(QLatin1String("log"));
<< QString::number(logCount);
if (m_settings.logCount > 0)
arguments << QLatin1String("-n") << QString::number(m_settings.logCount);
if (!fileName.isEmpty()) if (!fileName.isEmpty())
arguments << fileName; arguments << fileName;
@@ -224,7 +225,7 @@ void GitClient::log(const QString &workingDirectory, const QString &fileName)
const QString kind = QLatin1String(Git::Constants::GIT_LOG_EDITOR_KIND); const QString kind = QLatin1String(Git::Constants::GIT_LOG_EDITOR_KIND);
const QString sourceFile = source(workingDirectory, fileName); const QString sourceFile = source(workingDirectory, fileName);
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, false, "logFileName", sourceFile); VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, false, "logFileName", sourceFile);
executeGit(workingDirectory, arguments, m_plugin->m_outputWindow, editor); executeGit(workingDirectory, arguments, m_plugin->outputWindow(), editor);
} }
void GitClient::show(const QString &source, const QString &id) void GitClient::show(const QString &source, const QString &id)
@@ -240,7 +241,7 @@ void GitClient::show(const QString &source, const QString &id)
const QFileInfo sourceFi(source); const QFileInfo sourceFi(source);
const QString workDir = sourceFi.isDir() ? sourceFi.absoluteFilePath() : sourceFi.absolutePath(); const QString workDir = sourceFi.isDir() ? sourceFi.absoluteFilePath() : sourceFi.absolutePath();
executeGit(workDir, arguments, m_plugin->m_outputWindow, editor); executeGit(workDir, arguments, m_plugin->outputWindow(), editor);
} }
void GitClient::blame(const QString &workingDirectory, const QString &fileName) void GitClient::blame(const QString &workingDirectory, const QString &fileName)
@@ -255,7 +256,7 @@ void GitClient::blame(const QString &workingDirectory, const QString &fileName)
const QString sourceFile = source(workingDirectory, fileName); const QString sourceFile = source(workingDirectory, fileName);
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, true, "blameFileName", sourceFile); VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, true, "blameFileName", sourceFile);
executeGit(workingDirectory, arguments, m_plugin->m_outputWindow, editor); executeGit(workingDirectory, arguments, m_plugin->outputWindow(), editor);
} }
void GitClient::checkout(const QString &workingDirectory, const QString &fileName) void GitClient::checkout(const QString &workingDirectory, const QString &fileName)
@@ -269,7 +270,7 @@ void GitClient::checkout(const QString &workingDirectory, const QString &fileNam
arguments << QLatin1String("checkout") << QLatin1String("HEAD") << QLatin1String("--") arguments << QLatin1String("checkout") << QLatin1String("HEAD") << QLatin1String("--")
<< fileName; << fileName;
executeGit(workingDirectory, arguments, m_plugin->m_outputWindow, 0,true); executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0,true);
} }
void GitClient::hardReset(const QString &workingDirectory, const QString &commit) void GitClient::hardReset(const QString &workingDirectory, const QString &commit)
@@ -279,7 +280,7 @@ void GitClient::hardReset(const QString &workingDirectory, const QString &commit
if (!commit.isEmpty()) if (!commit.isEmpty())
arguments << commit; arguments << commit;
executeGit(workingDirectory, arguments, m_plugin->m_outputWindow, 0,true); executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0,true);
} }
void GitClient::addFile(const QString &workingDirectory, const QString &fileName) void GitClient::addFile(const QString &workingDirectory, const QString &fileName)
@@ -287,7 +288,7 @@ void GitClient::addFile(const QString &workingDirectory, const QString &fileName
QStringList arguments; QStringList arguments;
arguments << QLatin1String("add") << fileName; arguments << QLatin1String("add") << fileName;
executeGit(workingDirectory, arguments, m_plugin->m_outputWindow, 0,true); executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0,true);
} }
bool GitClient::synchronousAdd(const QString &workingDirectory, const QStringList &files) bool GitClient::synchronousAdd(const QString &workingDirectory, const QStringList &files)
@@ -302,8 +303,8 @@ bool GitClient::synchronousAdd(const QString &workingDirectory, const QStringLis
if (!rc) { if (!rc) {
const QString errorMessage = tr("Unable to add %n file(s) to %1: %2", 0, files.size()). const QString errorMessage = tr("Unable to add %n file(s) to %1: %2", 0, files.size()).
arg(workingDirectory, QString::fromLocal8Bit(errorText)); arg(workingDirectory, QString::fromLocal8Bit(errorText));
m_plugin->m_outputWindow->append(errorMessage); m_plugin->outputWindow()->append(errorMessage);
m_plugin->m_outputWindow->popup(false); m_plugin->outputWindow()->popup(false);
} }
return rc; return rc;
} }
@@ -319,14 +320,14 @@ bool GitClient::synchronousReset(const QString &workingDirectory,
arguments << QLatin1String("reset") << QLatin1String("HEAD") << QLatin1String("--") << files; arguments << QLatin1String("reset") << QLatin1String("HEAD") << QLatin1String("--") << files;
const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText); const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText);
const QString output = QString::fromLocal8Bit(outputText); const QString output = QString::fromLocal8Bit(outputText);
m_plugin->m_outputWindow->popup(false); m_plugin->outputWindow()->popup(false);
m_plugin->m_outputWindow->append(output); m_plugin->outputWindow()->append(output);
// Note that git exits with 1 even if the operation is successful // Note that git exits with 1 even if the operation is successful
// Assume real failure if the output does not contain "foo.cpp modified" // Assume real failure if the output does not contain "foo.cpp modified"
if (!rc && !output.contains(QLatin1String("modified"))) { if (!rc && !output.contains(QLatin1String("modified"))) {
const QString errorMessage = tr("Unable to reset %n file(s) in %1: %2", 0, files.size()). const QString errorMessage = tr("Unable to reset %n file(s) in %1: %2", 0, files.size()).
arg(workingDirectory, QString::fromLocal8Bit(errorText)); arg(workingDirectory, QString::fromLocal8Bit(errorText));
m_plugin->m_outputWindow->append(errorMessage); m_plugin->outputWindow()->append(errorMessage);
return false; return false;
} }
return true; return true;
@@ -339,13 +340,13 @@ void GitClient::executeGit(const QString &workingDirectory, const QStringList &a
if (Git::Constants::debug) if (Git::Constants::debug)
qDebug() << "executeGit" << workingDirectory << arguments << editor; qDebug() << "executeGit" << workingDirectory << arguments << editor;
m_plugin->m_outputWindow->append(formatCommand(QLatin1String(kGitCommand), arguments)); m_plugin->outputWindow()->append(formatCommand(QLatin1String(kGitCommand), arguments));
QProcess process; QProcess process;
ProjectExplorer::Environment environment = ProjectExplorer::Environment::systemEnvironment(); ProjectExplorer::Environment environment = ProjectExplorer::Environment::systemEnvironment();
if (m_plugin->m_settingsPage && !m_plugin->m_settingsPage->adoptEnvironment()) if (m_settings.adoptPath)
environment.set(QLatin1String("PATH"), m_plugin->m_settingsPage->path()); environment.set(QLatin1String("PATH"), m_settings.path);
GitCommand* command = new GitCommand(); GitCommand* command = new GitCommand();
if (outputToWindow) { if (outputToWindow) {
@@ -373,14 +374,14 @@ bool GitClient::synchronousGit(const QString &workingDirectory
qDebug() << "synchronousGit" << workingDirectory << arguments; qDebug() << "synchronousGit" << workingDirectory << arguments;
const QString binary = QLatin1String(kGitCommand); const QString binary = QLatin1String(kGitCommand);
m_plugin->m_outputWindow->append(formatCommand(binary, arguments)); m_plugin->outputWindow()->append(formatCommand(binary, arguments));
QProcess process; QProcess process;
process.setWorkingDirectory(workingDirectory); process.setWorkingDirectory(workingDirectory);
ProjectExplorer::Environment environment = ProjectExplorer::Environment::systemEnvironment(); ProjectExplorer::Environment environment = ProjectExplorer::Environment::systemEnvironment();
if (m_plugin->m_settingsPage && !m_plugin->m_settingsPage->adoptEnvironment()) if (m_settings.adoptPath)
environment.set(QLatin1String("PATH"), m_plugin->m_settingsPage->path()); environment.set(QLatin1String("PATH"), m_settings.path);
process.setEnvironment(environment.toStringList()); process.setEnvironment(environment.toStringList());
process.start(binary, arguments); process.start(binary, arguments);
@@ -417,6 +418,34 @@ static inline QString trimFileSpecification(QString fileSpec)
return fileSpec; return fileSpec;
} }
GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory,
bool untracked,
QString *output,
QString *errorMessage)
{
// Run 'status'. Note that git returns exitcode 1 if there are no added files.
QByteArray outputText;
QByteArray errorText;
QStringList statusArgs(QLatin1String("status"));
if (untracked)
statusArgs << QLatin1String("-u");
const bool statusRc = synchronousGit(workingDirectory, statusArgs, &outputText, &errorText);
if (output)
*output = QString::fromLocal8Bit(outputText).remove(QLatin1Char('\r'));
// Is it something really fatal?
if (!statusRc && !outputText.contains(kBranchIndicatorC)) {
if (errorMessage) {
const QString error = QString::fromLocal8Bit(errorText).remove(QLatin1Char('\r'));
*errorMessage = tr("Unable to obtain the status: %1").arg(error);
}
return StatusFailed;
}
// Unchanged?
if (outputText.contains("nothing to commit"))
return StatusUnchanged;
return StatusChanged;
}
/* Parse a git status file list: /* Parse a git status file list:
* \code * \code
# Changes to be committed: # Changes to be committed:
@@ -517,24 +546,15 @@ bool GitClient::getCommitData(const QString &workingDirectory,
} }
// Run status. Note that it has exitcode 1 if there are no added files. // Run status. Note that it has exitcode 1 if there are no added files.
QByteArray outputText; QString output;
QByteArray errorText; switch (gitStatus(repoDirectory, untrackedFilesInCommit, &output, errorMessage)) {
QStringList statusArgs(QLatin1String("status")); case StatusChanged:
break;
if (untrackedFilesInCommit) case StatusUnchanged:
statusArgs << QLatin1String("-u"); *errorMessage = tr("There are no modified files.");
const bool statusRc = synchronousGit(repoDirectory, statusArgs, &outputText, &errorText); return false;
if (!statusRc) { case StatusFailed:
// Something fatal return false;
if (!outputText.contains(kBranchIndicatorC)) {
*errorMessage = tr("Unable to obtain the project status: %1").arg(QString::fromLocal8Bit(errorText));
return false;
}
// All unchanged
if (outputText.contains("nothing to commit")) {
*errorMessage = tr("There are no modified files.");
return false;
}
} }
// Output looks like: // Output looks like:
@@ -555,7 +575,7 @@ bool GitClient::getCommitData(const QString &workingDirectory,
// # // #
// # list of files... // # list of files...
const QStringList lines = QString::fromLocal8Bit(outputText).remove(QLatin1Char('\r')).split(QLatin1Char('\n')); const QStringList lines = output.split(QLatin1Char('\n'));
if (!parseFiles(lines, d)) { if (!parseFiles(lines, d)) {
*errorMessage = tr("Unable to parse the file output."); *errorMessage = tr("Unable to parse the file output.");
return false; return false;
@@ -610,22 +630,62 @@ bool GitClient::addAndCommit(const QString &repositoryDirectory,
QByteArray errorText; QByteArray errorText;
const bool rc = synchronousGit(repositoryDirectory, args, &outputText, &errorText); const bool rc = synchronousGit(repositoryDirectory, args, &outputText, &errorText);
const QString message = rc ? const QString message = rc ?
tr("Committed %n file(s).", 0, checkedFiles.size()) : tr("Committed %n file(s).\n", 0, checkedFiles.size()) :
tr("Unable to commit %n file(s): %1", 0, checkedFiles.size()).arg(QString::fromLocal8Bit(errorText)); tr("Unable to commit %n file(s): %1\n", 0, checkedFiles.size()).arg(QString::fromLocal8Bit(errorText));
m_plugin->m_outputWindow->append(message); m_plugin->outputWindow()->append(message);
m_plugin->m_outputWindow->popup(false); m_plugin->outputWindow()->popup(false);
return rc; return rc;
} }
void GitClient::pull(const QString &workingDirectory) void GitClient::pull(const QString &workingDirectory)
{ {
executeGit(workingDirectory, QStringList(QLatin1String("pull")), m_plugin->m_outputWindow, 0,true); executeGit(workingDirectory, QStringList(QLatin1String("pull")), m_plugin->outputWindow(), 0, true);
} }
void GitClient::push(const QString &workingDirectory) void GitClient::push(const QString &workingDirectory)
{ {
executeGit(workingDirectory, QStringList(QLatin1String("push")), m_plugin->m_outputWindow, 0,true); executeGit(workingDirectory, QStringList(QLatin1String("push")), m_plugin->outputWindow(), 0, true);
}
void GitClient::stash(const QString &workingDirectory)
{
// Check for changes and stash
QString errorMessage;
switch (gitStatus(workingDirectory, false, 0, &errorMessage)) {
case StatusChanged:
executeGit(workingDirectory, QStringList(QLatin1String("stash")), m_plugin->outputWindow(), 0, true);
break;
case StatusUnchanged:
m_plugin->outputWindow()->append(tr("There are no modified files."));
m_plugin->outputWindow()->popup();
break;
case StatusFailed:
m_plugin->outputWindow()->append(errorMessage);
m_plugin->outputWindow()->popup();
break;
}
}
void GitClient::stashPop(const QString &workingDirectory)
{
QStringList arguments(QLatin1String("stash"));
arguments << QLatin1String("pop");
executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0, true);
}
void GitClient::branchList(const QString &workingDirectory)
{
QStringList arguments(QLatin1String("branch"));
arguments << QLatin1String("-r");
executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0, true);
}
void GitClient::stashList(const QString &workingDirectory)
{
QStringList arguments(QLatin1String("stash"));
arguments << QLatin1String("list");
executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0, true);
} }
QString GitClient::readConfig(const QString &workingDirectory, const QStringList &configVar) QString GitClient::readConfig(const QString &workingDirectory, const QStringList &configVar)
@@ -645,6 +705,21 @@ QString GitClient::readConfigValue(const QString &workingDirectory, const QStrin
return readConfig(workingDirectory, QStringList(configVar)).remove(QLatin1Char('\n')); return readConfig(workingDirectory, QStringList(configVar)).remove(QLatin1Char('\n'));
} }
GitSettings GitClient::settings() const
{
return m_settings;
}
void GitClient::setSettings(const GitSettings &s)
{
if (s != m_settings) {
m_settings = s;
if (QSettings *s = m_core->settings())
m_settings.toSettings(s);
}
}
// ------------------------ GitCommand
GitCommand::GitCommand() GitCommand::GitCommand()
{ {
} }

View File

@@ -34,6 +34,8 @@
#ifndef GITCLIENT_H #ifndef GITCLIENT_H
#define GITCLIENT_H #define GITCLIENT_H
#include "gitsettings.h"
#include <coreplugin/iversioncontrol.h> #include <coreplugin/iversioncontrol.h>
#include <coreplugin/editormanager/ieditor.h> #include <coreplugin/editormanager/ieditor.h>
#include <projectexplorer/environment.h> #include <projectexplorer/environment.h>
@@ -91,6 +93,11 @@ public:
void pull(const QString &workingDirectory); void pull(const QString &workingDirectory);
void push(const QString &workingDirectory); void push(const QString &workingDirectory);
void stash(const QString &workingDirectory);
void stashPop(const QString &workingDirectory);
void branchList(const QString &workingDirectory);
void stashList(const QString &workingDirectory);
QString readConfig(const QString &workingDirectory, const QStringList &configVar); QString readConfig(const QString &workingDirectory, const QStringList &configVar);
QString readConfigValue(const QString &workingDirectory, const QString &configVar); QString readConfigValue(const QString &workingDirectory, const QString &configVar);
@@ -106,10 +113,19 @@ public:
const QStringList &checkedFiles, const QStringList &checkedFiles,
const QStringList &origCommitFiles); const QStringList &origCommitFiles);
GitSettings settings() const;
void setSettings(const GitSettings &s);
public slots: public slots:
void show(const QString &source, const QString &id); void show(const QString &source, const QString &id);
private: private:
enum StatusResult { StatusChanged, StatusUnchanged, StatusFailed };
StatusResult gitStatus(const QString &workingDirectory,
bool untracked,
QString *output = 0,
QString *errorMessage = 0);
VCSBase::VCSBaseEditor *createVCSEditor(const QString &kind, VCSBase::VCSBaseEditor *createVCSEditor(const QString &kind,
QString title, QString title,
const QString &source, const QString &source,
@@ -132,6 +148,7 @@ private:
const QString m_msgWait; const QString m_msgWait;
GitPlugin *m_plugin; GitPlugin *m_plugin;
Core::ICore *m_core; Core::ICore *m_core;
GitSettings m_settings;
}; };
class GitCommand : public QObject class GitCommand : public QObject

View File

@@ -104,6 +104,7 @@ void GitOutputWindow::append(const QString &text)
const QStringList lines = text.split(QLatin1Char('\n')); const QStringList lines = text.split(QLatin1Char('\n'));
foreach (const QString &s, lines) foreach (const QString &s, lines)
m_outputListWidget->addItem(s); m_outputListWidget->addItem(s);
m_outputListWidget->scrollToBottom();
popup(); popup();
} }

View File

@@ -126,6 +126,10 @@ GitPlugin::GitPlugin() :
m_diffSelectedFilesAction(0), m_diffSelectedFilesAction(0),
m_undoAction(0), m_undoAction(0),
m_redoAction(0), m_redoAction(0),
m_stashAction(0),
m_stashPopAction(0),
m_stashListAction(0),
m_branchListAction(0),
m_projectExplorer(0), m_projectExplorer(0),
m_gitClient(0), m_gitClient(0),
m_outputWindow(0), m_outputWindow(0),
@@ -206,6 +210,15 @@ static const VCSBase::VCSBaseSubmitEditorParameters submitParameters = {
Git::Constants::DIFF_SELECTED Git::Constants::DIFF_SELECTED
}; };
static inline Core::ICommand *createSeparator(Core::ActionManagerInterface *am,
const QList<int> &context,
const QString &id,
QObject *parent)
{
QAction *a = new QAction(parent);
a->setSeparator(true);
return am->registerAction(a, id, context);
}
bool GitPlugin::initialize(const QStringList &arguments, QString *error_message) bool GitPlugin::initialize(const QStringList &arguments, QString *error_message)
{ {
@@ -262,7 +275,6 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *error_message)
} }
Core::ICommand *command; Core::ICommand *command;
QAction *tmpaction;
m_diffAction = new QAction(tr("Diff current file"), this); m_diffAction = new QAction(tr("Diff current file"), this);
command = actionManager->registerAction(m_diffAction, "Git.Diff", globalcontext); command = actionManager->registerAction(m_diffAction, "Git.Diff", globalcontext);
@@ -306,10 +318,7 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *error_message)
connect(m_addAction, SIGNAL(triggered()), this, SLOT(addFile())); connect(m_addAction, SIGNAL(triggered()), this, SLOT(addFile()));
gitContainer->addAction(command); gitContainer->addAction(command);
tmpaction = new QAction(this); gitContainer->addAction(createSeparator(actionManager, globalcontext, QLatin1String("Git.Sep.Project"), this));
tmpaction->setSeparator(true);
command = actionManager->registerAction(tmpaction, QLatin1String("Git.Sep.Project"), globalcontext);
gitContainer->addAction(command);
m_diffProjectAction = new QAction(tr("Diff current project"), this); m_diffProjectAction = new QAction(tr("Diff current project"), this);
command = actionManager->registerAction(m_diffProjectAction, "Git.DiffProject", globalcontext); command = actionManager->registerAction(m_diffProjectAction, "Git.DiffProject", globalcontext);
@@ -337,15 +346,26 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *error_message)
connect(m_undoProjectAction, SIGNAL(triggered()), this, SLOT(undoProjectChanges())); connect(m_undoProjectAction, SIGNAL(triggered()), this, SLOT(undoProjectChanges()));
gitContainer->addAction(command); gitContainer->addAction(command);
tmpaction = new QAction(this); gitContainer->addAction(createSeparator(actionManager, globalcontext, QLatin1String("Git.Sep.Global"), this));
tmpaction->setSeparator(true);
command = actionManager->registerAction(tmpaction, QLatin1String("Git.Sep.Global"), globalcontext); m_stashAction = new QAction(tr("Stash"), this);
m_stashAction->setToolTip("Saves the current state of your work.");
command = actionManager->registerAction(m_stashAction, "Git.Stash", globalcontext);
command->setAttribute(Core::ICommand::CA_UpdateText);
connect(m_stashAction, SIGNAL(triggered()), this, SLOT(stash()));
gitContainer->addAction(command); gitContainer->addAction(command);
m_showAction = new QAction(tr("Show commit..."), this); m_pullAction = new QAction(tr("Pull"), this);
command = actionManager->registerAction(m_showAction, "Git.ShowCommit", globalcontext); command = actionManager->registerAction(m_pullAction, "Git.Pull", globalcontext);
command->setAttribute(Core::ICommand::CA_UpdateText); command->setAttribute(Core::ICommand::CA_UpdateText);
connect(m_showAction, SIGNAL(triggered()), this, SLOT(showCommit())); connect(m_pullAction, SIGNAL(triggered()), this, SLOT(pull()));
gitContainer->addAction(command);
m_stashPopAction = new QAction(tr("Stash pop"), this);
m_stashAction->setToolTip("Restores changes saved to the stash list using \"Stash\".");
command = actionManager->registerAction(m_stashPopAction, "Git.StashPop", globalcontext);
command->setAttribute(Core::ICommand::CA_UpdateText);
connect(m_stashPopAction, SIGNAL(triggered()), this, SLOT(stashPop()));
gitContainer->addAction(command); gitContainer->addAction(command);
m_commitAction = new QAction(tr("Commit..."), this); m_commitAction = new QAction(tr("Commit..."), this);
@@ -355,24 +375,37 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *error_message)
connect(m_commitAction, SIGNAL(triggered()), this, SLOT(startCommit())); connect(m_commitAction, SIGNAL(triggered()), this, SLOT(startCommit()));
gitContainer->addAction(command); gitContainer->addAction(command);
m_pullAction = new QAction(tr("Pull"), this);
command = actionManager->registerAction(m_pullAction, "Git.Pull", globalcontext);
command->setAttribute(Core::ICommand::CA_UpdateText);
connect(m_pullAction, SIGNAL(triggered()), this, SLOT(pull()));
gitContainer->addAction(command);
m_pushAction = new QAction(tr("Push"), this); m_pushAction = new QAction(tr("Push"), this);
command = actionManager->registerAction(m_pushAction, "Git.Push", globalcontext); command = actionManager->registerAction(m_pushAction, "Git.Push", globalcontext);
command->setAttribute(Core::ICommand::CA_UpdateText); command->setAttribute(Core::ICommand::CA_UpdateText);
connect(m_pushAction, SIGNAL(triggered()), this, SLOT(push())); connect(m_pushAction, SIGNAL(triggered()), this, SLOT(push()));
gitContainer->addAction(command); gitContainer->addAction(command);
gitContainer->addAction(createSeparator(actionManager, globalcontext, QLatin1String("Git.Sep.Branch"), this));
m_branchListAction = new QAction(tr("List branches"), this);
command = actionManager->registerAction(m_branchListAction, "Git.BranchList", globalcontext);
command->setAttribute(Core::ICommand::CA_UpdateText);
connect(m_branchListAction, SIGNAL(triggered()), this, SLOT(branchList()));
gitContainer->addAction(command);
m_stashListAction = new QAction(tr("List stashes"), this);
command = actionManager->registerAction(m_stashListAction, "Git.StashList", globalcontext);
command->setAttribute(Core::ICommand::CA_UpdateText);
connect(m_stashListAction, SIGNAL(triggered()), this, SLOT(stashList()));
gitContainer->addAction(command);
m_showAction = new QAction(tr("Show commit..."), this);
command = actionManager->registerAction(m_showAction, "Git.ShowCommit", globalcontext);
command->setAttribute(Core::ICommand::CA_UpdateText);
connect(m_showAction, SIGNAL(triggered()), this, SLOT(showCommit()));
gitContainer->addAction(command);
// Submit editor // Submit editor
QList<int> submitContext; QList<int> submitContext;
submitContext.push_back(m_core->uniqueIDManager()->uniqueIdentifier(QLatin1String(Constants::C_GITSUBMITEDITOR))); submitContext.push_back(m_core->uniqueIDManager()->uniqueIdentifier(QLatin1String(Constants::C_GITSUBMITEDITOR)));
m_submitCurrentAction = new QAction(VCSBase::VCSBaseSubmitEditor::submitIcon(), tr("Commit"), this); m_submitCurrentAction = new QAction(VCSBase::VCSBaseSubmitEditor::submitIcon(), tr("Commit"), this);
command = actionManager->registerAction(m_submitCurrentAction, Constants::SUBMIT_CURRENT, submitContext); command = actionManager->registerAction(m_submitCurrentAction, Constants::SUBMIT_CURRENT, submitContext);
// TODO
connect(m_submitCurrentAction, SIGNAL(triggered()), this, SLOT(submitCurrentLog())); connect(m_submitCurrentAction, SIGNAL(triggered()), this, SLOT(submitCurrentLog()));
m_diffSelectedFilesAction = new QAction(VCSBase::VCSBaseSubmitEditor::diffIcon(), tr("Diff Selected Files"), this); m_diffSelectedFilesAction = new QAction(VCSBase::VCSBaseSubmitEditor::diffIcon(), tr("Diff Selected Files"), this);
@@ -421,7 +454,7 @@ void GitPlugin::diffCurrentProject()
m_gitClient->diff(workingDirectory, QString()); m_gitClient->diff(workingDirectory, QString());
} }
QFileInfo GitPlugin::currentFile() QFileInfo GitPlugin::currentFile() const
{ {
QString fileName = m_core->fileManager()->currentFile(); QString fileName = m_core->fileManager()->currentFile();
QFileInfo fileInfo(fileName); QFileInfo fileInfo(fileName);
@@ -636,26 +669,52 @@ bool GitPlugin::editorAboutToClose(Core::IEditor *iEditor)
void GitPlugin::pull() void GitPlugin::pull()
{ {
QString workingDirectory = getWorkingDirectory(); const QString workingDirectory = getWorkingDirectory();
if (workingDirectory.isEmpty()) if (!workingDirectory.isEmpty())
return; m_gitClient->pull(workingDirectory);
m_gitClient->pull(workingDirectory);
} }
void GitPlugin::push() void GitPlugin::push()
{ {
QString workingDirectory = getWorkingDirectory(); const QString workingDirectory = getWorkingDirectory();
if (workingDirectory.isEmpty()) if (!workingDirectory.isEmpty())
return; m_gitClient->push(workingDirectory);
m_gitClient->push(workingDirectory); }
void GitPlugin::stash()
{
const QString workingDirectory = getWorkingDirectory();
if (!workingDirectory.isEmpty())
m_gitClient->stash(workingDirectory);
}
void GitPlugin::stashPop()
{
const QString workingDirectory = getWorkingDirectory();
if (!workingDirectory.isEmpty())
m_gitClient->stashPop(workingDirectory);
}
void GitPlugin::branchList()
{
const QString workingDirectory = getWorkingDirectory();
if (!workingDirectory.isEmpty())
m_gitClient->branchList(workingDirectory);
}
void GitPlugin::stashList()
{
const QString workingDirectory = getWorkingDirectory();
if (!workingDirectory.isEmpty())
m_gitClient->stashList(workingDirectory);
} }
void GitPlugin::updateActions() void GitPlugin::updateActions()
{ {
QFileInfo current = currentFile(); const QFileInfo current = currentFile();
const QString fileName = current.fileName(); const QString fileName = current.fileName();
const QString currentDirectory = getWorkingDirectory(); const QString currentDirectory = getWorkingDirectory();
QString repository = m_gitClient->findRepositoryForFile(current.absoluteFilePath()); const QString repository = m_gitClient->findRepositoryForFile(current.absoluteFilePath());
// First check for file commands and if the current file is inside // First check for file commands and if the current file is inside
// a Git-repository // a Git-repository
m_diffAction->setText(tr("Diff %1").arg(fileName)); m_diffAction->setText(tr("Diff %1").arg(fileName));
@@ -693,7 +752,7 @@ void GitPlugin::updateActions()
if (m_projectExplorer && m_projectExplorer->currentNode() if (m_projectExplorer && m_projectExplorer->currentNode()
&& m_projectExplorer->currentNode()->projectNode()) { && m_projectExplorer->currentNode()->projectNode()) {
QString name = QFileInfo(m_projectExplorer->currentNode()->projectNode()->path()).baseName(); const QString name = QFileInfo(m_projectExplorer->currentNode()->projectNode()->path()).baseName();
m_diffProjectAction->setEnabled(true); m_diffProjectAction->setEnabled(true);
m_diffProjectAction->setText(tr("Diff Project %1").arg(name)); m_diffProjectAction->setText(tr("Diff Project %1").arg(name));
m_statusProjectAction->setEnabled(true); m_statusProjectAction->setEnabled(true);
@@ -729,4 +788,19 @@ void GitPlugin::showCommit()
m_gitClient->show(m_changeSelectionDialog->m_ui.repositoryEdit->text(), change); m_gitClient->show(m_changeSelectionDialog->m_ui.repositoryEdit->text(), change);
} }
GitOutputWindow *GitPlugin::outputWindow() const
{
return m_outputWindow;
}
GitSettings GitPlugin::settings() const
{
return m_gitClient->settings();
}
void GitPlugin::setSettings(const GitSettings &s)
{
m_gitClient->setSettings(s);
}
Q_EXPORT_PLUGIN(GitPlugin) Q_EXPORT_PLUGIN(GitPlugin)

View File

@@ -66,6 +66,7 @@ namespace Internal {
class ChangeSelectionDialog; class ChangeSelectionDialog;
class GitSubmitEditor; class GitSubmitEditor;
struct CommitData; struct CommitData;
struct GitSettings;
// Just a proxy for GitPlugin // Just a proxy for GitPlugin
class CoreListener : public Core::ICoreListener class CoreListener : public Core::ICoreListener
@@ -94,6 +95,11 @@ public:
QString getWorkingDirectory(); QString getWorkingDirectory();
GitOutputWindow *outputWindow() const;
GitSettings settings() const;
void setSettings(const GitSettings &s);
public slots: public slots:
void updateActions(); void updateActions();
bool editorAboutToClose(Core::IEditor *editor); bool editorAboutToClose(Core::IEditor *editor);
@@ -114,12 +120,15 @@ private slots:
void showCommit(); void showCommit();
void startCommit(); void startCommit();
void stash();
void stashPop();
void branchList();
void stashList();
void pull(); void pull();
void push(); void push();
private: private:
friend class GitClient; QFileInfo currentFile() const;
QFileInfo currentFile();
Core::IEditor *openSubmitEditor(const QString &fileName, const CommitData &cd); Core::IEditor *openSubmitEditor(const QString &fileName, const CommitData &cd);
void cleanChangeTmpFile(); void cleanChangeTmpFile();
@@ -144,6 +153,10 @@ private:
QAction *m_diffSelectedFilesAction; QAction *m_diffSelectedFilesAction;
QAction *m_undoAction; QAction *m_undoAction;
QAction *m_redoAction; QAction *m_redoAction;
QAction *m_stashAction;
QAction *m_stashPopAction;
QAction *m_stashListAction;
QAction *m_branchListAction;
ProjectExplorer::ProjectExplorerPlugin *m_projectExplorer; ProjectExplorer::ProjectExplorerPlugin *m_projectExplorer;
GitClient *m_gitClient; GitClient *m_gitClient;

View File

@@ -0,0 +1,79 @@
/***************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
**
** Non-Open Source Usage
**
** Licensees may use this file in accordance with the Qt Beta Version
** License Agreement, Agreement version 2.2 provided with the Software or,
** alternatively, in accordance with the terms contained in a written
** agreement between you and Nokia.
**
** GNU General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the packaging
** of this file. Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
**
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
** http://www.gnu.org/copyleft/gpl.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt GPL Exception
** version 1.2, included in the file GPL_EXCEPTION.txt in this package.
**
***************************************************************************/
#include "gitsettings.h"
#include <QtCore/QSettings>
#include <QtCore/QTextStream>
static const char *groupC = "Git";
static const char *sysEnvKeyC = "SysEnv";
static const char *pathKeyC = "Path";
static const char *logCountKeyC = "LogCount";
enum { defaultLogCount = 10 };
namespace Git {
namespace Internal {
GitSettings::GitSettings() :
adoptPath(false),
logCount(defaultLogCount)
{
}
void GitSettings::fromSettings(QSettings *settings)
{
settings->beginGroup(QLatin1String(groupC));
adoptPath = settings->value(QLatin1String(sysEnvKeyC), false).toBool();
path = settings->value(QLatin1String(pathKeyC), QString()).toString();
logCount = settings->value(QLatin1String(logCountKeyC), defaultLogCount).toInt();
settings->endGroup();
}
void GitSettings::toSettings(QSettings *settings) const
{
settings->beginGroup(QLatin1String(groupC));
settings->setValue(QLatin1String(sysEnvKeyC), adoptPath);
settings->setValue(QLatin1String(pathKeyC), path);
settings->setValue(QLatin1String(logCountKeyC), logCount);
settings->endGroup();
}
bool GitSettings::equals(const GitSettings &s) const
{
return adoptPath == s.adoptPath && path == s.path && logCount == s.logCount;
}
}
}

View File

@@ -0,0 +1,69 @@
/***************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
**
** Non-Open Source Usage
**
** Licensees may use this file in accordance with the Qt Beta Version
** License Agreement, Agreement version 2.2 provided with the Software or,
** alternatively, in accordance with the terms contained in a written
** agreement between you and Nokia.
**
** GNU General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the packaging
** of this file. Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
**
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
** http://www.gnu.org/copyleft/gpl.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt GPL Exception
** version 1.2, included in the file GPL_EXCEPTION.txt in this package.
**
***************************************************************************/
#ifndef GITSETTINGS_H
#define GITSETTINGS_H
#include <QtCore/QStringList>
QT_BEGIN_NAMESPACE
class QSettings;
QT_END_NAMESPACE
namespace Git {
namespace Internal {
// Todo: Add user name and password?
struct GitSettings
{
GitSettings();
void fromSettings(QSettings *);
void toSettings(QSettings *) const;
bool equals(const GitSettings &s) const;
bool adoptPath;
QString path;
int logCount;
};
inline bool operator==(const GitSettings &p1, const GitSettings &p2)
{ return p1.equals(p2); }
inline bool operator!=(const GitSettings &p1, const GitSettings &p2)
{ return !p1.equals(p2); }
} // namespace Internal
} // namespace Git
#endif // GITSETTINGS_H

View File

@@ -32,35 +32,44 @@
***************************************************************************/ ***************************************************************************/
#include "settingspage.h" #include "settingspage.h"
#include "gitsettings.h"
#include "gitplugin.h"
#include <coreplugin/icore.h>
#include <extensionsystem/pluginmanager.h>
#include <QtCore/QSettings>
#include <QtGui/QLineEdit>
#include <QtGui/QFileDialog>
#include <QtCore/QDebug> #include <QtCore/QDebug>
using namespace Git::Internal; using namespace Git::Internal;
static const char *groupC = "Git"; SettingsPageWidget::SettingsPageWidget(QWidget *parent) :
static const char *sysEnvKeyC = "SysEnv"; QWidget(parent)
static const char *pathKeyC = "Path"; {
static const char *logCountKeyC = "LogCount"; m_ui.setupUi(this);
connect(m_ui.adoptButton, SIGNAL(clicked()), this, SLOT(setSystemPath()));
}
GitSettings SettingsPageWidget::settings() const
{
GitSettings rc;
rc.path = m_ui.pathLineEdit->text();
rc.adoptPath = m_ui.environmentGroupBox->isChecked() && !rc.path.isEmpty();
rc.logCount = m_ui.logCountSpinBox->value();
return rc;
}
void SettingsPageWidget::setSettings(const GitSettings &s)
{
m_ui.environmentGroupBox->setChecked(s.adoptPath);
m_ui.pathLineEdit->setText(s.path);
m_ui.logCountSpinBox->setValue(s.logCount);
}
void SettingsPageWidget::setSystemPath()
{
m_ui.pathLineEdit->setText(QLatin1String(qgetenv("PATH")));
}
// -------- SettingsPage
SettingsPage::SettingsPage() SettingsPage::SettingsPage()
{ {
Core::ICore *coreIFace = ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>();
if (coreIFace)
m_settings = coreIFace->settings();
if (m_settings) {
m_settings->beginGroup(QLatin1String(groupC));
m_adopt = m_settings->value(QLatin1String(sysEnvKeyC), true).toBool();
m_path = m_settings->value(QLatin1String(pathKeyC), QString()).toString();
m_logCount = m_settings->value(QLatin1String(logCountKeyC), 10).toInt();
m_settings->endGroup();
}
} }
QString SettingsPage::name() const QString SettingsPage::name() const
@@ -68,7 +77,7 @@ QString SettingsPage::name() const
return tr("General"); return tr("General");
} }
QString SettingsPage::category() const QString SettingsPage::category() const
{ {
return QLatin1String("Git"); return QLatin1String("Git");
} }
@@ -80,37 +89,17 @@ QString SettingsPage::trCategory() const
QWidget *SettingsPage::createPage(QWidget *parent) QWidget *SettingsPage::createPage(QWidget *parent)
{ {
QWidget *w = new QWidget(parent); if (!m_widget)
m_ui.setupUi(w); m_widget = new SettingsPageWidget(parent);
m_ui.adoptCheckBox->setChecked(m_adopt); m_widget->setSettings(GitPlugin::instance()->settings());
m_ui.pathLineEdit->setText(m_path); return m_widget;
m_ui.logLineEdit->setText(QString::number(m_logCount));
connect(m_ui.adoptButton, SIGNAL(clicked()), this, SLOT(setSystemPath()));
return w;
} }
void SettingsPage::finished(bool accepted) void SettingsPage::finished(bool accepted)
{ {
if (!accepted) if (!accepted || !m_widget)
return; return;
m_adopt = m_ui.adoptCheckBox->isChecked(); GitPlugin::instance()->setSettings(m_widget->settings());
m_path = m_ui.pathLineEdit->text();
m_logCount = m_ui.logLineEdit->text().toInt();
if (!m_settings)
return;
m_settings->beginGroup(QLatin1String(groupC));
m_settings->setValue(QLatin1String(sysEnvKeyC), m_adopt);
m_settings->setValue(QLatin1String(pathKeyC), m_path);
m_settings->setValue(QLatin1String(logCountKeyC), m_logCount);
m_settings->endGroup();
} }
void SettingsPage::setSystemPath()
{
m_path = qgetenv("PATH");
m_ui.pathLineEdit->setText(m_path);
}

View File

@@ -35,6 +35,7 @@
#define SETTINGSPAGE_H #define SETTINGSPAGE_H
#include <QtGui/QWidget> #include <QtGui/QWidget>
#include <QtCore/QPointer>
#include <coreplugin/dialogs/ioptionspage.h> #include <coreplugin/dialogs/ioptionspage.h>
@@ -47,6 +48,23 @@ QT_END_NAMESPACE
namespace Git { namespace Git {
namespace Internal { namespace Internal {
struct GitSettings;
class SettingsPageWidget : public QWidget {
Q_OBJECT
public:
explicit SettingsPageWidget(QWidget *parent = 0);
GitSettings settings() const;
void setSettings(const GitSettings &);
private slots:
void setSystemPath();
private:
Ui::SettingsPage m_ui;
};
class SettingsPage : public Core::IOptionsPage class SettingsPage : public Core::IOptionsPage
{ {
Q_OBJECT Q_OBJECT
@@ -61,20 +79,8 @@ public:
QWidget *createPage(QWidget *parent); QWidget *createPage(QWidget *parent);
void finished(bool accepted); void finished(bool accepted);
bool adoptEnvironment() const { return m_adopt; }
int logCount() const { return m_logCount; }
QString path() const { return m_path; }
private slots:
void setSystemPath();
private: private:
Ui_SettingsPage m_ui; QPointer<SettingsPageWidget> m_widget;
QSettings *m_settings;
bool m_adopt;
QString m_path;
int m_logCount;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -6,103 +6,113 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>345</width> <width>436</width>
<height>177</height> <height>186</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QCheckBox" name="adoptCheckBox"> <layout class="QVBoxLayout" name="verticalLayout">
<property name="text">
<string>Use System Environment</string>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="title">
<string>Environment variables</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>PATH:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="pathLineEdit"/>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="adoptButton">
<property name="text">
<string>Adopt</string>
</property>
</widget>
</item>
<item row="1" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>52</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1" colspan="2">
<widget class="QLabel" name="label_2">
<property name="text">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt; font-weight:600;&quot;&gt;Note&lt;/span&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; that Git needs Perl in the environment as well&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QGroupBox" name="environmentGroupBox">
<property name="text"> <property name="enabled">
<string>Commit display count:</string> <bool>true</bool>
</property> </property>
<property name="title">
<string>Environment variables</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="pathlabel">
<property name="text">
<string>PATH:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLineEdit" name="pathLineEdit"/>
</item>
<item>
<widget class="QPushButton" name="adoptButton">
<property name="text">
<string>From system</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="noteLabel">
<property name="text">
<string>&lt;b&gt;Note:&lt;/b&gt;</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="noteFieldlabel">
<property name="text">
<string>Git needs to find Perl in the environment as well.</string>
</property>
</widget>
</item>
</layout>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLineEdit" name="logLineEdit"> <layout class="QFormLayout" name="logFormLayout">
<property name="toolTip"> <property name="fieldGrowthPolicy">
<string>Note that huge amount of commits might take some time.</string> <enum>QFormLayout::ExpandingFieldsGrow</enum>
</property> </property>
</widget> <item row="0" column="1">
<widget class="QSpinBox" name="logCountSpinBox">
<property name="toolTip">
<string>Note that huge amount of commits might take some time.</string>
</property>
<property name="maximum">
<number>1000</number>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="logCountLabel">
<property name="text">
<string>Log commit display count:</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>141</width> <width>40</width>
<height>20</height> <height>20</height>
</size> </size>
</property> </property>
@@ -114,22 +124,5 @@ p, li { white-space: pre-wrap; }
<tabstop>pathLineEdit</tabstop> <tabstop>pathLineEdit</tabstop>
</tabstops> </tabstops>
<resources/> <resources/>
<connections> <connections/>
<connection>
<sender>adoptCheckBox</sender>
<signal>toggled(bool)</signal>
<receiver>groupBox</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>144</x>
<y>33</y>
</hint>
<hint type="destinationlabel">
<x>139</x>
<y>65</y>
</hint>
</hints>
</connection>
</connections>
</ui> </ui>