blob: 0f42cade5284216f0f54ade48c7a8c262290a459 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.maven.shared.release.scm;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import java.util.concurrent.atomic.AtomicReference;
import org.apache.maven.scm.manager.NoSuchScmProviderException;
import org.apache.maven.scm.manager.ScmManager;
import org.apache.maven.scm.provider.ScmProvider;
import org.apache.maven.scm.provider.ScmProviderRepository;
import org.apache.maven.scm.provider.ScmProviderRepositoryWithHost;
import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
import org.apache.maven.scm.repository.ScmRepository;
import org.apache.maven.scm.repository.ScmRepositoryException;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.Settings;
import org.apache.maven.shared.release.config.ReleaseDescriptor;
import org.apache.maven.shared.release.util.MavenCrypto;
import org.apache.maven.shared.release.util.MavenCrypto.MavenCryptoException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static java.util.Objects.requireNonNull;
/**
* Tool that gets a configured SCM repository from release configuration.
*
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
*/
@Singleton
@Named
public class DefaultScmRepositoryConfigurator implements ScmRepositoryConfigurator {
private final Logger logger = LoggerFactory.getLogger(getClass());
private final AtomicReference<ScmManager> scmManager;
private final MavenCrypto mavenCrypto;
@Inject
public DefaultScmRepositoryConfigurator(ScmManager scmManager, MavenCrypto mavenCrypto) {
this.scmManager = new AtomicReference<>(requireNonNull(scmManager));
this.mavenCrypto = requireNonNull(mavenCrypto);
}
/**
* For testing purposes only!
*/
public void setScmManager(ScmManager scmManager) {
this.scmManager.set(scmManager);
}
@Override
public ScmRepository getConfiguredRepository(ReleaseDescriptor releaseDescriptor, Settings settings)
throws ScmRepositoryException, NoSuchScmProviderException {
String url = releaseDescriptor.getScmSourceUrl();
return getConfiguredRepository(url, releaseDescriptor, settings);
}
@Override
public ScmRepository getConfiguredRepository(String url, ReleaseDescriptor releaseDescriptor, Settings settings)
throws ScmRepositoryException, NoSuchScmProviderException {
String username = releaseDescriptor.getScmUsername();
String password = releaseDescriptor.getScmPassword();
String privateKey = releaseDescriptor.getScmPrivateKey();
String passphrase = releaseDescriptor.getScmPrivateKeyPassPhrase();
ScmRepository repository = scmManager.get().makeScmRepository(url);
ScmProviderRepository scmRepo = repository.getProviderRepository();
// MRELEASE-76
scmRepo.setPersistCheckout(false);
if (settings != null) {
Server server = null;
if (releaseDescriptor.getScmId() != null) {
server = settings.getServer(releaseDescriptor.getScmId());
}
if (server == null && repository.getProviderRepository() instanceof ScmProviderRepositoryWithHost) {
ScmProviderRepositoryWithHost repositoryWithHost =
(ScmProviderRepositoryWithHost) repository.getProviderRepository();
String host = repositoryWithHost.getHost();
int port = repositoryWithHost.getPort();
if (port > 0) {
host += ":" + port;
}
// TODO: this is a bit dodgy - id is not host, but since we don't have a <host> field we make an
// assumption
server = settings.getServer(host);
}
if (server != null) {
if (username == null) {
username = server.getUsername();
}
if (password == null) {
password = decrypt(server.getPassword(), server.getId());
}
if (privateKey == null) {
privateKey = server.getPrivateKey();
}
if (passphrase == null) {
passphrase = decrypt(server.getPassphrase(), server.getId());
}
}
}
if (!(username == null || username.isEmpty())) {
scmRepo.setUser(username);
}
if (!(password == null || password.isEmpty())) {
scmRepo.setPassword(password);
}
if (scmRepo instanceof ScmProviderRepositoryWithHost) {
ScmProviderRepositoryWithHost repositoryWithHost = (ScmProviderRepositoryWithHost) scmRepo;
if (!(privateKey == null || privateKey.isEmpty())) {
repositoryWithHost.setPrivateKey(privateKey);
}
if (!(passphrase == null || passphrase.isEmpty())) {
repositoryWithHost.setPassphrase(passphrase);
}
}
if ("svn".equals(repository.getProvider())) {
SvnScmProviderRepository svnRepo = (SvnScmProviderRepository) repository.getProviderRepository();
String tagBase = releaseDescriptor.getScmTagBase();
if (!(tagBase == null || tagBase.isEmpty())) {
svnRepo.setTagBase(tagBase);
}
String branchBase = releaseDescriptor.getScmBranchBase();
if (!(branchBase == null || branchBase.isEmpty())) {
svnRepo.setBranchBase(branchBase);
}
}
return repository;
}
private String decrypt(String str, String server) {
try {
return mavenCrypto.decrypt(str);
} catch (MavenCryptoException e) {
String msg = "Failed to decrypt password/passphrase for server " + server + ", using auth token as is: "
+ e.getMessage();
if (logger.isDebugEnabled()) {
logger.warn(msg, e);
} else {
logger.warn(msg);
}
return str;
}
}
@Override
public ScmProvider getRepositoryProvider(ScmRepository repository) throws NoSuchScmProviderException {
return scmManager.get().getProviderByRepository(repository);
}
}