Switch jgit library to the EDL (3-clause BSD)
[egit/zawir.git] / org.spearce.jgit / src / org / spearce / jgit / revwalk / DateRevQueue.java
blob2a8bd8dd2c890794b44c9e82655a2402856d739a
1 /*
2 * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
4 * All rights reserved.
6 * Redistribution and use in source and binary forms, with or
7 * without modification, are permitted provided that the following
8 * conditions are met:
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * - Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
18 * - Neither the name of the Git Development Community nor the
19 * names of its contributors may be used to endorse or promote
20 * products derived from this software without specific prior
21 * written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
24 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
25 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
28 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
33 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
35 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 package org.spearce.jgit.revwalk;
40 import java.io.IOException;
42 import org.spearce.jgit.errors.IncorrectObjectTypeException;
43 import org.spearce.jgit.errors.MissingObjectException;
45 /** A queue of commits sorted by commit time order. */
46 public class DateRevQueue extends AbstractRevQueue {
47 private Entry head;
49 private Entry free;
51 /** Create an empty date queue. */
52 public DateRevQueue() {
53 super();
56 DateRevQueue(final Generator s) throws MissingObjectException,
57 IncorrectObjectTypeException, IOException {
58 for (;;) {
59 final RevCommit c = s.next();
60 if (c == null)
61 break;
62 add(c);
66 public void add(final RevCommit c) {
67 Entry q = head;
68 final long when = c.commitTime;
69 final Entry n = newEntry(c);
70 if (q == null || when > q.commit.commitTime) {
71 n.next = q;
72 head = n;
73 } else {
74 Entry p = q.next;
75 while (p != null && p.commit.commitTime > when) {
76 q = p;
77 p = q.next;
79 n.next = q.next;
80 q.next = n;
84 public RevCommit next() {
85 final Entry q = head;
86 if (q == null)
87 return null;
88 head = q.next;
89 freeEntry(q);
90 return q.commit;
93 /**
94 * Peek at the next commit, without removing it.
96 * @return the next available commit; null if there are no commits left.
98 public RevCommit peek() {
99 return head != null ? head.commit : null;
102 public void clear() {
103 head = null;
104 free = null;
107 boolean everbodyHasFlag(final int f) {
108 for (Entry q = head; q != null; q = q.next) {
109 if ((q.commit.flags & f) == 0)
110 return false;
112 return true;
115 boolean anybodyHasFlag(final int f) {
116 for (Entry q = head; q != null; q = q.next) {
117 if ((q.commit.flags & f) != 0)
118 return true;
120 return false;
123 @Override
124 int outputType() {
125 return outputType | SORT_COMMIT_TIME_DESC;
128 public String toString() {
129 final StringBuffer s = new StringBuffer();
130 for (Entry q = head; q != null; q = q.next) {
131 s.append(q.commit);
132 s.append(' ');
133 s.append(q.commit.commitTime);
134 s.append('\n');
136 return s.toString();
139 private Entry newEntry(final RevCommit c) {
140 Entry r = free;
141 if (r == null)
142 r = new Entry();
143 else
144 free = r.next;
145 r.commit = c;
146 return r;
149 private void freeEntry(final Entry e) {
150 e.next = free;
151 free = e;
154 static class Entry {
155 Entry next;
157 RevCommit commit;