code: package com.beijunyi.parallelgit.filesystem.commands;
  
  import java.io.IOException;
  import javax.annotation.Nonnull;
  
  import com.beijunyi.parallelgit.filesystem.GfsStatusProvider;
  import com.beijunyi.parallelgit.filesystem.GitFileSystem;
  import com.beijunyi.parallelgit.filesystem.exceptions.NoBranchException;
  import com.beijunyi.parallelgit.filesystem.exceptions.NoHeadCommitException;
  import com.beijunyi.parallelgit.utils.BranchUtils;
  import org.eclipse.jgit.revwalk.RevCommit;
  
  import static com.beijunyi.parallelgit.filesystem.commands.GfsReset.Status.SUCCESS;
  import static com.beijunyi.parallelgit.utils.CommitUtils.getCommit;
  
  public class GfsReset extends GfsCommand<GfsReset.Result> {
  
    private boolean soft = false;
    private boolean hard = false;
    private String branch;
    private String revision;
  
    public GfsReset(GitFileSystem gfs) {
      super(gfs);
    }
  
    @Nonnull
    public GfsReset soft(boolean soft) {
      this.soft = soft;
      return this;
    }
  
    @Nonnull
    public GfsReset hard(boolean hard) {
      this.hard = hard;
      return this;
    }
  
    @Nonnull
    public GfsReset revision(String revision) {
      this.revision = revision;
      return this;
    }
  
    @Nonnull
    @Override
    protected Result doExecute(GfsStatusProvider.Update update) throws IOException {
      prepareBranch();
      prepareCommit();
      RevCommit commit = getCommit(revision, repo);
      BranchUtils.resetBranchHead(branch, commit, repo);
      gfs.updateOrigin(commit.getTree());
      if(!soft) gfs.reset();
      if(hard) update.clearMergeNote();
      update.commit(commit);
      return Result.success();
    }
  
    private void prepareBranch() {
      if(!status.isAttached()) throw new NoBranchException();
      branch = status.branch();
    }
  
    private void prepareCommit() throws IOException {
      if(revision == null) {
        if(!status.isInitialized()) throw new NoHeadCommitException();
        revision = status.commit().getName();
      }
    }
  
    public enum Status {
      SUCCESS,
    }
  
    public static class Result implements GfsCommandResult {
  
      private final Status status;
  
      private Result(Status status) {
        this.status = status;
      }
  
      @Nonnull
      public static Result success() {
        return new Result(SUCCESS);
      }
  
      @Override
      public boolean isSuccessful() {
        return SUCCESS.equals(status);
      }
  
    }
  
  }
  