Mercurial > jhg
comparison src/org/tmatesoft/hg/core/Nodeid.java @ 535:d9c07e1432c4
Issue 42: tolerate lines in .hgtags that do not conform to its format specification
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Tue, 05 Feb 2013 15:54:37 +0100 |
| parents | 465316bf97e8 |
| children | d29d9dc6c128 |
comparison
equal
deleted
inserted
replaced
| 534:243202f1bda5 | 535:d9c07e1432c4 |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010-2011 TMate Software Ltd | 2 * Copyright (c) 2010-2013 TMate Software Ltd |
| 3 * | 3 * |
| 4 * This program is free software; you can redistribute it and/or modify | 4 * This program is free software; you can redistribute it and/or modify |
| 5 * it under the terms of the GNU General Public License as published by | 5 * it under the terms of the GNU General Public License as published by |
| 6 * the Free Software Foundation; version 2 of the License. | 6 * the Free Software Foundation; version 2 of the License. |
| 7 * | 7 * |
| 164 * | 164 * |
| 165 * @param asciiRepresentation - encoded form of the Nodeid. | 165 * @param asciiRepresentation - encoded form of the Nodeid. |
| 166 * @return object representation | 166 * @return object representation |
| 167 * @throws HgBadNodeidFormatException custom {@link IllegalArgumentException} subclass when argument doesn't match encoded form of 20-bytes sha1 digest. | 167 * @throws HgBadNodeidFormatException custom {@link IllegalArgumentException} subclass when argument doesn't match encoded form of 20-bytes sha1 digest. |
| 168 */ | 168 */ |
| 169 public static Nodeid fromAscii(String asciiRepresentation) { | 169 public static Nodeid fromAscii(String asciiRepresentation) throws HgBadNodeidFormatException { |
| 170 if (asciiRepresentation.length() != 40) { | 170 if (asciiRepresentation.length() != 40) { |
| 171 throw new HgBadNodeidFormatException(String.format("Bad value: %s", asciiRepresentation)); | 171 throw new HgBadNodeidFormatException(String.format("Bad value: %s", asciiRepresentation)); |
| 172 } | 172 } |
| 173 // XXX is better impl for String possible? | 173 // XXX is better impl for String possible? |
| 174 return fromAscii(asciiRepresentation.toCharArray(), 0, 40); | 174 return fromAscii(asciiRepresentation.toCharArray(), 0, 40); |
| 176 | 176 |
| 177 /** | 177 /** |
| 178 * Parse encoded representation. Similar to {@link #fromAscii(String)}. | 178 * Parse encoded representation. Similar to {@link #fromAscii(String)}. |
| 179 * @throws HgBadNodeidFormatException custom {@link IllegalArgumentException} subclass when bytes are not hex digits or number of bytes != 40 (160 bits) | 179 * @throws HgBadNodeidFormatException custom {@link IllegalArgumentException} subclass when bytes are not hex digits or number of bytes != 40 (160 bits) |
| 180 */ | 180 */ |
| 181 public static Nodeid fromAscii(byte[] asciiRepresentation, int offset, int length) { | 181 public static Nodeid fromAscii(byte[] asciiRepresentation, int offset, int length) throws HgBadNodeidFormatException { |
| 182 if (length != 40) { | 182 if (length != 40) { |
| 183 throw new IllegalArgumentException(); | 183 throw new HgBadNodeidFormatException(String.format("Expected 40 hex characters for nodeid, not %d", length)); |
| 184 } | 184 } |
| 185 try { | 185 try { |
| 186 byte[] data = new byte[20]; | 186 byte[] data = new byte[20]; |
| 187 boolean zeroBytes = DigestHelper.ascii2bin(asciiRepresentation, offset, length, data); | 187 boolean zeroBytes = DigestHelper.ascii2bin(asciiRepresentation, offset, length, data); |
| 188 if (zeroBytes) { | 188 if (zeroBytes) { |
| 189 return NULL; | 189 return NULL; |
| 190 } | 190 } |
| 191 return new Nodeid(data, false); | 191 return new Nodeid(data, false); |
| 192 } catch (HgBadNodeidFormatException ex) { | |
| 193 throw ex; | |
| 192 } catch (IllegalArgumentException ex) { | 194 } catch (IllegalArgumentException ex) { |
| 193 throw new HgBadNodeidFormatException(ex.getMessage()); | 195 throw new HgBadNodeidFormatException(ex.getMessage()); |
| 194 } | 196 } |
| 195 } | 197 } |
| 196 | 198 |
