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