blob: 109fe60f34ce414cfda1c090113792fe90f9d356 [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.streampark.console.base.util;
import org.apache.streampark.common.util.FileUtils;
import org.apache.streampark.common.util.SystemPropertyUtils;
import org.apache.streampark.console.core.entity.Project;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import org.eclipse.jgit.api.CloneCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.LsRemoteCommand;
import org.eclipse.jgit.api.TransportCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.transport.JschConfigSessionFactory;
import org.eclipse.jgit.transport.OpenSshConfig;
import org.eclipse.jgit.transport.SshTransport;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import org.eclipse.jgit.util.FS;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/** */
public class GitUtils {
private GitUtils() {}
public static Git clone(Project project) throws GitAPIException {
CloneCommand cloneCommand =
Git.cloneRepository().setURI(project.getUrl()).setDirectory(project.getAppSource());
if (StringUtils.isNotBlank(project.getBranches())) {
cloneCommand.setBranch(Constants.R_HEADS + project.getBranches());
cloneCommand.setBranchesToClone(
Collections.singletonList(Constants.R_HEADS + project.getBranches()));
}
setCredentials(cloneCommand, project);
return cloneCommand.call();
}
public static List<String> getBranchList(Project project) throws GitAPIException {
LsRemoteCommand command = Git.lsRemoteRepository().setRemote(project.getUrl()).setHeads(true);
setCredentials(command, project);
Collection<Ref> refList = command.call();
List<String> branchList = new ArrayList<>(4);
if (CollectionUtils.isEmpty(refList)) {
return branchList;
}
for (Ref ref : refList) {
String refName = ref.getName();
if (refName.startsWith(Constants.R_HEADS)) {
String branchName = refName.replace(Constants.R_HEADS, "");
branchList.add(branchName);
}
}
return branchList;
}
private static void setCredentials(TransportCommand<?, ?> transportCommand, Project project) {
if (project.isHttpRepositoryUrl()) {
if (!StringUtils.isAllEmpty(project.getUserName(), project.getPassword())) {
UsernamePasswordCredentialsProvider credentialsProvider =
new UsernamePasswordCredentialsProvider(project.getUserName(), project.getPassword());
transportCommand.setCredentialsProvider(credentialsProvider);
}
} else if (project.isSshRepositoryUrl()) {
transportCommand.setTransportConfigCallback(
transport -> {
SshTransport sshTransport = (SshTransport) transport;
sshTransport.setSshSessionFactory(
new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host hc, Session session) {
session.setConfig("StrictHostKeyChecking", "no");
}
@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
JSch jSch = super.createDefaultJSch(fs);
String prvkeyPath = project.getPrvkeyPath();
if (StringUtils.isBlank(prvkeyPath)) {
String userHome = SystemPropertyUtils.getUserHome();
if (userHome != null) {
String rsaPath = userHome.concat("/.ssh/id_rsa");
if (FileUtils.exists(rsaPath)) {
prvkeyPath = rsaPath;
}
}
}
if (prvkeyPath == null) {
return jSch;
}
if (StringUtils.isBlank(project.getPassword())) {
jSch.addIdentity(prvkeyPath);
} else {
jSch.addIdentity(prvkeyPath, project.getPassword());
}
return jSch;
}
});
});
} else {
throw new IllegalStateException(
"[StreamPark] repository URL is invalid, must be ssh or http(s)");
}
}
}