comparison src/org/tmatesoft/hg/repo/Changeset.java @ 87:25f2e5d1cd8b

Fix IAE when changeset has no files listed (merged revision)
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 26 Jan 2011 01:07:26 +0100
parents 6f1b88693d48
children a3a2e5deb320
comparison
equal deleted inserted replaced
86:ee4458416579 87:25f2e5d1cd8b
177 } 177 }
178 178
179 // 179 //
180 int lastStart = breakIndex3 + 1; 180 int lastStart = breakIndex3 + 1;
181 int breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex); 181 int breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex);
182 ArrayList<String> _files = new ArrayList<String>(5); 182 ArrayList<String> _files = null;
183 while (breakIndex4 != -1 && breakIndex4 + 1 < bufferEndIndex) { 183 if (breakIndex4 > lastStart) {
184 _files.add(new String(data, lastStart, breakIndex4 - lastStart)); 184 // if breakIndex4 == lastStart, we already found \n\n and hence there are no files (e.g. merge revision)
185 lastStart = breakIndex4 + 1; 185 _files = new ArrayList<String>(5);
186 if (data[breakIndex4 + 1] == lineBreak) { 186 while (breakIndex4 != -1 && breakIndex4 + 1 < bufferEndIndex) {
187 // found \n\n 187 _files.add(new String(data, lastStart, breakIndex4 - lastStart));
188 break; 188 lastStart = breakIndex4 + 1;
189 } else { 189 if (data[breakIndex4 + 1] == lineBreak) {
190 breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex); 190 // found \n\n
191 } 191 break;
192 } 192 } else {
193 if (breakIndex4 == -1 || breakIndex4 >= bufferEndIndex) { 193 breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex);
194 throw new IllegalArgumentException("Bad Changeset data"); 194 }
195 }
196 if (breakIndex4 == -1 || breakIndex4 >= bufferEndIndex) {
197 throw new IllegalArgumentException("Bad Changeset data");
198 }
199 } else {
200 breakIndex4--;
195 } 201 }
196 String _comment; 202 String _comment;
197 try { 203 try {
198 _comment = new String(data, breakIndex4+2, bufferEndIndex - breakIndex4 - 2, "UTF-8"); 204 _comment = new String(data, breakIndex4+2, bufferEndIndex - breakIndex4 - 2, "UTF-8");
199 } catch (UnsupportedEncodingException ex) { 205 } catch (UnsupportedEncodingException ex) {
203 // change this instance at once, don't leave it partially changes in case of error 209 // change this instance at once, don't leave it partially changes in case of error
204 this.manifest = _nodeid; 210 this.manifest = _nodeid;
205 this.user = _user; 211 this.user = _user;
206 this.time = _time; 212 this.time = _time;
207 this.timezone = _timezone; 213 this.timezone = _timezone;
208 this.files = Collections.unmodifiableList(_files); 214 this.files = _files == null ? Collections.<String>emptyList() : Collections.unmodifiableList(_files);
209 this.comment = _comment; 215 this.comment = _comment;
210 this.extras = _extrasMap; 216 this.extras = _extrasMap;
211 } 217 }
212 218
213 private static int indexOf(byte[] src, byte what, int startOffset, int endIndex) { 219 private static int indexOf(byte[] src, byte what, int startOffset, int endIndex) {