Mercurial > hg4j
comparison src/org/tmatesoft/hg/internal/PhasesHelper.java @ 493:ba36f66c32b4
Refactor to keep knowledge about repository control files and their location in respect to .hg/ in a single place (facilitate future adoption of shared repositories)
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Thu, 18 Oct 2012 18:36:13 +0200 |
| parents | b3c16d1aede0 |
| children | d2f6ab541330 |
comparison
equal
deleted
inserted
replaced
| 492:e4eaa23e3442 | 493:ba36f66c32b4 |
|---|---|
| 31 import java.util.List; | 31 import java.util.List; |
| 32 | 32 |
| 33 import org.tmatesoft.hg.core.HgChangeset; | 33 import org.tmatesoft.hg.core.HgChangeset; |
| 34 import org.tmatesoft.hg.core.Nodeid; | 34 import org.tmatesoft.hg.core.Nodeid; |
| 35 import org.tmatesoft.hg.repo.HgChangelog; | 35 import org.tmatesoft.hg.repo.HgChangelog; |
| 36 import org.tmatesoft.hg.repo.HgInternals; | |
| 37 import org.tmatesoft.hg.repo.HgInvalidControlFileException; | 36 import org.tmatesoft.hg.repo.HgInvalidControlFileException; |
| 38 import org.tmatesoft.hg.repo.HgParentChildMap; | 37 import org.tmatesoft.hg.repo.HgParentChildMap; |
| 39 import org.tmatesoft.hg.repo.HgPhase; | 38 import org.tmatesoft.hg.repo.HgPhase; |
| 40 import org.tmatesoft.hg.repo.HgRepository; | 39 import org.tmatesoft.hg.repo.HgRepository; |
| 41 | 40 |
| 48 * @author Artem Tikhomirov | 47 * @author Artem Tikhomirov |
| 49 * @author TMate Software Ltd. | 48 * @author TMate Software Ltd. |
| 50 */ | 49 */ |
| 51 public final class PhasesHelper { | 50 public final class PhasesHelper { |
| 52 | 51 |
| 53 private final HgRepository repo; | 52 private final Internals repo; |
| 54 private final HgParentChildMap<HgChangelog> parentHelper; | 53 private final HgParentChildMap<HgChangelog> parentHelper; |
| 55 private Boolean repoSupporsPhases; | 54 private Boolean repoSupporsPhases; |
| 56 private List<Nodeid> draftPhaseRoots; | 55 private List<Nodeid> draftPhaseRoots; |
| 57 private List<Nodeid> secretPhaseRoots; | 56 private List<Nodeid> secretPhaseRoots; |
| 58 private RevisionDescendants[][] phaseDescendants = new RevisionDescendants[HgPhase.values().length][]; | 57 private RevisionDescendants[][] phaseDescendants = new RevisionDescendants[HgPhase.values().length][]; |
| 59 | 58 |
| 60 public PhasesHelper(HgRepository hgRepo) { | 59 public PhasesHelper(Internals internalRepo) { |
| 61 this(hgRepo, null); | 60 this(internalRepo, null); |
| 62 } | 61 } |
| 63 | 62 |
| 64 public PhasesHelper(HgRepository hgRepo, HgParentChildMap<HgChangelog> pw) { | 63 public PhasesHelper(Internals internalRepo, HgParentChildMap<HgChangelog> pw) { |
| 65 repo = hgRepo; | 64 repo = internalRepo; |
| 66 parentHelper = pw; | 65 parentHelper = pw; |
| 67 } | 66 } |
| 68 | 67 |
| 69 public HgRepository getRepo() { | 68 public HgRepository getRepo() { |
| 70 return repo; | 69 return repo.getRepo(); |
| 71 } | 70 } |
| 72 | 71 |
| 73 public boolean isCapableOfPhases() throws HgInvalidControlFileException { | 72 public boolean isCapableOfPhases() throws HgInvalidControlFileException { |
| 74 if (null == repoSupporsPhases) { | 73 if (null == repoSupporsPhases) { |
| 75 repoSupporsPhases = readRoots(); | 74 repoSupporsPhases = readRoots(); |
| 88 if (!isCapableOfPhases()) { | 87 if (!isCapableOfPhases()) { |
| 89 return HgPhase.Undefined; | 88 return HgPhase.Undefined; |
| 90 } | 89 } |
| 91 // csetRev is only used when parentHelper is available | 90 // csetRev is only used when parentHelper is available |
| 92 if (parentHelper != null && (csetRev == null || csetRev.isNull())) { | 91 if (parentHelper != null && (csetRev == null || csetRev.isNull())) { |
| 93 csetRev = repo.getChangelog().getRevision(csetRevIndex); | 92 csetRev = getRepo().getChangelog().getRevision(csetRevIndex); |
| 94 } | 93 } |
| 95 | 94 |
| 96 for (HgPhase phase : new HgPhase[] {HgPhase.Secret, HgPhase.Draft }) { | 95 for (HgPhase phase : new HgPhase[] {HgPhase.Secret, HgPhase.Draft }) { |
| 97 List<Nodeid> roots = getPhaseRoots(phase); | 96 List<Nodeid> roots = getPhaseRoots(phase); |
| 98 if (roots.isEmpty()) { | 97 if (roots.isEmpty()) { |
| 119 return HgPhase.Public; | 118 return HgPhase.Public; |
| 120 | 119 |
| 121 } | 120 } |
| 122 | 121 |
| 123 private Boolean readRoots() throws HgInvalidControlFileException { | 122 private Boolean readRoots() throws HgInvalidControlFileException { |
| 124 // FIXME shall access phaseroots through HgRepository#repoPathHelper | 123 File phaseroots = repo.getFileFromStoreDir("phaseroots"); |
| 125 File phaseroots = new File(HgInternals.getRepositoryDir(repo), "store/phaseroots"); | |
| 126 BufferedReader br = null; | 124 BufferedReader br = null; |
| 127 try { | 125 try { |
| 128 if (!phaseroots.exists()) { | 126 if (!phaseroots.exists()) { |
| 129 return Boolean.FALSE; | 127 return Boolean.FALSE; |
| 130 } | 128 } |
| 135 String[] lc = line.trim().split("\\s+"); | 133 String[] lc = line.trim().split("\\s+"); |
| 136 if (lc.length == 0) { | 134 if (lc.length == 0) { |
| 137 continue; | 135 continue; |
| 138 } | 136 } |
| 139 if (lc.length != 2) { | 137 if (lc.length != 2) { |
| 140 repo.getSessionContext().getLog().dump(getClass(), Warn, "Bad line in phaseroots:%s", line); | 138 repo.getContext().getLog().dump(getClass(), Warn, "Bad line in phaseroots:%s", line); |
| 141 continue; | 139 continue; |
| 142 } | 140 } |
| 143 int phaseIndex = Integer.parseInt(lc[0]); | 141 int phaseIndex = Integer.parseInt(lc[0]); |
| 144 Nodeid rootRev = Nodeid.fromAscii(lc[1]); | 142 Nodeid rootRev = Nodeid.fromAscii(lc[1]); |
| 145 if (!repo.getChangelog().isKnown(rootRev)) { | 143 if (!getRepo().getChangelog().isKnown(rootRev)) { |
| 146 repo.getSessionContext().getLog().dump(getClass(), Warn, "Phase(%d) root node %s doesn't exist in the repository, ignored.", phaseIndex, rootRev); | 144 repo.getContext().getLog().dump(getClass(), Warn, "Phase(%d) root node %s doesn't exist in the repository, ignored.", phaseIndex, rootRev); |
| 147 continue; | 145 continue; |
| 148 } | 146 } |
| 149 HgPhase phase = HgPhase.parse(phaseIndex); | 147 HgPhase phase = HgPhase.parse(phaseIndex); |
| 150 List<Nodeid> roots = phase2roots.get(phase); | 148 List<Nodeid> roots = phase2roots.get(phase); |
| 151 if (roots == null) { | 149 if (roots == null) { |
| 160 } finally { | 158 } finally { |
| 161 if (br != null) { | 159 if (br != null) { |
| 162 try { | 160 try { |
| 163 br.close(); | 161 br.close(); |
| 164 } catch (IOException ex) { | 162 } catch (IOException ex) { |
| 165 repo.getSessionContext().getLog().dump(getClass(), Info, ex, null); | 163 repo.getContext().getLog().dump(getClass(), Info, ex, null); |
| 166 // ignore the exception otherwise | 164 // ignore the exception otherwise |
| 167 } | 165 } |
| 168 } | 166 } |
| 169 } | 167 } |
| 170 return Boolean.TRUE; | 168 return Boolean.TRUE; |
| 189 | 187 |
| 190 private RevisionDescendants[] buildPhaseDescendants(HgPhase phase) throws HgInvalidControlFileException { | 188 private RevisionDescendants[] buildPhaseDescendants(HgPhase phase) throws HgInvalidControlFileException { |
| 191 int[] roots = toIndexes(getPhaseRoots(phase)); | 189 int[] roots = toIndexes(getPhaseRoots(phase)); |
| 192 RevisionDescendants[] rv = new RevisionDescendants[roots.length]; | 190 RevisionDescendants[] rv = new RevisionDescendants[roots.length]; |
| 193 for (int i = 0; i < roots.length; i++) { | 191 for (int i = 0; i < roots.length; i++) { |
| 194 rv[i] = new RevisionDescendants(repo, roots[i]); | 192 rv[i] = new RevisionDescendants(getRepo(), roots[i]); |
| 195 rv[i].build(); | 193 rv[i].build(); |
| 196 } | 194 } |
| 197 return rv; | 195 return rv; |
| 198 } | 196 } |
| 199 | 197 |
| 200 private int[] toIndexes(List<Nodeid> roots) throws HgInvalidControlFileException { | 198 private int[] toIndexes(List<Nodeid> roots) throws HgInvalidControlFileException { |
| 201 int[] rv = new int[roots.size()]; | 199 int[] rv = new int[roots.size()]; |
| 202 for (int i = 0; i < rv.length; i++) { | 200 for (int i = 0; i < rv.length; i++) { |
| 203 rv[i] = repo.getChangelog().getRevisionIndex(roots.get(i)); | 201 rv[i] = getRepo().getChangelog().getRevisionIndex(roots.get(i)); |
| 204 } | 202 } |
| 205 return rv; | 203 return rv; |
| 206 } | 204 } |
| 207 } | 205 } |
