diff options
Diffstat (limited to 'src/repository.h')
| -rw-r--r-- | src/repository.h | 176 |
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 |
