package org.jmeld.vc.git;
import org.jmeld.util.Result;
import org.jmeld.vc.StatusResult;
import org.jmeld.vc.util.VcCmd;
import java.io.*;
public class StatusCmd extends VcCmd<StatusResult> {
private StatusResult statusResult;
private String reference;
private enum Phase {
state
}
private File file;
private Phase phase;
private File actualfile;
public StatusCmd(File file, String reference) {
this.file = file;
this.reference = reference;
initWorkingDirectory(file);
}
public Result execute() {
phase = Phase.state;
if (phase == Phase.state) {
statusResult = new StatusResult(workingDirectory);
} else {
statusResult = getResultData();
}
File[] files;
if (file.isDirectory()) {
files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return !(pathname.isDirectory() && pathname.getName().equals(".git"));
}
});
} else {
files = new File[]{file};
}
for(File file:files) {
actualfile = file;
processFile();
}
return getResult();
}
private Result processFile() {
return _execute("git", "diff", getReferencePoint(), "--name-status", actualfile.getAbsolutePath());
}
private String getReferencePoint() {
if ("index".equals(reference)) {
return "--cached";
} else if ("worktree".equals(reference)) {
return "";
} else {
return reference;
}
}
/*
Format:
<S><tab>file
<S>:
Added (A)
Copied (C)
Deleted (D)
Modified (M)
Renamed (R)
Changed (T)
Unmerged (U)
Unknown (X)
Broken (B)
*/
protected void build(byte[] data) {
BufferedReader reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data)));
try {
boolean changes = false;
String text;
while ((text = reader.readLine()) != null) {
changes = true;
if (phase == Phase.state) {
StatusResult.Status status;
if (text.isEmpty()) {
status = StatusResult.Status.unmodified;
statusResult.addEntry(actualfile.getName(), status);
} else {
char statusChar = text.charAt(0);
switch (statusChar) {
case 'M':
status = StatusResult.Status.modified;
break;
case 'A':
status = StatusResult.Status.added;
break;
case 'D':
status = StatusResult.Status.removed;
break;
case 'R':
status = StatusResult.Status.renamed;
break;
case 'U':
status = StatusResult.Status.updated;
break;
case 'C':
status = StatusResult.Status.copied;
break;
case '!':
status = StatusResult.Status.ignored;
break;
case '?':
status = StatusResult.Status.unversioned;
break;
case ' ':
status = StatusResult.Status.unversioned;
break;
default:
status = StatusResult.Status.unmodified;
break;
}
statusResult.addEntry(text.substring(2), status);
}
}
}
if (!changes) {
statusResult.addEntry(actualfile.getName(), StatusResult.Status.unmodified);
}
} catch (IOException ex) {
// This cannot happen! We are reading from a byte array.
}
setResultData(statusResult);
}
public static void main(String[] args) {
StatusResult result;
File file = parseFile(args);
if (file == null) {
return;
}
result = new GitVersionControl().executeStatus(file);
if (result != null) {
for (StatusResult.Entry entry : result.getEntryList()) {
System.out.println(entry.getStatus().getShortText() + " " + entry.getName());
}
}
}
}