SVNCommitItem[] commitItems = SVNCommitUtil.harvestCommitables(wcAccess, targets, lockTokens, !keepLocks, recursive);
SVNCommitItem[] commitItems = SVNCommitUtil.harvestCommitables(wcAccess, targets, lockTokens, !keepLocks, recursive, force);
    public SVNCommitPacket doCollectCommitItems(File[] paths, boolean keepLocks, boolean force, boolean recursive) throws SVNException {        Set targets = new TreeSet();        SVNWCAccess wcAccess = SVNCommitUtil.createCommitWCAccess(paths, recursive, force, targets);        try {            Map lockTokens = new HashMap();            SVNCommitItem[] commitItems = SVNCommitUtil.harvestCommitables(wcAccess, targets, lockTokens, !keepLocks, recursive);            boolean hasModifications = false;            for (int i = 0; commitItems != null && i < commitItems.length; i++) {                SVNCommitItem commitItem = commitItems[i];                if (commitItem.isAdded() || commitItem.isDeleted() || commitItem.isContentsModified() || commitItem.isPropertiesModified() ||                        commitItem.isCopied()) {                    hasModifications = true;                    break;                }            }            if (!hasModifications) {                wcAccess.close(true);                return SVNCommitPacket.EMPTY;            }            return new SVNCommitPacket(wcAccess, commitItems, lockTokens);        } catch (SVNException e) {            wcAccess.close(true);            if (e.getMessage() != null && e.getMessage().startsWith("svn:")) {                e.setMessage("svn: Commit failed (details follow):\n" + e.getMessage());            }            throw e;        }    }