Mercurial > hg4j
comparison src/org/tmatesoft/hg/internal/RepositoryComparator.java @ 215:41a778e3fd31
Issue 5: Facilities for progress and cancellation. More specific exceptions. Exceptions from callbacks as RuntimeException
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 17 May 2011 00:56:54 +0200 |
parents | 6a2481866491 |
children | 9fb50c04f03c |
comparison
equal
deleted
inserted
replaced
214:4252faa556cd | 215:41a778e3fd31 |
---|---|
29 import java.util.Map.Entry; | 29 import java.util.Map.Entry; |
30 import java.util.Set; | 30 import java.util.Set; |
31 | 31 |
32 import org.tmatesoft.hg.core.HgBadStateException; | 32 import org.tmatesoft.hg.core.HgBadStateException; |
33 import org.tmatesoft.hg.core.HgException; | 33 import org.tmatesoft.hg.core.HgException; |
34 import org.tmatesoft.hg.core.HgRemoteConnectionException; | |
34 import org.tmatesoft.hg.core.Nodeid; | 35 import org.tmatesoft.hg.core.Nodeid; |
35 import org.tmatesoft.hg.repo.HgChangelog; | 36 import org.tmatesoft.hg.repo.HgChangelog; |
36 import org.tmatesoft.hg.repo.HgRemoteRepository; | 37 import org.tmatesoft.hg.repo.HgRemoteRepository; |
37 import org.tmatesoft.hg.repo.HgRemoteRepository.Range; | 38 import org.tmatesoft.hg.repo.HgRemoteRepository.Range; |
38 import org.tmatesoft.hg.repo.HgRemoteRepository.RemoteBranch; | 39 import org.tmatesoft.hg.repo.HgRemoteRepository.RemoteBranch; |
55 public RepositoryComparator(HgChangelog.ParentWalker pwLocal, HgRemoteRepository hgRemote) { | 56 public RepositoryComparator(HgChangelog.ParentWalker pwLocal, HgRemoteRepository hgRemote) { |
56 localRepo = pwLocal; | 57 localRepo = pwLocal; |
57 remoteRepo = hgRemote; | 58 remoteRepo = hgRemote; |
58 } | 59 } |
59 | 60 |
60 public RepositoryComparator compare(Object context) throws HgException, CancelledException { | 61 public RepositoryComparator compare(ProgressSupport progressSupport, CancelSupport cancelSupport) throws HgRemoteConnectionException, CancelledException { |
61 ProgressSupport progressSupport = ProgressSupport.Factory.get(context); | |
62 CancelSupport cancelSupport = CancelSupport.Factory.get(context); | |
63 cancelSupport.checkCancelled(); | 62 cancelSupport.checkCancelled(); |
64 progressSupport.start(10); | 63 progressSupport.start(10); |
65 common = Collections.unmodifiableList(findCommonWithRemote()); | 64 common = Collections.unmodifiableList(findCommonWithRemote()); |
66 // sanity check | 65 // sanity check |
67 for (Nodeid n : common) { | 66 for (Nodeid n : common) { |
124 throw new HgBadStateException(String.format("Invalid index of common known revision: %d in total of %d", earliestRevision, 1+changelog.getLastRevision())); | 123 throw new HgBadStateException(String.format("Invalid index of common known revision: %d in total of %d", earliestRevision, 1+changelog.getLastRevision())); |
125 } | 124 } |
126 changelog.range(earliestRevision+1, changelog.getLastRevision(), inspector); | 125 changelog.range(earliestRevision+1, changelog.getLastRevision(), inspector); |
127 } | 126 } |
128 | 127 |
129 private List<Nodeid> findCommonWithRemote() throws HgException { | 128 private List<Nodeid> findCommonWithRemote() throws HgRemoteConnectionException { |
130 List<Nodeid> remoteHeads = remoteRepo.heads(); | 129 List<Nodeid> remoteHeads = remoteRepo.heads(); |
131 LinkedList<Nodeid> resultCommon = new LinkedList<Nodeid>(); // these remotes are known in local | 130 LinkedList<Nodeid> resultCommon = new LinkedList<Nodeid>(); // these remotes are known in local |
132 LinkedList<Nodeid> toQuery = new LinkedList<Nodeid>(); // these need further queries to find common | 131 LinkedList<Nodeid> toQuery = new LinkedList<Nodeid>(); // these need further queries to find common |
133 for (Nodeid rh : remoteHeads) { | 132 for (Nodeid rh : remoteHeads) { |
134 if (localRepo.knownNode(rh)) { | 133 if (localRepo.knownNode(rh)) { |
206 // TODO ensure unique elements in the list | 205 // TODO ensure unique elements in the list |
207 return resultCommon; | 206 return resultCommon; |
208 } | 207 } |
209 | 208 |
210 // somewhat similar to Outgoing.findCommonWithRemote() | 209 // somewhat similar to Outgoing.findCommonWithRemote() |
211 public List<BranchChain> calculateMissingBranches() throws HgException { | 210 public List<BranchChain> calculateMissingBranches() throws HgRemoteConnectionException { |
212 List<Nodeid> remoteHeads = remoteRepo.heads(); | 211 List<Nodeid> remoteHeads = remoteRepo.heads(); |
213 LinkedList<Nodeid> common = new LinkedList<Nodeid>(); // these remotes are known in local | 212 LinkedList<Nodeid> common = new LinkedList<Nodeid>(); // these remotes are known in local |
214 LinkedList<Nodeid> toQuery = new LinkedList<Nodeid>(); // these need further queries to find common | 213 LinkedList<Nodeid> toQuery = new LinkedList<Nodeid>(); // these need further queries to find common |
215 for (Nodeid rh : remoteHeads) { | 214 for (Nodeid rh : remoteHeads) { |
216 if (localRepo.knownNode(rh)) { | 215 if (localRepo.knownNode(rh)) { |