Mercurial > jhg
comparison src/org/tmatesoft/hg/internal/PhasesHelper.java @ 628:6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Wed, 22 May 2013 15:52:31 +0200 |
| parents | d2f6ab541330 |
| children | c75297c17867 |
comparison
equal
deleted
inserted
replaced
| 627:5153eb73b18d | 628:6526d8adbc0f |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 TMate Software Ltd | 2 * Copyright (c) 2012-2013 TMate Software Ltd |
| 3 * | 3 * |
| 4 * This program is free software; you can redistribute it and/or modify | 4 * This program is free software; you can redistribute it and/or modify |
| 5 * it under the terms of the GNU General Public License as published by | 5 * it under the terms of the GNU General Public License as published by |
| 6 * the Free Software Foundation; version 2 of the License. | 6 * the Free Software Foundation; version 2 of the License. |
| 7 * | 7 * |
| 35 import org.tmatesoft.hg.repo.HgChangelog; | 35 import org.tmatesoft.hg.repo.HgChangelog; |
| 36 import org.tmatesoft.hg.repo.HgInvalidControlFileException; | 36 import org.tmatesoft.hg.repo.HgInvalidControlFileException; |
| 37 import org.tmatesoft.hg.repo.HgParentChildMap; | 37 import org.tmatesoft.hg.repo.HgParentChildMap; |
| 38 import org.tmatesoft.hg.repo.HgPhase; | 38 import org.tmatesoft.hg.repo.HgPhase; |
| 39 import org.tmatesoft.hg.repo.HgRepository; | 39 import org.tmatesoft.hg.repo.HgRepository; |
| 40 import org.tmatesoft.hg.repo.HgRuntimeException; | |
| 40 | 41 |
| 41 /** | 42 /** |
| 42 * Support to deal with Mercurial phases feature (as of Mercurial version 2.1) | 43 * Support to deal with Mercurial phases feature (as of Mercurial version 2.1) |
| 43 * | 44 * |
| 44 * @see http://mercurial.selenic.com/wiki/Phases | 45 * @see http://mercurial.selenic.com/wiki/Phases |
| 67 | 68 |
| 68 public HgRepository getRepo() { | 69 public HgRepository getRepo() { |
| 69 return repo.getRepo(); | 70 return repo.getRepo(); |
| 70 } | 71 } |
| 71 | 72 |
| 72 public boolean isCapableOfPhases() throws HgInvalidControlFileException { | 73 public boolean isCapableOfPhases() throws HgRuntimeException { |
| 73 if (null == repoSupporsPhases) { | 74 if (null == repoSupporsPhases) { |
| 74 repoSupporsPhases = readRoots(); | 75 repoSupporsPhases = readRoots(); |
| 75 } | 76 } |
| 76 return repoSupporsPhases.booleanValue(); | 77 return repoSupporsPhases.booleanValue(); |
| 77 } | 78 } |
| 78 | 79 |
| 79 | 80 |
| 80 public HgPhase getPhase(HgChangeset cset) throws HgInvalidControlFileException { | 81 /** |
| 82 * @param cset revision to query | |
| 83 * @return phase of the changeset, never <code>null</code> | |
| 84 * @throws HgInvalidControlFileException if failed to access revlog index/data entry. <em>Runtime exception</em> | |
| 85 * @throws HgRuntimeException subclass thereof to indicate other issues with the library. <em>Runtime exception</em> | |
| 86 */ | |
| 87 public HgPhase getPhase(HgChangeset cset) throws HgRuntimeException { | |
| 81 final Nodeid csetRev = cset.getNodeid(); | 88 final Nodeid csetRev = cset.getNodeid(); |
| 82 final int csetRevIndex = cset.getRevisionIndex(); | 89 final int csetRevIndex = cset.getRevisionIndex(); |
| 83 return getPhase(csetRevIndex, csetRev); | 90 return getPhase(csetRevIndex, csetRev); |
| 84 } | 91 } |
| 85 | 92 |
| 86 public HgPhase getPhase(final int csetRevIndex, Nodeid csetRev) throws HgInvalidControlFileException { | 93 /** |
| 94 * @param csetRevIndex revision index to query | |
| 95 * @param csetRev revision nodeid, optional | |
| 96 * @return phase of the changeset, never <code>null</code> | |
| 97 * @throws HgInvalidControlFileException if failed to access revlog index/data entry. <em>Runtime exception</em> | |
| 98 * @throws HgRuntimeException subclass thereof to indicate other issues with the library. <em>Runtime exception</em> | |
| 99 */ | |
| 100 public HgPhase getPhase(final int csetRevIndex, Nodeid csetRev) throws HgRuntimeException { | |
| 87 if (!isCapableOfPhases()) { | 101 if (!isCapableOfPhases()) { |
| 88 return HgPhase.Undefined; | 102 return HgPhase.Undefined; |
| 89 } | 103 } |
| 90 // csetRev is only used when parentHelper is available | 104 // csetRev is only used when parentHelper is available |
| 91 if (parentHelper != null && (csetRev == null || csetRev.isNull())) { | 105 if (parentHelper != null && (csetRev == null || csetRev.isNull())) { |
| 117 } | 131 } |
| 118 return HgPhase.Public; | 132 return HgPhase.Public; |
| 119 | 133 |
| 120 } | 134 } |
| 121 | 135 |
| 122 private Boolean readRoots() throws HgInvalidControlFileException { | 136 private Boolean readRoots() throws HgRuntimeException { |
| 123 File phaseroots = repo.getFileFromStoreDir("phaseroots"); | 137 File phaseroots = repo.getFileFromStoreDir("phaseroots"); // TODO into HgRepositoryFiles |
| 124 BufferedReader br = null; | 138 BufferedReader br = null; |
| 125 try { | 139 try { |
| 126 if (!phaseroots.exists()) { | 140 if (!phaseroots.exists()) { |
| 127 return Boolean.FALSE; | 141 return Boolean.FALSE; |
| 128 } | 142 } |
| 175 } | 189 } |
| 176 return Collections.emptyList(); | 190 return Collections.emptyList(); |
| 177 } | 191 } |
| 178 | 192 |
| 179 | 193 |
| 180 private RevisionDescendants[] getPhaseDescendants(HgPhase phase) throws HgInvalidControlFileException { | 194 private RevisionDescendants[] getPhaseDescendants(HgPhase phase) throws HgRuntimeException { |
| 181 int ordinal = phase.ordinal(); | 195 int ordinal = phase.ordinal(); |
| 182 if (phaseDescendants[ordinal] == null) { | 196 if (phaseDescendants[ordinal] == null) { |
| 183 phaseDescendants[ordinal] = buildPhaseDescendants(phase); | 197 phaseDescendants[ordinal] = buildPhaseDescendants(phase); |
| 184 } | 198 } |
| 185 return phaseDescendants[ordinal]; | 199 return phaseDescendants[ordinal]; |
| 186 } | 200 } |
| 187 | 201 |
| 188 private RevisionDescendants[] buildPhaseDescendants(HgPhase phase) throws HgInvalidControlFileException { | 202 private RevisionDescendants[] buildPhaseDescendants(HgPhase phase) throws HgRuntimeException { |
| 189 int[] roots = toIndexes(getPhaseRoots(phase)); | 203 int[] roots = toIndexes(getPhaseRoots(phase)); |
| 190 RevisionDescendants[] rv = new RevisionDescendants[roots.length]; | 204 RevisionDescendants[] rv = new RevisionDescendants[roots.length]; |
| 191 for (int i = 0; i < roots.length; i++) { | 205 for (int i = 0; i < roots.length; i++) { |
| 192 rv[i] = new RevisionDescendants(getRepo(), roots[i]); | 206 rv[i] = new RevisionDescendants(getRepo(), roots[i]); |
| 193 rv[i].build(); | 207 rv[i].build(); |
| 194 } | 208 } |
| 195 return rv; | 209 return rv; |
| 196 } | 210 } |
| 197 | 211 |
| 198 private int[] toIndexes(List<Nodeid> roots) throws HgInvalidControlFileException { | 212 private int[] toIndexes(List<Nodeid> roots) throws HgRuntimeException { |
| 199 int[] rv = new int[roots.size()]; | 213 int[] rv = new int[roots.size()]; |
| 200 for (int i = 0; i < rv.length; i++) { | 214 for (int i = 0; i < rv.length; i++) { |
| 201 rv[i] = getRepo().getChangelog().getRevisionIndex(roots.get(i)); | 215 rv[i] = getRepo().getChangelog().getRevisionIndex(roots.get(i)); |
| 202 } | 216 } |
| 203 return rv; | 217 return rv; |
