work save

- basic git operations
This commit is contained in:
Roy Qu 2022-02-09 14:58:39 +08:00
parent 18d5a6c1ab
commit 149148a635
2 changed files with 173 additions and 1 deletions

View File

@ -1,4 +1,7 @@
#include "gitmanager.h"
#include "../utils.h"
#include <QFileInfo>
GitManager::GitManager(QObject *parent) : QObject(parent),
mGitPathValid(false)
@ -9,3 +12,143 @@ bool GitManager::gitPathValid() const
{
return mGitPathValid;
}
void GitManager::createRepository(const QString &folder)
{
if (hasRepository(folder))
throw GitError(tr("Folder \"%1\" already has a repository!"));
QStringList args;
args.append("init");
runGit(folder,args);
}
bool GitManager::hasRepository(const QString &folder)
{
QStringList args;
args.append("status");
QString output = runGit(folder,args);
return !output.startsWith("fatal:");
}
void GitManager::add(const QString &folder, const QString &path)
{
QStringList args;
args.append("add");
args.append(path);
runGit(folder,args);
}
void GitManager::remove(const QString &folder, const QString &path)
{
QStringList args;
args.append("rm");
args.append(path);
runGit(folder,args);
}
void GitManager::rename(const QString &folder, const QString &oldName, const QString &newName)
{
QStringList args;
args.append("mv");
args.append(oldName);
args.append(newName);
runGit(folder,args);
}
void GitManager::restore(const QString &folder, const QString &path)
{
QStringList args;
args.append("restore");
args.append(path);
runGit(folder,args);
}
QStringList GitManager::listFiles(const QString &folder)
{
QStringList args;
args.append("ls-files");
return textToLines(runGit(folder,args));
}
void GitManager::clone(const QString &folder, const QString &url)
{
QStringList args;
args.append("clone");
args.append(url);
runGit(folder,args);
}
void GitManager::commit(const QString &folder, const QString &message)
{
QStringList args;
args.append("commit");
args.append("-m");
args.append(message);
runGit(folder,args);
}
void GitManager::revert(const QString &folder)
{
QStringList args;
args.append("revert");
runGit(folder,args);
}
void GitManager::reset(const QString &folder, const QString &commit, ResetStrategy strategy)
{
//todo reset type
QStringList args;
args.append("reset");
switch(strategy) {
case ResetStrategy::Soft:
args.append("--soft");
break;
case ResetStrategy::Hard:
args.append("--hard");
break;
case ResetStrategy::Mixed:
args.append("--mixed");
break;
case ResetStrategy::Merge:
args.append("--merge");
break;
case ResetStrategy::Keep:
args.append("--keep");
break;
}
args.append(commit);
runGit(folder,args);
}
void GitManager::validate()
{
QStringList args;
args.append("--version");
QString output = runGit("",args);
mGitPathValid = output.startsWith("git version");
}
QString GitManager::runGit(const QString& workingFolder, const QStringList &args)
{
QFileInfo fileInfo(mGitPath);
if (!fileInfo.exists())
throw GitError("fatal: git doesn't exist");
emit gitCmdRunning(QString("Running in \"%1\": \n \"%2\" \"%3\"")
.arg(workingFolder,
mGitPath,
args.join("\" \"")));
QString output = runAndGetOutput(
fileInfo.absoluteFilePath(),
workingFolder,
args);
emit gitCmdFinished(output);
if (output.startsWith("fatal:"))
throw GitError(output);
return output;
}
GitError::GitError(const QString &reason):BaseError(reason)
{
}

View File

@ -2,21 +2,50 @@
#define GITMANAGER_H
#include <QObject>
#include "utils.h"
class GitError: public BaseError {
public:
explicit GitError(const QString& reason);
};
class GitManager : public QObject
{
Q_OBJECT
public:
enum class ResetStrategy {
Soft,
Hard,
Merge,
Mixed,
Keep
};
explicit GitManager(QObject *parent = nullptr);
bool gitPathValid() const;
bool createRepository(const QString& folder);
void createRepository(const QString& folder);
bool hasRepository(const QString& folder);
void add(const QString& folder, const QString& path);
void remove(const QString& folder, const QString& path);
void rename(const QString& folder, const QString& oldName, const QString& newName);
void restore(const QString& folder, const QString& path);
QStringList listFiles(const QString& folder);
void clone(const QString& folder, const QString& url);
void commit(const QString& folder, const QString& message);
void revert(const QString& folder);
void reset(const QString& folder, const QString& commit, ResetStrategy strategy);
signals:
void gitCmdRunning(const QString& gitCmd);
void gitCmdFinished(const QString& message);
private:
void validate();
QString runGit(const QString& workingFolder, const QStringList& args);
private:
QString mGitPath;
bool mGitPathValid;