package com.cadrlife.devsearch.agent.service.git;
import com.cadrlife.devsearch.agent.AgentModule;
import com.cadrlife.devsearch.agent.domain.RepoDescriptor;
import com.cadrlife.devsearch.agent.service.CleanService;
import com.cadrlife.devsearch.agent.service.RepoService;
import com.cadrlife.devsearch.domain.Project;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Strings;
import org.apache.http.impl.client.DefaultHttpClient;
import org.eclipse.jgit.api.Git;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.nio.file.Path;
import java.util.List;
public abstract class GithubRepoService extends RepoService {
private static final Logger LOG = LoggerFactory.getLogger(GithubRepoService.class);
protected final GithubService githubService;
private CleanService cleanService = new CleanService();
private GitService gitService = new GitService();
protected GithubRepoService() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
this.githubService = new GithubService(new DefaultHttpClient(AgentModule.getClientConnectionManager()), objectMapper);
}
@Override
public void updateProject(File projectFile, Project project) {
prepareProject(project);
Path projectPath = projectFile.toPath();
String projectName = project.getName();
if (gitService.gitRepoLooksValid(projectPath)) {
LOG.info("Found .git for {}, trying pull", projectName);
try {
Git gitHandle = gitService.pull(projectFile);
project.setLastChangedDate(gitService.findLastChangedDate(gitHandle, projectFile));
return;
} catch (Exception e) {
LOG.warn("Problem pulling {}, trying fresh clone instead", projectName, e);
}
}
cleanService.clean(projectPath);
String repoUrl = project.getCloneUrl();
LOG.info("Performing fresh clone of {}, url '{}'", projectName, repoUrl);
Git gitHandle = gitService.clone(projectFile, repoUrl, project.getDefaultBranch());
project.setLastChangedDate(gitService.findLastChangedDate(gitHandle, projectFile));
}
@Override
public String getSourceType() {
return "github";
}
@Override
public void pushRepo(Project project) {
Path projectPath = project.getCheckoutPath();
if (!gitService.gitRepoLooksValid(projectPath)) {
throw new RuntimeException("No .git found for project in " + projectPath);
}
gitService.push(projectPath.toFile());
}
protected abstract void prepareProject(Project project);
}