James Moger
2011-06-08 008322bec70a3a20bd00ed2219215a9f42fe0ca5
src/com/gitblit/utils/DiffUtils.java
@@ -1,10 +1,29 @@
/*
 * Copyright 2011 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit.utils;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jgit.api.BlameCommand;
import org.eclipse.jgit.blame.BlameResult;
import org.eclipse.jgit.diff.DiffEntry;
import org.eclipse.jgit.diff.DiffFormatter;
import org.eclipse.jgit.diff.RawText;
import org.eclipse.jgit.diff.RawTextComparator;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -15,28 +34,41 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.gitblit.utils.JGitUtils.DiffOutputType;
import com.gitblit.models.AnnotatedLine;
public class DiffUtils {
   private static final Logger LOGGER = LoggerFactory.getLogger(DiffUtils.class);
   public static enum DiffOutputType {
      PLAIN, GITWEB, GITBLIT;
      public static DiffOutputType forName(String name) {
         for (DiffOutputType type : values()) {
            if (type.name().equalsIgnoreCase(name)) {
               return type;
            }
         }
         return null;
      }
   }
   public static String getCommitDiff(Repository r, RevCommit commit, DiffOutputType outputType) {
      return getCommitDiff(r, null, commit, null, outputType);
      return getDiff(r, null, commit, null, outputType);
   }
   public static String getCommitDiff(Repository r, RevCommit commit, String path,
   public static String getDiff(Repository r, RevCommit commit, String path,
         DiffOutputType outputType) {
      return getCommitDiff(r, null, commit, path, outputType);
      return getDiff(r, null, commit, path, outputType);
   }
   public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit,
   public static String getDiff(Repository r, RevCommit baseCommit, RevCommit commit,
         DiffOutputType outputType) {
      return getCommitDiff(r, baseCommit, commit, null, outputType);
      return getDiff(r, baseCommit, commit, null, outputType);
   }
   public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit,
         String path, DiffOutputType outputType) {
   public static String getDiff(Repository r, RevCommit baseCommit, RevCommit commit, String path,
         DiffOutputType outputType) {
      try {
         RevTree baseTree;
         if (baseCommit == null) {
@@ -146,4 +178,24 @@
      }
      return null;
   }
   public static List<AnnotatedLine> blame(Repository r, String blobPath, String objectId) {
      List<AnnotatedLine> lines = new ArrayList<AnnotatedLine>();
      try {
         BlameCommand blameCommand = new BlameCommand(r);
         blameCommand.setFilePath(blobPath);
         blameCommand.setStartCommit(r.resolve(objectId));
         BlameResult blameResult = blameCommand.call();
         RawText rawText = blameResult.getResultContents();
         int length = rawText.size();
         for (int i = 0; i < length; i++) {
            RevCommit commit = blameResult.getSourceCommit(i);
            AnnotatedLine line = new AnnotatedLine(commit, i + 1, rawText.getString(i));
            lines.add(line);
         }
      } catch (Throwable t) {
         LOGGER.error("failed to generate blame!", t);
      }
      return lines;
   }
}