From 1c4df5aa91b316f89d7c76adf86cebcbee334b09 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Sun, 23 Dec 2007 19:12:23 -0200 Subject: [PATCH] Implement the commit transaction --- src/repository.cpp | 123 +++++++++++++++++++++++++++++++++++++++++++++ src/repository.h | 4 +- 2 files changed, 126 insertions(+), 1 deletion(-) diff --git a/src/repository.cpp b/src/repository.cpp index c3174b8..966b73d 100644 --- a/src/repository.cpp +++ b/src/repository.cpp @@ -16,6 +16,7 @@ */ #include "repository.h" +#include Repository::Repository(const Rules::Repository &rule) { @@ -30,3 +31,125 @@ Repository::Repository(const Rules::Repository &rule) fastImport.setWorkingDirectory(rule.name); fastImport.setProcessChannelMode(QProcess::ForwardedChannels); } + +Repository::~Repository() +{ + if (fastImport.state() == QProcess::Running) { + fastImport.closeWriteChannel(); + fastImport.waitForFinished(); + } +} + +Repository::Transaction *Repository::newTransaction(const QString &branch, const QString &svnprefix, + int revnum) +{ + if (!branches.contains(branch)) + return 0; + + Transaction *txn = new Transaction; + txn->repository = this; + txn->branch = branch.toUtf8(); + txn->svnprefix = svnprefix.toUtf8(); + txn->datetime = 0; + txn->revnum = revnum; + txn->lastmark = revnum; + + if (fastImport.state() == QProcess::NotRunning) + // start the process + fastImport.start("git-fast-import", QStringList()); + + return txn; +} + +Repository::Transaction::~Transaction() +{ +} + +void Repository::Transaction::setAuthor(const QByteArray &a) +{ + author = a; +} + +void Repository::Transaction::setDateTime(uint dt) +{ + datetime = dt; +} + +void Repository::Transaction::setLog(const QByteArray &l) +{ + log = l; +} + +void Repository::Transaction::deleteFile(const QString &path) +{ + deletedFiles.append(path); +} + +QIODevice *Repository::Transaction::addFile(const QString &path, int mode, qint64 length) +{ + FileProperties fp; + fp.mode = mode; + fp.mark = ++lastmark; + + repository->fastImport.write("blob\nmark :"); + repository->fastImport.write(QByteArray::number(fp.mark)); + repository->fastImport.write("\ndata "); + repository->fastImport.write(QByteArray::number(length)); + repository->fastImport.write("\n", 1); + repository->fastImport.waitForBytesWritten(0); + + modifiedFiles.insert(path, fp); + return &repository->fastImport; +} + +void Repository::Transaction::commit() +{ + // create the commit message + QByteArray message = log; + if (!message.endsWith('\n')) + message += '\n'; + message += "\nsvn=" + svnprefix + "; revision=" + QByteArray::number(revnum) + "\n"; + + { + QByteArray branchRef = branch; + if (!branchRef.startsWith("refs/heads/")) + branchRef.prepend("refs/heads/"); + + QTextStream s(&repository->fastImport); + s << "commit " << branchRef << endl; + s << "mark :" << revnum << endl; + s << "committer " << author << ' ' << datetime << "-0000" << endl; + + Branch &br = repository->branches[branch]; + if (!br.isCreated) { + br.isCreated = true; + s << "from " << br.branchFrom << endl; + } + + s << "data " << message.length() << endl; + } + + repository->fastImport.write(message); + + // write the file deletions + foreach (QString df, deletedFiles) + repository->fastImport.write("D " + df.toUtf8() + "\n"); + + // write the file modifications + QHash::ConstIterator it = modifiedFiles.constBegin(); + for ( ; it != modifiedFiles.constEnd(); ++it) { + repository->fastImport.write("M ", 2); + repository->fastImport.write(QByteArray::number(it->mode, 8)); + repository->fastImport.write(" :", 2); + repository->fastImport.write(QByteArray::number(it->mark)); + repository->fastImport.write(" ", 1); + repository->fastImport.write(it.key().toUtf8()); + repository->fastImport.write("\n", 1); + } + + repository->fastImport.write("\n"); + + while (repository->fastImport.bytesToWrite() && repository->fastImport.waitForBytesWritten()) { + // nothing + } +} diff --git a/src/repository.h b/src/repository.h index cd50cdc..c0556c7 100644 --- a/src/repository.h +++ b/src/repository.h @@ -36,16 +36,18 @@ public: }; Repository *repository; - QByteArray branchRef; + QByteArray branch; QByteArray svnprefix; QByteArray author; QByteArray log; uint datetime; int revnum; + int lastmark; QStringList deletedFiles; QHash modifiedFiles; + inline Transaction() {} public: ~Transaction(); void commit(); -- 2.45.0