// only refresh might have changed; for branches/roots change, another method is used
  public MergeCheckResult getState(
      final WCInfoWithBranches info,
      final SvnChangeList list,
      final WCInfoWithBranches.Branch selectedBranch,
      final String branchPath) {
    final String currentUrl = info.getRootUrl();
    final String branchUrl = selectedBranch.getUrl();

    MyCurrentUrlData rootMapping = myState.getCurrentUrlMapping().get(currentUrl);
    BranchInfo mergeChecker = null;
    if (rootMapping == null) {
      rootMapping = new MyCurrentUrlData();
      myState.getCurrentUrlMapping().put(currentUrl, rootMapping);
    } else {
      mergeChecker = rootMapping.getBranchInfo(branchPath);
    }
    if (mergeChecker == null) {
      mergeChecker =
          new BranchInfo(
              SvnVcs.getInstance(myProject),
              info.getRepoUrl(),
              branchUrl,
              currentUrl,
              info.getTrunkRoot());
      rootMapping.addBranchInfo(branchPath, mergeChecker);
    }

    return mergeChecker.checkList(list, branchPath);
  }
  private void doAction(final MyAction action) {
    LOG.debug("doAction: START " + action.name());
    final MyExitAction[] exitActions;
    List<Runnable> toBeCalled = null;
    synchronized (myLock) {
      final MyState oldState = myState;
      myState = myState.transition(action);
      if (oldState.equals(myState)) return;
      exitActions = MyTransitionAction.getExit(oldState, myState);

      LOG.debug("doAction: oldState: " + oldState.name() + ", newState: " + myState.name());

      if (LOG.isDebugEnabled() && exitActions != null) {
        final String debugExitActions =
            StringUtil.join(
                exitActions,
                new Function<MyExitAction, String>() {
                  @Override
                  public String fun(MyExitAction exitAction) {
                    return exitAction.name();
                  }
                },
                " ");
        LOG.debug("exit actions: " + debugExitActions);
      }
      if (exitActions != null) {
        for (MyExitAction exitAction : exitActions) {
          if (MyExitAction.markStart.equals(exitAction)) {
            myWaitingFinishListeners.addAll(myWaitingStartListeners);
            myWaitingStartListeners.clear();
          } else if (MyExitAction.markEnd.equals(exitAction)) {
            toBeCalled = new ArrayList<Runnable>(myWaitingFinishListeners);
            myWaitingFinishListeners.clear();
          }
        }
      }
    }
    if (exitActions != null) {
      for (MyExitAction exitAction : exitActions) {
        if (MyExitAction.submitRequestToExecutor.equals(exitAction)) {
          myAlarm.consume(myWorker);
          // myAlarm.addRequest(myWorker, ourDelay);
          // ApplicationManager.getApplication().executeOnPooledThread(myWorker);
        }
      }
    }
    if (toBeCalled != null) {
      for (Runnable runnable : toBeCalled) {
        runnable.run();
      }
    }
    LOG.debug("doAction: END " + action.name());
  }
  public void clear(final WCPaths info, final String branchPath) {
    final String currentUrl = info.getRootUrl();

    final MyCurrentUrlData rootMapping = myState.getCurrentUrlMapping().get(currentUrl);
    if (rootMapping != null) {
      final BranchInfo mergeChecker = rootMapping.getBranchInfo(branchPath);
      if (mergeChecker != null) {
        mergeChecker.clear();
      }
    }
  }
 public boolean isMixedRevisions(final WCInfoWithBranches info, final String branchPath) {
   final String currentUrl = info.getRootUrl();
   final MyCurrentUrlData rootMapping = myState.getCurrentUrlMapping().get(currentUrl);
   if (rootMapping != null) {
     final BranchInfo branchInfo = rootMapping.getBranchInfo(branchPath);
     if (branchInfo != null) {
       return branchInfo.isMixedRevisionsFound();
     }
   }
   return false;
 }
  @Nullable
  public MergeinfoCached getCachedState(final WCPaths info, final String branchPath) {
    final String currentUrl = info.getRootUrl();

    MyCurrentUrlData rootMapping = myState.getCurrentUrlMapping().get(currentUrl);
    if (rootMapping != null) {
      final BranchInfo branchInfo = rootMapping.getBranchInfo(branchPath);
      if (branchInfo != null) {
        return branchInfo.getCached();
      }
    }
    return null;
  }
 private static void logWrongAction(final MyState state, final MyAction action) {
   LOG.info("Wrong action: state=" + state.name() + ", action=" + action.name());
 }