@Override
  public PageData getRevisionData(FileSystemPage page, String label) {
    // Workaround for CachingPage
    if (label == null) {
      return persistence.getRevisionData(page, null);
    }
    String content, propertiesXml;
    RevCommit revCommit;
    Repository repository = getRepository(page);

    try {
      String fileSystemPath = getPath(page, repository);
      ObjectId rev = repository.resolve(label);
      RevWalk walk = new RevWalk(repository);
      revCommit = walk.parseCommit(rev);

      content = getRepositoryContent(repository, revCommit, fileSystemPath + "/" + contentFilename);
      propertiesXml =
          getRepositoryContent(repository, revCommit, fileSystemPath + "/" + propertiesFilename);
    } catch (IOException e) {
      throw new RuntimeException("Unable to get data for revision " + label, e);
    }

    final PageData pageData = new PageData(page);
    pageData.setContent(content);
    pageData.setProperties(
        parsePropertiesXml(propertiesXml, revCommit.getAuthorIdent().getWhen().getTime()));
    return pageData;
  }
 @Override
 public WikiPage toWikiPage(WikiPage root) {
   FileSystemPage fsPage = (FileSystemPage) root;
   WikiPage recentChangesPage = InMemoryPage.createChildPage(RECENT_CHANGES, fsPage);
   PageData pageData = recentChangesPage.getData();
   try {
     pageData.setContent(
         convertToWikiText(
             history(
                 fsPage,
                 new LogCommandSpec() {
                   @Override
                   public LogCommand specify(LogCommand log, String fileSystemPath) {
                     return log.setMaxCount(RECENT_CHANGES_DEPTH);
                   }
                 })));
   } catch (GitAPIException e) {
     pageData.setContent("Unable to read history: " + e.getMessage());
   }
   // No properties, no features.
   pageData.setProperties(new WikiPageProperties());
   recentChangesPage.commit(pageData);
   return recentChangesPage;
 }