/*
* ====================================================================
* 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.util.Collection;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import org.tmatesoft.svn.core.ISVNDirEntryHandler;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNDirEntry;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLock;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.internal.util.SVNDate;
import org.tmatesoft.svn.core.internal.util.SVNFormatUtil;
import org.tmatesoft.svn.core.internal.util.SVNXMLUtil;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.core.internal.wc.SVNPath;
import org.tmatesoft.svn.core.wc.SVNLogClient;
import org.tmatesoft.svn.util.SVNLogType;
/**
* @version 1.3
* @author TMate Software Ltd.
*/
public class SVNListCommand extends SVNXMLCommand implements ISVNDirEntryHandler {
public SVNListCommand() {
super("list", new String[] {"ls"});
}
protected Collection createSupportedOptions() {
Collection options = new LinkedList();
options.add(SVNOption.REVISION);
options.add(SVNOption.VERBOSE);
options.add(SVNOption.RECURSIVE);
options.add(SVNOption.DEPTH);
options.add(SVNOption.INCREMENTAL);
options.add(SVNOption.XML);
return options;
}
public void run() throws SVNException {
List targets = getSVNEnvironment().combineTargets(null, true);
if (targets.isEmpty()) {
targets.add("");
}
if (getSVNEnvironment().isXML()) {
if (getSVNEnvironment().isVerbose()) {
SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.CL_ARG_PARSING_ERROR, "'verbose' option invalid in XML mode"), SVNLogType.CLIENT);
}
if (!getSVNEnvironment().isIncremental()) {
printXMLHeader("lists");
}
} else if (getSVNEnvironment().isIncremental()) {
SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.CL_ARG_PARSING_ERROR, "'incremental' option only valid in XML mode"), SVNLogType.CLIENT);
}
SVNDepth depth = getSVNEnvironment().getDepth();
if (depth == SVNDepth.UNKNOWN) {
depth = SVNDepth.IMMEDIATES;
}
int fields = getSVNEnvironment().isXML() || getSVNEnvironment().isVerbose() ?
SVNDirEntry.DIRENT_ALL : SVNDirEntry.DIRENT_KIND | SVNDirEntry.DIRENT_TIME;
boolean fetchLocks = getSVNEnvironment().isXML() || getSVNEnvironment().isVerbose();
SVNLogClient client = getSVNEnvironment().getClientManager().getLogClient();
boolean seenNonExistentPaths = false;
for (int i = 0; i < targets.size(); i++) {
String targetName = (String) targets.get(i);
SVNPath target = new SVNPath(targetName, true);
if (getSVNEnvironment().isXML()) {
StringBuffer buffer = openXMLTag("list", SVNXMLUtil.XML_STYLE_NORMAL, "path",
"".equals(target.getTarget()) ? "." : target.getTarget(), new StringBuffer());
getSVNEnvironment().getOut().print(buffer.toString());
}
try {
if (!target.isURL()) {
client.doList(target.getFile(), target.getPegRevision(), getSVNEnvironment().getStartRevision(), fetchLocks, depth, fields, this);
} else {
client.doList(target.getURL(), target.getPegRevision(), getSVNEnvironment().getStartRevision(), fetchLocks, depth, fields, this);
}
} catch (SVNException e) {
getSVNEnvironment().handleWarning(e.getErrorMessage(),
new SVNErrorCode[] {SVNErrorCode.WC_PATH_NOT_FOUND, SVNErrorCode.FS_NOT_FOUND},
getSVNEnvironment().isQuiet());
seenNonExistentPaths = true;
}
if (getSVNEnvironment().isXML()) {
StringBuffer buffer = closeXMLTag("list", new StringBuffer());
getSVNEnvironment().getOut().print(buffer.toString());
}
}
if (getSVNEnvironment().isXML() && !getSVNEnvironment().isIncremental()) {
printXMLFooter("lists");
}
if (seenNonExistentPaths) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.ILLEGAL_TARGET, "Could not list all targets because some targets don't exist");
SVNErrorManager.error(err, SVNLogType.CLIENT);
}
}
public void handleDirEntry(SVNDirEntry dirEntry) throws SVNException {
if (getSVNEnvironment().isXML()) {
printDirEntryXML(dirEntry);
} else {
printDirEntry(dirEntry);
}
}
protected void printDirEntry(SVNDirEntry dirEntry) {
String path = dirEntry.getRelativePath();
if ("".equals(path)) {
if (getSVNEnvironment().isVerbose() && dirEntry.getKind() == SVNNodeKind.DIR) {
path = ".";
} else if (dirEntry.getKind() == SVNNodeKind.DIR) {
return;
}
}
StringBuffer buffer = new StringBuffer();
if (getSVNEnvironment().isVerbose()) {
buffer.append(SVNFormatUtil.formatString(dirEntry.getRevision() + "", 7, false));
buffer.append(' ');
String author = dirEntry.getAuthor() == null ? " ? " : dirEntry.getAuthor();
if (author.length() > 8) {
author = author.substring(0, 8);
}
buffer.append(SVNFormatUtil.formatString(author, 8, true));
buffer.append(' ');
buffer.append(dirEntry.getLock() != null ? 'O' : ' ');
buffer.append(' ');
buffer.append(SVNFormatUtil.formatString(dirEntry.getKind() == SVNNodeKind.DIR ? "" : dirEntry.getSize() + "", 10, false));
buffer.append(' ');
// time now.
Date d = dirEntry.getDate();
String timeStr = "";
if (d != null) {
if (System.currentTimeMillis() - d.getTime() < 365 * 1000 * 86400 / 2) {
timeStr = SVNDate.formatConsoleShortDate(d);
} else {
timeStr = SVNDate.formatConsoleLongDate(d);
}
}
buffer.append(SVNFormatUtil.formatString(timeStr, 12, false));
buffer.append(' ');
}
buffer.append(path);
if (dirEntry.getKind() == SVNNodeKind.DIR) {
buffer.append('/');
}
buffer.append('\n');
getSVNEnvironment().getOut().print(buffer.toString());
}
protected void printDirEntryXML(SVNDirEntry dirEntry) {
String path = dirEntry.getRelativePath();
if ("".equals(path)) {
if (getSVNEnvironment().isVerbose() && dirEntry.getKind() == SVNNodeKind.DIR) {
path = ".";
} else if (dirEntry.getKind() == SVNNodeKind.DIR) {
return;
}
}
StringBuffer buffer = new StringBuffer();
buffer = openXMLTag("entry", SVNXMLUtil.XML_STYLE_NORMAL, "kind", dirEntry.getKind().toString(), buffer);
buffer = openCDataTag("name", path, buffer);
if (dirEntry.getKind() == SVNNodeKind.FILE) {
buffer = openCDataTag("size", Long.toString(dirEntry.getSize()), buffer);
}
buffer = openXMLTag("commit", SVNXMLUtil.XML_STYLE_NORMAL, "revision", Long.toString(dirEntry.getRevision()), buffer);
buffer = openCDataTag("author", dirEntry.getAuthor(), buffer);
if (dirEntry.getDate() != null) {
buffer = openCDataTag("date", ((SVNDate) dirEntry.getDate()).format(), buffer);
}
buffer = closeXMLTag("commit", buffer);
SVNLock lock = dirEntry.getLock();
if (lock != null) {
buffer = openXMLTag("lock", SVNXMLUtil.XML_STYLE_NORMAL, null, buffer);
buffer = openCDataTag("token", lock.getID(), buffer);
buffer = openCDataTag("owner", lock.getOwner(), buffer);
buffer = openCDataTag("comment", lock.getComment(), buffer);
buffer = openCDataTag("created", ((SVNDate) lock.getCreationDate()).format(), buffer);
if (lock.getExpirationDate() != null && lock.getExpirationDate().getTime() > 0) {
buffer = openCDataTag("expires", ((SVNDate) lock.getExpirationDate()).format(), buffer);
}
buffer = closeXMLTag("lock", buffer);
}
buffer = closeXMLTag("entry", buffer);
getSVNEnvironment().getOut().print(buffer.toString());
}
}