# HG changeset patch # User Artem Tikhomirov # Date 1296000446 -3600 # Node ID 25f2e5d1cd8b3f1f3cbbe22ee4aaedb6f61362ee # Parent ee445841657900f0a1c5f99922b50693652877c4 Fix IAE when changeset has no files listed (merged revision) diff -r ee4458416579 -r 25f2e5d1cd8b .hgignore --- a/.hgignore Wed Jan 26 01:06:37 2011 +0100 +++ b/.hgignore Wed Jan 26 01:07:26 2011 +0100 @@ -3,3 +3,4 @@ src/Extras.java jhg.jar jhg-tests.jar +jhg-cl.jar diff -r ee4458416579 -r 25f2e5d1cd8b src/org/tmatesoft/hg/core/Cset.java --- a/src/org/tmatesoft/hg/core/Cset.java Wed Jan 26 01:06:37 2011 +0100 +++ b/src/org/tmatesoft/hg/core/Cset.java Wed Jan 26 01:07:26 2011 +0100 @@ -85,6 +85,10 @@ } public List getAffectedFiles() { + // reports files as recorded in changelog. Note, merge revisions may have no + // files listed, and thus this method would return empty list, while + // #getModifiedFiles() would return list with merged file(s) (because it uses status to get 'em, not + // what #files() gives). ArrayList rv = new ArrayList(changeset.files().size()); for (String name : changeset.files()) { rv.add(pathHelper.path(name)); diff -r ee4458416579 -r 25f2e5d1cd8b src/org/tmatesoft/hg/repo/Changeset.java --- a/src/org/tmatesoft/hg/repo/Changeset.java Wed Jan 26 01:06:37 2011 +0100 +++ b/src/org/tmatesoft/hg/repo/Changeset.java Wed Jan 26 01:07:26 2011 +0100 @@ -179,19 +179,25 @@ // int lastStart = breakIndex3 + 1; int breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex); - ArrayList _files = new ArrayList(5); - while (breakIndex4 != -1 && breakIndex4 + 1 < bufferEndIndex) { - _files.add(new String(data, lastStart, breakIndex4 - lastStart)); - lastStart = breakIndex4 + 1; - if (data[breakIndex4 + 1] == lineBreak) { - // found \n\n - break; - } else { - breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex); + ArrayList _files = null; + if (breakIndex4 > lastStart) { + // if breakIndex4 == lastStart, we already found \n\n and hence there are no files (e.g. merge revision) + _files = new ArrayList(5); + while (breakIndex4 != -1 && breakIndex4 + 1 < bufferEndIndex) { + _files.add(new String(data, lastStart, breakIndex4 - lastStart)); + lastStart = breakIndex4 + 1; + if (data[breakIndex4 + 1] == lineBreak) { + // found \n\n + break; + } else { + breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex); + } } - } - if (breakIndex4 == -1 || breakIndex4 >= bufferEndIndex) { - throw new IllegalArgumentException("Bad Changeset data"); + if (breakIndex4 == -1 || breakIndex4 >= bufferEndIndex) { + throw new IllegalArgumentException("Bad Changeset data"); + } + } else { + breakIndex4--; } String _comment; try { @@ -205,7 +211,7 @@ this.user = _user; this.time = _time; this.timezone = _timezone; - this.files = Collections.unmodifiableList(_files); + this.files = _files == null ? Collections.emptyList() : Collections.unmodifiableList(_files); this.comment = _comment; this.extras = _extrasMap; }