Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgMergeState.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 | ee8264d80747 |
children | 12f668401613 |
comparison
equal
deleted
inserted
replaced
422:5d1cc7366d04 | 423:9c9c442b5f2e |
---|---|
25 import java.util.ArrayList; | 25 import java.util.ArrayList; |
26 import java.util.Arrays; | 26 import java.util.Arrays; |
27 import java.util.Collections; | 27 import java.util.Collections; |
28 import java.util.List; | 28 import java.util.List; |
29 | 29 |
30 import org.tmatesoft.hg.core.HgBadStateException; | |
31 import org.tmatesoft.hg.core.HgFileRevision; | 30 import org.tmatesoft.hg.core.HgFileRevision; |
32 import org.tmatesoft.hg.core.HgInvalidControlFileException; | |
33 import org.tmatesoft.hg.core.Nodeid; | 31 import org.tmatesoft.hg.core.Nodeid; |
34 import org.tmatesoft.hg.internal.ManifestRevision; | 32 import org.tmatesoft.hg.internal.ManifestRevision; |
35 import org.tmatesoft.hg.internal.Pool; | 33 import org.tmatesoft.hg.internal.Pool; |
36 import org.tmatesoft.hg.util.Pair; | 34 import org.tmatesoft.hg.util.Pair; |
37 import org.tmatesoft.hg.util.Path; | 35 import org.tmatesoft.hg.util.Path; |
38 import org.tmatesoft.hg.util.PathPool; | 36 import org.tmatesoft.hg.util.PathPool; |
39 import org.tmatesoft.hg.util.PathRewrite; | 37 import org.tmatesoft.hg.util.PathRewrite; |
40 | 38 |
41 /** | 39 /** |
42 * | 40 * Access to repository's merge state |
41 * | |
43 * @author Artem Tikhomirov | 42 * @author Artem Tikhomirov |
44 * @author TMate Software Ltd. | 43 * @author TMate Software Ltd. |
45 */ | 44 */ |
46 public class HgMergeState { | 45 public class HgMergeState { |
47 private Nodeid wcp1, wcp2, stateParent; | 46 private Nodeid wcp1, wcp2, stateParent; |
90 | 89 |
91 HgMergeState(HgRepository hgRepo) { | 90 HgMergeState(HgRepository hgRepo) { |
92 repo = hgRepo; | 91 repo = hgRepo; |
93 } | 92 } |
94 | 93 |
95 public void refresh() throws HgInvalidControlFileException { | 94 /** |
95 * Update our knowledge about repository's merge state | |
96 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | |
97 */ | |
98 public void refresh() throws HgRuntimeException { | |
96 entries = null; | 99 entries = null; |
97 // it's possible there are two parents but no merge/state, we shall report this case as 'merging', with proper | 100 // it's possible there are two parents but no merge/state, we shall report this case as 'merging', with proper |
98 // first and second parent values | 101 // first and second parent values |
99 stateParent = Nodeid.NULL; | 102 stateParent = Nodeid.NULL; |
100 Pool<Nodeid> nodeidPool = new Pool<Nodeid>(); | 103 Pool<Nodeid> nodeidPool = new Pool<Nodeid>(); |
151 if ("u".equals(r[1])) { | 154 if ("u".equals(r[1])) { |
152 k = Kind.Unresolved; | 155 k = Kind.Unresolved; |
153 } else if ("r".equals(r[1])) { | 156 } else if ("r".equals(r[1])) { |
154 k = Kind.Resolved; | 157 k = Kind.Resolved; |
155 } else { | 158 } else { |
156 throw new HgBadStateException(r[1]); | 159 throw new HgInvalidStateException(String.format("Unknown merge kind %s", r[1])); |
157 } | 160 } |
158 Entry e = new Entry(k, pathPool.path(r[0]), p1, p2, ca); | 161 Entry e = new Entry(k, pathPool.path(r[0]), p1, p2, ca); |
159 result.add(e); | 162 result.add(e); |
160 } | 163 } |
161 entries = result.toArray(new Entry[result.size()]); | 164 entries = result.toArray(new Entry[result.size()]); |
182 * | 185 * |
183 * @return <code>true</code> when recorded merge state doesn't seem to correspond to present working copy | 186 * @return <code>true</code> when recorded merge state doesn't seem to correspond to present working copy |
184 */ | 187 */ |
185 public boolean isStale() { | 188 public boolean isStale() { |
186 if (wcp1 == null) { | 189 if (wcp1 == null) { |
187 throw new HgBadStateException("Call #refresh() first"); | 190 refresh(); |
188 } | 191 } |
189 return !stateParent.isNull() /*there's merge state*/ && !wcp1.equals(stateParent) /*and it doesn't match*/; | 192 return !stateParent.isNull() /*there's merge state*/ && !wcp1.equals(stateParent) /*and it doesn't match*/; |
190 } | 193 } |
191 | 194 |
192 /** | 195 /** |
193 * It's possible for a repository to be in a 'merging' state (@see {@link #isMerging()} without any | 196 * It's possible for a repository to be in a 'merging' state (@see {@link #isMerging()} without any |
194 * conflict to resolve (no merge state information file). | 197 * conflict to resolve (no merge state information file). |
198 * | |
195 * @return first parent of the working copy, never <code>null</code> | 199 * @return first parent of the working copy, never <code>null</code> |
196 */ | 200 */ |
197 public Nodeid getFirstParent() { | 201 public Nodeid getFirstParent() { |
198 if (wcp1 == null) { | 202 if (wcp1 == null) { |
199 throw new HgBadStateException("Call #refresh() first"); | 203 refresh(); |
200 } | 204 } |
201 return wcp1; | 205 return wcp1; |
202 } | 206 } |
203 | 207 |
204 /** | 208 /** |
205 * @return second parent of the working copy, never <code>null</code> | 209 * @return second parent of the working copy, never <code>null</code> |
206 */ | 210 */ |
207 public Nodeid getSecondParent() { | 211 public Nodeid getSecondParent() { |
208 if (wcp2 == null) { | 212 if (wcp2 == null) { |
209 throw new HgBadStateException("Call #refresh() first"); | 213 refresh(); |
210 } | 214 } |
211 return wcp2; | 215 return wcp2; |
212 } | 216 } |
213 | 217 |
214 /** | 218 /** |
215 * @return revision of the merge state or {@link Nodeid#NULL} if there's no merge state | 219 * @return revision of the merge state or {@link Nodeid#NULL} if there's no merge state |
216 */ | 220 */ |
217 public Nodeid getStateParent() { | 221 public Nodeid getStateParent() { |
218 if (stateParent == null) { | 222 if (stateParent == null) { |
219 throw new HgBadStateException("Call #refresh() first"); | 223 refresh(); |
220 } | 224 } |
221 return stateParent; | 225 return stateParent; |
222 } | 226 } |
223 | 227 |
224 /** | 228 /** |