package com.beijunyi.parallelgit.filesystem.utils;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Path;
import java.util.Map;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.beijunyi.parallelgit.filesystem.exceptions.HeadAlreadyDefinedException;
import com.beijunyi.parallelgit.utils.RefUtils;
import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import static com.beijunyi.parallelgit.filesystem.GitFileSystemProvider.*;
import static com.beijunyi.parallelgit.utils.BranchUtils.branchExists;
import static com.beijunyi.parallelgit.utils.CommitUtils.*;
import static com.beijunyi.parallelgit.utils.RepositoryUtils.*;
public class GfsConfiguration {
private final Repository repo;
private String branch;
private RevCommit commit;
public GfsConfiguration(Repository repo) {
this.repo = repo;
}
@Nonnull
public static GfsConfiguration repo(Repository repo) {
return new GfsConfiguration(repo);
}
@Nonnull
public static GfsConfiguration inMemoryRepo() {
return repo(new InMemoryRepository(new DfsRepositoryDescription()));
}
@Nonnull
public static GfsConfiguration fileRepo(File repoDir) throws IOException {
Repository repo = repoDir.exists() ? openRepository(repoDir) : createRepository(repoDir);
return repo(repo);
}
@Nonnull
public static GfsConfiguration fileRepo(String repoDir) throws IOException {
return fileRepo(new File(repoDir));
}
@Nonnull
public static GfsConfiguration fileRepo(Path repoDir) throws IOException {
return fileRepo(repoDir.toFile());
}
@Nonnull
public static GfsConfiguration fromPath(Path repoDir, Map<String, ?> props) throws IOException {
return fileRepo(repoDir).readProperties(props);
}
@Nonnull
public static GfsConfiguration fromUri(URI uri, Map<String, ?> props) throws IOException {
String repoDir = GfsUriUtils.getRepository(uri);
return fileRepo(repoDir).readProperties(props);
}
@Nonnull
public Repository repository() {
return repo;
}
@Nonnull
public GfsConfiguration branch(String name) throws IOException {
if(commit != null)
throw new HeadAlreadyDefinedException();
if(!branchExists(name, repo) && exists(name, repo))
commit = getCommit(name, repo);
else {
branch = RefUtils.fullBranchName(name);
Ref ref = repo.exactRef(branch);
if(ref != null)
commit = getCommit(ref, repo);
}
return this;
}
@Nonnull
public GfsConfiguration branch(Ref ref) throws IOException {
return branch(ref.getName());
}
@Nullable
public String branch() throws IOException {
return branch;
}
@Nonnull
public GfsConfiguration commit(RevCommit commit) {
if(branch != null || this.commit != null)
throw new HeadAlreadyDefinedException();
this.commit = commit;
return this;
}
@Nonnull
public GfsConfiguration commit(AnyObjectId id) throws IOException {
return commit(getCommit(id, repo));
}
@Nonnull
public GfsConfiguration commit(String id) throws IOException {
return commit(getCommit(id, repo));
}
@Nullable
public RevCommit commit() {
return commit;
}
@Nonnull
private GfsConfiguration readProperties(Map<String, ?> props) throws IOException {
String branch = (String) props.get(BRANCH);
if(branch != null)
branch(branch);
else {
String commit = (String) props.get(COMMIT);
if(commit != null)
commit(commit);
}
return this;
}
}