-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathgitcommands.cpp
More file actions
116 lines (89 loc) · 3.11 KB
/
gitcommands.cpp
File metadata and controls
116 lines (89 loc) · 3.11 KB
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
#include "gitcommands.h"
#include <QProcess>
#include <QRegExp>
#include <QDebug>
GitCommands::GitCommands(QObject *parent)
: QObject(parent)
{
}
GitCommands::GitCommands(const QString &path, QObject *parent)
: GitCommands(parent)
{
setPath(path);
}
GitCommands::~GitCommands()
{
}
void GitCommands::listCommits(std::function<void (QList<Commit>)> callback)
{
auto p = new QProcess(this);
p->setWorkingDirectory(mPath);
p->setArguments({QStringLiteral("log"), QStringLiteral("--date=format:%Y-%m-%d %H:%M:%S")});
p->setProgram(QStringLiteral("git"));
connect(p, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, [p, callback](int, QProcess::ExitStatus){
const auto data = QString::fromUtf8(p->readAll());
QRegExp rx("commit\\s+(.+)\\s+Author\\:\\s+(.+)\\s+Date\\:\\s+(.+)\\n\\n\\s+(.+)\\n\\n");
rx.setMinimal(true);
int pos = 0;
QList<Commit> list;
while ((pos = rx.indexIn(data, pos)) != -1)
{
Commit c;
c.id = rx.cap(1).remove(QRegExp("Merge\\:.+")).trimmed();
c.commiter = rx.cap(2).trimmed();
c.datetime = QDateTime::fromString(rx.cap(3).trimmed(), QStringLiteral("yyyy-MM-dd hh:mm:ss"));
c.comment = rx.cap(4).trimmed();
list << c;
pos += rx.matchedLength();
}
p->deleteLater();
callback(list);
});
p->start();
}
void GitCommands::commitDiff(const QString &commit, std::function<void (QString)> callback)
{
auto p = new QProcess(this);
p->setWorkingDirectory(mPath);
p->setArguments({QStringLiteral("diff"), (commit + QStringLiteral("^!"))});
p->setProgram(QStringLiteral("git"));
connect(p, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, [p, callback](int, QProcess::ExitStatus){
callback( QString::fromUtf8(p->readAll()) );
p->deleteLater();
});
p->start();
}
void GitCommands::commitStat(const QString &commit, std::function<void (QList<Stat>)> callback)
{
auto p = new QProcess(this);
p->setWorkingDirectory(mPath);
p->setArguments({QStringLiteral("diff"), (commit + QStringLiteral("^!")), QStringLiteral("--numstat")});
p->setProgram(QStringLiteral("git"));
connect(p, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, [p, callback](int, QProcess::ExitStatus){
const auto data = QString::fromUtf8(p->readAll());
QRegExp rx("(\\d+)\\s+(\\d+)\\s+(.+)\\n");
rx.setMinimal(true);
int pos = 0;
QList<Stat> list;
while ((pos = rx.indexIn(data, pos)) != -1)
{
Stat c;
c.insertions = rx.cap(1).trimmed().toInt();
c.deletions = rx.cap(2).trimmed().toInt();
c.fileName = rx.cap(3).trimmed();
list << c;
pos += rx.matchedLength();
}
p->deleteLater();
callback(list);
});
p->start();
}
QString GitCommands::path() const
{
return mPath;
}
void GitCommands::setPath(const QString &newPath)
{
mPath = newPath;
}