aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp
blob: aaea619a2b1f55ae5433e2d9dc1e95a622f45a80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#include "vcsbasediffeditorcontroller.h"

#include <extensionsystem/pluginmanager.h>

#include <utils/async.h>
#include <utils/environment.h>
#include <utils/futuresynchronizer.h>
#include <utils/qtcassert.h>
#include <utils/qtcprocess.h>

using namespace DiffEditor;
using namespace Utils;

namespace VcsBase {

class VcsBaseDiffEditorControllerPrivate
{
public:
    VcsBaseDiffEditorControllerPrivate(VcsBaseDiffEditorController *q) : q(q) {}

    VcsBaseDiffEditorController *q;
    Environment m_processEnvironment;
    FilePath m_vcsBinary;
    const Tasking::TreeStorage<QString> m_inputStorage;
};

/////////////////////

VcsBaseDiffEditorController::VcsBaseDiffEditorController(Core::IDocument *document)
    : DiffEditorController(document)
    , d(new VcsBaseDiffEditorControllerPrivate(this))
{}

VcsBaseDiffEditorController::~VcsBaseDiffEditorController()
{
    delete d;
}

Tasking::TreeStorage<QString> VcsBaseDiffEditorController::inputStorage() const
{
    return d->m_inputStorage;
}

Tasking::TaskItem VcsBaseDiffEditorController::postProcessTask()
{
    using namespace Tasking;

    const auto setupDiffProcessor = [this](Async<QList<FileData>> &async) {
        const QString *storage = inputStorage().activeStorage();
        QTC_ASSERT(storage, qWarning("Using postProcessTask() requires putting inputStorage() "
                                     "into task tree's root group."));
        const QString inputData = storage ? *storage : QString();
        async.setFutureSynchronizer(ExtensionSystem::PluginManager::futureSynchronizer());
        async.setConcurrentCallData(&DiffUtils::readPatchWithPromise, inputData);
    };
    const auto onDiffProcessorDone = [this](const Async<QList<FileData>> &async) {
        setDiffFiles(async.isResultAvailable() ? async.result() : QList<FileData>());
        // TODO: We should set the right starting line here
    };
    const auto onDiffProcessorError = [this](const Async<QList<FileData>> &) {
        setDiffFiles({});
    };
    return AsyncTask<QList<FileData>>(setupDiffProcessor, onDiffProcessorDone, onDiffProcessorError);
}

void VcsBaseDiffEditorController::setupCommand(Process &process, const QStringList &args) const
{
    process.setEnvironment(d->m_processEnvironment);
    process.setWorkingDirectory(workingDirectory());
    process.setCommand({d->m_vcsBinary, args});
    process.setUseCtrlCStub(true);
}

void VcsBaseDiffEditorController::setVcsBinary(const FilePath &path)
{
    d->m_vcsBinary = path;
}

void VcsBaseDiffEditorController::setProcessEnvironment(const Environment &value)
{
    d->m_processEnvironment = value;
}

} // namespace VcsBase