comparison src/org/tmatesoft/hg/repo/HgChangelog.java @ 363:d9dfa9fe9cec

Decode escape sequences in changeset extras field
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Fri, 09 Dec 2011 02:08:09 +0100
parents 150500515714
children 3572fcb06473
comparison
equal deleted inserted replaced
362:4937e35b805b 363:d9dfa9fe9cec
278 } 278 }
279 int space2 = _timeString.indexOf(' ', space1 + 1); 279 int space2 = _timeString.indexOf(' ', space1 + 1);
280 if (space2 == -1) { 280 if (space2 == -1) {
281 space2 = _timeString.length(); 281 space2 = _timeString.length();
282 } 282 }
283 long unixTime = Long.parseLong(_timeString.substring(0, space1)); // XXX Float, perhaps 283 long unixTime = Long.parseLong(_timeString.substring(0, space1));
284 int _timezone = Integer.parseInt(_timeString.substring(space1 + 1, space2)); 284 int _timezone = Integer.parseInt(_timeString.substring(space1 + 1, space2));
285 // XXX not sure need to add timezone here - I can't figure out whether Hg keeps GMT time, and records timezone just for info, or unixTime is taken local 285 // unixTime is local time, and timezone records difference of the local time to UTC.
286 // on commit and timezone is recorded to adjust it to UTC.
287 Date _time = new Date(unixTime * 1000); 286 Date _time = new Date(unixTime * 1000);
288 String _extras = space2 < _timeString.length() ? _timeString.substring(space2 + 1) : null; 287 String _extras = space2 < _timeString.length() ? _timeString.substring(space2 + 1) : null;
289 Map<String, String> _extrasMap; 288 Map<String, String> _extrasMap;
290 final String extras_branch_key = "branch"; 289 final String extras_branch_key = "branch";
291 if (_extras == null) { 290 if (_extras == null) {
292 _extrasMap = Collections.singletonMap(extras_branch_key, HgRepository.DEFAULT_BRANCH_NAME); 291 _extrasMap = Collections.singletonMap(extras_branch_key, HgRepository.DEFAULT_BRANCH_NAME);
293 } else { 292 } else {
294 _extrasMap = new HashMap<String, String>(); 293 _extrasMap = new HashMap<String, String>();
295 for (String pair : _extras.split("\00")) { 294 for (String pair : _extras.split("\00")) {
295 pair = decode(pair);
296 int eq = pair.indexOf(':'); 296 int eq = pair.indexOf(':');
297 // FIXME need to decode key/value, @see changelog.py:decodeextra
298 _extrasMap.put(pair.substring(0, eq), pair.substring(eq + 1)); 297 _extrasMap.put(pair.substring(0, eq), pair.substring(eq + 1));
299 } 298 }
300 if (!_extrasMap.containsKey(extras_branch_key)) { 299 if (!_extrasMap.containsKey(extras_branch_key)) {
301 _extrasMap.put(extras_branch_key, HgRepository.DEFAULT_BRANCH_NAME); 300 _extrasMap.put(extras_branch_key, HgRepository.DEFAULT_BRANCH_NAME);
302 } 301 }
350 return i; 349 return i;
351 } 350 }
352 } 351 }
353 return -1; 352 return -1;
354 } 353 }
354
355 private static String decode(String s) {
356 if (s != null && s.indexOf('\\') != -1) {
357 // TestAuxUtilities#testChangelogExtrasDecode
358 return s.replace("\\\\", "\\").replace("\\n", "\n").replace("\\r", "\r").replace("\\0", "\00");
359 }
360 return s;
361 }
355 } 362 }
356 363
357 private static class RawCsetCollector implements Inspector { 364 private static class RawCsetCollector implements Inspector {
358 final ArrayList<RawChangeset> result; 365 final ArrayList<RawChangeset> result;
359 366