# HG changeset patch # User Artem Tikhomirov # Date 1329876655 -3600 # Node ID f52ca9530774436ce5a9192e7c5a825a5018b65d # Parent 728708de3597ff6a2e1b302cbb7a1228a6871bba Resolve FIXMEs: more consistent exceptions diff -r 728708de3597 -r f52ca9530774 src/org/tmatesoft/hg/core/HgCallbackTargetException.java --- a/src/org/tmatesoft/hg/core/HgCallbackTargetException.java Tue Feb 21 19:18:40 2012 +0100 +++ b/src/org/tmatesoft/hg/core/HgCallbackTargetException.java Wed Feb 22 03:10:55 2012 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 TMate Software Ltd + * Copyright (c) 2011-2012 TMate Software Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,6 +29,7 @@ * {@link RuntimeException} subclass, {@link Wrap}. Then, unwrap and re-throw with checked {@link HgCallbackTargetException}. * * FIXME REVISIT perhaps, shall just throw HgCallbackTargetException from any handler, and do not catch anything in commands at all? + * FIXME decide whether shall root at HgException ("throws HgException, HgCallbackTargetException" looks a bit odd now) * * @author Artem Tikhomirov * @author TMate Software Ltd. diff -r 728708de3597 -r f52ca9530774 src/org/tmatesoft/hg/core/HgException.java --- a/src/org/tmatesoft/hg/core/HgException.java Tue Feb 21 19:18:40 2012 +0100 +++ b/src/org/tmatesoft/hg/core/HgException.java Wed Feb 22 03:10:55 2012 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 TMate Software Ltd + * Copyright (c) 2011-2012 TMate Software Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -101,7 +101,7 @@ protected void appendDetails(StringBuilder sb) { if (filename != null) { - sb.append("file:'"); + sb.append("path:'"); sb.append(filename); sb.append('\''); sb.append(';'); diff -r 728708de3597 -r f52ca9530774 src/org/tmatesoft/hg/core/HgInvalidControlFileException.java --- a/src/org/tmatesoft/hg/core/HgInvalidControlFileException.java Tue Feb 21 19:18:40 2012 +0100 +++ b/src/org/tmatesoft/hg/core/HgInvalidControlFileException.java Wed Feb 22 03:10:55 2012 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 TMate Software Ltd + * Copyright (c) 2011-2012 TMate Software Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,7 +29,7 @@ * @author TMate Software Ltd. */ @SuppressWarnings("serial") -@Experimental(reason="WORK IN PROGRESS. Name is likely to change. Path argument to be added?") +@Experimental(reason="WORK IN PROGRESS. Name is likely to change") public class HgInvalidControlFileException extends HgInvalidFileException { public HgInvalidControlFileException(String message, Throwable th, File file) { @@ -47,4 +47,10 @@ super.setRevision(r); return this; } + + @Override + public HgException setRevisionIndex(int rev) { + super.setRevisionIndex(rev); + return this; + } } diff -r 728708de3597 -r f52ca9530774 src/org/tmatesoft/hg/core/HgInvalidFileException.java --- a/src/org/tmatesoft/hg/core/HgInvalidFileException.java Tue Feb 21 19:18:40 2012 +0100 +++ b/src/org/tmatesoft/hg/core/HgInvalidFileException.java Wed Feb 22 03:10:55 2012 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 TMate Software Ltd + * Copyright (c) 2011-2012 TMate Software Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -44,11 +44,11 @@ public HgInvalidFileException(String message, Throwable th, File file) { super(message, th); - localFile = file; + localFile = file; // allows null } public HgInvalidFileException setFile(File file) { - assert file != null; + assert file != null; // doesn't allow null not to clear file accidentally localFile = file; return this; } diff -r 728708de3597 -r f52ca9530774 src/org/tmatesoft/hg/internal/RevlogDump.java --- a/src/org/tmatesoft/hg/internal/RevlogDump.java Tue Feb 21 19:18:40 2012 +0100 +++ b/src/org/tmatesoft/hg/internal/RevlogDump.java Wed Feb 22 03:10:55 2012 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2011 TMate Software Ltd + * Copyright (c) 2010-2012 TMate Software Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -r 728708de3597 -r f52ca9530774 src/org/tmatesoft/hg/repo/Revlog.java --- a/src/org/tmatesoft/hg/repo/Revlog.java Tue Feb 21 19:18:40 2012 +0100 +++ b/src/org/tmatesoft/hg/repo/Revlog.java Wed Feb 22 03:10:55 2012 +0100 @@ -177,25 +177,54 @@ } /** - * Access to revision data as is (decompressed, but otherwise unprocessed, i.e. not parsed for e.g. changeset or manifest entries) - * @param nodeid + * Access to revision data as is, equivalent to rawContent(getRevisionIndex(nodeid), sink) + * + * @param nodeid revision to retrieve + * @param sink data destination + * + * @throws HgInvalidRevisionException if supplied argument doesn't represent revision index in this revlog + * @throws HgInvalidControlFileException if access to revlog index/data entry failed + * @throws CancelledException if content retrieval operation was cancelled + * + * @see #rawContent(int, ByteChannel) */ - protected void rawContent(Nodeid nodeid, ByteChannel sink) throws HgException, IOException, CancelledException, HgInvalidRevisionException { + protected void rawContent(Nodeid nodeid, ByteChannel sink) throws HgInvalidControlFileException, CancelledException, HgInvalidRevisionException { rawContent(getRevisionIndex(nodeid), sink); } /** - * @param fileRevisionIndex - index of this file change (not a changelog revision index), non-negative. From predefined constants, only {@link HgRepository#TIP} makes sense. - * FIXME is it necessary to have IOException along with HgException here? + * Access to revision data as is (decompressed, but otherwise unprocessed, i.e. not parsed for e.g. changeset or manifest entries). + * + * @param fileRevisionIndex index of this revlog change (not a changelog revision index), non-negative. From predefined constants, only {@link HgRepository#TIP} makes sense. + * @param sink data destination + * + * @throws HgInvalidRevisionException if supplied argument doesn't represent revision index in this revlog + * @throws HgInvalidControlFileException if access to revlog index/data entry failed + * @throws CancelledException if content retrieval operation was cancelled */ - protected void rawContent(int fileRevisionIndex, ByteChannel sink) throws HgException, IOException, CancelledException, HgInvalidRevisionException { + protected void rawContent(int fileRevisionIndex, ByteChannel sink) throws HgInvalidControlFileException, CancelledException, HgInvalidRevisionException { if (sink == null) { throw new IllegalArgumentException(); } - ContentPipe insp = new ContentPipe(sink, 0, repo.getContext().getLog()); - insp.checkCancelled(); - content.iterate(fileRevisionIndex, fileRevisionIndex, true, insp); - insp.checkFailed(); + try { + ContentPipe insp = new ContentPipe(sink, 0, repo.getContext().getLog()); + insp.checkCancelled(); + content.iterate(fileRevisionIndex, fileRevisionIndex, true, insp); + insp.checkFailed(); + } catch (IOException ex) { + HgInvalidControlFileException e = new HgInvalidControlFileException(String.format("Access to revision %d content failed", fileRevisionIndex), ex, null); + e.setRevisionIndex(fileRevisionIndex); + // FIXME e.setFileName(content.getIndexFile() or this.getHumanFriendlyPath()) - shall decide whether + // protected abstract getPath() with impl in HgDataFile, HgManifest and HgChangelog or path is data of either Revlog or RevlogStream + // Do the same (add file name) below + throw e; + } catch (HgInvalidControlFileException ex) { + throw ex; + } catch (HgException ex) { + HgInvalidControlFileException e = new HgInvalidControlFileException(ex.getClass().getSimpleName(), ex, null); + e.setRevisionIndex(fileRevisionIndex); + throw e; + } } /** @@ -585,6 +614,7 @@ failure = ex; } + // TODO consider if IOException in addition to HgException is of any real utility public void checkFailed() throws HgException, IOException, CancelledException { if (failure == null) { return;