Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgWorkingCopyStatusCollector.java @ 362:4937e35b805b
Report dirstate access error with Exception
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Fri, 09 Dec 2011 01:14:41 +0100 |
| parents | 150500515714 |
| children | 189dc6dc1c3e |
comparison
equal
deleted
inserted
replaced
| 361:8099939af5fa | 362:4937e35b805b |
|---|---|
| 63 private HgDirstate dirstate; | 63 private HgDirstate dirstate; |
| 64 private HgStatusCollector baseRevisionCollector; | 64 private HgStatusCollector baseRevisionCollector; |
| 65 private PathPool pathPool; | 65 private PathPool pathPool; |
| 66 private ManifestRevision dirstateParentManifest; | 66 private ManifestRevision dirstateParentManifest; |
| 67 | 67 |
| 68 /** | |
| 69 * Collector that iterates over complete working copy | |
| 70 */ | |
| 68 public HgWorkingCopyStatusCollector(HgRepository hgRepo) { | 71 public HgWorkingCopyStatusCollector(HgRepository hgRepo) { |
| 69 this(hgRepo, new HgInternals(hgRepo).createWorkingDirWalker(null)); | 72 this(hgRepo, new HgInternals(hgRepo).createWorkingDirWalker(null)); |
| 70 } | 73 } |
| 71 | 74 |
| 72 // FIXME document cons | 75 /** |
| 73 public HgWorkingCopyStatusCollector(HgRepository hgRepo, FileIterator hgRepoWalker) { | 76 * Collector may analyze and report status for any arbitrary sub-tree of the working copy. |
| 77 * File iterator shall return names of the files relative to the repository root. | |
| 78 * | |
| 79 * @param hgRepo status target repository | |
| 80 * @param workingCopyWalker iterator over files in the working copy | |
| 81 */ | |
| 82 public HgWorkingCopyStatusCollector(HgRepository hgRepo, FileIterator workingCopyWalker) { | |
| 74 repo = hgRepo; | 83 repo = hgRepo; |
| 75 repoWalker = hgRepoWalker; | 84 repoWalker = workingCopyWalker; |
| 76 } | 85 } |
| 77 | 86 |
| 78 /** | 87 /** |
| 79 * Optionally, supply a collector instance that may cache (or have already cached) base revision | 88 * Optionally, supply a collector instance that may cache (or have already cached) base revision |
| 80 * @param sc may be null | 89 * @param sc may be null |
| 141 return dirstateParentManifest; | 150 return dirstateParentManifest; |
| 142 } | 151 } |
| 143 | 152 |
| 144 // may be invoked few times, TIP or WORKING_COPY indicate comparison shall be run against working copy parent | 153 // may be invoked few times, TIP or WORKING_COPY indicate comparison shall be run against working copy parent |
| 145 // NOTE, use of TIP constant requires certain care. TIP here doesn't mean latest cset, but actual working copy parent. | 154 // NOTE, use of TIP constant requires certain care. TIP here doesn't mean latest cset, but actual working copy parent. |
| 146 public void walk(int baseRevision, HgStatusInspector inspector) throws IOException { | 155 public void walk(int baseRevision, HgStatusInspector inspector) throws HgInvalidControlFileException, IOException { |
| 147 if (HgInternals.wrongLocalRevision(baseRevision) || baseRevision == BAD_REVISION) { | 156 if (HgInternals.wrongLocalRevision(baseRevision) || baseRevision == BAD_REVISION) { |
| 148 throw new IllegalArgumentException(String.valueOf(baseRevision)); | 157 throw new IllegalArgumentException(String.valueOf(baseRevision)); |
| 149 } | 158 } |
| 150 try { | 159 if (getDirstateImpl() == null) { |
| 151 if (getDirstateImpl() == null) { | 160 getDirstate(); |
| 152 // FIXME this is a hack to avoid declaring throws for the #walk() at the moment | 161 } |
| 153 // once I decide whether to have mediator that collects errors or to use exceptions here | 162 if (getDirstateParentManifest() == null) { |
| 154 // this hack shall be removed in favor of either severe error in mediator or a re-thrown exception. | 163 initDirstateParentManifest(); |
| 155 getDirstate(); | |
| 156 } | |
| 157 if (getDirstateParentManifest() == null) { | |
| 158 initDirstateParentManifest(); | |
| 159 } | |
| 160 } catch (HgInvalidControlFileException ex) { | |
| 161 repo.getContext().getLog().error(getClass(), ex, "Failed to initialize with dirstate information"); | |
| 162 return; | |
| 163 } | 164 } |
| 164 ManifestRevision collect = null; // non null indicates we compare against base revision | 165 ManifestRevision collect = null; // non null indicates we compare against base revision |
| 165 Set<Path> baseRevFiles = Collections.emptySet(); // files from base revision not affected by status calculation | 166 Set<Path> baseRevFiles = Collections.emptySet(); // files from base revision not affected by status calculation |
| 166 if (baseRevision != TIP && baseRevision != WORKING_COPY) { | 167 if (baseRevision != TIP && baseRevision != WORKING_COPY) { |
| 167 collect = getManifest(baseRevision); | 168 collect = getManifest(baseRevision); |
| 269 } | 270 } |
| 270 } | 271 } |
| 271 } | 272 } |
| 272 } | 273 } |
| 273 | 274 |
| 274 public HgStatusCollector.Record status(int baseRevision) throws IOException { | 275 public HgStatusCollector.Record status(int baseRevision) throws HgInvalidControlFileException, IOException { |
| 275 HgStatusCollector.Record rv = new HgStatusCollector.Record(); | 276 HgStatusCollector.Record rv = new HgStatusCollector.Record(); |
| 276 walk(baseRevision, rv); | 277 walk(baseRevision, rv); |
| 277 return rv; | 278 return rv; |
| 278 } | 279 } |
| 279 | 280 |
