@Test public void testRefusedAddVariant() throws Exception { SVNWCDb db = new SVNWCDb(); final File ioFile = new File(myWorkingCopyRoot, filename + System.currentTimeMillis()); ioFile.createNewFile(); System.out.println(getStatus(ioFile)); SVNWCContext context = null; try { db.open(ISVNWCDb.SVNWCDbOpenMode.ReadWrite, new DefaultSVNOptions(), true, true); context = new SVNWCContext( db, new ISVNEventHandler() { @Override public void handleEvent(SVNEvent event, double progress) throws SVNException {} @Override public void checkCancelled() throws SVNCancelException {} }); File file = context.acquireWriteLock(myWorkingCopyRoot, false, true); boolean failed = false; try { SVNWCClient client = new SVNWCClient((ISVNRepositoryPool) null, new DefaultSVNOptions()); client.doAdd(ioFile, true, false, false, true); } catch (SVNException e) { Assert.assertEquals(155004, e.getErrorMessage().getErrorCode().getCode()); failed = true; } Assert.assertTrue(failed); System.out.println(getStatus(ioFile)); } finally { if (context != null) { context.releaseWriteLock(myWorkingCopyRoot); } ioFile.delete(); db.close(); } }
@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(); }