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 142 143 144 145 146
|
/******************************************************************************
* Copyright (C) 2010 by Peter Penz <peter.penz@gmx.at> *
* Copyright (C) 2010 by Sebastian Doerner <sebastian@sebastian-doerner.de> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
******************************************************************************/
#ifndef FILEVIEWGITPLUGIN_H
#define FILEVIEWGITPLUGIN_H
#include <Dolphin/KVersionControlPlugin>
#include <KIO/CommandLauncherJob>
#include <KJobUiDelegate>
#include <KDialogJobUiDelegate>
#include <KFileItem>
#include <QList>
#include <QHash>
#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;
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 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;
QString m_currentDir;
QProcess m_process;
QString m_command;
QStringList m_arguments;
QString m_operationCompletedMsg;
QString m_errorMsg;
//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
|