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(" ");