private static @NotNull Trinity<String, String, String> getAffectedBlobs(@NotNull Project project,
                                                                           @NotNull VirtualFile root,
                                                                           @NotNull FilePath path) {
    try {
      GitLineHandler h = new GitLineHandler(project, root, GitCommand.LS_FILES);
      h.addParameters("--exclude-standard", "--unmerged", "-z");
      h.endOptions();
      h.addRelativePaths(path);

      String output = Git.getInstance().runCommand(h).getOutputOrThrow();
      StringScanner s = new StringScanner(output);

      String originalBlob = null;
      String yoursBlob = null;
      String theirsBlob = null;

      while (s.hasMoreData()) {
        s.spaceToken(); // permissions
        String blob = s.spaceToken();
        int source = Integer.parseInt(s.tabToken()); // stage
        s.boundedToken('\u0000'); // file name

        if (source == ORIGINAL_REVISION_NUM) {
          originalBlob = blob;
        }
        else if (source == YOURS_REVISION_NUM) {
          yoursBlob = blob;
        }
        else if (source == THEIRS_REVISION_NUM) {
          theirsBlob = blob;
        }

        else {
          throw new IllegalStateException("Unknown revision " + source + " for the file: " + path);
        }
      }
      return Trinity.create(originalBlob, yoursBlob, theirsBlob);
    }
    catch (VcsException e) {
      LOG.warn(e);
      return Trinity.create(null, null, null);
    }
  }
private static @NotNull Trinity<String, String, String> getAffectedBlobs(@NotNull Project project,
                                                                           @NotNull VirtualFile root,
                                                                           @NotNull FilePath path)