James Moger
2014-02-28 131da2786c1bf275c07ba628af4254a40d1dc42f
src/main/java/com/gitblit/utils/JGitUtils.java
@@ -15,10 +15,8 @@
 */
package com.gitblit.utils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.MessageFormat;
import java.util.ArrayList;
@@ -706,6 +704,7 @@
         return null;
      }
      RevCommit commit = null;
      RevWalk walk = null;
      try {
         // resolve object id
         ObjectId branchObject;
@@ -714,12 +713,18 @@
         } else {
            branchObject = repository.resolve(objectId);
         }
         RevWalk walk = new RevWalk(repository);
         if (branchObject == null) {
            return null;
         }
         walk = new RevWalk(repository);
         RevCommit rev = walk.parseCommit(branchObject);
         commit = rev;
         walk.dispose();
      } catch (Throwable t) {
         error(t, repository, "{0} failed to get commit {1}", objectId);
      } finally {
         if (walk != null) {
            walk.dispose();
         }
      }
      return commit;
   }
@@ -755,18 +760,8 @@
            ObjectId entid = tw.getObjectId(0);
            FileMode entmode = tw.getFileMode(0);
            if (entmode != FileMode.GITLINK) {
               RevObject ro = rw.lookupAny(entid, entmode.getObjectType());
               rw.parseBody(ro);
               ByteArrayOutputStream os = new ByteArrayOutputStream();
               ObjectLoader ldr = repository.open(ro.getId(), Constants.OBJ_BLOB);
               byte[] tmp = new byte[4096];
               InputStream in = ldr.openStream();
               int n;
               while ((n = in.read(tmp)) > 0) {
                  os.write(tmp, 0, n);
               }
               in.close();
               content = os.toByteArray();
               ObjectLoader ldr = repository.open(entid, Constants.OBJ_BLOB);
               content = ldr.getCachedBytes();
            }
         }
      } catch (Throwable t) {
@@ -810,17 +805,8 @@
      byte[] content = null;
      try {
         RevBlob blob = rw.lookupBlob(ObjectId.fromString(objectId));
         rw.parseBody(blob);
         ByteArrayOutputStream os = new ByteArrayOutputStream();
         ObjectLoader ldr = repository.open(blob.getId(), Constants.OBJ_BLOB);
         byte[] tmp = new byte[4096];
         InputStream in = ldr.openStream();
         int n;
         while ((n = in.read(tmp)) > 0) {
            os.write(tmp, 0, n);
         }
         in.close();
         content = os.toByteArray();
         content = ldr.getCachedBytes();
      } catch (Throwable t) {
         error(t, repository, "{0} can't find blob {1}", objectId);
      } finally {
@@ -990,6 +976,36 @@
    *            most recent commit. if null, HEAD is assumed.
    * @return list of files changed in a commit range
    */
   public static List<PathChangeModel> getFilesInRange(Repository repository, String startCommit, String endCommit) {
      List<PathChangeModel> list = new ArrayList<PathChangeModel>();
      if (!hasCommits(repository)) {
         return list;
      }
      try {
         ObjectId startRange = repository.resolve(startCommit);
         ObjectId endRange = repository.resolve(endCommit);
         RevWalk rw = new RevWalk(repository);
         RevCommit start = rw.parseCommit(startRange);
         RevCommit end = rw.parseCommit(endRange);
         list.addAll(getFilesInRange(repository, start, end));
         rw.release();
      } catch (Throwable t) {
         error(t, repository, "{0} failed to determine files in range {1}..{2}!", startCommit, endCommit);
      }
      return list;
   }
   /**
    * Returns the list of files changed in a specified commit. If the
    * repository does not exist or is empty, an empty list is returned.
    *
    * @param repository
    * @param startCommit
    *            earliest commit
    * @param endCommit
    *            most recent commit. if null, HEAD is assumed.
    * @return list of files changed in a commit range
    */
   public static List<PathChangeModel> getFilesInRange(Repository repository, RevCommit startCommit, RevCommit endCommit) {
      List<PathChangeModel> list = new ArrayList<PathChangeModel>();
      if (!hasCommits(repository)) {
@@ -1003,7 +1019,7 @@
         List<DiffEntry> diffEntries = df.scan(startCommit.getTree(), endCommit.getTree());
         for (DiffEntry diff : diffEntries) {
            PathChangeModel pcm = PathChangeModel.from(diff,  null);
            PathChangeModel pcm = PathChangeModel.from(diff,  endCommit.getName());
            list.add(pcm);
         }
         Collections.sort(list);
@@ -1470,23 +1486,6 @@
      String target = null;
      try {
         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();
            }
         }
      } catch (Throwable t) {
         error(t, repository, "{0} failed to get symbolic HEAD target");
      }