aboutsummaryrefslogtreecommitdiffstats
path: root/src/repository.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/repository.h')
-rw-r--r--src/repository.h176
1 files changed, 151 insertions, 25 deletions
diff --git a/src/repository.h b/src/repository.h
index a4532ab..44388e0 100644
--- a/src/repository.h
+++ b/src/repository.h
@@ -21,8 +21,76 @@
#include <QHash>
#include <QProcess>
#include <QVector>
+#include <QFile>
#include "ruleparser.h"
+#include "CommandLineParser.h"
+
+class LoggingQProcess : public QProcess
+{
+ QFile log;
+ bool logging;
+public:
+ LoggingQProcess(const QString filename) : QProcess(), log() {
+ if(CommandLineParser::instance()->contains("debug-rules")) {
+ logging = true;
+ QString name = filename;
+ name.replace('/', '_');
+ name.prepend("gitlog-");
+ log.setFileName(name);
+ log.open(QIODevice::WriteOnly);
+ } else {
+ logging = false;
+ }
+ };
+ ~LoggingQProcess() {
+ if(logging) {
+ log.close();
+ }
+ };
+
+ qint64 write(const char *data) {
+ Q_ASSERT(state() == QProcess::Running);
+ if(logging) {
+ log.write(data);
+ }
+ return QProcess::write(data);
+ }
+ qint64 write(const char *data, qint64 length) {
+ Q_ASSERT(state() == QProcess::Running);
+ if(logging) {
+ log.write(data);
+ }
+ return QProcess::write(data, length);
+ }
+ qint64 write(const QByteArray &data) {
+ Q_ASSERT(state() == QProcess::Running);
+ if(logging) {
+ log.write(data);
+ }
+ return QProcess::write(data);
+ }
+ qint64 writeNoLog(const char *data) {
+ Q_ASSERT(state() == QProcess::Running);
+ return QProcess::write(data);
+ }
+ qint64 writeNoLog(const char *data, qint64 length) {
+ Q_ASSERT(state() == QProcess::Running);
+ return QProcess::write(data, length);
+ }
+ qint64 writeNoLog(const QByteArray &data) {
+ Q_ASSERT(state() == QProcess::Running);
+ return QProcess::write(data);
+ }
+ bool putChar( char c) {
+ Q_ASSERT(state() == QProcess::Running);
+ if(logging) {
+ log.putChar(c);
+ }
+ return QProcess::putChar(c);
+ }
+};
+
class Repository
{
@@ -30,36 +98,94 @@ public:
class Transaction
{
Q_DISABLE_COPY(Transaction)
- protected:
- Transaction() {}
+ friend class Repository;
+
+ Repository *repository;
+ QByteArray branch;
+ QByteArray svnprefix;
+ QByteArray author;
+ QByteArray log;
+ uint datetime;
+ int revnum;
+
+ QVector<int> merges;
+
+ QStringList deletedFiles;
+ QByteArray modifiedFiles;
+
+ inline Transaction() {}
public:
- virtual ~Transaction() {}
- virtual void commit() = 0;
+ ~Transaction();
+ void commit();
- virtual void setAuthor(const QByteArray &author) = 0;
- virtual void setDateTime(uint dt) = 0;
- virtual void setLog(const QByteArray &log) = 0;
+ void setAuthor(const QByteArray &author);
+ void setDateTime(uint dt);
+ void setLog(const QByteArray &log);
- virtual void noteCopyFromBranch (const QString &prevbranch, int revFrom) = 0;
+ void noteCopyFromBranch (const QString &prevbranch, int revFrom);
- virtual void deleteFile(const QString &path) = 0;
- virtual QIODevice *addFile(const QString &path, int mode, qint64 length) = 0;
+ void deleteFile(const QString &path);
+ QIODevice *addFile(const QString &path, int mode, qint64 length);
};
- virtual int setupIncremental(int &cutoff) = 0;
- virtual void restoreLog() = 0;
- virtual ~Repository() {}
-
- virtual int createBranch(const QString &branch, int revnum,
- const QString &branchFrom, int revFrom) = 0;
- virtual int deleteBranch(const QString &branch, int revnum) = 0;
- virtual Transaction *newTransaction(const QString &branch, const QString &svnprefix, int revnum) = 0;
-
- virtual void createAnnotatedTag(const QString &name, const QString &svnprefix, int revnum,
- const QByteArray &author, uint dt,
- const QByteArray &log) = 0;
- virtual void finalizeTags() = 0;
-};
+ Repository(const Rules::Repository &rule);
+ int setupIncremental(int &cutoff);
+ void restoreLog();
+ ~Repository();
+
+ void reloadBranches();
+ int createBranch(const QString &branch, int revnum,
+ const QString &branchFrom, int revFrom);
+ int deleteBranch(const QString &branch, int revnum);
+ Repository::Transaction *newTransaction(const QString &branch, const QString &svnprefix, int revnum);
-Repository *makeRepository(const Rules::Repository &rule, const QHash<QString, Repository *> &repositories);
+ void createAnnotatedTag(const QString &name, const QString &svnprefix, int revnum,
+ const QByteArray &author, uint dt,
+ const QByteArray &log);
+ void finalizeTags();
+private:
+ struct Branch
+ {
+ int created;
+ QVector<int> commits;
+ QVector<int> marks;
+ };
+ struct AnnotatedTag
+ {
+ QString supportingRef;
+ QByteArray svnprefix;
+ QByteArray author;
+ QByteArray log;
+ uint dt;
+ int revnum;
+ };
+
+ QHash<QString, Branch> branches;
+ QHash<QString, AnnotatedTag> annotatedTags;
+ QString name;
+ QString prefix;
+ LoggingQProcess fastImport;
+ int commitCount;
+ int outstandingTransactions;
+
+ /* starts at 0, and counts up. */
+ int last_commit_mark;
+
+ /* starts at maxMark and counts down. Reset after each SVN revision */
+ int next_file_mark;
+
+ bool processHasStarted;
+
+ void startFastImport();
+ void closeFastImport();
+
+ // called when a transaction is deleted
+ void forgetTransaction(Transaction *t);
+
+ int resetBranch(const QString &branch, int revnum, int mark, const QByteArray &resetTo, const QByteArray &comment);
+ int markFrom(const QString &branchFrom, int branchRevNum, QByteArray &desc);
+
+ friend class ProcessCache;
+ Q_DISABLE_COPY(Repository)
+};
#endif