Mercurial > jhg
comparison src/org/tmatesoft/hg/core/HgLogCommand.java @ 403:2747b0723867
FIXMEs: work on exceptions and javadoc
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Mon, 05 Mar 2012 14:50:51 +0100 |
parents | 1fcc7f7b6d65 |
children | ee8264d80747 |
comparison
equal
deleted
inserted
replaced
402:1fcc7f7b6d65 | 403:2747b0723867 |
---|---|
511 } | 511 } |
512 return children; | 512 return children; |
513 } | 513 } |
514 | 514 |
515 void populate(HgChangeset cs) { | 515 void populate(HgChangeset cs) { |
516 cachedChangesets.put(cs.getRevision(), cs); | 516 cachedChangesets.put(cs.getRevisionIndex(), cs); |
517 } | 517 } |
518 | 518 |
519 private HgChangeset[] get(int... changelogRevisionNumber) throws HgInvalidControlFileException { | 519 private HgChangeset[] get(int... changelogRevisionIndex) throws HgException { |
520 HgChangeset[] rv = new HgChangeset[changelogRevisionNumber.length]; | 520 HgChangeset[] rv = new HgChangeset[changelogRevisionIndex.length]; |
521 IntVector misses = new IntVector(changelogRevisionNumber.length, -1); | 521 IntVector misses = new IntVector(changelogRevisionIndex.length, -1); |
522 for (int i = 0; i < changelogRevisionNumber.length; i++) { | 522 for (int i = 0; i < changelogRevisionIndex.length; i++) { |
523 if (changelogRevisionNumber[i] == -1) { | 523 if (changelogRevisionIndex[i] == -1) { |
524 rv[i] = null; | 524 rv[i] = null; |
525 continue; | 525 continue; |
526 } | 526 } |
527 HgChangeset cached = cachedChangesets.get(changelogRevisionNumber[i]); | 527 HgChangeset cached = cachedChangesets.get(changelogRevisionIndex[i]); |
528 if (cached != null) { | 528 if (cached != null) { |
529 rv[i] = cached; | 529 rv[i] = cached; |
530 } else { | 530 } else { |
531 misses.add(changelogRevisionNumber[i]); | 531 misses.add(changelogRevisionIndex[i]); |
532 } | 532 } |
533 } | 533 } |
534 if (misses.size() > 0) { | 534 if (misses.size() > 0) { |
535 final int[] changesets2read = misses.toArray(); | 535 final int[] changesets2read = misses.toArray(); |
536 initTransform(); | 536 initTransform(); |
537 repo.getChangelog().range(this, changesets2read); | 537 repo.getChangelog().range(this, changesets2read); |
538 for (int changeset2read : changesets2read) { | 538 for (int changeset2read : changesets2read) { |
539 HgChangeset cs = cachedChangesets.get(changeset2read); | 539 HgChangeset cs = cachedChangesets.get(changeset2read); |
540 if (cs == null) { | 540 if (cs == null) { |
541 throw new HgBadStateException(); | 541 throw new HgException(String.format("Can't get changeset for revision %d", changeset2read)); |
542 } | |
543 // HgChangelog.range may reorder changesets according to their order in the changelog | |
544 // thus need to find original index | |
545 boolean sanity = false; | |
546 for (int i = 0; i < changelogRevisionIndex.length; i++) { | |
547 if (changelogRevisionIndex[i] == cs.getRevisionIndex()) { | |
548 rv[i] = cs; | |
549 sanity = true; | |
550 break; | |
542 } | 551 } |
543 // HgChangelog.range may reorder changesets according to their order in the changelog | 552 } |
544 // thus need to find original index | 553 if (!sanity) { |
545 boolean sanity = false; | 554 HgInternals.getContext(repo).getLog().error(getClass(), "Index of revision %d:%s doesn't match any of requested", cs.getRevisionIndex(), cs.getNodeid().shortNotation()); |
546 for (int i = 0; i < changelogRevisionNumber.length; i++) { | 555 } |
547 if (changelogRevisionNumber[i] == cs.getRevision()) { | 556 assert sanity; |
548 rv[i] = cs; | |
549 sanity = true; | |
550 break; | |
551 } | |
552 } | |
553 assert sanity; | |
554 } | 557 } |
555 } | 558 } |
556 return rv; | 559 return rv; |
557 } | 560 } |
558 | 561 |
566 public void next(int revisionNumber, Nodeid nodeid, RawChangeset cset) { | 569 public void next(int revisionNumber, Nodeid nodeid, RawChangeset cset) { |
567 HgChangeset cs = transform.handle(revisionNumber, nodeid, cset); | 570 HgChangeset cs = transform.handle(revisionNumber, nodeid, cset); |
568 populate(cs.clone()); | 571 populate(cs.clone()); |
569 } | 572 } |
570 | 573 |
571 public Nodeid changesetRevision() { | 574 public Nodeid changesetRevision() throws HgException { |
572 if (changesetRevision == null) { | 575 if (changesetRevision == null) { |
573 changesetRevision = getRevision(historyNode.changeset); | 576 changesetRevision = getRevision(historyNode.changeset); |
574 } | 577 } |
575 return changesetRevision; | 578 return changesetRevision; |
576 } | 579 } |
577 | 580 |
578 public Pair<Nodeid, Nodeid> parentRevisions() { | 581 public Pair<Nodeid, Nodeid> parentRevisions() throws HgException { |
579 if (parentRevisions == null) { | 582 if (parentRevisions == null) { |
580 HistoryNode p; | 583 HistoryNode p; |
581 final Nodeid p1, p2; | 584 final Nodeid p1, p2; |
582 if ((p = historyNode.parent1) != null) { | 585 if ((p = historyNode.parent1) != null) { |
583 p1 = getRevision(p.changeset); | 586 p1 = getRevision(p.changeset); |
592 parentRevisions = new Pair<Nodeid, Nodeid>(p1, p2); | 595 parentRevisions = new Pair<Nodeid, Nodeid>(p1, p2); |
593 } | 596 } |
594 return parentRevisions; | 597 return parentRevisions; |
595 } | 598 } |
596 | 599 |
597 public Collection<Nodeid> childRevisions() { | 600 public Collection<Nodeid> childRevisions() throws HgException { |
598 if (childRevisions != null) { | 601 if (childRevisions != null) { |
599 return childRevisions; | 602 return childRevisions; |
600 } | 603 } |
601 if (historyNode.children == null) { | 604 if (historyNode.children == null) { |
602 childRevisions = Collections.emptyList(); | 605 childRevisions = Collections.emptyList(); |
609 } | 612 } |
610 return childRevisions; | 613 return childRevisions; |
611 } | 614 } |
612 | 615 |
613 // reading nodeid involves reading index only, guess, can afford not to optimize multiple reads | 616 // reading nodeid involves reading index only, guess, can afford not to optimize multiple reads |
614 private Nodeid getRevision(int changelogRevisionNumber) { | 617 private Nodeid getRevision(int changelogRevisionNumber) throws HgInvalidControlFileException { |
615 // XXX pipe through pool | 618 // TODO [post-1.0] pipe through pool |
616 HgChangeset cs = cachedChangesets.get(changelogRevisionNumber); | 619 HgChangeset cs = cachedChangesets.get(changelogRevisionNumber); |
617 if (cs != null) { | 620 if (cs != null) { |
618 return cs.getNodeid(); | 621 return cs.getNodeid(); |
619 } else { | 622 } else { |
620 try { | 623 return repo.getChangelog().getRevision(changelogRevisionNumber); |
621 return repo.getChangelog().getRevision(changelogRevisionNumber); | |
622 } catch (HgException ex) { | |
623 HgInternals.getContext(repo).getLog().error(getClass(), ex, null); | |
624 // FIXME propagate, perhaps? | |
625 return Nodeid.NULL; // FIXME this is quick-n-dirty hack to move forward with introducing exceptions | |
626 } | |
627 } | 624 } |
628 } | 625 } |
629 } | 626 } |
630 } | 627 } |