private void doExternalStatus(Map<File, File> externalsNew) throws SVNException { for (Iterator<File> paths = externalsNew.keySet().iterator(); paths.hasNext(); ) { File fullPath = paths.next(); File wcRootAbsPath = externalsNew.get(fullPath); Structure<StructureFields.ExternalNodeInfo> externalInfo = SvnWcDbExternals.readExternal( getWcContext(), fullPath, wcRootAbsPath, StructureFields.ExternalNodeInfo.kind); ISVNWCDb.SVNWCDbKind externalKind = externalInfo.get(StructureFields.ExternalNodeInfo.kind); if (externalKind != ISVNWCDb.SVNWCDbKind.Dir) { continue; } if (SVNFileType.getType(fullPath) != SVNFileType.DIRECTORY) { continue; } handleEvent( SVNEventFactory.createSVNEvent( fullPath, SVNNodeKind.DIR, null, SVNRepository.INVALID_REVISION, SVNEventAction.STATUS_EXTERNAL, null, null, null), ISVNEventHandler.UNKNOWN); try { SvnGetStatus getStatus = getOperation().getOperationFactory().createGetStatus(); getStatus.setSingleTarget(SvnTarget.fromFile(fullPath)); getStatus.setRevision(SVNRevision.HEAD); getStatus.setDepth(getOperation().getDepth()); getStatus.setRemote(getOperation().isRemote()); getStatus.setReportAll(getOperation().isReportAll()); getStatus.setReportIgnored(getOperation().isReportIgnored()); getStatus.setReportExternals(getOperation().isReportExternals()); getStatus.setReceiver(getOperation().getReceiver()); getStatus.setFileListHook(getOperation().getFileListHook()); getStatus.run(); } catch (SVNException e) { if (e instanceof SVNCancelException) { throw e; } } } }
@Override protected SvnStatus run(SVNWCContext context) throws SVNException { File directoryPath; String targetName; SVNNodeKind kind = context.readKind(getFirstTarget(), false); SVNDepth depth = getOperation().getDepth(); if (kind == SVNNodeKind.DIR) { directoryPath = getFirstTarget(); targetName = ""; } else { directoryPath = SVNFileUtil.getParentFile(getFirstTarget()); targetName = SVNFileUtil.getFileName(getFirstTarget()); if (kind == SVNNodeKind.FILE) { if (depth == SVNDepth.EMPTY) { depth = SVNDepth.FILES; } } else { boolean notAWc = false; try { kind = context.readKind(directoryPath, false); notAWc = kind != SVNNodeKind.DIR; } catch (SVNException e) { notAWc = true; } if (notAWc) { SVNErrorMessage err = SVNErrorMessage.create( SVNErrorCode.WC_PATH_NOT_FOUND, "The node ''{0}'' was not found", getFirstTarget()); SVNErrorManager.error(err, SVNLogType.WC); } } } String[] globalIgnores = context.getOptions().getIgnorePatterns(); if (getOperation().isRemote()) { SVNURL url = context.getUrlFromPath(directoryPath); if (url == null) { SVNErrorMessage error = SVNErrorMessage.create( SVNErrorCode.ENTRY_MISSING_URL, "Entry ''{0}'' has no URL", directoryPath); SVNErrorManager.error(error, SVNLogType.WC); } SVNRepository repository = getRepositoryAccess().createRepository(url, null, true); long rev; if (getOperation().getRevision() == SVNRevision.HEAD) { rev = -1; } else { rev = context.getRevisionNumber( getOperation().getRevision(), null, repository, getFirstTarget()); } kind = repository.checkPath("", rev); checkCancelled(); SVNStatusEditor17 editor = null; SVNReporter17 reporter = null; if (kind == SVNNodeKind.NONE) { boolean added = context.isNodeAdded(directoryPath); if (added) { boolean replaced = context.isNodeReplaced(directoryPath); if (replaced) { added = false; } } setTargetDeletedInRepository(!added); editor = new SVNStatusEditor17( getFirstTarget(), context, getOperation().getOptions(), getOperation().isReportIgnored(), getOperation().isReportAll(), depth, this); editor.setFileListHook(getOperation().getFileListHook()); checkCancelled(); editor.closeEdit(); } else { editor = new SVNRemoteStatusEditor17( directoryPath, targetName, context, getOperation().getOptions(), getOperation().isReportIgnored(), getOperation().isReportAll(), depth, this); editor.setFileListHook(getOperation().getFileListHook()); SVNRepository locksRepos = getRepositoryAccess().createRepository(url, null, false); checkCancelled(); boolean serverSupportsDepth = repository.hasCapability(SVNCapability.DEPTH); reporter = new SVNReporter17( getFirstTarget(), context, false, !serverSupportsDepth, depth, false, true, true, false, null); SVNStatusReporter17 statusReporter = new SVNStatusReporter17(locksRepos, reporter, editor); String target = "".equals(targetName) ? null : targetName; SVNDepth statusDepth = getOperation().isDepthAsSticky() ? depth : SVNDepth.UNKNOWN; repository.status( rev, target, statusDepth, statusReporter, SVNCancellableEditor.newInstance((ISVNEditor) editor, this, null)); } getOperation().setRemoteRevision(editor.getTargetRevision()); long reportedFiles = reporter != null ? reporter.getReportedFilesCount() : 0; long totalFiles = reporter != null ? reporter.getTotalFilesCount() : 0; SVNEvent event = SVNEventFactory.createSVNEvent( getFirstTarget(), SVNNodeKind.NONE, null, editor.getTargetRevision(), SVNEventAction.STATUS_COMPLETED, null, null, null, reportedFiles, totalFiles); handleEvent(event, ISVNEventHandler.UNKNOWN); } else { SVNStatusEditor17 editor = new SVNStatusEditor17( directoryPath, context, context.getOptions(), getOperation().isReportIgnored(), getOperation().isReportAll(), depth, this); editor.setFileListHook(getOperation().getFileListHook()); try { editor.walkStatus( getFirstTarget(), depth, getOperation().isReportAll(), getOperation().isReportIgnored(), false, globalIgnores != null ? Arrays.asList(globalIgnores) : null); } catch (SVNException e) { if (e.getErrorMessage().getErrorCode() == SVNErrorCode.WC_MISSING) { SVNErrorMessage err = SVNErrorMessage.create( SVNErrorCode.WC_NOT_WORKING_COPY, "''{0}'' is not a working copy", getFirstTarget()); SVNErrorManager.error(err, SVNLogType.WC); } throw e; } } if (depth.isRecursive() && getOperation().isReportExternals()) { Map<File, File> externals = context.getDb().getExternalsDefinedBelow(getFirstTarget()); doExternalStatus(externals); } return getOperation().first(); }