Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgChangelog.java @ 656:a937e63b6e02
Performance: rebuild information about branches takes too long (my improvement: 3 times, 11-15 s to less than 4 sec)
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Thu, 04 Jul 2013 18:40:03 +0200 |
| parents | 6526d8adbc0f |
| children | fba85bc1dfb8 |
comparison
equal
deleted
inserted
replaced
| 655:bcbcc318f250 | 656:a937e63b6e02 |
|---|---|
| 303 long unixTime = Long.parseLong(_timeString.substring(0, space1)); | 303 long unixTime = Long.parseLong(_timeString.substring(0, space1)); |
| 304 int _timezone = Integer.parseInt(_timeString.substring(space1 + 1, space2)); | 304 int _timezone = Integer.parseInt(_timeString.substring(space1 + 1, space2)); |
| 305 // unixTime is local time, and timezone records difference of the local time to UTC. | 305 // unixTime is local time, and timezone records difference of the local time to UTC. |
| 306 Date _time = new Date(unixTime * 1000); | 306 Date _time = new Date(unixTime * 1000); |
| 307 String _extras = space2 < _timeString.length() ? _timeString.substring(space2 + 1) : null; | 307 String _extras = space2 < _timeString.length() ? _timeString.substring(space2 + 1) : null; |
| 308 Map<String, String> _extrasMap; | 308 Map<String, String> _extrasMap = parseExtras(_extras); |
| 309 final String extras_branch_key = "branch"; | |
| 310 if (_extras == null || _extras.trim().length() == 0) { | |
| 311 _extrasMap = Collections.singletonMap(extras_branch_key, HgRepository.DEFAULT_BRANCH_NAME); | |
| 312 } else { | |
| 313 _extrasMap = new HashMap<String, String>(); | |
| 314 for (String pair : _extras.split("\00")) { | |
| 315 pair = decode(pair); | |
| 316 int eq = pair.indexOf(':'); | |
| 317 _extrasMap.put(pair.substring(0, eq), pair.substring(eq + 1)); | |
| 318 } | |
| 319 if (!_extrasMap.containsKey(extras_branch_key)) { | |
| 320 _extrasMap.put(extras_branch_key, HgRepository.DEFAULT_BRANCH_NAME); | |
| 321 } | |
| 322 _extrasMap = Collections.unmodifiableMap(_extrasMap); | |
| 323 } | |
| 324 | |
| 325 // | 309 // |
| 326 int lastStart = breakIndex3 + 1; | 310 int lastStart = breakIndex3 + 1; |
| 327 int breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex); | 311 int breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex); |
| 328 ArrayList<String> _files = null; | 312 ArrayList<String> _files = null; |
| 329 if (breakIndex4 > lastStart) { | 313 if (breakIndex4 > lastStart) { |
| 330 // if breakIndex4 == lastStart, we already found \n\n and hence there are no files (e.g. merge revision) | 314 // if breakIndex4 == lastStart, we already found \n\n and hence there are no files (e.g. merge revision) |
| 331 _files = new ArrayList<String>(5); | 315 _files = new ArrayList<String>(5); |
| 316 // TODO pool file names | |
| 317 // TODO encoding of filenames? | |
| 332 while (breakIndex4 != -1 && breakIndex4 + 1 < bufferEndIndex) { | 318 while (breakIndex4 != -1 && breakIndex4 + 1 < bufferEndIndex) { |
| 333 _files.add(new String(data, lastStart, breakIndex4 - lastStart)); | 319 _files.add(new String(data, lastStart, breakIndex4 - lastStart)); |
| 334 lastStart = breakIndex4 + 1; | 320 lastStart = breakIndex4 + 1; |
| 335 if (data[breakIndex4 + 1] == lineBreak) { | 321 if (data[breakIndex4 + 1] == lineBreak) { |
| 336 // found \n\n | 322 // found \n\n |
| 360 this.time = _time; | 346 this.time = _time; |
| 361 this.timezone = _timezone; | 347 this.timezone = _timezone; |
| 362 this.files = _files == null ? Collections.<String> emptyList() : Collections.unmodifiableList(_files); | 348 this.files = _files == null ? Collections.<String> emptyList() : Collections.unmodifiableList(_files); |
| 363 this.comment = _comment; | 349 this.comment = _comment; |
| 364 this.extras = _extrasMap; | 350 this.extras = _extrasMap; |
| 351 } | |
| 352 | |
| 353 private Map<String, String> parseExtras(String _extras) { | |
| 354 final String extras_branch_key = "branch"; | |
| 355 _extras = _extras == null ? null : _extras.trim(); | |
| 356 if (_extras == null || _extras.length() == 0) { | |
| 357 return Collections.singletonMap(extras_branch_key, HgRepository.DEFAULT_BRANCH_NAME); | |
| 358 } | |
| 359 Map<String, String> _extrasMap = new HashMap<String, String>(); | |
| 360 int lastIndex = 0; | |
| 361 do { | |
| 362 String pair; | |
| 363 int sp = _extras.indexOf('\0', lastIndex); | |
| 364 if (sp == -1) { | |
| 365 sp = _extras.length(); | |
| 366 } | |
| 367 if (sp > lastIndex) { | |
| 368 pair = _extras.substring(lastIndex, sp); | |
| 369 pair = decode(pair); | |
| 370 int eq = pair.indexOf(':'); | |
| 371 _extrasMap.put(pair.substring(0, eq), pair.substring(eq + 1)); | |
| 372 lastIndex = sp + 1; | |
| 373 } | |
| 374 } while (lastIndex < _extras.length()); | |
| 375 if (!_extrasMap.containsKey(extras_branch_key)) { | |
| 376 _extrasMap.put(extras_branch_key, HgRepository.DEFAULT_BRANCH_NAME); | |
| 377 } | |
| 378 return Collections.unmodifiableMap(_extrasMap); | |
| 365 } | 379 } |
| 366 | 380 |
| 367 private static int indexOf(byte[] src, byte what, int startOffset, int endIndex) { | 381 private static int indexOf(byte[] src, byte what, int startOffset, int endIndex) { |
| 368 for (int i = startOffset; i < endIndex; i++) { | 382 for (int i = startOffset; i < endIndex; i++) { |
| 369 if (src[i] == what) { | 383 if (src[i] == what) { |
