blob: 6e0ee960b64aac05bebf6ced281f9634986ef106 [file] [log] [blame]
/*
* Copyright 2000-2012 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;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.util.Consumer;
import com.intellij.util.containers.Convertor;
import com.intellij.util.containers.MultiMap;
import junit.framework.Assert;
import junit.framework.TestCase;
import org.jetbrains.idea.svn.api.Depth;
import org.jetbrains.idea.svn.api.NodeKind;
import org.jetbrains.idea.svn.status.Status;
import org.jetbrains.idea.svn.info.Info;
import org.jetbrains.idea.svn.status.*;
import org.jetbrains.idea.svn.info.SvnInfoHandler;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.wc.SVNRevision;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
/**
* Created with IntelliJ IDEA.
* User: Irina.Chernushina
* Date: 11/9/12
* Time: 7:03 PM
*/
public class SvnParseCommandLineParseTest extends TestCase {
public static final String LINUX_ROOT = "/c7181320/";
public void testInfo() throws Exception {
final String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<info>\n" +
"<entry\n" +
" path=\"ReduceReturnOrYieldBreakTransformation.cs\"\n" +
" revision=\"91603\"\n" +
" kind=\"file\">\n" +
"<url>http://svn.labs.intellij.net/resharper/trunk/ReSharper/src/Decompiler.Core/Src/Transformations/StatementStructure/ReduceReturnOrYieldBreakTransformation.cs</url>\n" +
"<repository>\n" +
"<root>http://svn.labs.intellij.net/resharper</root>\n" +
"<uuid>ed0594e5-7722-0410-9c76-949374689613</uuid>\n" +
"</repository>\n" +
"<wc-info>\n" +
"<wcroot-abspath>C:/TestProjects/sortedProjects/Subversion/Resharper17short</wcroot-abspath>\n" +
"<schedule>normal</schedule>\n" +
"<depth>infinity</depth>\n" +
"<text-updated>2012-01-20T11:25:32.625000Z</text-updated>\n" +
"<checksum>7af8adacb93afaa48b2cfb76de605824c220983a</checksum>\n" +
"</wc-info>\n" +
"<commit\n" +
" revision=\"87972\">\n" +
"<author>Slava.Trenogin</author>\n" +
"<date>2011-10-06T21:27:41.539022Z</date>\n" +
"</commit>\n" +
"</entry>\n" +
"</info>";
final Info[] info = new Info[1];
final SvnInfoHandler handler = new SvnInfoHandler(new File("C:/base/"), new Consumer<Info>() {
@Override
public void consume(Info info1) {
info[0] = info1;
}
});
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new ByteArrayInputStream(s.getBytes(CharsetToolkit.UTF8_CHARSET)), handler);
Assert.assertNotNull(info[0]);
}
public void testStatus() throws Exception {
final String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<status>\n" +
"<target\n" +
" path=\".\">\n" +
"<entry\n" +
" path=\".\">\n" +
"<wc-status\n" +
" props=\"normal\"\n" +
" item=\"incomplete\"\n" +
" revision=\"92339\">\n" +
"<commit\n" +
" revision=\"91672\">\n" +
"<author>qx</author>\n" +
"<date>2012-01-27T16:11:06.069351Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"Decompiler\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" tree-conflicted=\"true\"\n" +
" item=\"missing\">\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"Help\">\n" +
"<wc-status\n" +
" props=\"normal\"\n" +
" item=\"incomplete\"\n" +
" revision=\"92339\">\n" +
"<commit\n" +
" revision=\"91555\">\n" +
"<author>Egor.Malyshev</author>\n" +
"<date>2012-01-18T18:05:07.328519Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"Help\\XML\">\n" +
"<wc-status\n" +
" props=\"normal\"\n" +
" item=\"incomplete\"\n" +
" revision=\"92339\">\n" +
"<commit\n" +
" revision=\"91555\">\n" +
"<author>Egor.Malyshev</author>\n" +
"<date>2012-01-18T18:05:07.328519Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"Help\\XML\\images\">\n" +
"<wc-status\n" +
" props=\"normal\"\n" +
" item=\"incomplete\"\n" +
" revision=\"92339\">\n" +
"<commit\n" +
" revision=\"91170\">\n" +
"<author>Maria.Egorkina</author>\n" +
"<date>2011-12-20T13:26:52.217550Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"Platform\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" item=\"external\">\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"ReSharper.ipr\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"91677\"\n" +
" props=\"normal\">\n" +
"<commit\n" +
" revision=\"87631\">\n" +
"<author>Alexey.Kuptsov</author>\n" +
"<date>2011-09-30T11:25:10.391467Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"ReSharper.iws\">\n" +
"<wc-status\n" +
" item=\"ignored\"\n" +
" props=\"none\">\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"measure.bat\">\n" +
"<wc-status\n" +
" item=\"unversioned\"\n" +
" props=\"none\">\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"src\\Daemon\\src\\HighlightingBase.cs\">\n" +
"<wc-status\n" +
" item=\"deleted\"\n" +
" revision=\"91677\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"79264\">\n" +
"<author>xvost</author>\n" +
"<date>2011-02-05T16:06:12.116814Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"src\\Daemon\\src\\HighlightingBase1.cs\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" copied=\"true\"\n" +
" item=\"added\">\n" +
"<commit\n" +
" revision=\"79264\">\n" +
"<author>xvost</author>\n" +
"<date>2011-02-05T16:06:12.116814Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"src\\Decompiler.Core\">\n" +
"<wc-status\n" +
" item=\"added\"\n" +
" props=\"normal\"\n" +
" copied=\"true\"\n" +
" tree-conflicted=\"true\">\n" +
"<commit\n" +
" revision=\"91559\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2012-01-18T19:17:40.876383Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"src\\Decompiler.Core\\Src\\Transformations\\Loops\\EliminateRedundantContinueTransformation.cs\">\n" +
"<wc-status\n" +
" props=\"normal\"\n" +
" copied=\"true\"\n" +
" item=\"modified\">\n" +
"<commit\n" +
" revision=\"87972\">\n" +
"<author>Slava.Trenogin</author>\n" +
"<date>2011-10-06T21:27:41.539022Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"src\\Decompiler.Core\\Src\\Transformations\\StatementStructure\\ReduceReturnOrYieldBreakTransformation.cs\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" props=\"normal\"\n" +
" copied=\"true\">\n" +
"<commit\n" +
" revision=\"87972\">\n" +
"<author>Slava.Trenogin</author>\n" +
"<date>2011-10-06T21:27:41.539022Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"stat.txt\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" item=\"unversioned\">\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\CommonServices\\src\\Services\\CommonServices.cs\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"92564\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"73708\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2010-09-10T14:14:04.090943Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Document.Tests\\AssemblyInfo.cs\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"92564\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"86795\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2011-09-11T13:54:16.917943Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Document.Tests\\RangeMarkerTest.cs\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" item=\"modified\"\n" +
" revision=\"92564\">\n" +
"<commit\n" +
" revision=\"77688\">\n" +
"<author>Alexander.Zverev</author>\n" +
"<date>2010-12-14T15:56:38.322018Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\AssemblyInfo.cs\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"92564\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"82127\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2011-04-13T20:57:30.828600Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\AssemblyNameInfo.cs\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"92564\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"90865\">\n" +
"<author>xvost</author>\n" +
"<date>2011-12-13T13:10:30.902950Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\BinaryBlobExtensions.cs\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"92564\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"74075\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2010-09-17T09:32:30.827654Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\BinaryBlobReader.cs\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" item=\"modified\"\n" +
" revision=\"92564\">\n" +
"<commit\n" +
" revision=\"74075\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2010-09-17T09:32:30.827654Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\BinaryBlobStream.cs\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" item=\"modified\"\n" +
" revision=\"92564\">\n" +
"<commit\n" +
" revision=\"74075\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2010-09-17T09:32:30.827654Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\BlobOnReader.cs\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"92564\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"74075\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2010-09-17T09:32:30.827654Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\ComStreamWrapper.cs\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"92564\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"91348\">\n" +
"<author>Sergey.Shkredov</author>\n" +
"<date>2012-01-09T11:26:53.770349Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\EmptyBlob.cs\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" item=\"modified\"\n" +
" revision=\"92564\">\n" +
"<commit\n" +
" revision=\"74075\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2010-09-17T09:32:30.827654Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\GAC.cs\">\n" +
"<wc-status\n" +
" props=\"normal\"\n" +
" item=\"modified\"\n" +
" revision=\"92564\">\n" +
"<commit\n" +
" revision=\"75626\">\n" +
"<author>Slava.Trenogin</author>\n" +
"<date>2010-10-21T07:41:45.036722Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\GacUtil.cs\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" item=\"modified\"\n" +
" revision=\"92564\">\n" +
"<commit\n" +
" revision=\"91646\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2012-01-21T19:08:04.108471Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\IBinaryReader.cs\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"92564\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"71390\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2010-07-12T18:29:27.763006Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\IntInterval.cs\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"92564\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"55567\">\n" +
"<author>qx</author>\n" +
"<date>2009-06-03T10:11:14.985037Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\ManifestResourceUtil.cs\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" item=\"modified\"\n" +
" revision=\"92564\">\n" +
"<commit\n" +
" revision=\"87972\">\n" +
"<author>Slava.Trenogin</author>\n" +
"<date>2011-10-06T21:27:41.539022Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\MarshalSpecParser.cs\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"92564\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"76982\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2010-11-28T10:16:36.309593Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\MetadataHelpers.cs\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" item=\"modified\"\n" +
" revision=\"92564\">\n" +
"<commit\n" +
" revision=\"91348\">\n" +
"<author>Sergey.Shkredov</author>\n" +
"<date>2012-01-09T11:26:53.770349Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\ModuleQualificationUtil.cs\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" item=\"modified\"\n" +
" revision=\"92564\">\n" +
"<commit\n" +
" revision=\"60918\">\n" +
"<author>xvost</author>\n" +
"<date>2009-11-03T10:42:37.363952Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\StreamBinaryReader.cs\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"92564\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"71390\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2010-07-12T18:29:27.763006Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\Resharper17short\\Platform\\src\\Metadata\\src\\Utils\\SubStream.cs\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"92564\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"76725\">\n" +
"<author>Leonid.Shalupov</author>\n" +
"<date>2010-11-20T13:23:44.172899Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"</target>\n" +
"<changelist\n" +
" name=\"ads\">\n" +
"<entry\n" +
" path=\"BuildVsix.cmd\">\n" +
"<wc-status\n" +
" item=\"modified\"\n" +
" revision=\"91677\"\n" +
" props=\"none\">\n" +
"<commit\n" +
" revision=\"77579\">\n" +
"<author>Victor.Kropp</author>\n" +
"<date>2010-12-13T11:06:36.141754Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"</changelist>\n" +
"</status>\n";
final SvnStatusHandler[] handlerArr = new SvnStatusHandler[1];
final boolean isWindows = SystemInfo.isWindows;
final String basePath = isWindows ? "C:/base/" : "/base33729/";
final SvnStatusHandler handler = new
SvnStatusHandler(new SvnStatusHandler.ExternalDataCallback() {
@Override
public void switchPath() {
handlerArr[0].getPending().getKind();
}
@Override
public void switchChangeList(String newList) {
}
}, new File(basePath), new Convertor<File, Info>() {
@Override
public Info convert(File o) {
try {
o.getCanonicalFile();
}
catch (IOException e) {
throw new RuntimeException(e);
}
if (isWindows) {
final int idx = o.getPath().indexOf(":");
Assert.assertTrue(idx > 0);
final int secondIdx = o.getPath().indexOf(":", idx + 1);
Assert.assertTrue(o.getPath(), secondIdx == -1);
} else {
if (o.getPath().contains(LINUX_ROOT)) {
Assert.assertFalse(o.getPath().contains(basePath));
}
}
try {
return createStubInfo(basePath + "1", "http://a.b.c");
}
catch (SVNException e) {
//
throw new RuntimeException(e);
}
}
});
handlerArr[0] = handler;
final String osChecked = changePathsIfNix(s);
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new ByteArrayInputStream(osChecked.getBytes(CharsetToolkit.UTF8_CHARSET)), handler);
final MultiMap<String,PortableStatus> changes = handler.getCurrentListChanges();
}
private String changePathsIfNix(String s) {
if (SystemInfo.isWindows) return s;
s = FileUtil.toSystemIndependentName(s);
return StringUtil.replace(s, "C:/", LINUX_ROOT);
}
private Info createStubInfo(final String basePath, final String baseUrl) throws SVNException {
return new Info(basePath, SVNURL.parseURIEncoded(baseUrl), SVNRevision.HEAD, NodeKind.FILE, "",
SVNURL.parseURIEncoded("http://a.b.c"), 1, new Date(), "me", null, Depth.EMPTY);
}
public void testStatusInExternalMove() throws Exception {
final String status = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<status>\n" +
"<target\n" +
" path=\".\">\n" +
"<entry\n" +
" path=\"slave\">\n" +
"<wc-status\n" +
" item=\"external\"\n" +
" props=\"none\">\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"src\\com\\test\\just\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" item=\"unversioned\">\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\local2\\sep12main\\main\\slave\\src\\com\\slave\\MacMessagesParser.java\">\n" +
"<wc-status\n" +
" item=\"added\"\n" +
" props=\"none\"\n" +
" copied=\"true\">\n" +
"<commit\n" +
" revision=\"7\">\n" +
"<author>admin</author>\n" +
"<date>2012-09-12T12:16:51.621000Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"C:\\TestProjects\\sortedProjects\\Subversion\\local2\\sep12main\\main\\slave\\src\\com\\slave\\SomeOtherClass.java\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" item=\"deleted\"\n" +
" revision=\"7\">\n" +
"<commit\n" +
" revision=\"7\">\n" +
"<author>admin</author>\n" +
"<date>2012-09-12T12:16:51.621000Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"</target>\n" +
"</status>";
final String basePath = "C:\\TestProjects\\sortedProjects\\Subversion\\local2\\sep12main\\main";
final SvnStatusHandler[] handler = new SvnStatusHandler[1];
final File baseFile = new File(basePath);
final SvnStatusHandler.ExternalDataCallback callback = CmdStatusClient.createStatusCallback(new StatusConsumer() {
@Override
public void consume(Status status) throws SVNException {
System.out.println(status.getURL());
if (new File(
"C:\\TestProjects\\sortedProjects\\Subversion\\local2\\sep12main\\main\\slave\\src\\com\\slave\\MacMessagesParser.java")
.equals(status.getFile())) {
Assert.assertEquals("http://external/src/com/slave/MacMessagesParser.java", status.getURL().toString());
}
if (new File("C:\\TestProjects\\sortedProjects\\Subversion\\local2\\sep12main\\main\\slave\\src\\com\\slave\\SomeOtherClass.java")
.equals(status.getFile())) {
Assert.assertEquals("http://external/src/com/slave/SomeOtherClass.java", status.getURL().toString());
}
}
}, baseFile, createStubInfo(basePath, "http://mainurl/"), handler);
handler[0] = new SvnStatusHandler(callback, baseFile, new Convertor<File, Info>() {
@Override
public Info convert(File o) {
try {
if (new File("C:\\TestProjects\\sortedProjects\\Subversion\\local2\\sep12main\\main\\slave").equals(o)) {
return createStubInfo(o.getPath(), "http://external");
}
return createStubInfo(o.getPath(), "http://12345");
}
catch (SVNException e) {
throw new RuntimeException(e);
}
}
});
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new ByteArrayInputStream(status.getBytes(CharsetToolkit.UTF8_CHARSET)), handler[0]);
final MultiMap<String,PortableStatus> changes = handler[0].getCurrentListChanges();
}
public void testStatusWithSwitched() throws Exception {
final String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<status>\n" +
"<target\n" +
" path=\".\">\n" +
"<entry\n" +
" path=\"root\\source\\s1.txt\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" switched=\"true\"\n" +
" item=\"normal\"\n" +
" revision=\"5\">\n" +
"<commit\n" +
" revision=\"4\">\n" +
"<author>Irina.Chernushina</author>\n" +
"<date>2013-02-18T13:14:24.391537Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"<entry\n" +
" path=\"root\\target\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" switched=\"true\"\n" +
" item=\"normal\"\n" +
" revision=\"5\">\n" +
"<commit\n" +
" revision=\"4\">\n" +
"<author>Irina.Chernushina</author>\n" +
"<date>2013-02-18T13:14:24.391537Z</date>\n" +
"</commit>\n" +
"</wc-status>\n" +
"</entry>\n" +
"</target>\n" +
"</status>";
final SvnStatusHandler[] handlerArr = new SvnStatusHandler[1];
final boolean isWindows = SystemInfo.isWindows;
final String basePath = isWindows ? "C:/base/" : "/base33729/";
final Set<PortableStatus> statuses = new HashSet<PortableStatus>();
final SvnStatusHandler handler = new
SvnStatusHandler(new SvnStatusHandler.ExternalDataCallback() {
@Override
public void switchPath() {
statuses.add(handlerArr[0].getPending());
handlerArr[0].getPending().getKind();
}
@Override
public void switchChangeList(String newList) {
}
}, new File(basePath), new Convertor<File, Info>() {
@Override
public Info convert(File o) {
try {
o.getCanonicalFile();
}
catch (IOException e) {
throw new RuntimeException(e);
}
if (isWindows) {
final int idx = o.getPath().indexOf(":");
Assert.assertTrue(idx > 0);
final int secondIdx = o.getPath().indexOf(":", idx + 1);
Assert.assertTrue(o.getPath(), secondIdx == -1);
} else {
if (o.getPath().contains(LINUX_ROOT)) {
Assert.assertFalse(o.getPath().contains(basePath));
}
}
try {
return createStubInfo(basePath + "1", "http://a.b.c");
}
catch (SVNException e) {
//
throw new RuntimeException(e);
}
}
});
handlerArr[0] = handler;
final String osChecked = changePathsIfNix(s);
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new ByteArrayInputStream(osChecked.getBytes(CharsetToolkit.UTF8_CHARSET)), handler);
final String[] expected = {"root\\source\\s1.txt", "root\\target"};
for (int i = 0; i < expected.length; i++) {
expected[i] = FileUtil.toSystemDependentName(expected[i]);
}
int cntMatched = 0;
for (PortableStatus status : statuses) {
Assert.assertTrue(status.isSwitched());
final String path = FileUtil.toSystemDependentName(status.getPath());
for (String s1 : expected) {
if (s1.equals(path)) {
++ cntMatched;
break;
}
}
}
Assert.assertEquals(2, cntMatched);
}
public void testOneFileInChangeListStatus() throws Exception {
final String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<status>\n" +
"<target\n" +
" path=\".\">\n" +
"</target>\n" +
"<changelist\n" +
" name=\"target\">\n" +
"<entry\n" +
" path=\"a.txt\">\n" +
"<wc-status\n" +
" props=\"none\"\n" +
" item=\"added\"\n" +
" revision=\"-1\">\n" +
"</wc-status>\n" +
"</entry>\n" +
"</changelist>\n" +
"</status>";
final SvnStatusHandler[] handlerArr = new SvnStatusHandler[1];
final boolean isWindows = SystemInfo.isWindows;
final String basePath = isWindows ? "C:/base/" : "/base33729/";
final Set<PortableStatus> statuses = new HashSet<PortableStatus>();
final String[] clName = new String[1];
final SvnStatusHandler handler = new
SvnStatusHandler(new SvnStatusHandler.ExternalDataCallback() {
@Override
public void switchPath() {
final PortableStatus pending = handlerArr[0].getPending();
pending.setChangelistName(clName[0]);
statuses.add(pending);
pending.getKind();
}
@Override
public void switchChangeList(String newList) {
clName[0] = newList;
}
}, new File(basePath), new Convertor<File, Info>() {
@Override
public Info convert(File o) {
try {
o.getCanonicalFile();
}
catch (IOException e) {
throw new RuntimeException(e);
}
if (isWindows) {
final int idx = o.getPath().indexOf(":");
Assert.assertTrue(idx > 0);
final int secondIdx = o.getPath().indexOf(":", idx + 1);
Assert.assertTrue(o.getPath(), secondIdx == -1);
} else {
if (o.getPath().contains(LINUX_ROOT)) {
Assert.assertFalse(o.getPath().contains(basePath));
}
}
try {
return createStubInfo(basePath + "1", "http://a.b.c");
}
catch (SVNException e) {
//
throw new RuntimeException(e);
}
}
});
handlerArr[0] = handler;
final String osChecked = changePathsIfNix(s);
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new ByteArrayInputStream(osChecked.getBytes(CharsetToolkit.UTF8_CHARSET)), handler);
Assert.assertEquals(1, statuses.size());
final PortableStatus next = statuses.iterator().next();
Assert.assertEquals("a.txt", next.getPath());
Assert.assertEquals("target", next.getChangelistName());
}
}