private static void extractFileName(
     final String curLine, final FilePatch patch, final boolean before, final boolean gitPatch) {
   String fileName = curLine.substring(4);
   int pos = fileName.indexOf('\t');
   if (pos < 0) {
     pos = fileName.indexOf(' ');
   }
   if (pos >= 0) {
     String versionId = fileName.substring(pos).trim();
     fileName = fileName.substring(0, pos);
     if (versionId.length() > 0 && !EMPTY_REVISION_INFO_PATTERN.matcher(versionId).matches()) {
       if (before) {
         patch.setBeforeVersionId(versionId);
       } else {
         patch.setAfterVersionId(versionId);
       }
     }
   }
   if ("/dev/null".equals(fileName)) return;
   if (before) {
     if (gitPatch && fileName.startsWith("a/")) {
       fileName = fileName.substring(2);
     }
     patch.setBeforeName(fileName);
   } else {
     if (gitPatch && fileName.startsWith("b/")) {
       fileName = fileName.substring(2);
     }
     patch.setAfterName(fileName);
   }
 }
    @Override
    public void apply(
        @NotNull MultiMap<VirtualFile, TextFilePatchInProgress> patchGroups,
        @Nullable LocalChangeList localList,
        @Nullable String fileName,
        @Nullable
            TransparentlyFailedValueI<Map<String, Map<String, CharSequence>>, PatchSyntaxException>
                additionalInfo) {
      final List<FilePatch> patches;
      try {
        patches = ApplyPatchSaveToFileExecutor.patchGroupsToOneGroup(patchGroups, myBaseDir);
      } catch (IOException e) {
        myInner.handleException(e, true);
        return;
      }

      final PatchApplier<BinaryFilePatch> patchApplier =
          new PatchApplier<BinaryFilePatch>(
              myVcs.getProject(), myBaseDir, patches, localList, null, null);
      patchApplier.execute(false, true); // 3
      boolean thereAreCreations = false;
      for (FilePatch patch : patches) {
        if (patch.isNewFile() || !Comparing.equal(patch.getAfterName(), patch.getBeforeName())) {
          thereAreCreations = true;
          break;
        }
      }
      if (thereAreCreations) {
        // restore deletion of old directory:
        myInner.next(new DirectoryAddition()); // 2
      }
      appendResolveConflictToContext(myInner); // 1
      appendTailToContextLast(myInner); // 4
      myInner.ping();
    }
 private static boolean needUnshelve(final FilePatch patch, final List<ShelvedChange> changes) {
   for (ShelvedChange change : changes) {
     if (Comparing.equal(patch.getBeforeName(), change.getBeforePath())) {
       return true;
     }
   }
   return false;
 }