Mercurial > hg4j
comparison src/org/tmatesoft/hg/internal/RepositoryComparator.java @ 698:822f3a83ff57
in, out and clone tests pass for ssh repositories. Infrastructure to decouple HgRemoteRepository from specific Connector implementation
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 06 Aug 2013 21:18:33 +0200 |
parents | 12a4f60ea972 |
children |
comparison
equal
deleted
inserted
replaced
697:24f4efedc9d5 | 698:822f3a83ff57 |
---|---|
21 import java.util.ArrayList; | 21 import java.util.ArrayList; |
22 import java.util.Arrays; | 22 import java.util.Arrays; |
23 import java.util.Collections; | 23 import java.util.Collections; |
24 import java.util.HashMap; | 24 import java.util.HashMap; |
25 import java.util.HashSet; | 25 import java.util.HashSet; |
26 import java.util.LinkedHashSet; | |
26 import java.util.LinkedList; | 27 import java.util.LinkedList; |
27 import java.util.List; | 28 import java.util.List; |
28 import java.util.ListIterator; | 29 import java.util.ListIterator; |
29 import java.util.Map; | 30 import java.util.Map; |
30 import java.util.Map.Entry; | 31 import java.util.Map.Entry; |
199 | 200 |
200 // somewhat similar to Outgoing.findCommonWithRemote() | 201 // somewhat similar to Outgoing.findCommonWithRemote() |
201 public List<BranchChain> calculateMissingBranches() throws HgRemoteConnectionException { | 202 public List<BranchChain> calculateMissingBranches() throws HgRemoteConnectionException { |
202 List<Nodeid> remoteHeads = remoteRepo.heads(); | 203 List<Nodeid> remoteHeads = remoteRepo.heads(); |
203 LinkedList<Nodeid> common = new LinkedList<Nodeid>(); // these remotes are known in local | 204 LinkedList<Nodeid> common = new LinkedList<Nodeid>(); // these remotes are known in local |
204 LinkedList<Nodeid> toQuery = new LinkedList<Nodeid>(); // these need further queries to find common | 205 LinkedHashSet<Nodeid> toQuery = new LinkedHashSet<Nodeid>(); // these need further queries to find common |
205 for (Nodeid rh : remoteHeads) { | 206 for (Nodeid rh : remoteHeads) { |
206 if (localRepo.knownNode(rh)) { | 207 if (localRepo.knownNode(rh)) { |
207 common.add(rh); | 208 common.add(rh); |
208 } else { | 209 } else { |
209 toQuery.add(rh); | 210 toQuery.add(rh); |
216 // detailed comments are in Outgoing.findCommonWithRemote | 217 // detailed comments are in Outgoing.findCommonWithRemote |
217 LinkedList<RemoteBranch> checkUp2Head = new LinkedList<RemoteBranch>(); | 218 LinkedList<RemoteBranch> checkUp2Head = new LinkedList<RemoteBranch>(); |
218 // records relation between branch head and its parent branch, if any | 219 // records relation between branch head and its parent branch, if any |
219 HashMap<Nodeid, BranchChain> head2chain = new HashMap<Nodeid, BranchChain>(); | 220 HashMap<Nodeid, BranchChain> head2chain = new HashMap<Nodeid, BranchChain>(); |
220 while (!toQuery.isEmpty()) { | 221 while (!toQuery.isEmpty()) { |
221 List<RemoteBranch> remoteBranches = remoteRepo.branches(toQuery); //head, root, first parent, second parent | 222 List<RemoteBranch> remoteBranches = remoteRepo.branches(new ArrayList<Nodeid>(toQuery)); //head, root, first parent, second parent |
222 toQuery.clear(); | 223 toQuery.clear(); |
223 while(!remoteBranches.isEmpty()) { | 224 while(!remoteBranches.isEmpty()) { |
224 RemoteBranch rb = remoteBranches.remove(0); | 225 RemoteBranch rb = remoteBranches.remove(0); |
225 BranchChain chainElement = head2chain.get(rb.head); | 226 BranchChain chainElement = head2chain.get(rb.head); |
226 if (chainElement == null) { | 227 if (chainElement == null) { |
238 // dig deeper in the history, if necessary | 239 // dig deeper in the history, if necessary |
239 boolean hasP1 = !rb.p1.isNull(), hasP2 = !rb.p2.isNull(); | 240 boolean hasP1 = !rb.p1.isNull(), hasP2 = !rb.p2.isNull(); |
240 if (hasP1 && !localRepo.knownNode(rb.p1)) { | 241 if (hasP1 && !localRepo.knownNode(rb.p1)) { |
241 toQuery.add(rb.p1); | 242 toQuery.add(rb.p1); |
242 // we might have seen parent node already, and recorded it as a branch chain | 243 // we might have seen parent node already, and recorded it as a branch chain |
243 // we shall reuse existing BC to get it completely initializer (head2chain map | 244 // we shall reuse existing BC to get it completely initialized (head2chain map |
244 // on second put with the same key would leave first BC uninitialized. | 245 // on second put with the same key would leave first BC uninitialized. |
245 | 246 |
246 // It seems there's no reason to be affraid (XXX although shall double-check) | 247 // It seems there's no reason to be afraid (XXX although shall double-check) |
247 // that BC's chain would get corrupt (its p1 and p2 fields assigned twice with different values) | 248 // that BC's chain would get corrupt (its p1 and p2 fields assigned twice with different values) |
248 // as parents are always the same (and likely, BC that is common would be the last unknown) | 249 // as parents are always the same (and likely, BC that is common would be the last unknown) |
249 BranchChain bc = head2chain.get(rb.p1); | 250 BranchChain bc = head2chain.get(rb.p1); |
250 if (bc == null) { | 251 if (bc == null) { |
251 head2chain.put(rb.p1, bc = new BranchChain(rb.p1)); | 252 head2chain.put(rb.p1, bc = new BranchChain(rb.p1)); |
350 return p1 == p2 && p1 != null && p1.branchHead == p1.branchRoot && p1.branchHead.isNull(); | 351 return p1 == p2 && p1 != null && p1.branchHead == p1.branchRoot && p1.branchHead.isNull(); |
351 } | 352 } |
352 | 353 |
353 @Override | 354 @Override |
354 public String toString() { | 355 public String toString() { |
355 return String.format("BranchChain [%s, %s]", branchRoot, branchHead); | 356 return String.format("BranchChain [root:%s, head:%s]", branchRoot, branchHead); |
356 } | 357 } |
357 | 358 |
358 void dump() { | 359 void dump() { |
359 System.out.println(toString()); | 360 System.out.println(toString()); |
360 internalDump(" "); | 361 internalDump(" "); |