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.revwalk;
46
47 import java.io.IOException;
48
49 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
50 import org.eclipse.jgit.errors.MissingObjectException;
51
52 class BoundaryGenerator extends Generator {
53 static final int UNINTERESTING = RevWalk.UNINTERESTING;
54
55 Generator g;
56
57 BoundaryGenerator(RevWalk w, Generator s) {
58 super(s.firstParent);
59 g = new InitialGenerator(w, s);
60 }
61
62 @Override
63 int outputType() {
64 return g.outputType() | HAS_UNINTERESTING;
65 }
66
67 @Override
68 void shareFreeList(BlockRevQueue q) {
69 g.shareFreeList(q);
70 }
71
72 @Override
73 RevCommit next() throws MissingObjectException,
74 IncorrectObjectTypeException, IOException {
75 return g.next();
76 }
77
78 private class InitialGenerator extends Generator {
79 private static final int PARSED = RevWalk.PARSED;
80
81 private static final int DUPLICATE = RevWalk.TEMP_MARK;
82
83 private final RevWalk walk;
84
85 private final FIFORevQueue held;
86
87 private final Generator source;
88
89 InitialGenerator(RevWalk w, Generator s) {
90 super(s.firstParent);
91 walk = w;
92 held = new FIFORevQueue(firstParent);
93 source = s;
94 source.shareFreeList(held);
95 }
96
97 @Override
98 int outputType() {
99 return source.outputType();
100 }
101
102 @Override
103 void shareFreeList(BlockRevQueue q) {
104 q.shareFreeList(held);
105 }
106
107 @Override
108 RevCommit next() throws MissingObjectException,
109 IncorrectObjectTypeException, IOException {
110 RevCommit c = source.next();
111 if (c != null) {
112 for (int i = 0; i < c.parents.length; i++) {
113 if (firstParent && i > 0) {
114 break;
115 }
116 RevCommit p = c.parents[i];
117 if ((p.flags & UNINTERESTING) != 0) {
118 held.add(p);
119 }
120 }
121 return c;
122 }
123
124 final FIFORevQueuee.html#FIFORevQueue">FIFORevQueue boundary = new FIFORevQueue(firstParent);
125 boundary.shareFreeList(held);
126 for (;;) {
127 c = held.next();
128 if (c == null)
129 break;
130 if ((c.flags & DUPLICATE) != 0)
131 continue;
132 if ((c.flags & PARSED) == 0)
133 c.parseHeaders(walk);
134 c.flags |= DUPLICATE;
135 boundary.add(c);
136 }
137 boundary.removeFlag(DUPLICATE);
138 g = boundary;
139 return boundary.next();
140 }
141 }
142 }