Skip to content
Snippets Groups Projects
gitclient.cpp 39.1 KiB
Newer Older
con's avatar
con committed

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
con's avatar
con committed
GitCommand::GitCommand()
{
}

GitCommand::~GitCommand()
{
}

void GitCommand::execute(const QStringList &arguments,
                         const QString &workingDirectory,
                         const ProjectExplorer::Environment &environment)
con's avatar
con committed
{
    if (Git::Constants::debug)
        qDebug() << "GitCommand::execute" << workingDirectory << arguments;

    // For some reason QtConcurrent::run() only works on this
    QFuture<void> task = QtConcurrent::run(this, &GitCommand::run
                                           , arguments
                                           , workingDirectory
                                           , environment);
    QString taskName = QLatin1String("Git ") + arguments[0];

    Core::ICore *core = ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>();
    core->progressManager()->addTask(task, taskName
                            , QLatin1String("Git.action")
                            , Core::ProgressManagerInterface::CloseOnSuccess);
}

void GitCommand::run(const QStringList &arguments,
                     const QString &workingDirectory,
                     const ProjectExplorer::Environment &environment)
con's avatar
con committed
{
    if (Git::Constants::debug)
        qDebug() << "GitCommand::run" << workingDirectory << arguments;
    QProcess process;
    if (!workingDirectory.isEmpty())
        process.setWorkingDirectory(workingDirectory);

    ProjectExplorer::Environment env = environment;
    if (env.toStringList().isEmpty())
        env = ProjectExplorer::Environment::systemEnvironment();
    process.setEnvironment(env.toStringList());

    process.start(QLatin1String(kGitCommand), arguments);
    if (!process.waitForFinished()) {
        emit errorText(QLatin1String("Error: Git timed out"));
        return;
    }

    const QByteArray output = process.readAllStandardOutput();
    if (output.isEmpty()) {
        if (arguments.at(0) == QLatin1String("diff"))
            emit outputText(tr("The file does not differ from HEAD"));
    } else {
        emit outputData(output);
    }
    const QByteArray error = process.readAllStandardError();
    if (!error.isEmpty())
        emit errorText(QString::fromLocal8Bit(error));

    // As it is used asynchronously, we need to delete ourselves
    this->deleteLater();
}