Mercurial > hg4j
comparison src/org/tmatesoft/hg/core/HgChangeset.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 | 6437d261048a |
comparison
equal
deleted
inserted
replaced
422:5d1cc7366d04 | 423:9c9c442b5f2e |
---|---|
21 import java.util.List; | 21 import java.util.List; |
22 import java.util.Map; | 22 import java.util.Map; |
23 | 23 |
24 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; | 24 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; |
25 import org.tmatesoft.hg.repo.HgChangelog; | 25 import org.tmatesoft.hg.repo.HgChangelog; |
26 import org.tmatesoft.hg.repo.HgInvalidStateException; | |
27 import org.tmatesoft.hg.repo.HgInvalidControlFileException; | |
26 import org.tmatesoft.hg.repo.HgRepository; | 28 import org.tmatesoft.hg.repo.HgRepository; |
29 import org.tmatesoft.hg.repo.HgRuntimeException; | |
27 import org.tmatesoft.hg.repo.HgStatusCollector; | 30 import org.tmatesoft.hg.repo.HgStatusCollector; |
31 import org.tmatesoft.hg.util.CancelledException; | |
28 import org.tmatesoft.hg.util.Path; | 32 import org.tmatesoft.hg.util.Path; |
29 | 33 |
30 | 34 |
31 /** | 35 /** |
32 * Record in the Mercurial changelog, describing single commit. | 36 * Record in the Mercurial changelog, describing single commit. |
168 | 172 |
169 /** | 173 /** |
170 * Figures out files and specific revisions thereof that were modified in this commit | 174 * Figures out files and specific revisions thereof that were modified in this commit |
171 * | 175 * |
172 * @return revisions of files modified in this commit | 176 * @return revisions of files modified in this commit |
173 * @throws HgInvalidControlFileException if access to revlog index/data entry failed | 177 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> |
174 * @throws HgException in case of some other library issue | 178 */ |
175 */ | 179 public List<HgFileRevision> getModifiedFiles() throws HgRuntimeException { |
176 public List<HgFileRevision> getModifiedFiles() throws HgException { | |
177 if (modifiedFiles == null) { | 180 if (modifiedFiles == null) { |
178 initFileChanges(); | 181 initFileChanges(); |
179 } | 182 } |
180 return modifiedFiles; | 183 return modifiedFiles; |
181 } | 184 } |
182 | 185 |
183 /** | 186 /** |
184 * Figures out files added in this commit | 187 * Figures out files added in this commit |
185 * | 188 * |
186 * @return revisions of files added in this commit | 189 * @return revisions of files added in this commit |
187 * @throws HgInvalidControlFileException if access to revlog index/data entry failed | 190 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> |
188 * @throws HgException in case of some other library issue | 191 */ |
189 */ | 192 public List<HgFileRevision> getAddedFiles() throws HgRuntimeException { |
190 public List<HgFileRevision> getAddedFiles() throws HgException { | |
191 if (addedFiles == null) { | 193 if (addedFiles == null) { |
192 initFileChanges(); | 194 initFileChanges(); |
193 } | 195 } |
194 return addedFiles; | 196 return addedFiles; |
195 } | 197 } |
196 | 198 |
197 /** | 199 /** |
198 * Figures out files that were deleted as part of this commit | 200 * Figures out files that were deleted as part of this commit |
199 * | 201 * |
200 * @return revisions of files deleted in this commit | 202 * @return revisions of files deleted in this commit |
201 * @throws HgInvalidControlFileException if access to revlog index/data entry failed | 203 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> |
202 * @throws HgException in case of some other library issue | 204 */ |
203 */ | 205 public List<Path> getRemovedFiles() throws HgRuntimeException { |
204 public List<Path> getRemovedFiles() throws HgException { | |
205 if (deletedFiles == null) { | 206 if (deletedFiles == null) { |
206 initFileChanges(); | 207 initFileChanges(); |
207 } | 208 } |
208 return deletedFiles; | 209 return deletedFiles; |
209 } | 210 } |
213 return !(getFirstParentRevision().isNull() || getSecondParentRevision().isNull()); | 214 return !(getFirstParentRevision().isNull() || getSecondParentRevision().isNull()); |
214 } | 215 } |
215 | 216 |
216 /** | 217 /** |
217 * @return never <code>null</code> | 218 * @return never <code>null</code> |
218 * @throws HgInvalidControlFileException if access to revlog index/data entry failed | 219 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> |
219 */ | 220 */ |
220 public Nodeid getFirstParentRevision() throws HgInvalidControlFileException { | 221 public Nodeid getFirstParentRevision() throws HgRuntimeException { |
221 if (parentHelper != null) { | 222 if (parentHelper != null) { |
222 return parentHelper.safeFirstParent(nodeid); | 223 return parentHelper.safeFirstParent(nodeid); |
223 } | 224 } |
224 // read once for both p1 and p2 | 225 // read once for both p1 and p2 |
225 if (parent1 == null) { | 226 if (parent1 == null) { |
230 return Nodeid.fromBinary(parent1, 0); | 231 return Nodeid.fromBinary(parent1, 0); |
231 } | 232 } |
232 | 233 |
233 /** | 234 /** |
234 * @return never <code>null</code> | 235 * @return never <code>null</code> |
235 * @throws HgInvalidControlFileException if access to revlog index/data entry failed | 236 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> |
236 */ | 237 */ |
237 public Nodeid getSecondParentRevision() throws HgInvalidControlFileException { | 238 public Nodeid getSecondParentRevision() throws HgRuntimeException { |
238 if (parentHelper != null) { | 239 if (parentHelper != null) { |
239 return parentHelper.safeSecondParent(nodeid); | 240 return parentHelper.safeSecondParent(nodeid); |
240 } | 241 } |
241 if (parent2 == null) { | 242 if (parent2 == null) { |
242 parent1 = new byte[20]; | 243 parent1 = new byte[20]; |
258 } catch (CloneNotSupportedException ex) { | 259 } catch (CloneNotSupportedException ex) { |
259 throw new InternalError(ex.toString()); | 260 throw new InternalError(ex.toString()); |
260 } | 261 } |
261 } | 262 } |
262 | 263 |
263 private /*synchronized*/ void initFileChanges() throws HgException { | 264 private /*synchronized*/ void initFileChanges() throws HgRuntimeException { |
264 ArrayList<Path> deleted = new ArrayList<Path>(); | 265 ArrayList<Path> deleted = new ArrayList<Path>(); |
265 ArrayList<HgFileRevision> modified = new ArrayList<HgFileRevision>(); | 266 ArrayList<HgFileRevision> modified = new ArrayList<HgFileRevision>(); |
266 ArrayList<HgFileRevision> added = new ArrayList<HgFileRevision>(); | 267 ArrayList<HgFileRevision> added = new ArrayList<HgFileRevision>(); |
267 HgStatusCollector.Record r = new HgStatusCollector.Record(); | 268 HgStatusCollector.Record r = new HgStatusCollector.Record(); |
268 statusHelper.change(revNumber, r); | 269 try { |
270 statusHelper.change(revNumber, r); | |
271 } catch (CancelledException ex) { | |
272 // Record can't cancel | |
273 throw new HgInvalidStateException("Internal error"); | |
274 } | |
269 final HgRepository repo = statusHelper.getRepo(); | 275 final HgRepository repo = statusHelper.getRepo(); |
270 for (Path s : r.getModified()) { | 276 for (Path s : r.getModified()) { |
271 Nodeid nid = r.nodeidAfterChange(s); | 277 Nodeid nid = r.nodeidAfterChange(s); |
272 if (nid == null) { | 278 if (nid == null) { |
273 throw new HgException(String.format("For the file %s recorded as modified couldn't find revision after change", s)); | 279 throw new HgInvalidStateException(String.format("For the file %s recorded as modified in changeset %d couldn't find revision after change", s, revNumber)); |
274 } | 280 } |
275 modified.add(new HgFileRevision(repo, nid, null, s, null)); | 281 modified.add(new HgFileRevision(repo, nid, null, s, null)); |
276 } | 282 } |
277 final Map<Path, Path> copied = r.getCopied(); | 283 final Map<Path, Path> copied = r.getCopied(); |
278 for (Path s : r.getAdded()) { | 284 for (Path s : r.getAdded()) { |
279 Nodeid nid = r.nodeidAfterChange(s); | 285 Nodeid nid = r.nodeidAfterChange(s); |
280 if (nid == null) { | 286 if (nid == null) { |
281 throw new HgException(String.format("For the file %s recorded as added couldn't find revision after change", s)); | 287 throw new HgInvalidStateException(String.format("For the file %s recorded as added in changeset %d couldn't find revision after change", s, revNumber)); |
282 } | 288 } |
283 added.add(new HgFileRevision(repo, nid, null, s, copied.get(s))); | 289 added.add(new HgFileRevision(repo, nid, null, s, copied.get(s))); |
284 } | 290 } |
285 for (Path s : r.getRemoved()) { | 291 for (Path s : r.getRemoved()) { |
286 // with Path from getRemoved, may just copy | 292 // with Path from getRemoved, may just copy |