package mobi.hsz.idea.vcswatch.requests;
import com.intellij.execution.process.ProcessOutput;
import com.intellij.openapi.vcs.AbstractVcs;
import com.intellij.openapi.vfs.VirtualFile;
import git4idea.config.GitVcsApplicationSettings;
import mobi.hsz.idea.vcswatch.core.Commit;
import org.jetbrains.annotations.NotNull;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GitWatchRequest extends VcsWatchRequest {
private static final String TEMPLATE = "%h %an ## %ad ## %s";
private static final Pattern PATTERN = Pattern.compile("^(\\w+) (.*?) ## (\\d+) .*? ## (.*)$", Pattern.MULTILINE);
public GitWatchRequest(@NotNull AbstractVcs vcs, @NotNull VirtualFile workingDirectory) {
super(vcs, workingDirectory);
}
@NotNull
@Override
protected String getExecutable() {
return GitVcsApplicationSettings.getInstance().getPathToGit();
}
@Override
public void run() {
// Update information about ahead commits. If nothing is returned, repository has no remote.
if (exec("remote", "update") == null) {
return;
}
// Check logs. If nothing is returned, there are not commits to pull.
ProcessOutput output = exec("log", "..@{u}", "--date=raw", "--pretty=format:" + TEMPLATE);
if (output == null) {
return;
}
// Parse logs.
Matcher matcher = PATTERN.matcher(output.getStdout());
while (matcher.find()) {
String id = matcher.group(1);
String user = matcher.group(2);
Date date = new Date(Long.valueOf(matcher.group(3)) * 1000);
String message = matcher.group(4);
addCommit(new Commit(id, user, date, message));
}
}
}