mirror of
				https://github.com/scm-manager/scm-manager.git
				synced 2025-11-03 20:15:52 +01:00 
			
		
		
		
	implement cat command for git
This commit is contained in:
		@@ -0,0 +1,196 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2010, Sebastian Sdorra All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, are permitted provided that the following conditions are met:
 | 
			
		||||
 *
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
 * this list of conditions and the following disclaimer. 2. Redistributions in
 | 
			
		||||
 * binary form must reproduce the above copyright notice, this list of
 | 
			
		||||
 * conditions and the following disclaimer in the documentation and/or other
 | 
			
		||||
 * materials provided with the distribution. 3. Neither the name of SCM-Manager;
 | 
			
		||||
 * nor the names of its contributors may be used to endorse or promote products
 | 
			
		||||
 * derived from this software without specific prior written permission.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
			
		||||
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 | 
			
		||||
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
			
		||||
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | 
			
		||||
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * http://bitbucket.org/sdorra/scm-manager
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
package sonia.scm.repository.spi;
 | 
			
		||||
 | 
			
		||||
//~--- non-JDK imports --------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import org.eclipse.jgit.lib.Constants;
 | 
			
		||||
import org.eclipse.jgit.lib.ObjectId;
 | 
			
		||||
import org.eclipse.jgit.lib.ObjectLoader;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevCommit;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevTree;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevWalk;
 | 
			
		||||
import org.eclipse.jgit.treewalk.TreeWalk;
 | 
			
		||||
import org.eclipse.jgit.treewalk.filter.PathFilter;
 | 
			
		||||
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
import sonia.scm.repository.GitUtil;
 | 
			
		||||
import sonia.scm.repository.PathNotFoundException;
 | 
			
		||||
import sonia.scm.repository.RepositoryException;
 | 
			
		||||
import sonia.scm.util.Util;
 | 
			
		||||
 | 
			
		||||
//~--- JDK imports ------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.OutputStream;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @author Sebastian Sdorra
 | 
			
		||||
 */
 | 
			
		||||
public class GitCatCommand extends AbstractGitCommand implements CatCommand
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * the logger for GitCatCommand
 | 
			
		||||
   */
 | 
			
		||||
  private static final Logger logger =
 | 
			
		||||
    LoggerFactory.getLogger(GitCatCommand.class);
 | 
			
		||||
 | 
			
		||||
  //~--- constructors ---------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Constructs ...
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @param repository
 | 
			
		||||
   * @param repositoryDirectory
 | 
			
		||||
   */
 | 
			
		||||
  public GitCatCommand(sonia.scm.repository.Repository repository,
 | 
			
		||||
                       File repositoryDirectory)
 | 
			
		||||
  {
 | 
			
		||||
    super(repository, repositoryDirectory);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //~--- get methods ----------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Method description
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @param request
 | 
			
		||||
   * @param output
 | 
			
		||||
   */
 | 
			
		||||
  @Override
 | 
			
		||||
  public void getCatResult(CatCommandRequest request, OutputStream output)
 | 
			
		||||
  {
 | 
			
		||||
    org.eclipse.jgit.lib.Repository repo = null;
 | 
			
		||||
 | 
			
		||||
    try
 | 
			
		||||
    {
 | 
			
		||||
      repo = open();
 | 
			
		||||
 | 
			
		||||
      ObjectId revId = GitUtil.getRevisionId(repo, request.getRevision());
 | 
			
		||||
 | 
			
		||||
      getContent(repo, revId, request.getPath(), output);
 | 
			
		||||
    }
 | 
			
		||||
    catch (Exception ex)
 | 
			
		||||
    {
 | 
			
		||||
      //TODO throw
 | 
			
		||||
      logger.error("could not fetch content", ex);
 | 
			
		||||
    }
 | 
			
		||||
    finally
 | 
			
		||||
    {
 | 
			
		||||
      GitUtil.close(repo);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Method description
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @param repo
 | 
			
		||||
   * @param revId
 | 
			
		||||
   * @param path
 | 
			
		||||
   * @param output
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @throws IOException
 | 
			
		||||
   * @throws RepositoryException
 | 
			
		||||
   */
 | 
			
		||||
  public void getContent(org.eclipse.jgit.lib.Repository repo, ObjectId revId,
 | 
			
		||||
                         String path, OutputStream output)
 | 
			
		||||
          throws IOException, RepositoryException
 | 
			
		||||
  {
 | 
			
		||||
    TreeWalk treeWalk = null;
 | 
			
		||||
    RevWalk revWalk = null;
 | 
			
		||||
 | 
			
		||||
    try
 | 
			
		||||
    {
 | 
			
		||||
      treeWalk = new TreeWalk(repo);
 | 
			
		||||
      treeWalk.setRecursive(Util.nonNull(path).contains("/"));
 | 
			
		||||
 | 
			
		||||
      if (logger.isDebugEnabled())
 | 
			
		||||
      {
 | 
			
		||||
        logger.debug("load content for {} at {}", path, revId.name());
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      revWalk = new RevWalk(repo);
 | 
			
		||||
 | 
			
		||||
      RevCommit entry = revWalk.parseCommit(revId);
 | 
			
		||||
      RevTree revTree = entry.getTree();
 | 
			
		||||
 | 
			
		||||
      if (revTree != null)
 | 
			
		||||
      {
 | 
			
		||||
        treeWalk.addTree(revTree);
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        logger.error("could not find tree for {}", revId.name());
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      treeWalk.setFilter(PathFilter.create(path));
 | 
			
		||||
 | 
			
		||||
      if (treeWalk.next())
 | 
			
		||||
      {
 | 
			
		||||
 | 
			
		||||
        // Path exists
 | 
			
		||||
        if (treeWalk.getFileMode(0).getObjectType() == Constants.OBJ_BLOB)
 | 
			
		||||
        {
 | 
			
		||||
          ObjectId blobId = treeWalk.getObjectId(0);
 | 
			
		||||
          ObjectLoader loader = repo.open(blobId);
 | 
			
		||||
 | 
			
		||||
          loader.copyTo(output);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
          // Not a blob, its something else (tree, gitlink)
 | 
			
		||||
          throw new PathNotFoundException(path);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        throw new PathNotFoundException(path);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    finally
 | 
			
		||||
    {
 | 
			
		||||
      GitUtil.release(revWalk);
 | 
			
		||||
      GitUtil.release(treeWalk);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -53,7 +53,8 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  /** Field description */
 | 
			
		||||
  private static final Set<Command> COMMANDS = ImmutableSet.of(Command.LOG);
 | 
			
		||||
  private static final Set<Command> COMMANDS = ImmutableSet.of(Command.CAT,
 | 
			
		||||
                                                 Command.LOG);
 | 
			
		||||
 | 
			
		||||
  //~--- constructors ---------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@@ -73,6 +74,18 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider
 | 
			
		||||
 | 
			
		||||
  //~--- get methods ----------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Method description
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @return
 | 
			
		||||
   */
 | 
			
		||||
  @Override
 | 
			
		||||
  public CatCommand getCatCommand()
 | 
			
		||||
  {
 | 
			
		||||
    return new GitCatCommand(repository, repositoryDirectory);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Method description
 | 
			
		||||
   *
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user