blob: 7571000267977d574b0fff24699ca8eaaa2f050c [file] [log] [blame]
/*
* Copyright 2000-2014 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.svnkit;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.SystemInfo;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.SvnConfiguration;
import org.jetbrains.idea.svn.SvnHttpAuthMethodsDefaultChecker;
import org.jetbrains.idea.svn.SvnVcs;
import org.jetbrains.idea.svn.auth.SvnAuthenticationManager;
import org.jetbrains.idea.svn.svnkit.lowLevel.PrimitivePool;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.internal.util.jna.SVNJNAUtil;
import org.tmatesoft.svn.core.internal.wc.admin.SVNAdminArea14;
import org.tmatesoft.svn.core.internal.wc.admin.SVNAdminAreaFactory;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.*;
import org.tmatesoft.svn.util.SVNDebugLog;
/**
* @author Konstantin Kolosovsky.
*/
public class SvnKitManager {
private static final Logger LOG = SvnVcs.wrapLogger(Logger.getInstance(SvnKitManager.class));
@NonNls public static final String LOG_PARAMETER_NAME = "javasvn.log";
@NonNls public static final String TRACE_NATIVE_CALLS = "javasvn.log.native";
@NonNls public static final String SVNKIT_HTTP_SSL_PROTOCOLS = "svnkit.http.sslProtocols";
@Nullable private static String ourExplicitlySetSslProtocols;
@NotNull private final SvnVcs myVcs;
@NotNull private final Project myProject;
@NotNull private final SvnConfiguration myConfiguration;
static {
System.setProperty("svnkit.log.native.calls", "true");
final SvnKitDebugLogger
logger = new SvnKitDebugLogger(Boolean.getBoolean(LOG_PARAMETER_NAME), Boolean.getBoolean(TRACE_NATIVE_CALLS), LOG);
SVNDebugLog.setDefaultLog(logger);
SVNJNAUtil.setJNAEnabled(true);
SvnHttpAuthMethodsDefaultChecker.check();
SVNAdminAreaFactory.setSelector(new SvnKitAdminAreaFactorySelector());
DAVRepositoryFactory.setup();
SVNRepositoryFactoryImpl.setup();
FSRepositoryFactory.setup();
// non-optimized writing is fast enough on Linux/MacOS, and somewhat more reliable
if (SystemInfo.isWindows) {
SVNAdminArea14.setOptimizedWritingEnabled(true);
}
if (!SVNJNAUtil.isJNAPresent()) {
LOG.warn("JNA is not found by svnkit library");
}
ourExplicitlySetSslProtocols = System.getProperty(SVNKIT_HTTP_SSL_PROTOCOLS);
}
public SvnKitManager(@NotNull SvnVcs vcs) {
myVcs = vcs;
myProject = myVcs.getProject();
myConfiguration = myVcs.getSvnConfiguration();
refreshSSLProperty();
}
@Nullable
public static String getExplicitlySetSslProtocols() {
return ourExplicitlySetSslProtocols;
}
public static boolean isSSLProtocolExplicitlySet() {
return ourExplicitlySetSslProtocols != null;
}
public void refreshSSLProperty() {
if (isSSLProtocolExplicitlySet()) return;
if (SvnConfiguration.SSLProtocols.all.equals(myConfiguration.getSslProtocols())) {
System.clearProperty(SVNKIT_HTTP_SSL_PROTOCOLS);
}
else if (SvnConfiguration.SSLProtocols.sslv3.equals(myConfiguration.getSslProtocols())) {
System.setProperty(SVNKIT_HTTP_SSL_PROTOCOLS, "SSLv3");
}
else if (SvnConfiguration.SSLProtocols.tlsv1.equals(myConfiguration.getSslProtocols())) {
System.setProperty(SVNKIT_HTTP_SSL_PROTOCOLS, "TLSv1");
}
}
public void activate() {
if (SystemInfo.isWindows) {
if (!SVNJNAUtil.isJNAPresent()) {
Notifications.Bus.notify(new Notification(myVcs.getDisplayName(), "Subversion plugin: no JNA",
"A problem with JNA initialization for SVNKit library. Encryption is not available.",
NotificationType.WARNING), myProject);
}
else if (!SVNJNAUtil.isWinCryptEnabled()) {
Notifications.Bus.notify(new Notification(myVcs.getDisplayName(), "Subversion plugin: no encryption",
"A problem with encryption module (Crypt32.dll) initialization for SVNKit library. " +
"Encryption is not available.",
NotificationType.WARNING
), myProject);
}
}
}
@NotNull
public ISVNOptions getSvnOptions() {
return myConfiguration.getOptions(myProject);
}
@NotNull
public SVNRepository createRepository(String url) throws SVNException {
return createRepository(SVNURL.parseURIEncoded(url));
}
@NotNull
public SVNRepository createRepository(@NotNull SVNURL url) throws SVNException {
SVNRepository repository = SVNRepositoryFactory.create(url);
repository.setAuthenticationManager(getAuthenticationManager());
repository.setTunnelProvider(getSvnOptions());
return repository;
}
@NotNull
private ISVNRepositoryPool getPool() {
return getPool(getAuthenticationManager());
}
@NotNull
private ISVNRepositoryPool getPool(@NotNull ISVNAuthenticationManager manager) {
if (myProject.isDisposed()) {
throw new ProcessCanceledException();
}
return new PrimitivePool(manager, getSvnOptions());
}
@NotNull
public SVNUpdateClient createUpdateClient() {
return setupClient(new SVNUpdateClient(getPool(), getSvnOptions()));
}
@NotNull
public SVNUpdateClient createUpdateClient(@NotNull ISVNAuthenticationManager manager) {
return setupClient(new SVNUpdateClient(getPool(manager), getSvnOptions()), manager);
}
@NotNull
public SVNStatusClient createStatusClient() {
SVNStatusClient client = new SVNStatusClient(getPool(), getSvnOptions());
client.setIgnoreExternals(false);
return setupClient(client);
}
@NotNull
public SVNWCClient createWCClient() {
return setupClient(new SVNWCClient(getPool(), getSvnOptions()));
}
@NotNull
public SVNWCClient createWCClient(@NotNull ISVNAuthenticationManager manager) {
return setupClient(new SVNWCClient(getPool(manager), getSvnOptions()), manager);
}
@NotNull
public SVNCopyClient createCopyClient() {
return setupClient(new SVNCopyClient(getPool(), getSvnOptions()));
}
@NotNull
public SVNMoveClient createMoveClient() {
return setupClient(new SVNMoveClient(getPool(), getSvnOptions()));
}
@NotNull
public SVNLogClient createLogClient() {
return setupClient(new SVNLogClient(getPool(), getSvnOptions()));
}
@NotNull
public SVNLogClient createLogClient(@NotNull ISVNAuthenticationManager manager) {
return setupClient(new SVNLogClient(getPool(manager), getSvnOptions()), manager);
}
@NotNull
public SVNCommitClient createCommitClient() {
return setupClient(new SVNCommitClient(getPool(), getSvnOptions()));
}
@NotNull
public SVNDiffClient createDiffClient() {
return setupClient(new SVNDiffClient(getPool(), getSvnOptions()));
}
@NotNull
public SVNChangelistClient createChangelistClient() {
return setupClient(new SVNChangelistClient(getPool(), getSvnOptions()));
}
@NotNull
private SvnAuthenticationManager getAuthenticationManager() {
return myConfiguration.getAuthenticationManager(myVcs);
}
@NotNull
private <T extends SVNBasicClient> T setupClient(@NotNull T client) {
return setupClient(client, getAuthenticationManager());
}
@NotNull
private static <T extends SVNBasicClient> T setupClient(@NotNull T client, @NotNull ISVNAuthenticationManager manager) {
client.getOperationsFactory().setAuthenticationManager(manager);
return client;
}
}