/*
* Copyright (c) 2016 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.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.diff.DiffEntry;
import org.eclipse.jgit.diff.DiffFormatter;
import org.eclipse.jgit.diff.RawTextComparator;
import org.obiba.git.GitException;
/**
* Opal GIT command used to extract the diff between two commits. By default, the diff is between the given commit and
* its parent. By providing a valid 'nthCommit' value, the command will extract the appropriate diff from the repo.
*/
public class DiffAsStringCommand extends AbstractGitCommand<Iterable<String>> {
private String path;
private final String commitId;
private String previousCommitId;
private int nthCommit = 1;
protected DiffAsStringCommand(@NotNull File repositoryPath, @Nullable File workPath, String commitId) {
super(repositoryPath, workPath);
this.commitId = commitId;
}
@Override
public Iterable<String> execute(Git git) {
try {
try(ByteArrayOutputStream out = new ByteArrayOutputStream()) {
DiffFormatter formatter = new DiffFormatter(out);
formatter.setRepository(git.getRepository());
formatter.setDiffComparator(RawTextComparator.DEFAULT);
formatter.setDetectRenames(true);
DiffCommand diffCommand = new DiffCommand.Builder(getRepositoryPath(), commitId).path(path)
.previousCommitId(previousCommitId).nthCommit(nthCommit).build();
Collection<String> diffEntries = new ArrayList<>();
for(DiffEntry diffEntry : diffCommand.execute(git)) {
formatter.format(diffEntry);
diffEntry.getOldId();
diffEntries.add(out.toString("UTF-8"));
out.reset();
}
return diffEntries;
}
} catch(IOException e) {
throw new GitException(e);
}
}
@SuppressWarnings("ParameterHidesMemberVariable")
public static class Builder {
private final DiffAsStringCommand command;
public Builder(@NotNull File repositoryPath, String commitId) {
this(repositoryPath, null, commitId);
}
public Builder(@NotNull File repositoryPath, @Nullable File workPath, String commitId) {
command = new DiffAsStringCommand(repositoryPath, workPath, commitId);
}
public Builder path(String path) {
command.path = path;
return this;
}
public Builder previousCommitId(String previousCommitId) {
command.previousCommitId = previousCommitId;
return this;
}
public Builder nthCommit(int nthCommit) {
command.nthCommit = nthCommit;
return this;
}
public DiffAsStringCommand build() {
return command;
}
}
}