public Node tipNode(String path, Integer likelyTipNumber, String likelyTipIdentifier) {
    for (int i = likelyTipNumber; i >= 1; i--) {
      if (contentCache.isCached(i)) {
        if (likelyTipNumber.equals(i)) {
          return node(path, likelyTipNumber, likelyTipIdentifier);
        } else {
          HgLogEntry logEntry = hgClient.logForRev(String.valueOf(i));
          return node(path, logEntry.getRevNumber(), logEntry.getIdentifier());
        }
      }
    }

    HgLogEntry entry0 = hgClient.logForRev("0");
    ensureFileCacheSynchedFor(0, entry0.getIdentifier());
    return node(path, 0, entry0.getIdentifier());
  }
  public void ensureFileCacheSynchedFor(Integer changesetNumber, String changesetIdentifier) {
    if (contentCache.isCached(changesetNumber)) {
      return;
    }

    Map<String, String> baseContent;
    if (changesetNumber.equals(0)) {
      baseContent = new HashMap<String, String>();
    } else {
      baseContent = contentCache.readFor(changesetNumber - 1);
    }

    if (changesetIdentifier == null) {
      changesetIdentifier = hgClient.logForRev(String.valueOf(changesetNumber)).getIdentifier();
    }

    contentBuilder.buildContent(changesetIdentifier, baseContent);
    contentCache.writeFor(changesetNumber, baseContent);
  }
 public boolean isCached(Integer revisionNumber) {
   return contentCache.isCached(revisionNumber);
 }