Mercurial > hg4j
comparison src/org/tmatesoft/hg/internal/RevisionSet.java @ 652:cd77bf51b562
Push: tests. Commit respects phases.new-commit setting. Fix outgoing when changes are not children of common (Issue 47)
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 02 Jul 2013 23:21:16 +0200 |
parents | 6e98d34eaca8 |
children | 629a7370554c |
comparison
equal
deleted
inserted
replaced
651:6e98d34eaca8 | 652:cd77bf51b562 |
---|---|
14 * the terms of a license other than GNU General Public License | 14 * the terms of a license other than GNU General Public License |
15 * contact TMate Software at support@hg4j.com | 15 * contact TMate Software at support@hg4j.com |
16 */ | 16 */ |
17 package org.tmatesoft.hg.internal; | 17 package org.tmatesoft.hg.internal; |
18 | 18 |
19 import static org.tmatesoft.hg.repo.HgRepository.NO_REVISION; | |
20 | |
19 import java.util.ArrayList; | 21 import java.util.ArrayList; |
20 import java.util.Collection; | 22 import java.util.Collection; |
21 import java.util.Collections; | 23 import java.util.Collections; |
22 import java.util.HashSet; | 24 import java.util.HashSet; |
23 import java.util.Iterator; | 25 import java.util.Iterator; |
25 import java.util.Set; | 27 import java.util.Set; |
26 | 28 |
27 import org.tmatesoft.hg.core.Nodeid; | 29 import org.tmatesoft.hg.core.Nodeid; |
28 import org.tmatesoft.hg.repo.HgChangelog; | 30 import org.tmatesoft.hg.repo.HgChangelog; |
29 import org.tmatesoft.hg.repo.HgParentChildMap; | 31 import org.tmatesoft.hg.repo.HgParentChildMap; |
32 import org.tmatesoft.hg.repo.HgRepository; | |
30 | 33 |
31 /** | 34 /** |
32 * Unmodifiable collection of revisions with handy set operations | 35 * Unmodifiable collection of revisions with handy set operations |
33 * | 36 * |
34 * @author Artem Tikhomirov | 37 * @author Artem Tikhomirov |
62 copy.remove(n); | 65 copy.remove(n); |
63 continue; | 66 continue; |
64 } | 67 } |
65 Nodeid p2 = ph.secondParent(n); | 68 Nodeid p2 = ph.secondParent(n); |
66 if (p2 != null && elements.contains(p2)) { | 69 if (p2 != null && elements.contains(p2)) { |
70 copy.remove(n); | |
71 continue; | |
72 } | |
73 } | |
74 return copy.size() == elements.size() ? this : new RevisionSet(copy); | |
75 } | |
76 | |
77 /** | |
78 * Same as {@link #roots(HgParentChildMap)}, but doesn't require a parent-child map | |
79 */ | |
80 public RevisionSet roots(HgRepository repo) { | |
81 // TODO introduce parent access interface, use it here, provide implementations | |
82 // that delegate to HgParentChildMap or HgRepository | |
83 HashSet<Nodeid> copy = new HashSet<Nodeid>(elements); | |
84 final HgChangelog clog = repo.getChangelog(); | |
85 byte[] parent1 = new byte[Nodeid.SIZE], parent2 = new byte[Nodeid.SIZE]; | |
86 int[] parentRevs = new int[2]; | |
87 for (Nodeid n : elements) { | |
88 assert clog.isKnown(n); | |
89 clog.parents(clog.getRevisionIndex(n), parentRevs, parent1, parent2); | |
90 if (parentRevs[0] != NO_REVISION && elements.contains(new Nodeid(parent1, false))) { | |
91 copy.remove(n); | |
92 continue; | |
93 } | |
94 if (parentRevs[1] != NO_REVISION && elements.contains(new Nodeid(parent2, false))) { | |
67 copy.remove(n); | 95 copy.remove(n); |
68 continue; | 96 continue; |
69 } | 97 } |
70 } | 98 } |
71 return copy.size() == elements.size() ? this : new RevisionSet(copy); | 99 return copy.size() == elements.size() ? this : new RevisionSet(copy); |
163 if (other.isEmpty()) { | 191 if (other.isEmpty()) { |
164 return this; | 192 return this; |
165 } | 193 } |
166 HashSet<Nodeid> copy = new HashSet<Nodeid>(elements); | 194 HashSet<Nodeid> copy = new HashSet<Nodeid>(elements); |
167 copy.addAll(other.elements); | 195 copy.addAll(other.elements); |
168 return new RevisionSet(copy); | 196 return copy.size() == elements.size() ? this : new RevisionSet(copy); |
169 } | 197 } |
170 | 198 |
171 /** | 199 /** |
172 * A ^ B := (A\B).union(B\A) | 200 * A ^ B := (A\B).union(B\A) |
173 * A ^ B := A.union(B) \ A.intersect(B) | 201 * A ^ B := A.union(B) \ A.intersect(B) |