package com.cadrlife.devsearch.agent.service.git;
import java.io.File;
import java.nio.file.Path;
import java.util.List;
import org.eclipse.jgit.api.Git;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.cadrlife.devsearch.agent.service.CleanService;
import com.cadrlife.devsearch.agent.service.RepoService;
import com.cadrlife.devsearch.agent.service.stash.Stash;
import com.cadrlife.devsearch.agent.service.stash.StashRestClient;
import com.cadrlife.devsearch.domain.Project;
public class GitStashService extends RepoService {
private static final Logger LOG = LoggerFactory.getLogger(GitStashService.class);
private final String stashProjectKey;
private final String username;
private final String password;
private final String apiBaseUrl;
private final Stash stash;
private final GitService gitService;
private CleanService cleanService;
public GitStashService(String stashProjectKey, String username, String password, String apiBaseUrl) {
this.stashProjectKey = stashProjectKey;
this.username = username;
this.password = password;
this.apiBaseUrl = apiBaseUrl;
stash = new Stash(new StashRestClient(username, password), apiBaseUrl);
gitService = new GitService();
cleanService = new CleanService();
}
public List <Project> findAllProjects() {
return stash.getRepositories(getRepoName(), stashProjectKey);
}
@Override
public void updateProject(File projectFile, Project 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);
}
}
LOG.info("Performing fresh clone of {}", projectName);
cleanService.clean(projectPath);
// String repoUrl = stash.createCloneUri(project., project.getSlug());
Git gitHandle = gitService.clone(projectFile, project.getCloneUrl(), "master");
project.setLastChangedDate(gitService.findLastChangedDate(gitHandle, projectFile));
}
private void foo() {
}
public List<Project> findProjectsByName(String projectName) {
return stash.getRepositoriesByName(getRepoName(), stashProjectKey, projectName);
}
@Override
public String getSourceType() {
return "stash";
}
public String getStashProjectKey() {
return stashProjectKey;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getApiBaseUrl() {
return apiBaseUrl;
}
@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.commit(projectPath.toFile(), project.getFileUpdates());
gitService.push(projectPath.toFile());
}
}