/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
* SAP - implementation
*******************************************************************************/
package org.eclipse.che.git.impl.jgit;
import org.eclipse.che.api.git.exception.GitException;
import org.eclipse.che.api.git.InfoPage;
import org.eclipse.che.api.git.shared.Status;
import org.eclipse.che.api.git.shared.StatusFormat;
import org.eclipse.jgit.api.StatusCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import static java.lang.System.lineSeparator;
/**
* Jgit implementation of {@link Status}
*
* @author Igor Vinokur
*/
public class JGitStatusImpl implements Status, InfoPage {
private String branchName;
private StatusFormat format;
private boolean clean;
private List<String> added;
private List<String> changed;
private List<String> removed;
private List<String> missing;
private List<String> modified;
private List<String> untracked;
private List<String> untrackedFolders;
private List<String> conflicting;
private String repositoryState;
/**
* @param branchName
* current repository branch name
* @param statusCommand
* Jgit status command
* @param format
* the output format for the status
* @throws GitException
* when any error occurs
*/
public JGitStatusImpl(String branchName, StatusCommand statusCommand, StatusFormat format) throws GitException {
this.branchName = branchName;
this.format = format;
org.eclipse.jgit.api.Status gitStatus;
try {
gitStatus = statusCommand.call();
} catch (GitAPIException exception) {
throw new GitException(exception.getMessage(), exception);
}
clean = gitStatus.isClean();
added = new ArrayList<>(gitStatus.getAdded());
changed = new ArrayList<>(gitStatus.getChanged());
removed = new ArrayList<>(gitStatus.getRemoved());
missing = new ArrayList<>(gitStatus.getMissing());
modified = new ArrayList<>(gitStatus.getModified());
untracked = new ArrayList<>(gitStatus.getUntracked());
untrackedFolders = new ArrayList<>(gitStatus.getUntrackedFolders());
conflicting = new ArrayList<>(gitStatus.getConflicting());
}
@Override
public void writeTo(OutputStream out) throws IOException {
StringBuilder status = new StringBuilder();
status.append("On branch ").append(branchName).append(lineSeparator());
if (isClean()) {
status.append(lineSeparator()).append("nothing to commit, working directory clean");
} else {
if (!added.isEmpty() || !changed.isEmpty() || !removed.isEmpty()) {
status.append(lineSeparator()).append("Changes to be committed:").append(lineSeparator());
added.forEach(file -> status.append(lineSeparator()).append("\tnew file: ").append(file));
changed.forEach(file -> status.append(lineSeparator()).append("\tmodified: ").append(file));
removed.forEach(file -> status.append(lineSeparator()).append("\tdeleted: ").append(file));
status.append(lineSeparator());
}
if (!untracked.isEmpty() || !modified.isEmpty() || !missing.isEmpty()) {
status.append(lineSeparator()).append("Changes not staged for commit:").append(lineSeparator());
untracked.forEach(file -> status.append(lineSeparator()).append("\tnew file: ").append(file));
modified.forEach(file -> status.append(lineSeparator()).append("\tmodified: ").append(file));
missing.forEach(file -> status.append(lineSeparator()).append("\tdeleted: ").append(file));
status.append(lineSeparator());
}
if (!conflicting.isEmpty()) {
status.append(lineSeparator()).append("Unmerged paths:").append(lineSeparator());
conflicting.forEach(file -> status.append(lineSeparator()).append("\tboth modified: ").append(file));
}
}
out.write(status.toString().getBytes());
}
@Override
public boolean isClean() {
return clean;
}
@Override
public void setClean(boolean clean) {
this.clean = clean;
}
@Override
public StatusFormat getFormat() {
return this.format;
}
@Override
public void setFormat(final StatusFormat format) {
this.format = format;
}
@Override
public String getBranchName() {
return branchName;
}
@Override
public void setBranchName(String branchName) {
this.branchName = branchName;
}
@Override
public List<String> getAdded() {
return added;
}
@Override
public void setAdded(List<String> added) {
this.added = added;
}
@Override
public List<String> getChanged() {
return changed;
}
@Override
public void setChanged(List<String> changed) {
this.changed = changed;
}
@Override
public List<String> getRemoved() {
return removed;
}
@Override
public void setRemoved(List<String> removed) {
this.removed = removed;
}
@Override
public List<String> getMissing() {
return missing;
}
@Override
public void setMissing(List<String> missing) {
this.missing = missing;
}
@Override
public List<String> getModified() {
return modified;
}
@Override
public void setModified(List<String> modified) {
this.modified = modified;
}
@Override
public List<String> getUntracked() {
return untracked;
}
@Override
public void setUntracked(List<String> untracked) {
this.untracked = untracked;
}
@Override
public List<String> getUntrackedFolders() {
return untrackedFolders;
}
@Override
public void setUntrackedFolders(List<String> untrackedFolders) {
this.untrackedFolders = untrackedFolders;
}
@Override
public List<String> getConflicting() {
return conflicting;
}
@Override
public void setConflicting(List<String> conflicting) {
this.conflicting = conflicting;
}
@Override
public String getRepositoryState() {
return this.repositoryState;
}
@Override
public void setRepositoryState(String repositoryState) {
this.repositoryState = repositoryState;
}
}