Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgMergeState.java @ 231:1792b37650f2
Introduced access to conflict resolution information (merge state)
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Wed, 01 Jun 2011 05:44:25 +0200 |
| parents | |
| children | 3fbfce107f94 |
comparison
equal
deleted
inserted
replaced
| 230:0dd9da7489dc | 231:1792b37650f2 |
|---|---|
| 1 /* | |
| 2 * Copyright (c) 2011 TMate Software Ltd | |
| 3 * | |
| 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 | |
| 6 * the Free Software Foundation; version 2 of the License. | |
| 7 * | |
| 8 * This program is distributed in the hope that it will be useful, | |
| 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 11 * GNU General Public License for more details. | |
| 12 * | |
| 13 * For information on how to redistribute this software under | |
| 14 * the terms of a license other than GNU General Public License | |
| 15 * contact TMate Software at support@hg4j.com | |
| 16 */ | |
| 17 package org.tmatesoft.hg.repo; | |
| 18 | |
| 19 import java.io.BufferedReader; | |
| 20 import java.io.File; | |
| 21 import java.io.FileReader; | |
| 22 import java.io.IOException; | |
| 23 import java.util.ArrayList; | |
| 24 import java.util.Arrays; | |
| 25 import java.util.Collections; | |
| 26 import java.util.List; | |
| 27 | |
| 28 import org.tmatesoft.hg.core.HgBadStateException; | |
| 29 import org.tmatesoft.hg.core.HgFileRevision; | |
| 30 import org.tmatesoft.hg.core.HgLogCommand.FileRevision; | |
| 31 import org.tmatesoft.hg.core.Nodeid; | |
| 32 import org.tmatesoft.hg.internal.Pool; | |
| 33 import org.tmatesoft.hg.repo.HgStatusCollector.ManifestRevisionInspector; | |
| 34 import org.tmatesoft.hg.util.Path; | |
| 35 import org.tmatesoft.hg.util.PathPool; | |
| 36 import org.tmatesoft.hg.util.PathRewrite; | |
| 37 | |
| 38 /** | |
| 39 * | |
| 40 * @author Artem Tikhomirov | |
| 41 * @author TMate Software Ltd. | |
| 42 */ | |
| 43 public class HgMergeState { | |
| 44 private Nodeid wcp1, wcp2; | |
| 45 | |
| 46 public enum Kind { | |
| 47 Resolved, Unresolved; | |
| 48 } | |
| 49 | |
| 50 public static class Entry { | |
| 51 private final Kind state; | |
| 52 private final HgFileRevision parent1; | |
| 53 private final HgFileRevision parent2; | |
| 54 private final HgFileRevision ancestor; | |
| 55 private final Path wcFile; | |
| 56 | |
| 57 /*package-local*/Entry(Kind s, Path actualCopy, HgFileRevision p1, HgFileRevision p2, HgFileRevision ca) { | |
| 58 if (p1 == null || p2 == null || ca == null || actualCopy == null) { | |
| 59 throw new IllegalArgumentException(); | |
| 60 } | |
| 61 state = s; | |
| 62 wcFile = actualCopy; | |
| 63 parent1 = p1; | |
| 64 parent2 = p2; | |
| 65 ancestor = ca; | |
| 66 } | |
| 67 | |
| 68 public Kind getState() { | |
| 69 return state; | |
| 70 } | |
| 71 public Path getActualFile() { | |
| 72 return wcFile; | |
| 73 } | |
| 74 public HgFileRevision getFirstParent() { | |
| 75 return parent1; | |
| 76 } | |
| 77 public HgFileRevision getSecondParent() { | |
| 78 return parent2; | |
| 79 } | |
| 80 public HgFileRevision getCommonAncestor() { | |
| 81 return ancestor; | |
| 82 } | |
| 83 } | |
| 84 | |
| 85 private final HgRepository repo; | |
| 86 private Entry[] entries; | |
| 87 | |
| 88 HgMergeState(HgRepository hgRepo) { | |
| 89 repo = hgRepo; | |
| 90 } | |
| 91 | |
| 92 public void refresh() throws IOException/*XXX it's unlikely caller can do anything reasonable about IOException */ { | |
| 93 entries = null; | |
| 94 final File f = new File(repo.getRepositoryRoot(), "merge/state"); | |
| 95 if (!f.canRead()) { | |
| 96 // empty state | |
| 97 return; | |
| 98 } | |
| 99 Nodeid[] wcParents = repo.loadDirstate().parents(); | |
| 100 wcp1 = wcParents[0]; wcp2 = wcParents[1]; | |
| 101 ArrayList<Entry> result = new ArrayList<Entry>(); | |
| 102 PathPool pathPool = new PathPool(new PathRewrite.Empty()); | |
| 103 Pool<Nodeid> nodeidPool = new Pool<Nodeid>(); | |
| 104 Pool<String> fnamePool = new Pool<String>(); | |
| 105 final ManifestRevisionInspector m1 = new ManifestRevisionInspector(nodeidPool, fnamePool); | |
| 106 final ManifestRevisionInspector m2 = new ManifestRevisionInspector(nodeidPool, fnamePool); | |
| 107 final int rp1 = repo.getChangelog().getLocalRevision(wcp1); | |
| 108 final int rp2 = repo.getChangelog().getLocalRevision(wcp2); | |
| 109 repo.getManifest().walk(rp1, rp1, m1); | |
| 110 repo.getManifest().walk(rp2, rp2, m2); | |
| 111 BufferedReader br = new BufferedReader(new FileReader(f)); | |
| 112 String s = br.readLine(); | |
| 113 Nodeid n = Nodeid.fromAscii(s); | |
| 114 if (!wcp1.equals(n)) { | |
| 115 throw new AssertionError("I assume merge/state records revision of the wc we merge into"); | |
| 116 } | |
| 117 while ((s = br.readLine()) != null) { | |
| 118 String[] r = s.split("\\00"); | |
| 119 HgFileRevision p1 = new HgFileRevision(repo, m1.nodeid(r[3]), pathPool.path(r[3])); | |
| 120 HgFileRevision ca = new HgFileRevision(repo, Nodeid.fromAscii(r[5]), pathPool.path(r[4])); | |
| 121 HgFileRevision p2 = new HgFileRevision(repo, m2.nodeid(r[6]), pathPool.path(r[6])); | |
| 122 final Kind k; | |
| 123 if ("u".equals(r[1])) { | |
| 124 k = Kind.Unresolved; | |
| 125 } else if ("r".equals(r[1])) { | |
| 126 k = Kind.Resolved; | |
| 127 } else { | |
| 128 throw new HgBadStateException(r[1]); | |
| 129 } | |
| 130 Entry e = new Entry(k, pathPool.path(r[0]), p1, p2, ca); | |
| 131 result.add(e); | |
| 132 } | |
| 133 entries = result.toArray(new Entry[result.size()]); | |
| 134 br.close(); | |
| 135 pathPool.clear(); | |
| 136 } | |
| 137 | |
| 138 public Nodeid getFirstParent() { | |
| 139 if (wcp1 == null) { | |
| 140 throw new HgBadStateException("Call #refresh() first"); | |
| 141 } | |
| 142 return wcp1; | |
| 143 } | |
| 144 | |
| 145 public Nodeid getSecondParent() { | |
| 146 if (wcp2 == null) { | |
| 147 throw new HgBadStateException("Call #refresh() first"); | |
| 148 } | |
| 149 return wcp2; | |
| 150 } | |
| 151 | |
| 152 public List<Entry> getConflicts() { | |
| 153 return entries == null ? Collections.<Entry>emptyList() : Arrays.asList(entries); | |
| 154 } | |
| 155 } |
