James Moger
2012-02-03 fe7c01a8bd76dff240e74bb770212911e227ba59
src/com/gitblit/utils/JGitUtils.java
@@ -340,7 +340,7 @@
               String repository = StringUtils.getRelativePath(basePath,
                     file.getAbsolutePath());
               list.add(repository);
            } else if (searchSubfolders) {
            } else if (searchSubfolders && file.canRead()) {
               // look for repositories in subfolders
               list.addAll(getRepositoryList(basePath, file, exportAll, searchSubfolders));
            }
@@ -1156,63 +1156,95 @@
   }
   /**
    * Returns the default HEAD for a repository. Normally returns the ref HEAD points to, but if HEAD points to nothing
    * it returns null.
    * Returns the target of the symbolic HEAD reference for a repository.
    * Normally returns a branch reference name, but when HEAD is detached,
    * the commit is matched against the known tags. The most recent matching
    * tag ref name will be returned if it references the HEAD commit. If
    * no match is found, the SHA1 is returned.
    *
    * @param repository
    * @return the refmodel for HEAD or null
    * @return the ref name or the SHA1 for a detached HEAD
    */
   public static RefModel getDefaultHead(Repository repository) {
      RefModel ref = null;
   public static String getHEADRef(Repository repository) {
      String target = null;
      try {
         Ref head = repository.getRef(Constants.HEAD);
         if (head != null) {
            Ref target = head.getTarget();
            RevWalk rw = new RevWalk(repository);
            ObjectId targetId = target.getObjectId();
            if (targetId != null) {
               RevObject object = rw.parseAny(targetId);
               ref = new RefModel(target.getName(), target, object);
         target = repository.getFullBranch();
         if (!target.startsWith(Constants.R_HEADS)) {
            // refers to an actual commit, probably a tag
            // find latest tag that matches the commit, if any
            List<RefModel> tagModels = getTags(repository, true, -1);
            if (tagModels.size() > 0) {
               RefModel tag = null;
               Date lastDate = new Date(0);
               for (RefModel tagModel : tagModels) {
                  if (tagModel.getReferencedObjectId().getName().equals(target) &&
                        tagModel.getDate().after(lastDate)) {
                     tag = tagModel;
                     lastDate = tag.getDate();
                  }
               }
               target = tag.getName();
            }
            rw.dispose();
         }
      } catch (Throwable t) {
         LOGGER.error("Failed to get default head!", t);
         error(t, repository, "{0} failed to get symbolic HEAD target");
      }
      return ref;
      return target;
   }
   /**
    * Sets the default HEAD symbolic ref for a repository.
    * Sets the symbolic ref HEAD to the specified target ref. The
    * HEAD will be detached if the target ref is not a branch.
    *
    * @param repository
    * @param ref
    * @param targetRef
    * @return true if successful
    */
   public static void setDefaultHead(Repository repository, Ref ref) {
   public static boolean setHEADtoRef(Repository repository, String targetRef) {
      try {
         boolean detach = !ref.getName().startsWith(Constants.R_HEADS); // detach if not a branch
          // detach HEAD if target ref is not a branch
         boolean detach = !targetRef.startsWith(Constants.R_HEADS);
         RefUpdate.Result result;
         RefUpdate head = repository.updateRef(Constants.HEAD, detach);
         if (detach) { // Tag
            RevCommit commit = getCommit(repository, ref.getObjectId().getName());
            RevCommit commit = getCommit(repository, targetRef);
            head.setNewObjectId(commit.getId());
            result = head.forceUpdate();
         } else {
            result = head.link(ref.getName());
            result = head.link(targetRef);
         }
         switch (result) {
         case NEW:
         case FORCED:
         case NO_CHANGE:
         case FAST_FORWARD:
            break;
            return true;
         default:
            LOGGER.error(MessageFormat.format("{0} failed to set default head to {1} ({2})",
                  repository.getDirectory().getAbsolutePath(), ref.getName(), result));
            LOGGER.error(MessageFormat.format("{0} HEAD update to {1} returned result {2}",
                  repository.getDirectory().getAbsolutePath(), targetRef, result));
         }
      } catch (Throwable t) {
         error(t, repository, "{0} failed to set default head to {1}", ref.getName());
         error(t, repository, "{0} failed to set HEAD to {1}", targetRef);
      }
      return false;
   }
   /**
    * Get the full branch and tag ref names for any potential HEAD targets.
    *
    * @param repository
    * @return a list of ref names
    */
   public static List<String> getAvailableHeadTargets(Repository repository) {
      List<String> targets = new ArrayList<String>();
      for (RefModel branchModel : JGitUtils.getLocalBranches(repository, true, -1)) {
         targets.add(branchModel.getName());
      }
      for (RefModel tagModel : JGitUtils.getTags(repository, true, -1)) {
         targets.add(tagModel.getName());
      }
      return targets;
   }
   /**