package com.googlesource.gerrit.plugins.its.base.util;

import com.google.gerrit.reviewdb.client.Project.NameKey;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.Inject;
import java.io.IOException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CommitMessageFetcher {
  private static final Logger log = LoggerFactory.getLogger(CommitMessageFetcher.class);

  private final GitRepositoryManager repoManager;

  @Inject
  CommitMessageFetcher(GitRepositoryManager repoManager) {
    this.repoManager = repoManager;
  }

  public String fetch(String projectName, String commitId) throws IOException {
    try (Repository repo = repoManager.openRepository(new NameKey(projectName))) {
      try (RevWalk revWalk = new RevWalk(repo)) {
        RevCommit commit = revWalk.parseCommit(ObjectId.fromString(commitId));
        return commit.getFullMessage();
      }
    }
  }

  public String fetchGuarded(String projectName, String commitId) {
    String ret = "";
    try {
      ret = fetch(projectName, commitId);
    } catch (IOException e) {
      log.error(
          "Could not fetch commit message for commit " + commitId + " of project " + projectName,
          e);
    }
    return ret;
  }
}
