code: package com.beijunyi.parallelgit.filesystem.merge;
  
  import java.io.IOException;
  import java.util.Map;
  import javax.annotation.Nonnull;
  
  import com.beijunyi.parallelgit.filesystem.GitFileSystem;
  import com.beijunyi.parallelgit.filesystem.io.GfsDefaultCheckout;
  import org.eclipse.jgit.merge.MergeFormatter;
  
  import static org.eclipse.jgit.lib.FileMode.REGULAR_FILE;
  
  public class GfsMergeCheckout extends GfsDefaultCheckout {
  
    private final Map<String, MergeConflict> conflicts;
    private MergeFormatter formatter;
  
    private GfsMergeCheckout(GitFileSystem gfs, Map<String, MergeConflict> conflicts) {
      super(gfs);
      this.conflicts = conflicts;
    }
  
    public static GfsMergeCheckout handleConflicts(GitFileSystem gfs, Map<String, MergeConflict> conflicts) {
      return new GfsMergeCheckout(gfs, conflicts);
    }
  
    @Nonnull
    public GfsMergeCheckout withFormatter(MergeFormatter formatter) {
      this.formatter = formatter;
      return this;
    }
  
    @Override
    protected boolean skips(String path) {
      return super.skips(path) || (conflicts != null && conflicts.containsKey(path));
    }
  
    @Override
    protected void applyChanges() throws IOException {
      addFormattedConflicts();
      super.applyChanges();
    }
  
    private void addFormattedConflicts() throws IOException {
      if(conflicts != null) {
        for(Map.Entry<String, MergeConflict> conflict : conflicts.entrySet()) {
          String path = conflict.getKey();
          byte[] formatted = conflict.getValue().format(formatter);
          changes.addChange(path, formatted, REGULAR_FILE);
        }
      }
    }
  
  }
  