public long commitTxn( boolean runPreCommitHook, boolean runPostCommitHook, SVNErrorMessage[] postCommitHookError, StringBuffer conflictPath) throws SVNException { if (myFSFS.isHooksEnabled() && runPreCommitHook) { FSHooks.runPreCommitHook(myFSFS.getRepositoryRoot(), myTxn.getTxnId()); } long newRevision = SVNRepository.INVALID_REVISION; while (true) { long youngishRev = myFSFS.getYoungestRevision(); FSRevisionRoot youngishRoot = myFSFS.createRevisionRoot(youngishRev); FSRevisionNode youngishRootNode = youngishRoot.getRevisionNode("/"); mergeChanges(myFSFS, getTxnRoot(), youngishRootNode, conflictPath); myTxn.setBaseRevision(youngishRev); FSWriteLock writeLock = FSWriteLock.getWriteLockForDB(myFSFS); synchronized (writeLock) { try { writeLock.lock(); newRevision = commit(); } catch (SVNException svne) { if (svne.getErrorMessage().getErrorCode() == SVNErrorCode.FS_TXN_OUT_OF_DATE) { long youngestRev = myFSFS.getYoungestRevision(); if (youngishRev == youngestRev) { throw svne; } continue; } throw svne; } finally { writeLock.unlock(); FSWriteLock.release(writeLock); } } break; } if (myFSFS.isHooksEnabled() && runPostCommitHook) { try { FSHooks.runPostCommitHook(myFSFS.getRepositoryRoot(), newRevision); } catch (SVNException svne) { SVNErrorMessage errorMessage = SVNErrorMessage.create( SVNErrorCode.REPOS_POST_COMMIT_HOOK_FAILED, "Commit succeeded, but post-commit hook failed", SVNErrorMessage.TYPE_WARNING); errorMessage.initCause(svne); SVNErrorMessage childErr = svne.getErrorMessage(); childErr.setDontShowErrorCode(true); errorMessage.setChildErrorMessage(childErr); if (postCommitHookError != null && postCommitHookError.length > 0) { postCommitHookError[0] = errorMessage; } else { SVNErrorManager.error(errorMessage, SVNLogType.FSFS); } } } return newRevision; }