blob: ac1d4a0486df525a4c21fc61311959999c657eca [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.idea.svn.browse;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.VcsException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.api.BaseSvnClient;
import org.jetbrains.idea.svn.api.Depth;
import org.jetbrains.idea.svn.commandLine.SvnBindException;
import org.tmatesoft.svn.core.*;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.wc.SVNLogClient;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc2.SvnTarget;
/**
* @author Konstantin Kolosovsky.
*/
public class SvnKitBrowseClient extends BaseSvnClient implements BrowseClient {
@Override
public void list(@NotNull SvnTarget target,
@Nullable SVNRevision revision,
@Nullable Depth depth,
@Nullable DirectoryEntryConsumer handler) throws VcsException {
assertUrl(target);
SVNLogClient client = getLogClient();
ISVNDirEntryHandler wrappedHandler = wrapHandler(handler);
try {
if (target.isFile()) {
client.doList(target.getFile(), target.getPegRevision(), notNullize(revision), true, toDepth(depth), SVNDirEntry.DIRENT_ALL, wrappedHandler);
}
else {
client.doList(target.getURL(), target.getPegRevision(), notNullize(revision), true, toDepth(depth), SVNDirEntry.DIRENT_ALL, wrappedHandler);
}
}
catch (SVNException e) {
throw new SvnBindException(e);
}
}
@Override
public long createDirectory(@NotNull SvnTarget target, @NotNull String message, boolean makeParents) throws VcsException {
assertUrl(target);
try {
SVNCommitInfo commitInfo =
myVcs.getSvnKitManager().createCommitClient().doMkDir(new SVNURL[]{target.getURL()}, message, null, makeParents);
return commitInfo.getNewRevision();
}
catch (SVNException e) {
throw new SvnBindException(e);
}
}
@NotNull
private SVNLogClient getLogClient() {
ISVNAuthenticationManager authManager = myIsActive
? myVcs.getSvnConfiguration().getInteractiveManager(myVcs)
: myVcs.getSvnConfiguration().getPassiveAuthenticationManager(myVcs.getProject());
return myVcs.getSvnKitManager().createLogClient(authManager);
}
@Nullable
private static ISVNDirEntryHandler wrapHandler(@Nullable DirectoryEntryConsumer handler) {
return handler == null ? null : new SkipEmptyNameDirectoriesHandler(handler);
}
public static class SkipEmptyNameDirectoriesHandler implements ISVNDirEntryHandler {
@NotNull private final DirectoryEntryConsumer handler;
public SkipEmptyNameDirectoriesHandler(@NotNull DirectoryEntryConsumer handler) {
this.handler = handler;
}
@Override
public void handleDirEntry(SVNDirEntry dirEntry) throws SVNException {
if (!isEmptyNameDirectory(dirEntry)) {
handler.consume(DirectoryEntry.create(dirEntry));
}
}
private static boolean isEmptyNameDirectory(@NotNull SVNDirEntry dirEntry) {
return SVNNodeKind.DIR.equals(dirEntry.getKind()) && StringUtil.isEmpty(dirEntry.getName());
}
}
}