/* * ==================================================================== * 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 org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.internal.util.SVNFormatUtil; import org.tmatesoft.svn.core.internal.wc.SVNTreeConflictUtil; import org.tmatesoft.svn.core.internal.wc17.db.ISVNWCDb; import org.tmatesoft.svn.core.wc.SVNStatus; import org.tmatesoft.svn.core.wc.SVNStatusType; /** * @version 1.3 * @author TMate Software Ltd. */ public class SVNStatusPrinter { private SVNCommandEnvironment myEnvironment; public SVNStatusPrinter(SVNCommandEnvironment env) { myEnvironment = env; } public void printStatus(String path, SVNStatus status, boolean detailed, boolean showLastCommitted, boolean skipUnrecognized, boolean showReposLocks) throws SVNException { if (status == null || (skipUnrecognized && !(status.isVersioned() || status.getTreeConflict() != null || status.getNodeStatus() == SVNStatusType.STATUS_EXTERNAL)) || (combineStatus(status) == SVNStatusType.STATUS_NONE && status.getRemoteContentsStatus() == SVNStatusType.STATUS_NONE)) { return; } char treeStatusCode = ' '; String treeDescriptionLine = ""; if (status.getTreeConflict() != null) { String description = SVNTreeConflictUtil.getHumanReadableConflictDescription(status.getTreeConflict()); treeStatusCode = 'C'; treeDescriptionLine = "\n > " + description; } StringBuffer result = new StringBuffer(); if (detailed) { String wcRevision; char remoteStatus; if (!status.isVersioned()) { wcRevision = ""; } else if (status.isCopied()) { wcRevision = "-"; } else if (!status.getRevision().isValid()) { if(status.getWorkingCopyFormat() == ISVNWCDb.WC_FORMAT_17) { if(status.getNodeStatus()==SVNStatusType.STATUS_DELETED) { wcRevision = status.getCommittedRevision().toString(); } else { wcRevision = "-"; } } else { wcRevision = " ? "; } } else { wcRevision = Long.toString(status.getRevision().getNumber()); } if (status.getRemoteNodeStatus() != SVNStatusType.STATUS_NONE) { remoteStatus = '*'; } else { remoteStatus = ' '; } char lockStatus; if (showReposLocks) { if (status.getRemoteLock() != null) { if (status.getLocalLock() != null) { lockStatus = status.getLocalLock().getID().equals(status.getRemoteLock().getID()) ? 'K' : 'T'; } else { lockStatus = 'O'; } } else if (status.getLocalLock() != null) { lockStatus = 'B'; } else { lockStatus = ' '; } } else { lockStatus = status.getLocalLock() != null ? 'K' : ' '; } if (showLastCommitted) { String commitRevision = ""; String commitAuthor = ""; if (status.isVersioned() && status.getCommittedRevision().isValid()) { commitRevision = status.getCommittedRevision().toString(); } else if (status.isVersioned()) { commitRevision = " ? "; } if (status.isVersioned() && status.getAuthor() != null) { commitAuthor = status.getAuthor(); } else if (status.isVersioned()) { commitAuthor = " ? "; } result.append(combineStatus(status).getCode()); result.append(status.getPropertiesStatus().getCode()); result.append(status.isLocked() ? 'L' : ' '); result.append(status.isCopied() ? '+' : ' '); result.append(getSwitchCharacter(status)); result.append(lockStatus); result.append(treeStatusCode); // tree status result.append(" "); result.append(remoteStatus); result.append(" "); result.append(SVNFormatUtil.formatString(wcRevision, 6, false, false)); // 6 chars result.append(" "); result.append(SVNFormatUtil.formatString(commitRevision, 6, false, false)); // 6 chars result.append(" "); result.append(SVNFormatUtil.formatString(commitAuthor, 12, true)); // 12 chars result.append(" "); result.append(path); result.append(treeDescriptionLine); } else { result.append(combineStatus(status).getCode()); result.append(status.getPropertiesStatus().getCode()); result.append(status.isLocked() ? 'L' : ' '); result.append(status.isCopied() ? '+' : ' '); result.append(getSwitchCharacter(status)); result.append(lockStatus); result.append(treeStatusCode); // tree status result.append(" "); result.append(remoteStatus); result.append(" "); result.append(SVNFormatUtil.formatString(wcRevision, 6, false, false)); // 6 chars result.append(" "); result.append(path); result.append(treeDescriptionLine); } } else { result.append(combineStatus(status).getCode()); result.append(status.getPropertiesStatus().getCode()); result.append(status.isLocked() ? 'L' : ' '); result.append(status.isCopied() ? '+' : ' '); result.append(getSwitchCharacter(status)); result.append(status.getLocalLock() != null ? 'K' : ' '); result.append(treeStatusCode); // tree status result.append(" "); result.append(path); result.append(treeDescriptionLine); } myEnvironment.getOut().println(result); } public static SVNStatusType combineStatus(SVNStatus status) { return status.getCombinedNodeAndContentsStatus(); } private static char getSwitchCharacter(SVNStatus status) { if (status == null) { return ' '; } return status.isSwitched() ? 'S' : (status.isFileExternal() ? 'X' : ' '); } }