Mercurial > hg4j
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 |