Mercurial > hg4j
comparison src/org/tmatesoft/hg/repo/Revlog.java @ 693:32b0d19e8aba
Fix file.isCopy() use for Log/History command. File revisions originating from another file list no parents even in the middle of revision chain
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Mon, 05 Aug 2013 12:45:36 +0200 |
| parents | 6526d8adbc0f |
| children | 7efabe0cddcf |
comparison
equal
deleted
inserted
replaced
| 692:e970b333f284 | 693:32b0d19e8aba |
|---|---|
| 365 revisionInsp.next(revisionIndex, nid, linkRevIndex); | 365 revisionInsp.next(revisionIndex, nid, linkRevIndex); |
| 366 } | 366 } |
| 367 if (parentInsp != null) { | 367 if (parentInsp != null) { |
| 368 allRevisions[i] = nid; | 368 allRevisions[i] = nid; |
| 369 if (_start > 0) { | 369 if (_start > 0) { |
| 370 // there are chances we don't know parents here, | |
| 371 // postpone parent dispatching for later, now just collect what's missing | |
| 370 firstParentIndexes[i] = parent1RevIndex; | 372 firstParentIndexes[i] = parent1RevIndex; |
| 371 secondParentIndexes[i] = parent2RevIndex; | 373 secondParentIndexes[i] = parent2RevIndex; |
| 372 if (parent1RevIndex < _start && parent1RevIndex >= 0) { | 374 if (parent1RevIndex < _start && parent1RevIndex >= 0) { |
| 373 missingParents.put(parent1RevIndex, null); | 375 missingParents.put(parent1RevIndex, null); |
| 374 } | 376 } |
| 375 if (parent2RevIndex < _start && parent2RevIndex >= 0) { | 377 if (parent2RevIndex < _start && parent2RevIndex >= 0) { |
| 376 missingParents.put(parent2RevIndex, null); | 378 missingParents.put(parent2RevIndex, null); |
| 377 } | 379 } |
| 378 } else { | 380 } else { |
| 381 // we iterate from the very beginning, got every index we'll need | |
| 379 Nodeid p1 = parent1RevIndex == -1 ? Nodeid.NULL : allRevisions[parent1RevIndex]; | 382 Nodeid p1 = parent1RevIndex == -1 ? Nodeid.NULL : allRevisions[parent1RevIndex]; |
| 380 Nodeid p2 = parent2RevIndex == -1 ? Nodeid.NULL : allRevisions[parent2RevIndex]; | 383 Nodeid p2 = parent2RevIndex == -1 ? Nodeid.NULL : allRevisions[parent2RevIndex]; |
| 381 parentInsp.next(revisionIndex, allRevisions[i], parent1RevIndex, parent2RevIndex, p1, p2); | 384 parentInsp.next(revisionIndex, allRevisions[i], parent1RevIndex, parent2RevIndex, p1, p2); |
| 382 } | 385 } |
| 383 i++; | 386 i++; |
| 384 } | 387 } |
| 385 } | 388 } |
| 386 }); | 389 }); |
| 387 if (parentInsp != null && _start > 0) { | 390 if (parentInsp != null && _start > 0 ) { |
| 388 assert missingParents.size() > 0; // in fact, more relaxed than assert. rather 'assume' | 391 if (missingParents.size() > 0) { |
| 389 // TODO [post-1.1] int[] IntMap#keys() or even sort of iterator that can modify values | 392 // it's possible to get empty missingParents when _start > 0 e.g. when n-th file revision |
| 390 for (int k = missingParents.firstKey(), l = missingParents.lastKey(); k <= l; k++) { | 393 // is a copy of another file and hence got -1,-1 parents in this revlog, and we indexWalk(n,n) |
| 391 if (missingParents.containsKey(k)) { | 394 for (int k = missingParents.firstKey(), l = missingParents.lastKey(); k <= l; k++) { |
| 392 Nodeid nid = getRepo().getChangelog().getRevision(k); | 395 // TODO [post-1.1] int[] IntMap#keys() or even sort of iterator that can modify values |
| 393 missingParents.put(k, nid); | 396 if (missingParents.containsKey(k)) { |
| 397 Nodeid nid = getRepo().getChangelog().getRevision(k); | |
| 398 missingParents.put(k, nid); | |
| 399 } | |
| 394 } | 400 } |
| 395 } | 401 } |
| 396 | 402 |
| 397 for (int i = 0, revNum = _start; i < allRevisions.length; i++, revNum++) { | 403 for (int i = 0, revNum = _start; i < allRevisions.length; i++, revNum++) { |
| 398 int riP1 = firstParentIndexes[i]; | 404 int riP1 = firstParentIndexes[i]; |
| 404 // (don't check for riP1<end as I assume parents come prior to children in the changelog) | 410 // (don't check for riP1<end as I assume parents come prior to children in the changelog) |
| 405 p1 = allRevisions[riP1 - start]; | 411 p1 = allRevisions[riP1 - start]; |
| 406 } else if (riP1 != -1) { | 412 } else if (riP1 != -1) { |
| 407 assert riP1 >=0 && riP1 < _start; | 413 assert riP1 >=0 && riP1 < _start; |
| 408 p1 = missingParents.get(riP1); | 414 p1 = missingParents.get(riP1); |
| 415 assert p1 != null; | |
| 409 } | 416 } |
| 410 // same for Pp2 | 417 // same for Pp2 |
| 411 if (riP2 >= _start) { | 418 if (riP2 >= _start) { |
| 412 p2 = allRevisions[riP2 - start]; | 419 p2 = allRevisions[riP2 - start]; |
| 413 } else if (riP2 != -1) { | 420 } else if (riP2 != -1) { |
| 414 assert riP2 >= 0 && riP2 < _start; | 421 assert riP2 >= 0 && riP2 < _start; |
| 415 p2 = missingParents.get(riP2); | 422 p2 = missingParents.get(riP2); |
| 423 assert p2 != null; | |
| 416 } | 424 } |
| 417 parentInsp.next(revNum, allRevisions[i], riP1, riP2, p1, p2); | 425 parentInsp.next(revNum, allRevisions[i], riP1, riP2, p1, p2); |
| 418 } | 426 } |
| 419 } | 427 } |
| 420 } | 428 } |
