Skip to content
Snippets Groups Projects
gitclient.cpp 95.8 KiB
Newer Older
/**************************************************************************
con's avatar
con committed
**
** This file is part of Qt Creator
**
con's avatar
con committed
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
con's avatar
con committed
**
hjk's avatar
hjk committed
** Contact: Nokia Corporation (info@qt.nokia.com)
con's avatar
con committed
**
** GNU Lesser General Public License Usage
hjk's avatar
hjk committed
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** 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.
con's avatar
con committed
** In addition, as a special exception, Nokia gives you certain additional
hjk's avatar
hjk committed
** rights. These rights are described in the Nokia Qt LGPL Exception
con's avatar
con committed
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
hjk's avatar
hjk committed
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
con's avatar
con committed
** If you have questions regarding the use of this file, please contact
Tobias Hunger's avatar
Tobias Hunger committed
** Nokia at info@qt.nokia.com.
con's avatar
con committed
**
**************************************************************************/
hjk's avatar
hjk committed

con's avatar
con committed
#include "gitclient.h"
#include "gitutils.h"
con's avatar
con committed
#include "commitdata.h"
hjk's avatar
hjk committed
#include "gitconstants.h"
#include "gitplugin.h"
#include "gitversioncontrol.h"
con's avatar
con committed

#include <coreplugin/actionmanager/actionmanager.h>
hjk's avatar
hjk committed
#include <coreplugin/coreconstants.h>
con's avatar
con committed
#include <coreplugin/editormanager/editormanager.h>
hjk's avatar
hjk committed
#include <coreplugin/icore.h>
#include <coreplugin/messagemanager.h>
#include <coreplugin/progressmanager/progressmanager.h>
hjk's avatar
hjk committed
#include <coreplugin/uniqueidmanager.h>
#include <coreplugin/filemanager.h>
#include <coreplugin/iversioncontrol.h>

con's avatar
con committed
#include <texteditor/itexteditor.h>
hjk's avatar
hjk committed
#include <utils/qtcassert.h>
#include <utils/qtcprocess.h>
#include <utils/synchronousprocess.h>
#include <utils/fileutils.h>
hjk's avatar
hjk committed
#include <vcsbase/vcsbaseeditor.h>
#include <vcsbase/vcsbaseoutputwindow.h>
#include <vcsbase/vcsbaseplugin.h>
con's avatar
con committed

#include <QtCore/QRegExp>
#include <QtCore/QTemporaryFile>
#include <QtCore/QFileInfo>
#include <QtCore/QDir>
#include <QtCore/QSignalMapper>
con's avatar
con committed

#include <QtGui/QComboBox>
#include <QtGui/QMainWindow> // for msg box parent
hjk's avatar
hjk committed
#include <QtGui/QMessageBox>
#include <QtGui/QToolButton>
con's avatar
con committed

static const char kGitDirectoryC[] = ".git";
static const char kBranchIndicatorC[] = "# On branch";
con's avatar
con committed

namespace Git {
namespace Internal {

BaseGitArgumentsWidget::BaseGitArgumentsWidget(GitSettings *settings,
                                               Git::Internal::GitClient *client,
                                               const QString &directory,
                                               const QStringList &args) :
    QWidget(0),
    m_client(client),
    m_workingDirectory(directory),
    m_diffArgs(args),
    m_settings(settings)
{
    Q_ASSERT(settings);
    Q_ASSERT(client);
}

class BaseGitDiffArgumentsWidget : public Git::Internal::BaseGitArgumentsWidget
{
Friedemann Kleint's avatar
Friedemann Kleint committed
    Q_OBJECT
public:
    BaseGitDiffArgumentsWidget(Git::Internal::GitSettings *settings,
                               Git::Internal::GitClient *client,
                               const QString &directory,
                               const QStringList &args) :
        BaseGitArgumentsWidget(settings, client, directory, args),
        m_patience(new QToolButton),
        m_ignoreSpaces(new QToolButton)
        QHBoxLayout *layout = new QHBoxLayout(this);
        layout->setContentsMargins(3, 0, 3, 0);
        layout->setSpacing(2);
Tobias Hunger's avatar
Tobias Hunger committed
        m_patience->setToolTip(tr("Use the patience algorithm for calculating the differences."));
        m_patience->setText(tr("Patience"));
        layout->addWidget(m_patience);
        m_patience->setCheckable(true);
        m_patience->setChecked(m_settings->diffPatience);
        connect(m_patience, SIGNAL(toggled(bool)), this, SLOT(testForArgumentsChanged()));

Tobias Hunger's avatar
Tobias Hunger committed
        m_ignoreSpaces->setToolTip(tr("Ignore whitespace only changes."));
        m_ignoreSpaces->setText(tr("Ignore Whitespace"));
        layout->addWidget(m_ignoreSpaces);
        m_ignoreSpaces->setCheckable(true);
        m_ignoreSpaces->setChecked(m_settings->ignoreSpaceChangesInDiff);
        connect(m_ignoreSpaces, SIGNAL(toggled(bool)), this, SLOT(testForArgumentsChanged()));
    }

    QStringList arguments() const
    {
        QStringList args;
        foreach (const QString &arg, m_diffArgs) {
            if (arg == QLatin1String("--patience")
                    || arg == QLatin1String("--ignore-space-change"))
                continue;
            args.append(arg);
        }
        if (m_patience->isChecked())
            args.prepend(QLatin1String("--patience"));
        if (m_ignoreSpaces->isChecked())
            args.prepend(QLatin1String("--ignore-space-change"));

        return args;
    }

    void testForArgumentsChanged() {
        m_settings->diffPatience = m_patience->isChecked();
        m_settings->ignoreSpaceChangesInDiff = m_ignoreSpaces->isChecked();

        QStringList newArguments = arguments();

        if (newArguments == m_diffArgs)
            return;

        m_diffArgs = newArguments;
        redoCommand();
    }

    QToolButton *m_patience;
    QToolButton *m_ignoreSpaces;
};

class GitCommitDiffArgumentsWidget : public BaseGitDiffArgumentsWidget
{
Friedemann Kleint's avatar
Friedemann Kleint committed
    Q_OBJECT
public:
    GitCommitDiffArgumentsWidget(Git::Internal::GitSettings *settings,
                                 Git::Internal::GitClient *client, const QString &directory,
                                 const QStringList &args, const QStringList &unstaged,
                                 const QStringList &staged) :
        BaseGitDiffArgumentsWidget(settings, client, directory, args),
        m_unstagedFileNames(unstaged),
        m_stagedFileNames(staged)
    { }

    void redoCommand()
    {
        m_client->diff(m_workingDirectory, m_diffArgs, m_unstagedFileNames, m_stagedFileNames);
    }

private:
    const QStringList m_unstagedFileNames;
    const QStringList m_stagedFileNames;
};

class GitFileDiffArgumentsWidget : public BaseGitDiffArgumentsWidget
{
Friedemann Kleint's avatar
Friedemann Kleint committed
    Q_OBJECT
public:
    GitFileDiffArgumentsWidget(Git::Internal::GitSettings *settings,
                               Git::Internal::GitClient *client, const QString &directory,
                               const QStringList &args, const QString &file) :
        BaseGitDiffArgumentsWidget(settings, client, directory, args),
        m_fileName(file)
    { }

    void redoCommand()
    {
        m_client->diff(m_workingDirectory, m_diffArgs, m_fileName);
    }

Loading
Loading full blame...