[Grandmas-svn-commit] SF.net SVN: grandmas-svn: [135] trunk
Brought to you by:
matthiasmiller
From: <hig...@us...> - 2006-12-22 18:43:06
|
Revision: 135 http://svn.sourceforge.net/grandmas-svn/?rev=135&view=rev Author: highjinx Date: 2006-12-22 10:43:05 -0800 (Fri, 22 Dec 2006) Log Message: ----------- * Refactored the Modifications class * Improved unit tests a little, including a check for no leading slash (which is currently failing) Modified Paths: -------------- trunk/grandmas_svn.pro trunk/include/svn/modification.h trunk/src/dialogs/mainwindow.cpp trunk/src/dialogs/modificationsmodel.cpp trunk/src/svn/commit_summary.cpp trunk/tests/nullable_test.h trunk/tests/svn_test.cpp trunk/tests/svn_test.h Added Paths: ----------- trunk/src/svn/modification.cpp Modified: trunk/grandmas_svn.pro =================================================================== --- trunk/grandmas_svn.pro 2006-12-22 18:01:02 UTC (rev 134) +++ trunk/grandmas_svn.pro 2006-12-22 18:43:05 UTC (rev 135) @@ -244,6 +244,7 @@ src/svn/commit_summary_thread.cpp \ src/svn/file_access.cpp \ src/svn/helpers.cpp \ + src/svn/modification.cpp \ src/svn/operation.cpp \ src/svn/operation_internal.cpp \ src/svn/pool.cpp \ Modified: trunk/include/svn/modification.h =================================================================== --- trunk/include/svn/modification.h 2006-12-22 18:01:02 UTC (rev 134) +++ trunk/include/svn/modification.h 2006-12-22 18:43:05 UTC (rev 135) @@ -36,61 +36,54 @@ public: enum Type { - Type_TextMod, - Type_Add, - Type_Delete, - Type_PropMod, + Type_FileModification, + Type_Addition, + Type_Deletion, + Type_PropertyModification, // Pseudo-types: types that are not modifications, but need to be displayed - Type_New, // exists, but has not been added + Type_Creation, // exists, but has not been added Type_Missing, - Type_Conflicting, + Type_Conflict, }; + + static Modification fileModification(QString filePath, Revision oldRevision, Revision newRevision); + static Modification addition(QString filePath, Revision revision); + static Modification additionWithHistory(QString filePath, Revision revision, QString historyFilePath, Revision historyRevision); + static Modification deletion(QString filePath, Revision revision); + static Modification propertyModification(QString filePath, Revision oldRevision, Revision newRevision); + // The revision for the following types is always uncommitted + static Modification creation(QString filePath); + static Modification missing(QString filePath); + static Modification conflict(QString filePath); - static bool isVersionedType(Type type) - { - switch (type) - { - case Type_TextMod: - case Type_Add: - case Type_Delete: - case Type_PropMod: - return true; - case Type_New: - case Type_Missing: - case Type_Conflicting: - return false; - default: - return false; - } - } + Type getType() const; + + QString getFilePath() const; - QString getFilePath() const { return mFilePath; } - Type getType() const { return mType; } + Revision getRevision() const; - // Only use for move mods - bool isAddedWithHistory() const - { - Q_ASSERT(mType == Type_Add); - return mHistoryFilePath != ""; - } - QString getHistoryFilePath() const - { - Q_ASSERT(isAddedWithHistory()); - return mHistoryFilePath; - } + // Only use for add mods + bool isAddedWithHistory() const; + QString getHistoryFilePath() const; + Revision getHistoryRevision() const; - Revision getOldRevision() const { return mOldRevision; } - Revision getNewRevision() const { return mNewRevision; } + Revision fileModification_getOldRevision() const; + Revision propertyModification_getOldRevision() const; -private: - friend class Svn::CommitSummaryFetcher; +public: // Helper functions + static bool isVersionedType(Type type); +private: + static Modification fromType(Type type, QString filePath, Revision revision); + Type mType; QString mFilePath; - QString mHistoryFilePath; + Revision mRevision; Revision mOldRevision; - Revision mNewRevision; + + QString mHistoryFilePath; + Revision mHistoryRevision; }; #endif Modified: trunk/src/dialogs/mainwindow.cpp =================================================================== --- trunk/src/dialogs/mainwindow.cpp 2006-12-22 18:01:02 UTC (rev 134) +++ trunk/src/dialogs/mainwindow.cpp 2006-12-22 18:43:05 UTC (rev 135) @@ -173,14 +173,14 @@ // Generate each side of the diff QString error, leftPath, rightPath; QString fullFilePath = RepoFileAccess::getCanonicalPath(*mpContext, mPath, mod.getFilePath()); - if (!RepoFileAccess::getDiffFiles(*mpContext, fullFilePath, mod.getOldRevision(), mod.getNewRevision(), leftPath, rightPath, error)) + if (!RepoFileAccess::getDiffFiles(*mpContext, fullFilePath, mod.fileModification_getOldRevision(), mod.getRevision(), leftPath, rightPath, error)) { QMessageBox::critical(this, "", error); return; } // Launch the diff - bool allowMerge = mod.getNewRevision().getType() == Revision::Uncommitted; + bool allowMerge = mod.getRevision().getType() == Revision::Uncommitted; if (!diffFiles(leftPath, rightPath, allowMerge)) { QMessageBox::critical(this, tr("The differences could not be displayed."), tr("The comparison program could not be opened.")); Modified: trunk/src/dialogs/modificationsmodel.cpp =================================================================== --- trunk/src/dialogs/modificationsmodel.cpp 2006-12-22 18:01:02 UTC (rev 134) +++ trunk/src/dialogs/modificationsmodel.cpp 2006-12-22 18:43:05 UTC (rev 135) @@ -204,13 +204,13 @@ { switch (mod.getType()) { - case Modification::Type_TextMod: return tr("Modified"); - case Modification::Type_Add: return tr("Added"); - case Modification::Type_Delete: return tr("Deleted"); - case Modification::Type_PropMod: return tr("Property Modified"); - case Modification::Type_New: return tr("?"); + case Modification::Type_FileModification: return tr("Modified"); + case Modification::Type_Addition: return tr("Added"); + case Modification::Type_Deletion: return tr("Deleted"); + case Modification::Type_PropertyModification: return tr("Property Modified"); + case Modification::Type_Creation: return tr("?"); case Modification::Type_Missing: return tr("!"); - case Modification::Type_Conflicting: return tr("Conflicting"); + case Modification::Type_Conflict: return tr("Conflicting"); } Q_ASSERT(false); @@ -219,7 +219,7 @@ else if (isPathColumn(rcIndex.column())) { QString path = mod.getFilePath(); - if (mod.getType() == Modification::Type_Add && mod.isAddedWithHistory()) + if (mod.getType() == Modification::Type_Addition && mod.isAddedWithHistory()) path += tr(" (with history from %1)").arg(mod.getHistoryFilePath()); return path; Modified: trunk/src/svn/commit_summary.cpp =================================================================== --- trunk/src/svn/commit_summary.cpp 2006-12-22 18:01:02 UTC (rev 134) +++ trunk/src/svn/commit_summary.cpp 2006-12-22 18:43:05 UTC (rev 135) @@ -127,34 +127,30 @@ char *path; void *val; apr_hash_this(pKey, (const void **)&path, NULL, &val); - - Modification mod; - mod.mFilePath = path; - removePrefixNoCase(mod.mFilePath, pThis->mRepoUrl); - - mod.mNewRevision = Revision::committed(revision); - mod.mOldRevision = Revision::committed(revision-1); + + QString filePath = path; + removePrefixNoCase(filePath, pThis->mRepoUrl); + svn_log_changed_path_t *log_item = reinterpret_cast<svn_log_changed_path_t *>(val); switch (log_item->action) { case 'A': - mod.mType = Modification::Type_Add; + summary.mModifications.append(Modification::addition(filePath, Revision::committed(revision))); break; case 'D': - mod.mType = Modification::Type_Delete; + summary.mModifications.append(Modification::deletion(filePath, Revision::committed(revision))); break; case 'R': // TODO: handle "replace" - mod.mType = Modification::Type_Add; + summary.mModifications.append(Modification::addition(filePath, Revision::committed(revision))); break; case 'M': - mod.mType = Modification::Type_TextMod; + summary.mModifications.append(Modification::fileModification(filePath, Revision::committed(revision-1), Revision::committed(revision))); break; default: // TODO: return error break; } - summary.mModifications.append(mod); } } @@ -168,36 +164,45 @@ return NULL; } -void Svn::CommitSummaryFetcher::statusCallback(void *baton, const char *path, svn_wc_status2_t *status) +void Svn::CommitSummaryFetcher::statusCallback(void *baton, const char *fullPath, svn_wc_status2_t *status) { + CommitSummaryFetcher* pThis = (CommitSummaryFetcher*)baton; + + QString filePath = fullPath; + removePrefixNoCase(filePath, pThis->mWcPath); + Modification mod; switch (status->text_status) { // cases we care about case svn_wc_status_unversioned: - mod.mType = Modification::Type_New; + mod = Modification::creation(filePath); break; case svn_wc_status_added: if (status->copied) - mod.mHistoryFilePath = status->entry->copyfrom_url; - - mod.mType = Modification::Type_Add; + { + QString historyFilePath = status->entry->copyfrom_url; + removePrefixNoCase(historyFilePath, pThis->mRepoUrl); + mod = Modification::additionWithHistory(filePath, Revision::uncommitted(), historyFilePath, Revision::base()); + } + else + mod = Modification::addition(filePath, Revision::uncommitted()); break; case svn_wc_status_missing: - mod.mType = Modification::Type_Missing; + mod = Modification::missing(filePath); break; case svn_wc_status_deleted: - mod.mType = Modification::Type_Delete; + mod = Modification::deletion(filePath, Revision::uncommitted()); break; case svn_wc_status_modified: - mod.mType = Modification::Type_TextMod; + mod = Modification::fileModification(filePath, Revision::base(), Revision::uncommitted()); break; case svn_wc_status_conflicted: - mod.mType = Modification::Type_Conflicting; + mod = Modification::conflict(filePath); break; // cases we can ignore @@ -215,22 +220,9 @@ return; } - - CommitSummaryFetcher* pThis = (CommitSummaryFetcher*)baton; - - // Set file path (removing working copy part) - mod.mNewRevision = Revision::uncommitted(); - - mod.mFilePath = path; - removePrefixNoCase(mod.mFilePath, pThis->mWcPath); - removePrefixNoCase(mod.mHistoryFilePath, pThis->mRepoUrl); - // Set old revision to base, if the file is already under version control - if (status->entry) - mod.mOldRevision = Revision::base(); - // Assume that if we're here (i.e. checking WC status) that we're only retrieving one revision GSVN_ASSERT(pThis->mSummaries.size() == 1); - + pThis->mSummaries[0].mModifications.append(mod); } Added: trunk/src/svn/modification.cpp =================================================================== --- trunk/src/svn/modification.cpp (rev 0) +++ trunk/src/svn/modification.cpp 2006-12-22 18:43:05 UTC (rev 135) @@ -0,0 +1,134 @@ +/*************************************************************************** + * Copyright (C) 2006 by Matthias Miller * + * ad...@gr... * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "svn/modification.h" + +Modification Modification::fromType(Type type, QString filePath, Revision revision) +{ + Modification mod; + mod.mType = type; + mod.mRevision = revision; + mod.mFilePath = filePath; + return mod; +} + +Modification Modification::fileModification(QString filePath, Revision oldRevision, Revision newRevision) +{ + Modification mod = fromType(Type_FileModification, filePath, newRevision); + mod.mOldRevision = oldRevision; + return mod; +} + +Modification Modification::addition(QString filePath, Revision revision) +{ + return fromType(Type_Addition, filePath, revision); +} + + +Modification Modification::additionWithHistory(QString filePath, Revision revision, QString historyFilePath, Revision historyRevision) +{ + Modification mod = fromType(Type_Addition, filePath, revision); + mod.mHistoryFilePath = historyFilePath; + mod.mHistoryRevision = historyRevision; + return mod; +} + +Modification Modification::deletion(QString filePath, Revision revision) +{ + return fromType(Type_Deletion, filePath, revision); +} + +Modification Modification::propertyModification(QString filePath, Revision oldRevision, Revision newRevision) +{ + Modification mod = fromType(Type_PropertyModification, filePath, newRevision); + mod.mOldRevision = oldRevision; + return mod; +} + +Modification Modification::creation(QString filePath) +{ + return fromType(Type_Creation, filePath, Revision::uncommitted()); +} + +Modification Modification::missing(QString filePath) +{ + return fromType(Type_Missing, filePath, Revision::uncommitted()); +} + +Modification Modification::conflict(QString filePath) +{ + return fromType(Type_Conflict, filePath, Revision::uncommitted()); +} + +bool Modification::isVersionedType(Type type) +{ + switch (type) + { + case Type_FileModification: + case Type_Addition: + case Type_Deletion: + case Type_PropertyModification: + return true; + + case Type_Creation: + case Type_Missing: + case Type_Conflict: + return false; + } + + return false; +} + +Modification::Type Modification::getType() const +{ + return mType; +} + +QString Modification::getFilePath() const +{ + return mFilePath; +} + +Revision Modification::getRevision() const +{ + return mRevision; +} + +bool Modification::isAddedWithHistory() const +{ + Q_ASSERT(mType == Type_Addition); + return mHistoryFilePath != ""; +} +QString Modification::getHistoryFilePath() const +{ + Q_ASSERT(isAddedWithHistory()); + return mHistoryFilePath; +} + +Revision Modification::fileModification_getOldRevision() const +{ + return mOldRevision; +} + +Revision Modification::propertyModification_getOldRevision() const +{ + return mOldRevision; +} + Modified: trunk/tests/nullable_test.h =================================================================== --- trunk/tests/nullable_test.h 2006-12-22 18:01:02 UTC (rev 134) +++ trunk/tests/nullable_test.h 2006-12-22 18:43:05 UTC (rev 135) @@ -23,7 +23,7 @@ class NullableTester : public QObject { Q_OBJECT -private slots: +private: void init() {} void testDefaultConstructor(); void testCopyConstructorValue(); Modified: trunk/tests/svn_test.cpp =================================================================== --- trunk/tests/svn_test.cpp 2006-12-22 18:01:02 UTC (rev 134) +++ trunk/tests/svn_test.cpp 2006-12-22 18:43:05 UTC (rev 135) @@ -20,6 +20,8 @@ #include "svn_test.h" +#include "svn/add.h" +#include "svn/svn_commit.h" #include <svn/commit_summary.h> #include <svn/file_access.h> #include <svn/modification.h> @@ -32,6 +34,29 @@ #include <iostream> +#define SVN_VERIFY(command) \ + do { \ + pError = (command); \ + if (!pError)\ + break;\ + qDebug("Condition failed: " #command "\n");\ + while (pError) {\ + qDebug(pError->message);\ + pError = pError->child;\ + }\ + QVERIFY(false); \ + } while (0) + +#define GSVN_VERIFY(command) \ + do { \ + if (!(command)) {\ + qDebug("Condition failed: " #command "\n");\ + qDebug(error.toAscii());\ + QVERIFY(false); \ + }\ + } while (0) + + namespace { bool clearReadOnlyFlag(QFileInfo file) @@ -67,11 +92,6 @@ QString rIgnoredError; Q_ASSERT(Operation::initAuthProviders(*mpContext, mpCtx, rIgnoredError)); - - mpCtx->log_msg_func = logMsgCallback; - mpCtx->log_msg_baton = this; - - mpCurrentCommitMsg = NULL; } SvnTester::~SvnTester() @@ -80,28 +100,9 @@ delete mpContext; } -svn_error_t* SvnTester::commitChanges(const char* pCommitMessage) -{ - mpCurrentCommitMsg = pCommitMessage; - - svn_client_commit_info_t* pCommitInfo; - apr_array_header_t *array = apr_array_make(mpContext->getAprPool(), 1, sizeof(const char*)); - APR_ARRAY_PUSH(array, const char*) = svn_path_canonicalize(getWcPath().toAscii(), mpContext->getAprPool()); - - svn_error_t* pError = svn_client_commit2(&pCommitInfo, array, true, false, mpCtx, mpContext->getAprPool()); - mpCurrentCommitMsg = NULL; - return pError; -} - -svn_error_t* SvnTester::addFile(QString relFilePath) -{ - QString fullPath = QDir::convertSeparators(getWcPath()+relFilePath); - return svn_client_add2(fullPath.toAscii(), true, true, mpCtx, mpContext->getAprPool()); -} - bool SvnTester::touchFile(QString relFilePath, QString fileText) { - QFile file(getWcPath()+relFilePath); + QFile file(getWcPath()+"/"+relFilePath); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return false; @@ -131,7 +132,7 @@ return false; } } - if (!dir.rmdir(filePath)) + if (dir.exists() && !dir.rmdir(filePath)) return false; return true; @@ -151,48 +152,10 @@ return fileText; } -bool SvnTester::updateWc() +void SvnTester::createRepoAndWc() { - apr_array_header_t *array = apr_array_make(mpContext->getAprPool(), 1, sizeof(const char*)); - APR_ARRAY_PUSH(array, const char*) = svn_path_canonicalize(getWcPath().toAscii(), mpContext->getAprPool()); - svn_opt_revision_t revision; - revision.kind = svn_opt_revision_head; - if (svn_client_update2(NULL, array, &revision, true, true, mpCtx, mpContext->getAprPool())) - return false; - - return true; -} + cleanup(); -#define SVN_VERIFY(command) \ - do { \ - pError = (command); \ - if (!pError)\ - break;\ - qDebug("Condition failed: " #command "\n");\ - while (pError) {\ - qDebug(pError->message);\ - pError = pError->child;\ - }\ - QVERIFY(false); \ - } while (0) - -#define GSVN_VERIFY(command) \ - do { \ - if (!(command)) {\ - qDebug("Condition failed: " #command "\n");\ - qDebug(rError.toAscii());\ - QVERIFY(false); \ - }\ - } while (0) - -void SvnTester::init() -{ -#ifdef Q_WS_WIN - // force these tests to fail early on Windows since they interfere - // with the working copy in the current directory. - QVERIFY(false); -#endif - apr_pool_t* pSubPool = svn_pool_create(mpContext->getAprPool()); svn_repos_t* pCreatedRepo; @@ -213,14 +176,17 @@ const char* repoPath = svn_path_canonicalize(url.toAscii(), mpContext->getAprPool()); const char* wcPath = svn_path_canonicalize(getWcPath().toAscii(), mpContext->getAprPool()); SVN_VERIFY(svn_client_checkout2(NULL, repoPath, wcPath, &revision, &revision, true, false, mpCtx, mpContext->getAprPool())); +} + + +void SvnTester::init() +{ +#ifdef Q_WS_WIN + // force these tests to fail early on Windows since they interfere + // with the working copy in the current directory. + QVERIFY(false); +#endif - QVERIFY(touchFile("/first.txt", "This is the first file")); - SVN_VERIFY(addFile("/first.txt")); - SVN_VERIFY(commitChanges("first commit")); - QVERIFY(touchFile("/second.txt", "This is the second file")); - SVN_VERIFY(addFile("/second.txt")); - - QVERIFY(updateWc()); } void SvnTester::cleanup() @@ -229,81 +195,96 @@ QVERIFY(removeDirectory(getWcPath())); } - -svn_error_t* SvnTester::logMsgCallback(const char **log_msg, const char **tmp_file, apr_array_header_t * /*commit_items*/, void *baton, apr_pool_t * /*pool*/) +void SvnTester::assertModsMatch(QString wcPath, Revision rev, QList<Modification> mods) { - SvnTester* pThis = (SvnTester*)baton; - Q_ASSERT(pThis->mpCurrentCommitMsg != NULL); - *log_msg = pThis->mpCurrentCommitMsg; - pThis->mpCurrentCommitMsg = NULL; - tmp_file = NULL; - return NULL; + Svn::CommitSummary summary; + Svn::CommitSummaryFetcher fetcher; + QString error; + GSVN_VERIFY(fetcher.fetchSummary(*mpContext, wcPath, rev, true, summary, error)); + + QCOMPARE(summary.modifications().size(), mods.size()); + for (int i = 0; i < mods.size(); i++) + { + QCOMPARE(summary.modifications()[i].getFilePath(), mods[i].getFilePath()); + QCOMPARE(summary.modifications()[i].getType(), mods[i].getType()); + if (Modification::isVersionedType(summary.modifications()[i].getType())) + { + QCOMPARE(summary.modifications()[i].getRevision(), rev); + } + else + { + QCOMPARE(rev, Revision::uncommitted()); + QCOMPARE(summary.modifications()[i].getRevision(), Revision::uncommitted()); + } + } } -void SvnTester::testModifications() +void SvnTester::testAdd() { - Svn::CommitSummary summary; - Svn::CommitSummaryFetcher fetcher; - QString rError; - Revision rev; - rev = Revision::committed(1); - GSVN_VERIFY(fetcher.fetchSummary(*mpContext, getWcPath(), rev, true, summary, rError)); + createRepoAndWc(); - QList<Modification> mods = summary.modifications(); + QString error; + QVERIFY(touchFile("first.txt", "This is the first file")); - QCOMPARE(mods.size(), 1); - QCOMPARE(mods[0].getFilePath(), QString("/first.txt")); - QCOMPARE(mods[0].getType(), Modification::Type_Add); - QCOMPARE(summary.getRevision(), Revision::committed(1)); + assertModsMatch(getWcPath(), Revision::uncommitted(), QList<Modification>() << Modification::creation("first.txt")); + + GSVN_VERIFY(Svn::add(*mpContext, getWcPath()+"/first.txt", error)); - rev = Revision::uncommitted(); - GSVN_VERIFY(fetcher.fetchSummary(*mpContext, getWcPath(), rev, true, summary, rError)); + assertModsMatch(getWcPath(), Revision::uncommitted(), QList<Modification>() << Modification::addition("first.txt", Revision::uncommitted())); - QCOMPARE(mods.size(), 1); - QCOMPARE(mods[0].getFilePath(), QString("/second.txt")); - QCOMPARE(mods[0].getType(), Modification::Type_Add); - QCOMPARE(summary.getRevision(), Revision::uncommitted()); + GSVN_VERIFY(Svn::commit(*mpContext, "test", QStringList() << getWcPath()+"/first.txt", error)); + + assertModsMatch(getWcPath(), Revision::committed(1), QList<Modification>() << Modification::addition("first.txt", Revision::committed(1))); } void SvnTester::testRepoFileAccess() { - QString rError; + createRepoAndWc(); + +// Test committed file + QString error; + QVERIFY(touchFile("first.txt", "This is the first file")); + GSVN_VERIFY(Svn::add(*mpContext, getWcPath()+"/first.txt", error)); + GSVN_VERIFY(Svn::commit(*mpContext, "test", QStringList() << getWcPath()+"/first.txt", error)); + QString filePath; - Revision oldRev; - oldRev = Revision::committed(1); - GSVN_VERIFY(RepoFileAccess::getFile(*mpContext, QDir::convertSeparators(getWcPath()+"/first.txt"), oldRev, filePath, rError)); + GSVN_VERIFY(RepoFileAccess::getFile(*mpContext, QDir::convertSeparators(getWcPath()+"/first.txt"), Revision::committed(1), filePath, error)); QCOMPARE(getFileContents(filePath), QString("This is the first file")); QVERIFY(filePath != getWcPath()+"/first.txt"); // We should not overwrite the WC copy! - Revision newRev; - newRev = Revision::uncommitted(); - GSVN_VERIFY(RepoFileAccess::getFile(*mpContext, QDir::convertSeparators(getWcPath()+"/second.txt"), newRev, filePath, rError)); +// Test uncommitted file + QVERIFY(touchFile("second.txt", "This is the second file")); + GSVN_VERIFY(RepoFileAccess::getFile(*mpContext, QDir::convertSeparators(getWcPath()+"/second.txt"), Revision::uncommitted(), filePath, error)); QCOMPARE(filePath, getWcPath()+"/second.txt"); // We should return the WC file path directly if working on uncommitted revisions QCOMPARE(getFileContents(filePath), QString("This is the second file")); - - - QVERIFY(touchFile("/first.txt", "This is the first file, now modified")); - + +// Test both committed and uncommitted files + QVERIFY(touchFile("first.txt", "This is the first file, now modified")); + QString oldFilePath, newFilePath; - GSVN_VERIFY(RepoFileAccess::getDiffFiles(*mpContext, getWcPath()+"/first.txt", oldRev, newRev, oldFilePath, newFilePath, rError)); + GSVN_VERIFY(RepoFileAccess::getDiffFiles(*mpContext, getWcPath()+"/first.txt", Revision::committed(1), Revision::uncommitted(), oldFilePath, newFilePath, error)); QCOMPARE(getFileContents(oldFilePath), QString("This is the first file")); QCOMPARE(getFileContents(newFilePath), QString("This is the first file, now modified")); } - - + + void SvnTester::testCommitSummary() { - QString rError; - Revision rev; - rev = Revision::committed(1); - + createRepoAndWc(); + +// Test committed file + QString error; + QVERIFY(touchFile("first.txt", "This is the first file")); + GSVN_VERIFY(Svn::add(*mpContext, getWcPath()+"/first.txt", error)); + GSVN_VERIFY(Svn::commit(*mpContext, "test message", QStringList() << getWcPath()+"/first.txt", error)); + Svn::CommitSummary summary; Svn::CommitSummaryFetcher fetcher; - GSVN_VERIFY(fetcher.fetchSummary(*mpContext, getWcPath(), rev, false, summary, rError)); + GSVN_VERIFY(fetcher.fetchSummary(*mpContext, getWcPath(), Revision::committed(1), false, summary, error)); //QCOMPARE(summary.getCommitAuthor(), QString("billfrank")); //QCOMPARE(summary.getCommitDate(), bogus); - QCOMPARE(summary.getCommitLogMessage(), QString("first commit")); + QCOMPARE(summary.getCommitLogMessage(), QString("test message")); } Modified: trunk/tests/svn_test.h =================================================================== --- trunk/tests/svn_test.h 2006-12-22 18:01:02 UTC (rev 134) +++ trunk/tests/svn_test.h 2006-12-22 18:43:05 UTC (rev 135) @@ -59,32 +59,28 @@ QString getRepoPath() { return QDir::cleanPath(QDir::convertSeparators(QDir::tempPath()+"/gsvn_repo")); } QString getWcPath() { return QDir::cleanPath(QDir::convertSeparators(QDir::tempPath()+"/gsvn_wc")); } - svn_error_t* commitChanges(const char* pCommitMessage); - svn_error_t* addFile(QString relFilePath); bool touchFile(QString relFilePath, QString fileText); // fails if the file exists - bool updateWc(); bool removeDirectory(QString filePath); QString getFileContents(QString filePath); + void createRepoAndWc(); + + void assertModsMatch(QString wcPath, Revision rev, QList<Modification> mods); + private slots: void init(); void cleanup(); - void testModifications(); + void testAdd(); void testRepoFileAccess(); void testCommitSummary(); private: - // Callbacks - static svn_error_t* logMsgCallback(const char **log_msg, const char **tmp_file, apr_array_header_t *commit_items, void *baton, apr_pool_t *pool); -private: NoOperationStatus mStatus; NoAuthentication mAuthentication; SvnOperationContext* mpContext; svn_client_ctx_t* mpCtx; - - const char* mpCurrentCommitMsg; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |