public void apply( final SvnVcs vcs, final List<RootUrlInfo> roots, final List<VirtualFile> lonelyRoots) { final SvnMapping mapping = new SvnMapping(); mapping.addAll(roots); mapping.reportLonelyRoots(lonelyRoots); final SvnMapping groupedMapping = new SvnMapping(); final List<RootUrlInfo> filtered = new ArrayList<RootUrlInfo>(); ForNestedRootChecker.filterOutSuperfluousChildren(vcs, roots, filtered); groupedMapping.addAll(filtered); ApplicationManager.getApplication() .runReadAction( new Runnable() { @Override public void run() { synchronized (myMonitor) { myMapping.copyFrom(mapping); myMoreRealMapping.copyFrom(groupedMapping); } } }); myProject.getMessageBus().syncPublisher(SvnVcs.ROOTS_RELOADED).run(); }
@Override public <S> List<S> filterUniqueRoots( final List<S> in, final Convertor<S, VirtualFile> convertor) { if (in.size() <= 1) return in; final List<MyPair<S>> infos = new ArrayList<MyPair<S>>(in.size()); final SvnFileUrlMappingImpl mapping = (SvnFileUrlMappingImpl) getSvnFileUrlMapping(); final List<S> notMatched = new LinkedList<S>(); for (S s : in) { final VirtualFile vf = convertor.convert(s); if (vf == null) continue; final File ioFile = new File(vf.getPath()); SVNURL url = mapping.getUrlForFile(ioFile); if (url == null) { url = SvnUtil.getUrl(this, ioFile); if (url == null) { notMatched.add(s); continue; } } infos.add(new MyPair<S>(vf, url.toString(), s)); } final List<MyPair<S>> filtered = new ArrayList<MyPair<S>>(infos.size()); ForNestedRootChecker.filterOutSuperfluousChildren(this, infos, filtered); final List<S> converted = ObjectsConvertor.convert( filtered, new Convertor<MyPair<S>, S>() { @Override public S convert(final MyPair<S> o) { return o.getSrc(); } }); if (!notMatched.isEmpty()) { // potential bug is here: order is not kept. but seems it only occurs for cases where result // is sorted after filtering so ok converted.addAll(notMatched); } return converted; }
public void detectCopyRoots(final VirtualFile[] roots, final boolean clearState) { final Getter<Boolean> cancelGetter = new Getter<Boolean>() { public Boolean get() { return myVcs.getProject().isDisposed(); } }; for (final VirtualFile vcsRoot : roots) { final List<Real> foundRoots = ForNestedRootChecker.getAllNestedWorkingCopies(vcsRoot, myVcs, false, cancelGetter); if (foundRoots.isEmpty()) { myLonelyRoots.add(vcsRoot); } // filter out bad(?) items for (Real foundRoot : foundRoots) { final SVNURL repoRoot = foundRoot.getInfo().getRepositoryRootURL(); if (repoRoot == null) { LOG.info( "Error: cannot find repository URL for versioned folder: " + foundRoot.getFile().getPath()); } else { myRepositoryRoots.register(repoRoot); myTopRoots.add( new RootUrlInfo( repoRoot, foundRoot.getInfo().getURL(), SvnFormatSelector.getWorkingCopyFormat(foundRoot.getInfo().getFile()), foundRoot.getFile(), vcsRoot)); } } } if (!SvnConfiguration.getInstance(myVcs.getProject()).DETECT_NESTED_COPIES) { myApplier.apply(myVcs, myTopRoots, myLonelyRoots); } else { addNestedRoots(clearState); } }