if (commitPackets == null || commitPackets.length == 0) {
return new SVNCommitInfo[0];
}
Collection tmpFiles = null;
SVNCommitInfo info = null;
ISVNEditor commitEditor = null;
Collection infos = new ArrayList();
boolean needsSleepForTimeStamp = false;
for (int p = 0; p < commitPackets.length; p++) {
SVNCommitPacket commitPacket = commitPackets[p].removeSkippedItems();
if (commitPacket.getCommitItems().length == 0) {
continue;
}
try {
commitMessage = getCommitHandler().getCommitMessage(commitMessage, commitPacket.getCommitItems());
if (commitMessage == null) {
infos.add(SVNCommitInfo.NULL);
continue;
}
commitMessage = SVNCommitUtil.validateCommitMessage(commitMessage);
Map commitables = new TreeMap();
SVNURL baseURL = SVNCommitUtil.translateCommitables(commitPacket.getCommitItems(), commitables);
Map lockTokens = SVNCommitUtil.translateLockTokens(commitPacket.getLockTokens(), baseURL.toString());
//TODO: we should pass wcAccess and path to check uuids
SVNCommitItem firstItem = commitPacket.getCommitItems()[0];
SVNRepository repository = createRepository(baseURL, firstItem.getFile(),
firstItem.getWCAccess(), true);
SVNCommitMediator mediator = new SVNCommitMediator(commitables);
tmpFiles = mediator.getTmpFiles();
String repositoryRoot = repository.getRepositoryRoot(true).getPath();
commitEditor = repository.getCommitEditor(commitMessage, lockTokens, keepLocks, revisionProperties, mediator);
// commit.
// set event handler for each wc access.
for (int i = 0; i < commitPacket.getCommitItems().length; i++) {
commitPacket.getCommitItems()[i].getWCAccess().setEventHandler(getEventDispatcher());
}
info = SVNCommitter.commit(mediator.getTmpFiles(), commitables, repositoryRoot, commitEditor);
// update wc.
Collection processedItems = new SVNHashSet();
Collection explicitCommitPaths = new SVNHashSet();
for (Iterator urls = commitables.keySet().iterator(); urls.hasNext();) {
String url = (String) urls.next();
SVNCommitItem item = (SVNCommitItem) commitables.get(url);
explicitCommitPaths.add(item.getPath());
}
for (Iterator urls = commitables.keySet().iterator(); urls.hasNext();) {
String url = (String) urls.next();
SVNCommitItem item = (SVNCommitItem) commitables.get(url);
SVNWCAccess wcAccess = item.getWCAccess();
String path = item.getPath();
SVNAdminArea dir = null;
String target = null;
try {
if (item.getKind() == SVNNodeKind.DIR) {
target = "";
dir = wcAccess.retrieve(item.getFile());
} else {
target = SVNPathUtil.tail(path);
dir = wcAccess.retrieve(item.getFile().getParentFile());
}
} catch (SVNException e) {
if (e.getErrorMessage().getErrorCode() == SVNErrorCode.WC_NOT_LOCKED) {
dir = null;
}
}
if (dir == null) {
if (hasProcessedParents(processedItems, path)) {
processedItems.add(path);
continue;
}
if (item.isDeleted() && item.getKind() == SVNNodeKind.DIR) {
File parentPath = "".equals(path) ? null : item.getFile().getParentFile();
String nameInParent = "".equals(path) ? null : SVNPathUtil.tail(path);
if (parentPath != null) {
SVNAdminArea parentDir = wcAccess.retrieve(parentPath);
if (parentDir != null) {
SVNEntry entryInParent = parentDir.getEntry(nameInParent, true);
if (entryInParent != null) {
Map attributes = new SVNHashMap();
attributes.put(SVNProperty.SCHEDULE, null);
attributes.put(SVNProperty.DELETED, Boolean.TRUE.toString());
parentDir.modifyEntry(nameInParent, attributes, true, true);
}
}
}
processedItems.add(path);
continue;
}
}
SVNEntry entry = dir.getEntry(target, true);
if (entry == null && hasProcessedParents(processedItems, path)) {
processedItems.add(path);
continue;
}
boolean recurse = false;
if (item.isAdded() && item.getCopyFromURL() != null && item.getKind() == SVNNodeKind.DIR) {
recurse = true;
}
boolean removeLock = !keepLocks && item.isLocked();
// update entry in dir.
SVNProperties wcPropChanges = mediator.getWCProperties(item);
dir.commit(target, info, wcPropChanges, removeLock, recurse, !keepChangelist, explicitCommitPaths, getCommitParameters());
processedItems.add(path);
}
needsSleepForTimeStamp = true;
// commit completed, include revision number.
dispatchEvent(SVNEventFactory.createSVNEvent(null, SVNNodeKind.NONE, null, info.getNewRevision(), SVNEventAction.COMMIT_COMPLETED, null, null, null), ISVNEventHandler.UNKNOWN);
} catch (SVNException e) {
if (e instanceof SVNCancelException) {
throw e;
}
SVNErrorMessage err = e.getErrorMessage().wrap("Commit failed (details follow):");
infos.add(new SVNCommitInfo(-1, null, null, err));
dispatchEvent(SVNEventFactory.createErrorEvent(err), ISVNEventHandler.UNKNOWN);
continue;
} finally {
if (info == null && commitEditor != null) {
try {