org.obiba.git.command.CommitLogCommand.java Source code

Java tutorial

Introduction

Here is the source code for org.obiba.git.command.CommitLogCommand.java

Source

/*
 * Copyright (c) 2013 OBiBa. All rights reserved.
 *
 * This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.obiba.git.command;

import java.io.File;
import java.io.IOException;

import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;

import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.obiba.git.CommitInfo;
import org.obiba.git.GitException;
import org.obiba.git.GitUtils;

/**
 * Opal GIT command used to extract the log of a repository path for a specific commit.
 */
public class CommitLogCommand extends AbstractGitCommand<CommitInfo> {

    private final String path;

    private final String commitId;

    private CommitLogCommand(@NotNull File repositoryPath, @Nullable File workPath, @NotNull String path,
            @NotNull String commitId) {
        super(repositoryPath, workPath);
        this.path = path;
        this.commitId = commitId;
    }

    @Override
    public CommitInfo execute(Git git) {
        Repository repository = git.getRepository();
        RevWalk walk = new RevWalk(repository);
        try {
            RevCommit commit = walk.parseCommit(ObjectId.fromString(commitId));
            if (TreeWalk.forPath(repository, path, commit.getTree()) != null) {
                // There is indeed the path in this commit
                PersonIdent personIdent = commit.getAuthorIdent();
                return new CommitInfo.Builder().authorName(personIdent.getName()) //
                        .authorEmail(personIdent.getEmailAddress()) //
                        .date(personIdent.getWhen()) //
                        .comment(commit.getFullMessage()) //
                        .commitId(commit.getName()) //
                        .head(GitUtils.isHead(repository, commitId)).build();
            }
        } catch (IOException e) {
            throw new GitException(e);
        }
        throw new GitException(String.format("Path '%s' was not found in commit '%s'", path, commitId));
    }

    public static class Builder {

        private final CommitLogCommand command;

        public Builder(@NotNull File repositoryPath, @NotNull String path, @NotNull String commitId) {
            this(repositoryPath, null, path, commitId);
        }

        public Builder(@NotNull File repositoryPath, @Nullable File workPath, @NotNull String path,
                @NotNull String commitId) {
            command = new CommitLogCommand(repositoryPath, workPath, path, commitId);
        }

        public CommitLogCommand build() {
            return command;
        }

    }

}