diff options
-rw-r--r-- | src/repository.cpp | 52 | ||||
-rw-r--r-- | src/repository.h | 5 | ||||
-rw-r--r-- | src/src.pro | 2 | ||||
-rw-r--r-- | src/svn.cpp | 5 |
4 files changed, 53 insertions, 11 deletions
diff --git a/src/repository.cpp b/src/repository.cpp index 1398dd0..be73df6 100644 --- a/src/repository.cpp +++ b/src/repository.cpp @@ -52,7 +52,7 @@ public: static ProcessCache processCache; Repository::Repository(const Rules::Repository &rule) - : name(rule.name), commitCount(0), outstandingTransactions(0), processHasStarted(false) + : name(rule.name), commitCount(0), outstandingTransactions(0), lastmark(0), processHasStarted(false) { foreach (Rules::Repository::Branch branchRule, rule.branches) { Branch branch; @@ -97,6 +97,19 @@ void Repository::closeFastImport() } processHasStarted = false; processCache.remove(this); + // Save the exported marks + QString revsFile = name; + revsFile.replace('/', '_'); + revsFile.prepend("revisions-"); + QFile exportedMarks(revsFile); + qDebug() << exportedMarks.open(QIODevice::Truncate | QIODevice::Text | QIODevice::WriteOnly); + + int mark; + foreach(mark, commitMarks.keys()) + { + exportedMarks.write(QString(":%2 r%1\n").arg(mark).arg(commitMarks.value(mark)).toLocal8Bit()); + } + exportedMarks.close(); } void Repository::reloadBranches() @@ -144,10 +157,27 @@ void Repository::createBranch(const QString &branch, int revnum, // now create the branch br.created = revnum; QByteArray branchFromRef; - const int closestCommit = *qLowerBound(exportedCommits, branchRevNum); - if(commitMarks.contains(closestCommit)) + const int closestCommit = *qLowerBound(commitMarks.keys(), branchRevNum); + if(exportedCommits.contains(closestCommit)) { - branchFromRef = ":" + QByteArray::number(commitMarks.value(closestCommit)); + bool pathFound = false; + QString path; + foreach(path, exportedCommits[closestCommit]) { + if(path.contains(branchFrom)) { + pathFound = true; + break; + } + } + + if(pathFound) { + branchFromRef = ":" + QByteArray::number(commitMarks.value(closestCommit)); + qDebug() << branch << "in repository" << name << "is branching from" << closestCommit << "(svn reports r" << branchRevNum << ") git mark:" << branchFromRef; + } else { + qWarning() << branch << "in repository" << name << "is branching from a revision that doesn't touch the branch from path, branching from current revision"; + branchFromRef = branchFrom.toUtf8(); + if (!branchFromRef.startsWith("refs/")) + branchFromRef.prepend("refs/heads/"); + } } else { qWarning() << branch << "in repository" << name << "is branching but no exported commits exist in repository" << "creating an empty branch."; @@ -165,7 +195,7 @@ void Repository::createBranch(const QString &branch, int revnum, fastImport.write("reset " + branchRef + "\nfrom " + branchFromRef + "\n\n" "progress Branch " + branchRef + " created from " - + branchFromRef + " r" + QByteArray::number(branchRevNum) + "\n\n"); + + branchFromRef + " r" + QByteArray::number(branchRevNum) + "(at SVN" + QByteArray::number(revnum) + ")\n\n"); } Repository::Transaction *Repository::newTransaction(const QString &branch, const QString &svnprefix, @@ -269,6 +299,11 @@ void Repository::startFastImport() processHasStarted = true; // start the process + QString marksFile = name; + marksFile.replace('/', '_'); + marksFile.prepend("marks-"); + QStringList marksOptions; + marksOptions << "--export-marks=" + marksFile; QString outputFile = name; outputFile.replace('/', '_'); outputFile.prepend("log-"); @@ -276,7 +311,7 @@ void Repository::startFastImport() fastImport.setProcessChannelMode(QProcess::MergedChannels); if (!CommandLineParser::instance()->contains("dry-run")) { - fastImport.start("git", QStringList() << "fast-import"); + fastImport.start("git", QStringList() << "fast-import" << marksOptions); } else { fastImport.start("/bin/cat", QStringList()); } @@ -311,6 +346,7 @@ void Repository::Transaction::deleteFile(const QString &path) if(pathNoSlash.endsWith('/')) pathNoSlash.chop(1); deletedFiles.append(pathNoSlash); + modifiedPaths.append(path); } QIODevice *Repository::Transaction::addFile(const QString &path, int mode, qint64 length) @@ -334,7 +370,7 @@ QIODevice *Repository::Transaction::addFile(const QString &path, int mode, qint6 repository->fastImport.write(QByteArray::number(length)); repository->fastImport.write("\n", 1); } - + modifiedPaths.append(branch + "/" + path); return &repository->fastImport; } @@ -358,7 +394,7 @@ void Repository::Transaction::commit() s << "commit " << branchRef << endl; s << "mark :" << QByteArray::number(++repository->lastmark) << endl; repository->commitMarks.insert(revnum, repository->lastmark); - repository->exportedCommits.append(revnum); + repository->exportedCommits.insert(revnum, modifiedPaths); s << "committer " << QString::fromUtf8(author) << ' ' << datetime << " -0000" << endl; Branch &br = repository->branches[branch]; diff --git a/src/repository.h b/src/repository.h index 629616b..d008996 100644 --- a/src/repository.h +++ b/src/repository.h @@ -42,6 +42,7 @@ public: QStringList deletedFiles; QByteArray modifiedFiles; + QVector<QString> modifiedPaths; inline Transaction() {} public: @@ -85,8 +86,10 @@ private: QHash<QString, Branch> branches; QHash<QString, AnnotatedTag> annotatedTags; + // rXXXX, mark QHash<int, int> commitMarks; - QVector<int> exportedCommits; + // rXXXX, [path, path, ...] + QHash<int, QVector<QString> > exportedCommits; QString name; QProcess fastImport; int commitCount; diff --git a/src/src.pro b/src/src.pro index 2fbde10..a402ca1 100644 --- a/src/src.pro +++ b/src/src.pro @@ -3,7 +3,7 @@ ###################################################################### SVN_INCLUDE = /usr/include/subversion-1 -APR_INCLUDE = /usr/include/apr-1.0 +APR_INCLUDE = /usr/include/apr-1.0 /usr/include/apr-1 exists(local-config.pri):include(local-config.pri) TEMPLATE = app diff --git a/src/svn.cpp b/src/svn.cpp index 604ddf1..2a9ffcb 100644 --- a/src/svn.cpp +++ b/src/svn.cpp @@ -141,7 +141,10 @@ bool Svn::exportRevision(int revnum) SvnPrivate::SvnPrivate(const QString &pathToRepository) : global_pool(NULL) { - openRepository(pathToRepository); + if( openRepository(pathToRepository) != EXIT_SUCCESS) { + qCritical() << "Failed to open repository"; + exit(1); + } // get the youngest revision svn_fs_youngest_rev(&youngest_rev, fs, global_pool); |