AbstractTreeIteratorHandler.java

  1. /*
  2.  * Copyright (C) 2008-2009, Google Inc.
  3.  * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> and others
  4.  *
  5.  * This program and the accompanying materials are made available under the
  6.  * terms of the Eclipse Distribution License v. 1.0 which is available at
  7.  * https://www.eclipse.org/org/documents/edl-v10.php.
  8.  *
  9.  * SPDX-License-Identifier: BSD-3-Clause
  10.  */

  11. package org.eclipse.jgit.pgm.opt;

  12. import java.io.File;
  13. import java.io.IOException;
  14. import java.text.MessageFormat;

  15. import org.eclipse.jgit.dircache.DirCache;
  16. import org.eclipse.jgit.dircache.DirCacheIterator;
  17. import org.eclipse.jgit.errors.IncorrectObjectTypeException;
  18. import org.eclipse.jgit.errors.MissingObjectException;
  19. import org.eclipse.jgit.lib.ObjectId;
  20. import org.eclipse.jgit.lib.ObjectReader;
  21. import org.eclipse.jgit.pgm.internal.CLIText;
  22. import org.eclipse.jgit.treewalk.AbstractTreeIterator;
  23. import org.eclipse.jgit.treewalk.CanonicalTreeParser;
  24. import org.eclipse.jgit.treewalk.FileTreeIterator;
  25. import org.eclipse.jgit.treewalk.WorkingTreeOptions;
  26. import org.eclipse.jgit.util.FS;
  27. import org.kohsuke.args4j.CmdLineException;
  28. import org.kohsuke.args4j.CmdLineParser;
  29. import org.kohsuke.args4j.OptionDef;
  30. import org.kohsuke.args4j.spi.OptionHandler;
  31. import org.kohsuke.args4j.spi.Parameters;
  32. import org.kohsuke.args4j.spi.Setter;

  33. /**
  34.  * Custom argument handler
  35.  * {@link org.eclipse.jgit.treewalk.AbstractTreeIterator} from string values.
  36.  * <p>
  37.  * Assumes the parser has been initialized with a Repository.
  38.  */
  39. public class AbstractTreeIteratorHandler extends
  40.         OptionHandler<AbstractTreeIterator> {
  41.     private final org.eclipse.jgit.pgm.opt.CmdLineParser clp;

  42.     /**
  43.      * Create a new handler for the command name.
  44.      * <p>
  45.      * This constructor is used only by args4j.
  46.      *
  47.      * @param parser
  48.      *            a {@link org.kohsuke.args4j.CmdLineParser} object.
  49.      * @param option
  50.      *            a {@link org.kohsuke.args4j.OptionDef} object.
  51.      * @param setter
  52.      *            a {@link org.kohsuke.args4j.spi.Setter} object.
  53.      */
  54.     public AbstractTreeIteratorHandler(final CmdLineParser parser,
  55.             final OptionDef option,
  56.             final Setter<? super AbstractTreeIterator> setter) {
  57.         super(parser, option, setter);
  58.         clp = (org.eclipse.jgit.pgm.opt.CmdLineParser) parser;
  59.     }

  60.     /** {@inheritDoc} */
  61.     @Override
  62.     public int parseArguments(Parameters params) throws CmdLineException {
  63.         final String name = params.getParameter(0);

  64.         if (new File(name).isDirectory()) {
  65.             setter.addValue(new FileTreeIterator(
  66.                 new File(name),
  67.                 FS.DETECTED,
  68.                 clp.getRepository().getConfig().get(WorkingTreeOptions.KEY)));
  69.             return 1;
  70.         }

  71.         if (new File(name).isFile()) {
  72.             final DirCache dirc;
  73.             try {
  74.                 dirc = DirCache.read(new File(name), FS.DETECTED);
  75.             } catch (IOException e) {
  76.                 throw new CmdLineException(clp, MessageFormat.format(CLIText.get().notAnIndexFile, name), e);
  77.             }
  78.             setter.addValue(new DirCacheIterator(dirc));
  79.             return 1;
  80.         }

  81.         final ObjectId id;
  82.         try {
  83.             id = clp.getRepository().resolve(name);
  84.         } catch (IOException e) {
  85.             throw new CmdLineException(clp, CLIText.format(e.getMessage()));
  86.         }
  87.         if (id == null)
  88.             throw new CmdLineException(clp,
  89.                     CLIText.format(CLIText.get().notATree), name);

  90.         final CanonicalTreeParser p = new CanonicalTreeParser();
  91.         try (ObjectReader curs = clp.getRepository().newObjectReader()) {
  92.             p.reset(curs, clp.getRevWalk().parseTree(id));
  93.         } catch (MissingObjectException | IncorrectObjectTypeException e) {
  94.             CmdLineException cle = new CmdLineException(clp,
  95.                     CLIText.format(CLIText.get().notATree), name);
  96.             cle.initCause(e);
  97.             throw cle;
  98.         } catch (IOException e) {
  99.             throw new CmdLineException(clp,
  100.                     CLIText.format(CLIText.get().cannotReadBecause), name,
  101.                     e.getMessage());
  102.         }

  103.         setter.addValue(p);
  104.         return 1;
  105.     }

  106.     /** {@inheritDoc} */
  107.     @Override
  108.     public String getDefaultMetaVariable() {
  109.         return CLIText.get().metaVar_treeish;
  110.     }
  111. }