File: fileviewgitplugin.h

package info (click to toggle)
dolphin-plugins 4%3A25.04.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 5,476 kB
  • sloc: cpp: 10,512; xml: 167; sh: 10; makefile: 3
file content (141 lines) | stat: -rw-r--r-- 4,878 bytes parent folder | download
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
    SPDX-FileCopyrightText: 2010 Peter Penz <peter.penz@gmx.at>
    SPDX-FileCopyrightText: 2010 Sebastian Doerner <sebastian@sebastian-doerner.de>

    SPDX-License-Identifier: GPL-2.0-or-later
*/

#ifndef FILEVIEWGITPLUGIN_H
#define FILEVIEWGITPLUGIN_H

#include <Dolphin/KVersionControlPlugin>
#include <KDialogJobUiDelegate>
#include <KIO/CommandLauncherJob>
#include <KJobUiDelegate>

#include <KFileItem>

#include <QHash>
#include <QList>
#include <QProcess>
#include <QString>

/**
 * @brief Git implementation for the KVersionControlPlugin2 interface.
 */
class FileViewGitPlugin : public KVersionControlPlugin
{
    Q_OBJECT

public:
    FileViewGitPlugin(QObject *parent, const QList<QVariant> &args);
    ~FileViewGitPlugin() override;
    QString fileName() const override;
    QString localRepositoryRoot(const QString &directory) const override;
    bool beginRetrieval(const QString &directory) override;
    void endRetrieval() override;
    ItemVersion itemVersion(const KFileItem &item) const override;
    QList<QAction *> versionControlActions(const KFileItemList &items) const override;
    QList<QAction *> outOfVersionControlActions(const KFileItemList &items) const override;

private Q_SLOTS:
    void addFiles();
    void revertFiles();
    void showLocalChanges();
    void removeFiles();
    void checkout();
    void commit();
    void createTag();
    void push();
    void pull();
    void log();
    void showDiff(const QUrl &link);
    void merge();
    void restoreStaged();
    void clone();

    void slotOperationCompleted(int exitCode, QProcess::ExitStatus exitStatus);
    void slotOperationError();

private:
    QList<QAction *> contextMenuFilesActions(const KFileItemList &items) const;
    QList<QAction *> contextMenuDirectoryActions(const QString &directory) const;
    /**
     * Reads into buffer from device until we reach the next \0 or maxChars have been read.
     * @returns The number of characters read.
     */
    int readUntilZeroChar(QIODevice *device, char *buffer, const int maxChars);
    /**
     * Parses the output of the git push command and returns an appropriate message,
     * that should be displayed to the user.
     * @returns The error or success message to be printed to the user
     */
    QString parsePushOutput();
    /**
     * Parses the output of the git pull command and returns an appropriate message,
     * that should be displayed to the user.
     * @returns The error or success message to be printed to the user
     */
    QString parsePullOutput();
    /**
     * Executes the command "git {svnCommand}" for the files that have been
     * set by getting the context menu actions (see contextMenuActions()).
     * @param infoMsg     Message that should be shown before the command is executed.
     * @param errorMsg    Message that should be shown if the execution of the command
     *                    has failed.
     * @param operationCompletedMsg
     *                    Message that should be shown if the execution of the command
     *                    has been completed successfully.
     */
    void execGitCommand(const QString &gitCommand,
                        const QStringList &arguments,
                        const QString &infoMsg,
                        const QString &errorMsg,
                        const QString &operationCompletedMsg);
    void startGitCommandProcess();

private:
    bool m_pendingOperation;
    /**
     * Contains all files in the current directory, whose version state is not
     * NormalVersion and directories containing such files (except for directories
     * whose only special contained file type is IgnoredVersion).
     */
    QHash<QString, ItemVersion> m_versionInfoHash;
    QAction *m_addAction;
    QAction *m_revertAction;
    QAction *m_showLocalChangesAction;
    QAction *m_removeAction;
    QAction *m_checkoutAction;
    QAction *m_commitAction;
    QAction *m_tagAction;
    QAction *m_pushAction;
    QAction *m_pullAction;
    QAction *m_logAction;
    QAction *m_mergeAction;
    QAction *m_restoreStagedAction;
    QAction *m_cloneAction;

    QString m_currentDir;
    QProcess m_process;
    QString m_command;
    QStringList m_arguments;
    QString m_operationCompletedMsg;
    QString m_errorMsg;

    QWidget *m_parentWidget;

    // Current targets. m_contextItems is used if and only if m_contextDir is empty.
    mutable QString m_contextDir;
    mutable KFileItemList m_contextItems;

    // Utility method, because the method call is the same except for the command
    void runCommand(const QString &command)
    {
        auto *job = new KIO::CommandLauncherJob(command);
        job->setWorkingDirectory(m_currentDir);
        job->setUiDelegate(new KDialogJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, nullptr));
        job->start();
    }
};
#endif // FILEVIEWGITPLUGIN_H