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