Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgChangelog.java @ 427:31a89587eb04
FIXMEs: consistent names, throws for commands and their handlers. Use of checked exceptions in hi-level api
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Thu, 29 Mar 2012 17:14:35 +0200 |
parents | 063b0663495a |
children | 1ee452f31187 |
comparison
equal
deleted
inserted
replaced
426:063b0663495a | 427:31a89587eb04 |
---|---|
28 import java.util.List; | 28 import java.util.List; |
29 import java.util.Locale; | 29 import java.util.Locale; |
30 import java.util.Map; | 30 import java.util.Map; |
31 import java.util.TimeZone; | 31 import java.util.TimeZone; |
32 | 32 |
33 import org.tmatesoft.hg.core.HgBadArgumentException; | |
34 import org.tmatesoft.hg.core.Nodeid; | 33 import org.tmatesoft.hg.core.Nodeid; |
35 import org.tmatesoft.hg.internal.Callback; | 34 import org.tmatesoft.hg.internal.Callback; |
36 import org.tmatesoft.hg.internal.DataAccess; | 35 import org.tmatesoft.hg.internal.DataAccess; |
37 import org.tmatesoft.hg.internal.IterateControlMediator; | 36 import org.tmatesoft.hg.internal.IterateControlMediator; |
38 import org.tmatesoft.hg.internal.Lifecycle; | 37 import org.tmatesoft.hg.internal.Lifecycle; |
225 } catch (CloneNotSupportedException ex) { | 224 } catch (CloneNotSupportedException ex) { |
226 throw new InternalError(ex.toString()); | 225 throw new InternalError(ex.toString()); |
227 } | 226 } |
228 } | 227 } |
229 | 228 |
230 /*package*/ static RawChangeset parse(DataAccess da) throws IOException, HgBadArgumentException { | 229 /*package*/ static RawChangeset parse(DataAccess da) throws IOException, HgInvalidDataFormatException { |
231 byte[] data = da.byteArray(); | 230 byte[] data = da.byteArray(); |
232 RawChangeset rv = new RawChangeset(); | 231 RawChangeset rv = new RawChangeset(); |
233 rv.init(data, 0, data.length, null); | 232 rv.init(data, 0, data.length, null); |
234 return rv; | 233 return rv; |
235 } | 234 } |
236 | 235 |
237 // @param usersPool - it's likely user names get repeated again and again throughout repository. can be null | 236 // @param usersPool - it's likely user names get repeated again and again throughout repository. can be null |
238 // FIXME replace HgBadArgumentException with HgInvalidDataFormatException or HgInvalidControlFileException | 237 /* package-local */void init(byte[] data, int offset, int length, Pool<String> usersPool) throws HgInvalidDataFormatException { |
239 /* package-local */void init(byte[] data, int offset, int length, Pool<String> usersPool) throws HgBadArgumentException { | |
240 final int bufferEndIndex = offset + length; | 238 final int bufferEndIndex = offset + length; |
241 final byte lineBreak = (byte) '\n'; | 239 final byte lineBreak = (byte) '\n'; |
242 int breakIndex1 = indexOf(data, lineBreak, offset, bufferEndIndex); | 240 int breakIndex1 = indexOf(data, lineBreak, offset, bufferEndIndex); |
243 if (breakIndex1 == -1) { | 241 if (breakIndex1 == -1) { |
244 throw new HgBadArgumentException("Bad Changeset data", null); | 242 throw new HgInvalidDataFormatException("Bad Changeset data"); |
245 } | 243 } |
246 Nodeid _nodeid = Nodeid.fromAscii(data, 0, breakIndex1); | 244 Nodeid _nodeid = Nodeid.fromAscii(data, 0, breakIndex1); |
247 int breakIndex2 = indexOf(data, lineBreak, breakIndex1 + 1, bufferEndIndex); | 245 int breakIndex2 = indexOf(data, lineBreak, breakIndex1 + 1, bufferEndIndex); |
248 if (breakIndex2 == -1) { | 246 if (breakIndex2 == -1) { |
249 throw new HgBadArgumentException("Bad Changeset data", null); | 247 throw new HgInvalidDataFormatException("Bad Changeset data"); |
250 } | 248 } |
251 String _user = new String(data, breakIndex1 + 1, breakIndex2 - breakIndex1 - 1); | 249 String _user = new String(data, breakIndex1 + 1, breakIndex2 - breakIndex1 - 1); |
252 if (usersPool != null) { | 250 if (usersPool != null) { |
253 _user = usersPool.unify(_user); | 251 _user = usersPool.unify(_user); |
254 } | 252 } |
255 int breakIndex3 = indexOf(data, lineBreak, breakIndex2 + 1, bufferEndIndex); | 253 int breakIndex3 = indexOf(data, lineBreak, breakIndex2 + 1, bufferEndIndex); |
256 if (breakIndex3 == -1) { | 254 if (breakIndex3 == -1) { |
257 throw new HgBadArgumentException("Bad Changeset data", null); | 255 throw new HgInvalidDataFormatException("Bad Changeset data"); |
258 } | 256 } |
259 String _timeString = new String(data, breakIndex2 + 1, breakIndex3 - breakIndex2 - 1); | 257 String _timeString = new String(data, breakIndex2 + 1, breakIndex3 - breakIndex2 - 1); |
260 int space1 = _timeString.indexOf(' '); | 258 int space1 = _timeString.indexOf(' '); |
261 if (space1 == -1) { | 259 if (space1 == -1) { |
262 throw new HgBadArgumentException(String.format("Bad Changeset data: %s in [%d..%d]", "time string", breakIndex2+1, breakIndex3), null); | 260 throw new HgInvalidDataFormatException(String.format("Bad Changeset data: %s in [%d..%d]", "time string", breakIndex2+1, breakIndex3)); |
263 } | 261 } |
264 int space2 = _timeString.indexOf(' ', space1 + 1); | 262 int space2 = _timeString.indexOf(' ', space1 + 1); |
265 if (space2 == -1) { | 263 if (space2 == -1) { |
266 space2 = _timeString.length(); | 264 space2 = _timeString.length(); |
267 } | 265 } |
303 } else { | 301 } else { |
304 breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex); | 302 breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex); |
305 } | 303 } |
306 } | 304 } |
307 if (breakIndex4 == -1 || breakIndex4 >= bufferEndIndex) { | 305 if (breakIndex4 == -1 || breakIndex4 >= bufferEndIndex) { |
308 throw new HgBadArgumentException("Bad Changeset data", null); | 306 throw new HgInvalidDataFormatException("Bad Changeset data"); |
309 } | 307 } |
310 } else { | 308 } else { |
311 breakIndex4--; | 309 breakIndex4--; |
312 } | 310 } |
313 String _comment; | 311 String _comment; |
315 _comment = new String(data, breakIndex4 + 2, bufferEndIndex - breakIndex4 - 2, "UTF-8"); | 313 _comment = new String(data, breakIndex4 + 2, bufferEndIndex - breakIndex4 - 2, "UTF-8"); |
316 // TODO post-1.0 respect ui.fallbackencoding and try to decode if set; use EncodingHelper | 314 // TODO post-1.0 respect ui.fallbackencoding and try to decode if set; use EncodingHelper |
317 } catch (UnsupportedEncodingException ex) { | 315 } catch (UnsupportedEncodingException ex) { |
318 _comment = ""; | 316 _comment = ""; |
319 // Could hardly happen | 317 // Could hardly happen |
320 throw new HgBadArgumentException("Bad Changeset data", ex); | 318 throw new HgInvalidDataFormatException("Bad Changeset data", ex); |
321 } | 319 } |
322 // change this instance at once, don't leave it partially changes in case of error | 320 // change this instance at once, don't leave it partially changes in case of error |
323 this.manifest = _nodeid; | 321 this.manifest = _nodeid; |
324 this.user = _user; | 322 this.user = _user; |
325 this.time = _time; | 323 this.time = _time; |
379 byte[] data = da.byteArray(); | 377 byte[] data = da.byteArray(); |
380 cset.init(data, 0, data.length, usersPool); | 378 cset.init(data, 0, data.length, usersPool); |
381 // XXX there's no guarantee for Changeset.Callback that distinct instance comes each time, consider instance reuse | 379 // XXX there's no guarantee for Changeset.Callback that distinct instance comes each time, consider instance reuse |
382 inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset); | 380 inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset); |
383 progressHelper.worked(1); | 381 progressHelper.worked(1); |
384 } catch (HgBadArgumentException ex) { | 382 } catch (HgInvalidDataFormatException ex) { |
385 // see below about better exception | 383 throw ex.setRevisionIndex(revisionNumber); |
386 throw new HgInvalidControlFileException("Failed reading changelog", ex, null).setRevisionIndex(revisionNumber); | |
387 } catch (IOException ex) { | 384 } catch (IOException ex) { |
388 // XXX need better exception, perhaps smth like HgChangelogException (extends HgInvalidControlFileException) | 385 // XXX need better exception, perhaps smth like HgChangelogException (extends HgInvalidControlFileException) |
389 throw new HgInvalidControlFileException("Failed reading changelog", ex, null).setRevisionIndex(revisionNumber); | 386 throw new HgInvalidControlFileException("Failed reading changelog", ex, null).setRevisionIndex(revisionNumber); |
390 } | 387 } |
391 if (iterateControl != null) { | 388 if (iterateControl != null) { |