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 package org.eclipse.jgit.revwalk;
45
46 import java.io.IOException;
47
48 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
49 import org.eclipse.jgit.errors.MissingObjectException;
50
51
52
53
54 public class FIFORevQueue extends BlockRevQueue {
55 private Block head;
56
57 private Block tail;
58
59
60 public FIFORevQueue() {
61 super(false);
62 }
63
64 FIFORevQueue(boolean firstParent) {
65 super(firstParent);
66 }
67
68 FIFORevQueue(Generator s) throws MissingObjectException,
69 IncorrectObjectTypeException, IOException {
70 super(s);
71 }
72
73
74 @Override
75 public void add(RevCommit c) {
76 Block b = tail;
77 if (b == null) {
78 b = free.newBlock();
79 b.add(c);
80 head = b;
81 tail = b;
82 return;
83 } else if (b.isFull()) {
84 b = free.newBlock();
85 tail.next = b;
86 tail = b;
87 }
88 b.add(c);
89 }
90
91
92
93
94
95
96
97 public void unpop(RevCommit c) {
98 Block b = head;
99 if (b == null) {
100 b = free.newBlock();
101 b.resetToMiddle();
102 b.add(c);
103 head = b;
104 tail = b;
105 return;
106 } else if (b.canUnpop()) {
107 b.unpop(c);
108 return;
109 }
110
111 b = free.newBlock();
112 b.resetToEnd();
113 b.unpop(c);
114 b.next = head;
115 head = b;
116 }
117
118
119 @Override
120 public RevCommit next() {
121 final Block b = head;
122 if (b == null)
123 return null;
124
125 final RevCommit c = b.pop();
126 if (b.isEmpty()) {
127 head = b.next;
128 if (head == null)
129 tail = null;
130 free.freeBlock(b);
131 }
132 return c;
133 }
134
135
136 @Override
137 public void clear() {
138 head = null;
139 tail = null;
140 free.clear();
141 }
142
143 @Override
144 boolean everbodyHasFlag(int f) {
145 for (Block b = head; b != null; b = b.next) {
146 for (int i = b.headIndex; i < b.tailIndex; i++)
147 if ((b.commits[i].flags & f) == 0)
148 return false;
149 }
150 return true;
151 }
152
153 @Override
154 boolean anybodyHasFlag(int f) {
155 for (Block b = head; b != null; b = b.next) {
156 for (int i = b.headIndex; i < b.tailIndex; i++)
157 if ((b.commits[i].flags & f) != 0)
158 return true;
159 }
160 return false;
161 }
162
163 void removeFlag(int f) {
164 final int not_f = ~f;
165 for (Block b = head; b != null; b = b.next) {
166 for (int i = b.headIndex; i < b.tailIndex; i++)
167 b.commits[i].flags &= not_f;
168 }
169 }
170
171
172 @Override
173 public String toString() {
174 final StringBuilder s = new StringBuilder();
175 for (Block q = head; q != null; q = q.next) {
176 for (int i = q.headIndex; i < q.tailIndex; i++)
177 describe(s, q.commits[i]);
178 }
179 return s.toString();
180 }
181 }