Mercurial > hg4j
comparison src/org/tmatesoft/hg/internal/RepositoryComparator.java @ 423:9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Fri, 23 Mar 2012 22:51:18 +0100 |
| parents | 994b5813a925 |
| children | 48f993aa2f41 |
comparison
equal
deleted
inserted
replaced
| 422:5d1cc7366d04 | 423:9c9c442b5f2e |
|---|---|
| 17 package org.tmatesoft.hg.internal; | 17 package org.tmatesoft.hg.internal; |
| 18 | 18 |
| 19 import static org.tmatesoft.hg.core.Nodeid.NULL; | 19 import static org.tmatesoft.hg.core.Nodeid.NULL; |
| 20 | 20 |
| 21 import java.util.ArrayList; | 21 import java.util.ArrayList; |
| 22 import java.util.Arrays; | |
| 22 import java.util.Collections; | 23 import java.util.Collections; |
| 23 import java.util.HashMap; | 24 import java.util.HashMap; |
| 24 import java.util.HashSet; | 25 import java.util.HashSet; |
| 25 import java.util.LinkedList; | 26 import java.util.LinkedList; |
| 26 import java.util.List; | 27 import java.util.List; |
| 27 import java.util.ListIterator; | 28 import java.util.ListIterator; |
| 28 import java.util.Map; | 29 import java.util.Map; |
| 29 import java.util.Map.Entry; | 30 import java.util.Map.Entry; |
| 30 import java.util.Set; | 31 import java.util.Set; |
| 31 | 32 |
| 32 import org.tmatesoft.hg.core.HgBadStateException; | |
| 33 import org.tmatesoft.hg.core.HgInvalidControlFileException; | |
| 34 import org.tmatesoft.hg.core.HgRemoteConnectionException; | 33 import org.tmatesoft.hg.core.HgRemoteConnectionException; |
| 35 import org.tmatesoft.hg.core.Nodeid; | 34 import org.tmatesoft.hg.core.Nodeid; |
| 36 import org.tmatesoft.hg.repo.HgChangelog; | 35 import org.tmatesoft.hg.repo.HgChangelog; |
| 36 import org.tmatesoft.hg.repo.HgInvalidControlFileException; | |
| 37 import org.tmatesoft.hg.repo.HgInvalidStateException; | |
| 37 import org.tmatesoft.hg.repo.HgRemoteRepository; | 38 import org.tmatesoft.hg.repo.HgRemoteRepository; |
| 38 import org.tmatesoft.hg.repo.HgRemoteRepository.Range; | 39 import org.tmatesoft.hg.repo.HgRemoteRepository.Range; |
| 39 import org.tmatesoft.hg.repo.HgRemoteRepository.RemoteBranch; | 40 import org.tmatesoft.hg.repo.HgRemoteRepository.RemoteBranch; |
| 40 import org.tmatesoft.hg.util.CancelSupport; | 41 import org.tmatesoft.hg.util.CancelSupport; |
| 41 import org.tmatesoft.hg.util.CancelledException; | 42 import org.tmatesoft.hg.util.CancelledException; |
| 63 progressSupport.start(10); | 64 progressSupport.start(10); |
| 64 common = Collections.unmodifiableList(findCommonWithRemote()); | 65 common = Collections.unmodifiableList(findCommonWithRemote()); |
| 65 // sanity check | 66 // sanity check |
| 66 for (Nodeid n : common) { | 67 for (Nodeid n : common) { |
| 67 if (!localRepo.knownNode(n)) { | 68 if (!localRepo.knownNode(n)) { |
| 68 throw new HgBadStateException("Unknown node reported as common:" + n); | 69 throw new HgInvalidStateException("Unknown node reported as common:" + n); |
| 69 } | 70 } |
| 70 } | 71 } |
| 71 progressSupport.done(); | 72 progressSupport.done(); |
| 72 return this; | 73 return this; |
| 73 } | 74 } |
| 74 | 75 |
| 75 public List<Nodeid> getCommon() { | 76 public List<Nodeid> getCommon() { |
| 76 if (common == null) { | 77 if (common == null) { |
| 77 throw new HgBadStateException("Call #compare(Object) first"); | 78 throw new HgInvalidStateException("Call #compare(Object) first"); |
| 78 } | 79 } |
| 79 return common; | 80 return common; |
| 80 } | 81 } |
| 81 | 82 |
| 82 /** | 83 /** |
| 118 // but check for possible wrong repo comparison (hs says 'repository is unrelated' if I try to | 119 // but check for possible wrong repo comparison (hs says 'repository is unrelated' if I try to |
| 119 // check in/out for a repo that has no common nodes. | 120 // check in/out for a repo that has no common nodes. |
| 120 return; | 121 return; |
| 121 } | 122 } |
| 122 if (earliestRevision < 0 || earliestRevision >= changelog.getLastRevision()) { | 123 if (earliestRevision < 0 || earliestRevision >= changelog.getLastRevision()) { |
| 123 throw new HgBadStateException(String.format("Invalid index of common known revision: %d in total of %d", earliestRevision, 1+changelog.getLastRevision())); | 124 throw new HgInvalidStateException(String.format("Invalid index of common known revision: %d in total of %d", earliestRevision, 1+changelog.getLastRevision())); |
| 124 } | 125 } |
| 125 changelog.range(earliestRevision+1, changelog.getLastRevision(), inspector); | 126 changelog.range(earliestRevision+1, changelog.getLastRevision(), inspector); |
| 126 } | 127 } |
| 127 | 128 |
| 128 private List<Nodeid> findCommonWithRemote() throws HgRemoteConnectionException { | 129 private List<Nodeid> findCommonWithRemote() throws HgRemoteConnectionException { |
| 315 break; | 316 break; |
| 316 } | 317 } |
| 317 } | 318 } |
| 318 } while(--watchdog > 0); | 319 } while(--watchdog > 0); |
| 319 if (watchdog == 0) { | 320 if (watchdog == 0) { |
| 320 throw new HgBadStateException(String.format("Can't narrow down branch [%s, %s]", rb.head.shortNotation(), rb.root.shortNotation())); | 321 throw new HgInvalidStateException(String.format("Can't narrow down branch [%s, %s]", rb.head.shortNotation(), rb.root.shortNotation())); |
| 321 } | 322 } |
| 322 } | 323 } |
| 323 if (debug) { | 324 if (debug) { |
| 324 System.out.println("calculateMissingBranches:"); | 325 System.out.println("calculateMissingBranches:"); |
| 325 for (BranchChain bc : branches2load) { | 326 for (BranchChain bc : branches2load) { |
| 484 rangeToEntry.clear(); | 485 rangeToEntry.clear(); |
| 485 } | 486 } |
| 486 toQuery.clear(); | 487 toQuery.clear(); |
| 487 } | 488 } |
| 488 if (rootIndex == -1) { | 489 if (rootIndex == -1) { |
| 489 throw new HgBadStateException("Shall not happen, provided between output is correct"); // FIXME EXCEPTIONS | 490 throw new HgInvalidStateException("Shall not happen, provided between output is correct"); // FIXME EXCEPTIONS |
| 490 } | 491 } |
| 491 result[rootIndex] = branchRoot; | 492 result[rootIndex] = branchRoot; |
| 492 boolean resultOk = true; | 493 boolean resultOk = true; |
| 493 LinkedList<Nodeid> fromRootToHead = new LinkedList<Nodeid>(); | 494 LinkedList<Nodeid> fromRootToHead = new LinkedList<Nodeid>(); |
| 495 IntVector missing = new IntVector(); | |
| 494 for (int i = 0; i <= rootIndex; i++) { | 496 for (int i = 0; i <= rootIndex; i++) { |
| 495 Nodeid n = result[i]; | 497 Nodeid n = result[i]; |
| 496 if (n == null) { | 498 if (n == null) { |
| 497 System.out.printf("ERROR: element %d wasn't found\n",i); | 499 missing.add(i); |
| 498 resultOk = false; | 500 resultOk = false; |
| 499 } | 501 } |
| 500 fromRootToHead.addFirst(n); // reverse order | 502 fromRootToHead.addFirst(n); // reverse order |
| 501 } | 503 } |
| 502 if (debug) { | 504 if (debug) { |
| 503 System.out.println("Total queries:" + totalQueries); | 505 System.out.println("Total queries:" + totalQueries); |
| 504 } | 506 } |
| 505 if (!resultOk) { | 507 if (!resultOk) { |
| 506 throw new HgBadStateException("See console for details"); // FIXME EXCEPTIONS | 508 assert missing.size() > 0; |
| 509 // TODO post-1.0 perhaps, there's better alternative than HgInvalidStateException, e.g. HgDataFormatException? | |
| 510 throw new HgInvalidStateException(String.format("Missing elements with indexes: %s", Arrays.toString(missing.toArray()))); | |
| 507 } | 511 } |
| 508 return fromRootToHead; | 512 return fromRootToHead; |
| 509 } | 513 } |
| 510 | 514 |
| 511 /** | 515 /** |
