package mobi.hsz.idea.vcswatch.requests; import com.intellij.execution.ExecutionException; import com.intellij.execution.process.ProcessOutput; import com.intellij.execution.util.ExecUtil; import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.ContainerUtil; import mobi.hsz.idea.vcswatch.core.Commit; import mobi.hsz.idea.vcswatch.core.VcsWatchManager; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; public abstract class VcsWatchRequest implements Runnable { /** VCS working directory. */ private final VirtualFile workingDirectory; /** Project VCS watch manager. */ private final VcsWatchManager vcsWatchManager; public VcsWatchRequest(@NotNull final AbstractVcs vcs, @NotNull final VirtualFile workingDirectory) { this.workingDirectory = workingDirectory; this.vcsWatchManager = VcsWatchManager.getInstance(vcs.getProject()); } @NonNls @NotNull protected abstract String getExecutable(); /** * Executes passed command with specified {@link #workingDirectory}. * * @param command Command to execute * @return {@link ProcessOutput} result or <code>null</code> if failed */ @Nullable protected ProcessOutput exec(@NotNull String... command) { try { final List<String> commands = ContainerUtil.newArrayList(getExecutable()); ContainerUtil.addAll(commands, command); final ProcessOutput output = ExecUtil.execAndGetOutput(commands, workingDirectory.getPath()); if (output.getExitCode() > 0 || output.getStdoutLines().size() == 0) { return null; } return output; } catch (ExecutionException ignored) { return null; } } /** * Adds new {@link Commit} to the {@link VcsWatchManager} registry. * * @param commit to add */ public void addCommit(@NotNull Commit commit) { this.vcsWatchManager.add(commit); } }