1
2
3
4
5
6
7
8
9
10
11
12
13 package org.eclipse.jgit.revwalk;
14
15 import java.io.IOException;
16 import java.text.MessageFormat;
17
18 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
19 import org.eclipse.jgit.errors.MissingObjectException;
20 import org.eclipse.jgit.internal.JGitText;
21 import org.eclipse.jgit.revwalk.filter.AndRevFilter;
22 import org.eclipse.jgit.revwalk.filter.RevFilter;
23 import org.eclipse.jgit.treewalk.filter.TreeFilter;
24
25
26
27
28
29
30
31
32
33 class StartGenerator extends Generator {
34 private final RevWalk walker;
35
36 StartGenerator(RevWalk w) {
37 super(w.isFirstParent());
38 walker = w;
39 }
40
41 @Override
42 int outputType() {
43 return 0;
44 }
45
46 @Override
47 RevCommit next() throws MissingObjectException,
48 IncorrectObjectTypeException, IOException {
49 Generator g;
50
51 final RevWalk w = walker;
52 RevFilter rf = w.getRevFilter();
53 final TreeFilter tf = w.getTreeFilter();
54 AbstractRevQueue q = walker.queue;
55
56 if (rf == RevFilter.MERGE_BASE) {
57
58
59
60 if (tf != TreeFilter.ALL) {
61 throw new IllegalStateException(MessageFormat.format(
62 JGitText.get().cannotCombineTreeFilterWithRevFilter, tf, rf));
63 }
64 if (w.isFirstParent()) {
65 throw new IllegalStateException(
66 JGitText.get().cannotFindMergeBaseUsingFirstParent);
67 }
68
69 final MergeBaseGeneratorerator.html#MergeBaseGenerator">MergeBaseGenerator mbg = new MergeBaseGenerator(w);
70 walker.pending = mbg;
71 walker.queue = AbstractRevQueue.EMPTY_QUEUE;
72 mbg.init(q);
73 return mbg.next();
74 }
75
76 final boolean uninteresting = q.anybodyHasFlag(RevWalk.UNINTERESTING);
77 boolean boundary = walker.hasRevSort(RevSort.BOUNDARY);
78
79 if (!boundary && walker instanceof ObjectWalk) {
80
81
82
83
84 boundary = true;
85 }
86 if (boundary && !uninteresting) {
87
88
89
90
91 boundary = false;
92 }
93
94 final DateRevQueue pending;
95 int pendingOutputType = 0;
96 if (q instanceof DateRevQueue)
97 pending = (DateRevQueue)q;
98 else
99 pending = new DateRevQueue(q);
100 if (tf != TreeFilter.ALL) {
101 int rewriteFlag;
102 if (w.getRewriteParents()) {
103 pendingOutputType |= HAS_REWRITE | NEEDS_REWRITE;
104 rewriteFlag = RevWalk.REWRITE;
105 } else
106 rewriteFlag = 0;
107 rf = AndRevFilter.create(new TreeRevFilter(w, tf, rewriteFlag), rf);
108 }
109
110 walker.queue = q;
111
112 if (walker instanceof DepthWalk) {
113 DepthWalk dw = (DepthWalk) walker;
114 g = new DepthGenerator(dw, pending);
115 } else {
116 g = new PendingGenerator(w, pending, rf, pendingOutputType);
117
118 if (walker.hasRevSort(RevSort.BOUNDARY)) {
119
120
121
122
123 ((PendingGenerator) g).canDispose = false;
124 }
125 }
126
127 if ((g.outputType() & NEEDS_REWRITE) != 0) {
128
129
130
131
132
133 g = new FIFORevQueue(g);
134 g = new RewriteGenerator(g);
135 }
136
137 if (walker.hasRevSort(RevSort.TOPO)
138 && walker.hasRevSort(RevSort.TOPO_KEEP_BRANCH_TOGETHER)) {
139 throw new IllegalStateException(JGitText
140 .get().cannotCombineTopoSortWithTopoKeepBranchTogetherSort);
141 }
142
143 if (walker.hasRevSort(RevSort.TOPO)
144 && (g.outputType() & SORT_TOPO) == 0) {
145 g = new TopoSortGenerator(g);
146 } else if (walker.hasRevSort(RevSort.TOPO_KEEP_BRANCH_TOGETHER)
147 && (g.outputType() & SORT_TOPO) == 0) {
148 g = new TopoNonIntermixSortGenerator(g);
149 }
150 if (walker.hasRevSort(RevSort.REVERSE))
151 g = new LIFORevQueue(g);
152 if (boundary)
153 g = new BoundaryGenerator(w, g);
154 else if (uninteresting) {
155
156
157
158
159
160
161 if (pending.peek() != null)
162 g = new DelayRevQueue(g);
163 g = new FixUninterestingGenerator(g);
164 }
165
166 w.pending = g;
167 return g.next();
168 }
169 }