void (@NotNull ProgressIndicator aProgressIndicator) { final ArrayList<VirtualFile> adds = new ArrayList<>(); final HashMap<VirtualFile, VirtualFile> copies = new HashMap<>(); // from -> to //delete unversioned and ignored files from copy source LOG.assertTrue(myProject != null, "Project is null"); Collection<VirtualFile> unversionedAndIgnoredFiles = new ArrayList<>(); final Map<VirtualFile, Collection<VirtualFile>> sortedSourceFilesByRepos = HgUtil.sortByHgRoots(myProject, copyFromMap.values()); HgStatusCommand statusCommand = new HgStatusCommand.Builder(false).unknown(true).ignored(true).build(myProject); for (Map.Entry<VirtualFile, Collection<VirtualFile>> entry : sortedSourceFilesByRepos.entrySet()) { Set<HgChange> changes = statusCommand.executeInCurrentThread(entry.getKey(), ContainerUtil.map(entry.getValue(), virtualFile -> VcsUtil.getFilePath(virtualFile))); for (HgChange change : changes) { unversionedAndIgnoredFiles.add(change.afterFile().toFilePath().getVirtualFile()); } } copyFromMap.values().removeAll(unversionedAndIgnoredFiles); // separate adds from copies for (VirtualFile file : addedFiles) { final VirtualFile copyFrom = copyFromMap.get(file); if (copyFrom != null) { copies.put(copyFrom, file); } else { adds.add(file); } } // add for all files at once if (!adds.isEmpty()) { new HgAddCommand(myProject).executeInCurrentThread(adds); } // copy needs to be run for each file separately if (!copies.isEmpty()) { for (Map.Entry<VirtualFile, VirtualFile> copy : copies.entrySet()) { new HgCopyCommand(myProject).executeInCurrentThread(copy.getKey(), copy.getValue()); } } for (VirtualFile file : addedFiles) { if (file.isDirectory()) { dirtyScopeManager.dirDirtyRecursively(file); } else { dirtyScopeManager.fileDirty(file); } } }