1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 package org.eclipse.jgit.pgm.opt;
46
47 import java.io.File;
48 import java.io.IOException;
49 import java.text.MessageFormat;
50
51 import org.eclipse.jgit.dircache.DirCache;
52 import org.eclipse.jgit.dircache.DirCacheIterator;
53 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
54 import org.eclipse.jgit.errors.MissingObjectException;
55 import org.eclipse.jgit.lib.ObjectId;
56 import org.eclipse.jgit.lib.ObjectReader;
57 import org.eclipse.jgit.pgm.internal.CLIText;
58 import org.eclipse.jgit.treewalk.AbstractTreeIterator;
59 import org.eclipse.jgit.treewalk.CanonicalTreeParser;
60 import org.eclipse.jgit.treewalk.FileTreeIterator;
61 import org.eclipse.jgit.treewalk.WorkingTreeOptions;
62 import org.eclipse.jgit.util.FS;
63 import org.kohsuke.args4j.CmdLineException;
64 import org.kohsuke.args4j.CmdLineParser;
65 import org.kohsuke.args4j.OptionDef;
66 import org.kohsuke.args4j.spi.OptionHandler;
67 import org.kohsuke.args4j.spi.Parameters;
68 import org.kohsuke.args4j.spi.Setter;
69
70
71
72
73
74
75
76 public class AbstractTreeIteratorHandler extends
77 OptionHandler<AbstractTreeIterator> {
78 private final org.eclipse.jgit.pgm.opt.CmdLineParser clp;
79
80
81
82
83
84
85
86
87
88
89
90
91
92 public AbstractTreeIteratorHandler(final CmdLineParser parser,
93 final OptionDef option,
94 final Setter<? super AbstractTreeIterator> setter) {
95 super(parser, option, setter);
96 clp = (org.eclipse.jgit.pgm.opt.CmdLineParser) parser;
97 }
98
99
100 @Override
101 public int parseArguments(Parameters params) throws CmdLineException {
102 final String name = params.getParameter(0);
103
104 if (new File(name).isDirectory()) {
105 setter.addValue(new FileTreeIterator(
106 new File(name),
107 FS.DETECTED,
108 clp.getRepository().getConfig().get(WorkingTreeOptions.KEY)));
109 return 1;
110 }
111
112 if (new File(name).isFile()) {
113 final DirCache dirc;
114 try {
115 dirc = DirCache.read(new File(name), FS.DETECTED);
116 } catch (IOException e) {
117 throw new CmdLineException(clp, MessageFormat.format(CLIText.get().notAnIndexFile, name), e);
118 }
119 setter.addValue(new DirCacheIterator(dirc));
120 return 1;
121 }
122
123 final ObjectId id;
124 try {
125 id = clp.getRepository().resolve(name);
126 } catch (IOException e) {
127 throw new CmdLineException(clp, CLIText.format(e.getMessage()));
128 }
129 if (id == null)
130 throw new CmdLineException(clp,
131 CLIText.format(CLIText.get().notATree), name);
132
133 final CanonicalTreeParseralTreeParser.html#CanonicalTreeParser">CanonicalTreeParser p = new CanonicalTreeParser();
134 try (ObjectReader curs = clp.getRepository().newObjectReader()) {
135 p.reset(curs, clp.getRevWalk().parseTree(id));
136 } catch (MissingObjectException | IncorrectObjectTypeException e) {
137 throw new CmdLineException(clp,
138 CLIText.format(CLIText.get().notATree), name);
139 } catch (IOException e) {
140 throw new CmdLineException(clp,
141 CLIText.format(CLIText.get().cannotReadBecause), name,
142 e.getMessage());
143 }
144
145 setter.addValue(p);
146 return 1;
147 }
148
149
150 @Override
151 public String getDefaultMetaVariable() {
152 return CLIText.get().metaVar_treeish;
153 }
154 }