code: 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();
    }
  
  
  }
  