package com.beijunyi.parallelgit.utils.io; import java.io.IOException; import javax.annotation.Nonnull; import javax.annotation.Nullable; import com.beijunyi.parallelgit.utils.TreeUtils; import org.eclipse.jgit.lib.*; import org.eclipse.jgit.treewalk.TreeWalk; import static org.eclipse.jgit.lib.FileMode.*; import static org.eclipse.jgit.lib.ObjectId.zeroId; public class GitFileEntry { private static final GitFileEntry MISSING_ENTRY = new GitFileEntry(zeroId(), MISSING); private static final GitFileEntry VIRTUAL_SUBTREE_ENTRY = new GitFileEntry(zeroId(), TREE); private final ObjectId id; private final FileMode mode; private GitFileEntry(ObjectId id, FileMode mode) { this.id = id; this.mode = mode; } @Nonnull public static GitFileEntry newEntry(ObjectId id, FileMode mode) { return new GitFileEntry(id, mode); } @Nonnull public static GitFileEntry newEntry(TreeWalk tw, int index) { return newEntry(tw.getObjectId(index), tw.getFileMode(index)); } @Nonnull public static GitFileEntry newEntry(TreeWalk tw) { return newEntry(tw, 0); } @Nonnull public static GitFileEntry newEntry(String path, AnyObjectId tree, ObjectReader reader) throws IOException { TreeWalk tw = TreeUtils.forPath(path, tree, reader); return tw != null ? newEntry(tw) : missingEntry(); } @Nonnull public static GitFileEntry newEntry(String path, AnyObjectId tree, Repository repo) throws IOException { try(ObjectReader reader = repo.newObjectReader()) { return newEntry(path, tree, reader); } } @Nonnull public static GitFileEntry missingEntry() { return MISSING_ENTRY; } @Nonnull public static GitFileEntry newTreeEntry(ObjectId id) { return newEntry(id, TREE); } @Nonnull public ObjectId getId() { return id; } @Nonnull public FileMode getMode() { return mode; } public boolean isSubtree() { return mode.equals(TREE); } public boolean isVirtualSubtree() { return VIRTUAL_SUBTREE_ENTRY.equals(this); } public boolean isMissing() { return MISSING_ENTRY.equals(this); } @Override public boolean equals(@Nullable Object obj) { if(this == obj) return true; if(obj == null || getClass() != obj.getClass()) return false; GitFileEntry that = (GitFileEntry)obj; return id.equals(that.id) && mode.equals(that.mode); } @Override public int hashCode() { int result = id.hashCode(); result = 31 * result + mode.hashCode(); return result; } }