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); }