You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AbstractTreeIteratorHandler.java 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. }