package com.beijunyi.parallelgit.utils; import java.io.IOException; import java.util.Collections; import java.util.List; import javax.annotation.Nonnull; import javax.annotation.Nullable; import com.beijunyi.parallelgit.utils.exceptions.NoSuchBranchException; import org.eclipse.jgit.lib.*; import static org.eclipse.jgit.lib.Constants.*; public final class RefUtils { private static boolean matchesPrefix(String name, String prefix) { return name.startsWith(prefix); } public static boolean matchesRefPrefix(String name) { return matchesPrefix(name, R_REFS); } public static boolean matchesBranchRefPrefix(String name) { return matchesPrefix(name, R_HEADS); } public static boolean matchesTagRefPrefix(String name) { return matchesPrefix(name, R_TAGS); } public static boolean isBranchRef(Ref name) { return matchesBranchRefPrefix(name.getName()); } public static boolean isTagRef(Ref name) { return matchesTagRefPrefix(name.getName()); } @Nonnull public static String appendPrefix(String name, String prefix) { if(!matchesPrefix(name, prefix)) { if(matchesRefPrefix(name)) throw new IllegalArgumentException("\"" + prefix + "\" is not the prefix of " + name); name = prefix + name; } if(!Repository.isValidRefName(name)) throw new IllegalArgumentException(name + " is not a valid ref name"); return name; } @Nonnull public static String fullBranchName(String name) { return appendPrefix(name, R_HEADS); } @Nonnull public static String fullTagRef(String name) { return appendPrefix(name, R_TAGS); } @Nonnull public static Ref getBranchRef(String name, Repository repo) throws IOException { Ref ret = repo.exactRef(fullBranchName(name)); if(ret == null) throw new NoSuchBranchException(name); return ret; } @Nullable public static Ref getTagRef(String name, Repository repo) throws IOException { return repo.exactRef(fullTagRef(name)); } @Nonnull public static List<ReflogEntry> getRefLogs(String ref, int max, Repository repository) throws IOException { ReflogReader reader = repository.getReflogReader(ref); return reader != null ? reader.getReverseEntries(max) : Collections.<ReflogEntry>emptyList(); } }