blob: bceb516caef3fd9bd3bd53bd60a0a238ef4898d4 [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.idea.svn.browse;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.util.PathUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.api.BaseSvnClient;
import org.jetbrains.idea.svn.api.Depth;
import org.jetbrains.idea.svn.api.NodeKind;
import org.jetbrains.idea.svn.checkin.CmdCheckinClient;
import org.jetbrains.idea.svn.checkin.CommitInfo;
import org.jetbrains.idea.svn.commandLine.CommandExecutor;
import org.jetbrains.idea.svn.commandLine.CommandUtil;
import org.jetbrains.idea.svn.commandLine.SvnBindException;
import org.jetbrains.idea.svn.commandLine.SvnCommandName;
import org.jetbrains.idea.svn.lock.Lock;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc2.SvnTarget;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.List;
/**
* @author Konstantin Kolosovsky.
*/
public class CmdBrowseClient extends BaseSvnClient implements BrowseClient {
@Override
public void list(@NotNull SvnTarget target,
@Nullable SVNRevision revision,
@Nullable Depth depth,
@Nullable DirectoryEntryConsumer handler) throws VcsException {
assertUrl(target);
List<String> parameters = new ArrayList<String>();
CommandUtil.put(parameters, target);
CommandUtil.put(parameters, revision);
CommandUtil.put(parameters, depth);
parameters.add("--xml");
CommandExecutor command = execute(myVcs, target, SvnCommandName.list, parameters, null);
try {
parseOutput(target.getURL(), command, handler);
}
catch (SVNException e) {
throw new SvnBindException(e);
}
}
@Override
public long createDirectory(@NotNull SvnTarget target, @NotNull String message, boolean makeParents) throws VcsException {
assertUrl(target);
List<String> parameters = ContainerUtil.newArrayList();
CommandUtil.put(parameters, target);
CommandUtil.put(parameters, makeParents, "--parents");
parameters.add("--message");
parameters.add(message);
CmdCheckinClient.CommandListener listener = new CmdCheckinClient.CommandListener(null);
execute(myVcs, target, SvnCommandName.mkdir, parameters, listener);
return listener.getCommittedRevision();
}
private static void parseOutput(@NotNull SVNURL url, @NotNull CommandExecutor command, @Nullable DirectoryEntryConsumer handler)
throws VcsException, SVNException {
try {
TargetLists lists = CommandUtil.parse(command.getOutput(), TargetLists.class);
if (handler != null && lists != null) {
for (TargetList list : lists.lists) {
for (Entry entry : list.entries) {
handler.consume(entry.toDirectoryEntry(url));
}
}
}
}
catch (JAXBException e) {
throw new SvnBindException(e);
}
}
@XmlRootElement(name = "lists")
public static class TargetLists {
@XmlElement(name = "list")
public List<TargetList> lists = new ArrayList<TargetList>();
}
public static class TargetList {
@XmlAttribute(name = "path")
public String path;
@XmlElement(name = "entry")
public List<Entry> entries = new ArrayList<Entry>();
}
public static class Entry {
@XmlAttribute(name = "kind", required = true)
public NodeKind kind;
@XmlElement(name = "name")
public String name;
@XmlElement(name = "size")
public long size;
public CommitInfo.Builder commit;
public Lock.Builder lock;
@NotNull
public DirectoryEntry toDirectoryEntry(@NotNull SVNURL url) throws SVNException {
// TODO: repository is not used for now
return new DirectoryEntry(url.appendPath(name, false), null, PathUtil.getFileName(name), kind,
commit != null ? commit.build() : null, name);
}
}
}