/* * ==================================================================== * Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html. * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.cli.svn; import java.text.MessageFormat; import java.util.Collection; import java.util.LinkedList; import java.util.List; import org.tmatesoft.svn.core.ISVNLogEntryHandler; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNErrorCode; import org.tmatesoft.svn.core.SVNErrorMessage; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNLogEntry; import org.tmatesoft.svn.core.internal.wc.SVNErrorManager; import org.tmatesoft.svn.core.internal.wc.SVNPath; import org.tmatesoft.svn.core.wc.SVNDiffClient; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc2.ISvnObjectReceiver; import org.tmatesoft.svn.core.wc2.SvnLogMergeInfo; import org.tmatesoft.svn.core.wc2.SvnOperationFactory; import org.tmatesoft.svn.core.wc2.SvnTarget; import org.tmatesoft.svn.util.SVNLogType; /** * @version 1.3 * @author TMate Software Ltd. */ public class SVNMergeInfoCommand extends SVNCommand implements ISVNLogEntryHandler { public SVNMergeInfoCommand() { super("mergeinfo", null); } protected Collection<SVNOption> createSupportedOptions() { Collection<SVNOption> options = new LinkedList<SVNOption>(); options.add(SVNOption.REVISION); options.add(SVNOption.SHOW_REVS); options.add(SVNOption.RECURSIVE); options.add(SVNOption.DEPTH); return options; } public void run() throws SVNException { List<String> targets = getSVNEnvironment().combineTargets(null, true); if (targets.size() < 1) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.CL_ARG_PARSING_ERROR, "Not enough arguments given"); SVNErrorManager.error(err, SVNLogType.CLIENT); } if (targets.size() > 2) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.CL_ARG_PARSING_ERROR, "Too many arguments given"); SVNErrorManager.error(err, SVNLogType.CLIENT); } SVNPath source = new SVNPath((String) targets.get(0), true); SVNRevision srcPegRevision = source.getPegRevision(); if (srcPegRevision == SVNRevision.UNDEFINED) { srcPegRevision = SVNRevision.HEAD; } SVNPath target = null; SVNRevision tgtPegRevision = null; if (targets.size() == 2) { target = new SVNPath((String) targets.get(1), true); tgtPegRevision = target.getPegRevision(); } else { target = new SVNPath(""); tgtPegRevision = SVNRevision.UNDEFINED; } if (tgtPegRevision == SVNRevision.UNDEFINED) { if (target.isURL()) { tgtPegRevision = SVNRevision.HEAD; } else { tgtPegRevision = SVNRevision.BASE; } } SVNDiffClient client = getSVNEnvironment().getClientManager().getDiffClient(); SvnOperationFactory of = client.getOperationsFactory(); SVNDepth depth = getSVNEnvironment().getDepth(); if (depth == SVNDepth.UNKNOWN) { depth = SVNDepth.EMPTY; } SvnLogMergeInfo logMergeInfo = of.createLogMergeInfo(); logMergeInfo.setDepth(depth); logMergeInfo.setDiscoverChangedPaths(true); logMergeInfo.setRevisionProperties(null); logMergeInfo.setReceiver(new ISvnObjectReceiver<SVNLogEntry>() { public void receive(SvnTarget target, SVNLogEntry object) throws SVNException { handleLogEntry(object); } }); logMergeInfo.setFindMerged(getSVNEnvironment().getShowRevisionType() == SVNShowRevisionType.MERGED); if (target.isURL()) { logMergeInfo.setSingleTarget(SvnTarget.fromURL(target.getURL(), tgtPegRevision)); } else { logMergeInfo.setSingleTarget(SvnTarget.fromFile(target.getFile(), tgtPegRevision)); } if (source.isURL()) { logMergeInfo.setSource(SvnTarget.fromURL(source.getURL(), srcPegRevision)); } else { logMergeInfo.setSource(SvnTarget.fromFile(source.getFile(), srcPegRevision)); } logMergeInfo.run(); } public void handleLogEntry(SVNLogEntry logEntry) throws SVNException { String message; if (logEntry.isNonInheritable()) { message = MessageFormat.format("r{0}*", new Object[] { String.valueOf(logEntry.getRevision()) }); } else { message = MessageFormat.format("r{0}", new Object[] { String.valueOf(logEntry.getRevision()) }); } getSVNEnvironment().getOut().println(message); } }