git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@278205 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -0,0 +1 @@ | |||||
| Moved to http://svn.apache.org/repos/asf/ant/sandbox/antlibs/antunit/trunk/ | |||||
| @@ -1,93 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2005 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <project default="compile"> | |||||
| <target name="setup"> | |||||
| <property name="build" value="build"/> | |||||
| <property name="build.classes" value="${build}/classes"/> | |||||
| <property name="build.testclasses" value="${build}/test-classes"/> | |||||
| <property name="build.lib" value="${build}/lib"/> | |||||
| <property name="jarname" value="${build.lib}/ant-antunit.jar"/> | |||||
| <mkdir dir="${build.classes}"/> | |||||
| <mkdir dir="${build.testclasses}"/> | |||||
| <mkdir dir="${build.lib}"/> | |||||
| </target> | |||||
| <target name="compile" depends="setup"> | |||||
| <javac | |||||
| srcdir="src/main" | |||||
| destdir="${build.classes}" | |||||
| debug="true" | |||||
| /> | |||||
| </target> | |||||
| <target name="antlib" depends="compile"> | |||||
| <copy todir="${build.classes}"> | |||||
| <fileset dir="src/main" includes="**/antlib.xml"/> | |||||
| </copy> | |||||
| <jar | |||||
| destfile="${jarname}" | |||||
| basedir="${build.classes}" | |||||
| /> | |||||
| </target> | |||||
| <target name="setup-for-tests" depends="setup"> | |||||
| <ant | |||||
| antfile="../../../build.xml" | |||||
| target="test-jar" | |||||
| inheritall="false" | |||||
| /> | |||||
| </target> | |||||
| <target name="compile-tests" depends="setup-for-tests, antlib"> | |||||
| <javac | |||||
| srcdir="src/testcases" | |||||
| destdir="${build.testclasses}" | |||||
| debug="true" | |||||
| > | |||||
| <classpath> | |||||
| <pathelement location="${jarname}"/> | |||||
| <pathelement location="../../../build/lib/ant-testutil.jar"/> | |||||
| </classpath> | |||||
| </javac> | |||||
| </target> | |||||
| <target name="test" depends="compile-tests"> | |||||
| <junit | |||||
| printsummary="false" | |||||
| haltonfailure="false" | |||||
| failureproperty="tests.failed" | |||||
| filtertrace="false" | |||||
| fork="true" | |||||
| forkmode="once" | |||||
| > | |||||
| <classpath> | |||||
| <pathelement location="${jarname}"/> | |||||
| <pathelement location="../../../build/lib/ant-testutil.jar"/> | |||||
| <pathelement location="${build.testclasses}"/> | |||||
| </classpath> | |||||
| <batchtest> | |||||
| <fileset dir="src/testcases"/> | |||||
| </batchtest> | |||||
| <formatter type="plain" usefile="false"/> | |||||
| </junit> | |||||
| <fail if="tests.failed">At least one test has failed.</fail> | |||||
| </target> | |||||
| </project> | |||||
| @@ -1,143 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2005 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <project name="assert-test" | |||||
| default="all" xmlns:au="antlib:org.apache.ant.antlib.antunit"> | |||||
| <target name="all"> | |||||
| <fail>Only run via JUnit</fail> | |||||
| </target> | |||||
| <target name="assertTruePass"> | |||||
| <au:assertTrue> | |||||
| <istrue value="true"/> | |||||
| </au:assertTrue> | |||||
| </target> | |||||
| <target name="assertTrueFail"> | |||||
| <au:assertTrue> | |||||
| <istrue value="false"/> | |||||
| </au:assertTrue> | |||||
| </target> | |||||
| <target name="assertFalsePass"> | |||||
| <au:assertFalse> | |||||
| <isfalse value="true"/> | |||||
| </au:assertFalse> | |||||
| </target> | |||||
| <target name="assertFalseFail"> | |||||
| <au:assertFalse> | |||||
| <isfalse value="false"/> | |||||
| </au:assertFalse> | |||||
| </target> | |||||
| <target name="assertEqualsPass"> | |||||
| <au:assertEquals expected="bar" actual="bar"/> | |||||
| </target> | |||||
| <target name="assertEqualsCasePass"> | |||||
| <au:assertEquals expected="bar" actual="BAR" casesensitive="false"/> | |||||
| </target> | |||||
| <target name="assertEqualsFail1"> | |||||
| <au:assertEquals expected="bar" actual="baz"/> | |||||
| </target> | |||||
| <target name="assertEqualsFail2"> | |||||
| <au:assertEquals expected="bar" actual="BAR"/> | |||||
| </target> | |||||
| <target name="assertPropertySetPass"> | |||||
| <property name="foo" value="bar"/> | |||||
| <au:assertPropertySet name="foo"/> | |||||
| </target> | |||||
| <target name="assertPropertySetFail"> | |||||
| <au:assertPropertySet name="foo"/> | |||||
| </target> | |||||
| <target name="assertPropertyEqualsPass"> | |||||
| <property name="foo" value="bar"/> | |||||
| <au:assertPropertyEquals name="foo" value="bar"/> | |||||
| </target> | |||||
| <target name="assertPropertyEqualsCasePass"> | |||||
| <property name="foo" value="bar"/> | |||||
| <au:assertPropertyEquals name="foo" value="BAR" casesensitive="false"/> | |||||
| </target> | |||||
| <target name="assertPropertyEqualsFail1"> | |||||
| <au:assertPropertyEquals name="foo" value="bar"/> | |||||
| </target> | |||||
| <target name="assertPropertyEqualsFail2"> | |||||
| <property name="foo" value="bar"/> | |||||
| <au:assertPropertyEquals name="foo" value="baz"/> | |||||
| </target> | |||||
| <target name="assertPropertyEqualsFail3"> | |||||
| <property name="foo" value="bar"/> | |||||
| <au:assertPropertyEquals name="foo" value="BAR"/> | |||||
| </target> | |||||
| <target name="assertFileExistsPass"> | |||||
| <au:assertFileExists file="assert.xml"/> | |||||
| </target> | |||||
| <target name="assertFileExistsFail"> | |||||
| <au:assertFileExists file="assert.txt"/> | |||||
| </target> | |||||
| <target name="assertFileDoesntExistPass"> | |||||
| <au:assertFileDoesntExist file="assert.txt"/> | |||||
| </target> | |||||
| <target name="assertFileDoesntExistFail"> | |||||
| <au:assertFileDoesntExist file="assert.xml"/> | |||||
| </target> | |||||
| <target name="assertDestIsUptodatePass"> | |||||
| <au:assertDestIsUptodate | |||||
| src="../../main/org/apache/ant/antlib/antunit/AssertTask.java" | |||||
| dest="../../../build/classes/org/apache/ant/antlib/antunit/AssertTask.class"/> | |||||
| </target> | |||||
| <target name="assertDestIsUptodateFail"> | |||||
| <au:assertDestIsUptodate | |||||
| dest="../../main/org/apache/ant/antlib/antunit/AssertTask.java" | |||||
| src="../../../build/classes/org/apache/ant/antlib/antunit/AssertTask.class"/> | |||||
| </target> | |||||
| <target name="assertDestIsOutofdatePass"> | |||||
| <au:assertDestIsOutofdate | |||||
| dest="../../main/org/apache/ant/antlib/antunit/AssertTask.java" | |||||
| src="../../../build/classes/org/apache/ant/antlib/antunit/AssertTask.class"/> | |||||
| </target> | |||||
| <target name="assertDestIsOutofdateFail"> | |||||
| <au:assertDestIsOutofdate | |||||
| src="../../main/org/apache/ant/antlib/antunit/AssertTask.java" | |||||
| dest="../../../build/classes/org/apache/ant/antlib/antunit/AssertTask.class"/> | |||||
| </target> | |||||
| </project> | |||||
| @@ -1,70 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.ant.antlib.antunit; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.taskdefs.condition.Condition; | |||||
| import org.apache.tools.ant.taskdefs.condition.ConditionBase; | |||||
| /** | |||||
| * Exits the active build, giving an additional message if the single | |||||
| * nested condition fails. | |||||
| * | |||||
| * <p>This one could as well be implemented as | |||||
| * | |||||
| * <pre> | |||||
| * <macrodef name="assertTrue"> | |||||
| * <attribute name="message" default="Assertion failed"/> | |||||
| * <element name="assertion" implicit="true"/> | |||||
| * <sequential> | |||||
| * <fail message="@{message}"> | |||||
| * <condition> | |||||
| * <assertion/> | |||||
| * </condition> | |||||
| * </fail> | |||||
| * </sequential> | |||||
| * </macrodef> | |||||
| * </pre> | |||||
| * | |||||
| * but wouldn't be able to throw a specialized exception that way - | |||||
| * and the macrodef would nest the exception in yet another | |||||
| * BuildException.</p> | |||||
| */ | |||||
| public class AssertTask extends ConditionBase { | |||||
| private String message = AssertionFailedException.DEFAULT_MESSAGE; | |||||
| public void setMessage(String value) { | |||||
| this.message = value; | |||||
| } | |||||
| public void execute() throws BuildException { | |||||
| int count = countConditions(); | |||||
| if (count > 1) { | |||||
| throw new BuildException("You must not specify more tha one " | |||||
| + "conditions"); | |||||
| } | |||||
| if (count < 1) { | |||||
| throw new BuildException("You must specify a condition"); | |||||
| } | |||||
| if (!((Condition) getConditions().nextElement()).eval()) { | |||||
| throw new AssertionFailedException(message); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,32 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.ant.antlib.antunit; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| /** | |||||
| * Specialized BuildException thrown by the AssertTask task. | |||||
| */ | |||||
| public class AssertionFailedException extends BuildException { | |||||
| public static final String DEFAULT_MESSAGE = "Assertion failed"; | |||||
| public AssertionFailedException(String message) { | |||||
| super(message); | |||||
| } | |||||
| } | |||||
| @@ -1,117 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2005 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <antlib xmlns:au="antlib:org.apache.ant.antlib.antunit"> | |||||
| <taskdef name="assertTrue" | |||||
| classname="org.apache.ant.antlib.antunit.AssertTask"/> | |||||
| <macrodef name="assertFalse"> | |||||
| <attribute name="message" default="Assertion failed"/> | |||||
| <element name="assertion" implicit="true"/> | |||||
| <sequential> | |||||
| <au:assertTrue message="@{message}"> | |||||
| <not> | |||||
| <assertion/> | |||||
| </not> | |||||
| </au:assertTrue> | |||||
| </sequential> | |||||
| </macrodef> | |||||
| <macrodef name="assertEquals"> | |||||
| <attribute name="expected"/> | |||||
| <attribute name="actual"/> | |||||
| <attribute name="casesensitive" default="true"/> | |||||
| <attribute name="message" | |||||
| default="Expected '@{expected}' but was '@{actual}'"/> | |||||
| <sequential> | |||||
| <au:assertTrue message="@{message}"> | |||||
| <equals arg1="@{expected}" arg2="@{actual}" | |||||
| casesensitive="@{casesensitive}"/> | |||||
| </au:assertTrue> | |||||
| </sequential> | |||||
| </macrodef> | |||||
| <macrodef name="assertPropertySet"> | |||||
| <attribute name="name"/> | |||||
| <attribute name="message" | |||||
| default="Expected property '@{name}'"/> | |||||
| <sequential> | |||||
| <au:assertTrue message="@{message}"> | |||||
| <isset property="@{name}"/> | |||||
| </au:assertTrue> | |||||
| </sequential> | |||||
| </macrodef> | |||||
| <macrodef name="assertPropertyEquals"> | |||||
| <attribute name="name"/> | |||||
| <attribute name="value"/> | |||||
| <attribute name="casesensitive" default="true"/> | |||||
| <attribute name="message" | |||||
| default="Expected property '@{name}' to have value '@{value}' but was '${@{name}}'"/> | |||||
| <sequential> | |||||
| <au:assertPropertySet message="@{message}" name="@{name}"/> | |||||
| <au:assertEquals message="@{message}" expected="@{value}" | |||||
| actual="${@{name}}" casesensitive="@{casesensitive}"/> | |||||
| </sequential> | |||||
| </macrodef> | |||||
| <macrodef name="assertFileExists"> | |||||
| <attribute name="file"/> | |||||
| <attribute name="message" | |||||
| default="Expected file '@{file}' to exist"/> | |||||
| <sequential> | |||||
| <au:assertTrue message="@{message}"> | |||||
| <available file="@{file}"/> | |||||
| </au:assertTrue> | |||||
| </sequential> | |||||
| </macrodef> | |||||
| <macrodef name="assertFileDoesntExist"> | |||||
| <attribute name="file"/> | |||||
| <attribute name="message" | |||||
| default="Didn't expect file '@{file}' to exist"/> | |||||
| <sequential> | |||||
| <au:assertFalse message="@{message}"> | |||||
| <available file="@{file}"/> | |||||
| </au:assertFalse> | |||||
| </sequential> | |||||
| </macrodef> | |||||
| <macrodef name="assertDestIsUptodate"> | |||||
| <attribute name="src"/> | |||||
| <attribute name="dest"/> | |||||
| <attribute name="message" | |||||
| default="Expected '@{dest}' to be more recent than '@{src}'"/> | |||||
| <sequential> | |||||
| <au:assertTrue message="@{message}"> | |||||
| <uptodate srcfile="@{src}" targetfile="@{dest}"/> | |||||
| </au:assertTrue> | |||||
| </sequential> | |||||
| </macrodef> | |||||
| <macrodef name="assertDestIsOutofdate"> | |||||
| <attribute name="src"/> | |||||
| <attribute name="dest"/> | |||||
| <attribute name="message" | |||||
| default="Expected '@{src}' to be more recent than '@{dest}'"/> | |||||
| <sequential> | |||||
| <au:assertFalse message="@{message}"> | |||||
| <uptodate srcfile="@{src}" targetfile="@{dest}"/> | |||||
| </au:assertFalse> | |||||
| </sequential> | |||||
| </macrodef> | |||||
| </antlib> | |||||
| @@ -1,138 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.ant.antlib.antunit; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.BuildFileTest; | |||||
| public class AssertTest extends BuildFileTest { | |||||
| public AssertTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| public void setUp() { | |||||
| configureProject("src/etc/testcases/assert.xml"); | |||||
| } | |||||
| public void testTruePass() { | |||||
| testPass("assertTruePass"); | |||||
| } | |||||
| public void testFalsePass() { | |||||
| testPass("assertFalsePass"); | |||||
| } | |||||
| public void testEqualsPass() { | |||||
| testPass("assertEqualsPass"); | |||||
| } | |||||
| public void testEqualsCasePass() { | |||||
| testPass("assertEqualsCasePass"); | |||||
| } | |||||
| public void testPropertySetPass() { | |||||
| testPass("assertPropertySetPass"); | |||||
| } | |||||
| public void testPropertyEqualsPass() { | |||||
| testPass("assertPropertyEqualsPass"); | |||||
| } | |||||
| public void testPropertyEqualsCasePass() { | |||||
| testPass("assertPropertyEqualsCasePass"); | |||||
| } | |||||
| public void testFileExistsPass() { | |||||
| testPass("assertFileExistsPass"); | |||||
| } | |||||
| public void testFileDoesntExistPass() { | |||||
| testPass("assertFileDoesntExistPass"); | |||||
| } | |||||
| public void testDestIsUptodatePass() { | |||||
| testPass("assertDestIsUptodatePass"); | |||||
| } | |||||
| public void testDestIsOutofdatePass() { | |||||
| testPass("assertDestIsOutofdatePass"); | |||||
| } | |||||
| public void testTrueFail() { | |||||
| testFail("assertTrueFail"); | |||||
| } | |||||
| public void testFalseFail() { | |||||
| testFail("assertFalseFail"); | |||||
| } | |||||
| public void testEqualsFail1() { | |||||
| testFail("assertEqualsFail1", "Expected 'bar' but was 'baz'"); | |||||
| } | |||||
| public void testEqualsFail2() { | |||||
| testFail("assertEqualsFail2", "Expected 'bar' but was 'BAR'"); | |||||
| } | |||||
| public void testPropertySetFail() { | |||||
| testFail("assertPropertySetFail", "Expected property 'foo'"); | |||||
| } | |||||
| public void testPropertyEqualsFail1() { | |||||
| testFail("assertPropertyEqualsFail1", "Expected property 'foo' to have value 'bar' but was '${foo}'"); | |||||
| } | |||||
| public void testPropertyEqualsFail2() { | |||||
| testFail("assertPropertyEqualsFail2", "Expected property 'foo' to have value 'baz' but was 'bar'"); | |||||
| } | |||||
| public void testPropertyEqualsFail3() { | |||||
| testFail("assertPropertyEqualsFail3", "Expected property 'foo' to have value 'BAR' but was 'bar'"); | |||||
| } | |||||
| public void testFileExistsFail() { | |||||
| testFail("assertFileExistsFail", | |||||
| "Expected file 'assert.txt' to exist"); | |||||
| } | |||||
| public void testFileDoesntExistFail() { | |||||
| testFail("assertFileDoesntExistFail", | |||||
| "Didn't expect file 'assert.xml' to exist"); | |||||
| } | |||||
| public void testDestIsUptodateFail() { | |||||
| testFail("assertDestIsUptodateFail", | |||||
| "Expected '../../main/org/apache/ant/antlib/antunit/AssertTask.java' to be more recent than '../../../build/classes/org/apache/ant/antlib/antunit/AssertTask.class'"); | |||||
| } | |||||
| public void testDestIsOutofdateFail() { | |||||
| testFail("assertDestIsOutofdateFail", | |||||
| "Expected '../../main/org/apache/ant/antlib/antunit/AssertTask.java' to be more recent than '../../../build/classes/org/apache/ant/antlib/antunit/AssertTask.class'"); | |||||
| } | |||||
| private void testPass(String target) { | |||||
| executeTarget(target); | |||||
| } | |||||
| private void testFail(String target) { | |||||
| testFail(target, "Assertion failed"); | |||||
| } | |||||
| private void testFail(String target, String message) { | |||||
| try { | |||||
| executeTarget(target); | |||||
| fail("Expected failed assetion"); | |||||
| } catch (AssertionFailedException e) { | |||||
| assertEquals(message, e.getMessage()); | |||||
| } catch (BuildException e) { | |||||
| // depending on the number of macrodef indirections, this | |||||
| // can become arbitrarily deep | |||||
| while (true) { | |||||
| Throwable t = e.getCause(); | |||||
| assertNotNull(t); | |||||
| assertTrue("nested is a BuildException", | |||||
| t instanceof BuildException); | |||||
| if (t instanceof AssertionFailedException) { | |||||
| assertEquals(message, e.getMessage()); | |||||
| break; | |||||
| } | |||||
| e = (BuildException) t; | |||||
| } | |||||
| } // end of try-catch | |||||
| } | |||||
| } | |||||
| @@ -1,38 +1 @@ | |||||
| dotnet sandbox README | |||||
| ===================== | |||||
| Author: | |||||
| ------- | |||||
| Stefan Bodewig, but feel free to go ahead and modify to your liking. | |||||
| Goal: | |||||
| ----- | |||||
| Provide a simple infrastructure to execute .NET applications from | |||||
| within Ant for different VMs so that the user doesn't have to change | |||||
| the build file when she wants to run Mono on Linux and Microsoft's VM | |||||
| on Windows. | |||||
| This sounds far more ambitioned than it actually is. | |||||
| Short term goals are: | |||||
| * A <dotnetexec> task that can be used as | |||||
| <dotnetexec executable="ExampleCsc.exe"/> | |||||
| without testing for the environment (see the dotnet.xml build file | |||||
| for Ant's tests as an example for what may become simpler with | |||||
| this). | |||||
| * A <nant> task. | |||||
| * A <msbuild> task - if only for the fun of having it. | |||||
| * A <wix> task. | |||||
| * A <nunit> task. | |||||
| Those tasks should end up in an antlib of their own in order to be | |||||
| distributable independent of Ant. | |||||
| Moved to http://svn.apache.org/repos/asf/ant/sandbox/antlibs/dotnet/trunk/ | |||||
| @@ -1,91 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2003-2004 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <project default="compile"> | |||||
| <target name="setup"> | |||||
| <property name="build" value="build"/> | |||||
| <property name="build.classes" value="${build}/classes"/> | |||||
| <property name="build.testclasses" value="${build}/test-classes"/> | |||||
| <property name="build.lib" value="${build}/lib"/> | |||||
| <property name="jarname" value="${build.lib}/dotnet.jar"/> | |||||
| <mkdir dir="${build.classes}"/> | |||||
| <mkdir dir="${build.testclasses}"/> | |||||
| <mkdir dir="${build.lib}"/> | |||||
| </target> | |||||
| <target name="compile" depends="setup"> | |||||
| <javac | |||||
| srcdir="src/main" | |||||
| destdir="${build.classes}" | |||||
| debug="true" | |||||
| /> | |||||
| </target> | |||||
| <target name="antlib" depends="compile"> | |||||
| <copy todir="${build.classes}"> | |||||
| <fileset dir="src/main" includes="**/antlib.xml"/> | |||||
| </copy> | |||||
| <jar | |||||
| destfile="${jarname}" | |||||
| basedir="${build.classes}" | |||||
| /> | |||||
| </target> | |||||
| <target name="setup-for-tests" depends="setup"> | |||||
| <ant | |||||
| antfile="../../../build.xml" | |||||
| target="test-jar" | |||||
| inheritall="false" | |||||
| /> | |||||
| </target> | |||||
| <target name="compile-tests" depends="setup-for-tests, antlib"> | |||||
| <javac | |||||
| srcdir="src/testcases" | |||||
| destdir="${build.testclasses}" | |||||
| debug="true" | |||||
| > | |||||
| <classpath> | |||||
| <pathelement location="${jarname}"/> | |||||
| <pathelement location="../../../build/lib/ant-testutil.jar"/> | |||||
| </classpath> | |||||
| </javac> | |||||
| </target> | |||||
| <target name="test" depends="compile-tests"> | |||||
| <junit | |||||
| printsummary="false" | |||||
| haltonfailure="false" | |||||
| failureproperty="tests.failed" | |||||
| filtertrace="false" | |||||
| > | |||||
| <classpath> | |||||
| <pathelement location="${jarname}"/> | |||||
| <pathelement location="../../../build/lib/ant-testutil.jar"/> | |||||
| <pathelement location="${build.testclasses}"/> | |||||
| </classpath> | |||||
| <batchtest> | |||||
| <fileset dir="src/testcases"/> | |||||
| </batchtest> | |||||
| <formatter type="plain" usefile="false"/> | |||||
| </junit> | |||||
| <fail if="tests.failed">At least one test has failed.</fail> | |||||
| </target> | |||||
| </project> | |||||
| @@ -1,32 +0,0 @@ | |||||
| <html> | |||||
| <head> | |||||
| <meta http-equiv="Content-Language" content="en-us"></meta> | |||||
| <title>DotNetExec Task</title> | |||||
| </head> | |||||
| <body> | |||||
| <h2><a name="dotnetexec">DotNetExec</a></h2> | |||||
| <h3>Description</h3> | |||||
| <p>Executes a .NET assembly that's on your PATH or pointed to | |||||
| directly by the executable attribute.</p> | |||||
| <p>This task is an extension of Ant's <a | |||||
| href="http://ant.apache.org/manual/CoreTasks/exec.html">exec</a> | |||||
| task and supports all attributes and nested child elements of that | |||||
| task. Use the executable attribute to specify the name of the | |||||
| assembly (including the extension).</p> | |||||
| <p>This task allows you to choose the .NET framework via the | |||||
| <code>vm</code> attribute. The default value is "microsoft" on | |||||
| Windows and "mono" on all other platforms. "microsoft" is a magic | |||||
| name that means "run the assembly as executable directly" - this | |||||
| may also work for Mono on Linux systems with the binfmt feature | |||||
| described in the <a | |||||
| href="http://www.go-mono.org/faq.html#q86">Mono FAQ</a>.</p> | |||||
| <hr/> | |||||
| <p align="center">Copyright © 2003-2004 The Apache Software Foundation. All rights Reserved.</p> | |||||
| </body> | |||||
| </html> | |||||
| @@ -1,142 +0,0 @@ | |||||
| <html> | |||||
| <head> | |||||
| <meta http-equiv="Content-Language" content="en-us"></meta> | |||||
| <title>Dotnet Ant Library</title> | |||||
| </head> | |||||
| <body> | |||||
| <h2>Introduction</h2> | |||||
| <p>This is a library of Ant tasks that support using .NET | |||||
| executables accross different platforms and in particular support | |||||
| using common .NET development tools like <a | |||||
| href="http://nant.sourceforge.net/">NAnt</a> or <a | |||||
| href="http://www.nunit.org/">NUnit</a> from within Ant.</p> | |||||
| <h2>Requirements</h2> | |||||
| <p>The current version requires Ant 1.6.2 or later and may even | |||||
| work better for a CVS build of Ant created from CVS HEAD.</p> | |||||
| <h2>Where is it?</h2> | |||||
| <p>The source code for the library currently lives in the | |||||
| developer sandbox in Ant's CVS - <a | |||||
| href="http://cvs.apache.org/viewcvs.cgi/ant/proposal/sandbox/dotnet/">http://cvs.apache.org/viewcvs.cgi/ant/proposal/sandbox/dotnet/</a>. | |||||
| A binary can be found at <a | |||||
| href="http://cvs.apache.org/~bodewig/dotnet/dotnet.jar">http://cvs.apache.org/~bodewig/dotnet/dotnet.jar</a>. | |||||
| A zip file containing the docs is also <a | |||||
| href="http://cvs.apache.org/~bodewig/dotnet/docs.zip">available</a>.</p> | |||||
| <p>Note that these are temporary locations and may change later.</p> | |||||
| <h2>Feedback</h2> | |||||
| <p>Right now direct any feedback either directly to <a | |||||
| href="mailto:bodewig@apache.org">me</a> or the <a | |||||
| href="http://ant.apache.org/mail.html#Developer List">Ant | |||||
| developer list</a>. | |||||
| <h2>Installation</h2> | |||||
| <p>If you are building this from sources, run the antlib target | |||||
| and you'll get a file <code>dotnet.jar</code>. If you've | |||||
| downloaded <code>dotnet.jar</code>, you are already ready.</p> | |||||
| <p>There are several ways to use the tasks:</p> | |||||
| <ul> | |||||
| <li>The traditional way: | |||||
| <pre> | |||||
| <taskdef | |||||
| resource="org/apache/tools/ant/taskdefs/optional/dotnet/antlib.xml"> | |||||
| <classpath> | |||||
| <pathelement location="YOUR-PATH-TO/dotnet.jar"/> | |||||
| </classpath> | |||||
| </taskdef> | |||||
| </pre> | |||||
| With this you can use the tasks like plain Ant tasks, they'll | |||||
| live in the default namespace. I.e. if you can run | |||||
| <exec> without any namespace prefix, you can do so for | |||||
| <dotnetexec> as well. | |||||
| </li> | |||||
| <li>Similar, but assigning a namespace URI | |||||
| <pre> | |||||
| <taskdef | |||||
| uri="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||||
| resource="org/apache/tools/ant/taskdefs/optional/dotnet/antlib.xml"> | |||||
| <classpath> | |||||
| <pathelement location="YOUR-PATH-TO/dotnet.jar"/> | |||||
| </classpath> | |||||
| </taskdef> | |||||
| </pre> | |||||
| This puts you task into a separate namespace than Ant's | |||||
| namespace. You would use the tasks like | |||||
| <pre> | |||||
| <project | |||||
| xmlns:dn="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||||
| xmlns="antlib:org.apache.tools.ant"> | |||||
| ... | |||||
| <dn:nant> | |||||
| <dn:target name="my-target"/> | |||||
| </dn:nant> | |||||
| </pre> | |||||
| or | |||||
| <pre> | |||||
| <nant xmlns="antlib:org.apache.tools.ant.taskdefs.optional.dotnet"> | |||||
| <target name="my-target"/> | |||||
| </nant> | |||||
| </pre> | |||||
| or a variation thereof. | |||||
| </li> | |||||
| <li>Using Ant's autodiscovery. Place <code>dotnet.jar</code> | |||||
| into a directory and use <code>ant -lib | |||||
| DIR-CONTAINING-THE-JAR</code> or copy it into | |||||
| <code>ANT_HOME/lib</code> - and then in your build file, simply | |||||
| declare the namespace on the <code>project</code> tag: | |||||
| <pre> | |||||
| <project | |||||
| xmlns:dn="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||||
| xmlns="antlib:org.apache.tools.ant"> | |||||
| </pre> | |||||
| And all tasks of this library will automatically be available | |||||
| in the <code>dn</code> namespace without any | |||||
| <code>taskdef</code>. | |||||
| </li> | |||||
| </ul> | |||||
| <h2>Tasks</h2> | |||||
| <ul> | |||||
| <li><a href="dotnetexec.html">dotnetexec</a> - run a .NET | |||||
| assembly that's in your PATH. You can chose the framework that | |||||
| is going to be used - defaults to Mono on non-Windows platforms | |||||
| and Microsoft's on Windows.</li> | |||||
| <li><a href="nant.html">nant</a> - execute the NAnt build | |||||
| tool.</li> | |||||
| <li><a href="msbuild.html">msbuild</a> - execute the MSBuild build | |||||
| tool, untested.</li> | |||||
| <li><a href="wix.html">wix</a> - execute the WiX toolset, untested.</li> | |||||
| <li><a href="nunit.html">nunit</a> - execute the | |||||
| nunit-console.exe <a href="http://www.nunit.org/">NUnit</a> | |||||
| test runner.</li> | |||||
| </ul> | |||||
| <hr/> | |||||
| <p align="center">Copyright © 2003-2004 The Apache Software Foundation. All rights Reserved.</p> | |||||
| </body> | |||||
| </html> | |||||
| @@ -1,109 +0,0 @@ | |||||
| <html> | |||||
| <head> | |||||
| <meta http-equiv="Content-Language" content="en-us"></meta> | |||||
| <title>MSBuild Task</title> | |||||
| </head> | |||||
| <body> | |||||
| <h2><a name="dotnetexec">MSBuild</a></h2> | |||||
| <h3>Description</h3> | |||||
| <p>Runs the MSBuild build tool presented at the 2003 PDC. This | |||||
| task is completely untested as the developers have no access to | |||||
| the tool, it has been implemented by looking at the docs only.</p> | |||||
| <p>You can either use an existing build file or nest a build file | |||||
| (snippet) as a child into the task. If you don't specify either, | |||||
| MSBuild's default build file search algorithm will apply.</p> | |||||
| <h3>Parameters</h3> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td align="center" valign="top"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">buildfile</td> | |||||
| <td valign="top">External build file to invoke MSBuild on.</td> | |||||
| <td align="center">No.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">vm</td> | |||||
| <td valign="top">Same as <a | |||||
| href="dotnetexec.html">dotnetexec</a>'s vm attribute. | |||||
| Specify the framework to use.</td> | |||||
| <td align="center">No.</td> | |||||
| </tr> | |||||
| </table> | |||||
| <h3>Parameters specified as nested elements</h3> | |||||
| <h4>target</h4> | |||||
| <p><code>target</code> has a single required attribute name - | |||||
| specifies a target to be run.</p> | |||||
| <h4>property</h4> | |||||
| <p><code>property</code> has two required attributes. name and | |||||
| value that specify name and value of a property that is to be | |||||
| defined in the MSBuild invocation.</p> | |||||
| <h4>build</h4> | |||||
| <p>This element allows no attributes. You can nest a MSBuild build | |||||
| file into it and MSBuild will be executed on that. You can also nest | |||||
| a build file snippet instead and Ant will wrap the necessary MSBuild | |||||
| <code><Project> around it.</code></p> | |||||
| <h3>Examples</h3> | |||||
| <p>Let MSBuild search for a *.proj file in the (Ant) project's base | |||||
| directory and execute the default target in it:</p> | |||||
| <pre><msbuild/></pre> | |||||
| <p>Let MSBuild execute the targets named foo and bar in the build | |||||
| file msbuild.proj in Ant's basedir and pass the property | |||||
| <code>/property:test=testvalue</code> to it:</p> | |||||
| <pre> | |||||
| <msbuild buildfile="msbuild.proj"> | |||||
| <target name="foo"/> | |||||
| <target name="bar"/> | |||||
| <property name="test" value="testvalue"/> | |||||
| </msbuild> | |||||
| </pre> | |||||
| <p>Define a build file embeded into the task, let MSBuild execute the | |||||
| echo target of that build file.</p> | |||||
| <pre> | |||||
| <msbuild> | |||||
| <target name="echo"> | |||||
| <build> | |||||
| <Project DefaultTargets="empty"> | |||||
| <Target Name="empty"/> | |||||
| <Target Name="echo"> | |||||
| <Task Name="Echo" Message="This is MSBuild"/> | |||||
| </Target> | |||||
| </Project> | |||||
| </build> | |||||
| </msbuild> | |||||
| </pre> | |||||
| <p>Run MSBuild's Echo task (if there actually is one):</p> | |||||
| <pre> | |||||
| <msbuild> | |||||
| <build> | |||||
| <Task Name="Echo" Message="This is MSBuild"/> | |||||
| </build> | |||||
| </msbuild> | |||||
| </pre> | |||||
| <hr/> | |||||
| <p align="center">Copyright © 2003-2004 The Apache Software Foundation. All rights Reserved.</p> | |||||
| </body> | |||||
| </html> | |||||
| @@ -1,108 +0,0 @@ | |||||
| <html> | |||||
| <head> | |||||
| <meta http-equiv="Content-Language" content="en-us"></meta> | |||||
| <title>NAnt Task</title> | |||||
| </head> | |||||
| <body> | |||||
| <h2><a name="dotnetexec">NAnt</a></h2> | |||||
| <h3>Description</h3> | |||||
| <p>Runs the <a href="http://nant.sourceforge.net/">NAnt</a> build | |||||
| tool.</p> | |||||
| <p>You can either use an existing build file or nest a build file | |||||
| (snippet) as a child into the task. If you don't specify either, | |||||
| NAnt's default build file search algorithm will apply.</p> | |||||
| <h3>Parameters</h3> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td align="center" valign="top"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">buildfile</td> | |||||
| <td valign="top">External build file to invoke NAnt on.</td> | |||||
| <td align="center">No.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">vm</td> | |||||
| <td valign="top">Same as <a | |||||
| href="dotnetexec.html">dotnetexec</a>'s vm attribute. | |||||
| Specify the framework to use.</td> | |||||
| <td align="center">No.</td> | |||||
| </tr> | |||||
| </table> | |||||
| <h3>Parameters specified as nested elements</h3> | |||||
| <h4>target</h4> | |||||
| <p><code>target</code> has a single required attribute name - | |||||
| specifies a target to be run.</p> | |||||
| <h4>property</h4> | |||||
| <p><code>property</code> has two required attributes. name and | |||||
| value that specify name and value of a property that is to be | |||||
| defined in the NAnt invocation.</p> | |||||
| <h4>build</h4> | |||||
| <p>This element allows no attributes. You can nest a NAnt build | |||||
| file into it and NAnt will be executed on that. You can also nest | |||||
| a build file snippet instead and Ant will wrap the necessary NAnt | |||||
| <code><project> around it.</code></p> | |||||
| <h3>Examples</h3> | |||||
| <p>Let NAnt search for a *.build file in the (Ant) project's base | |||||
| directory and execute the default target in it:</p> | |||||
| <pre><nant/></pre> | |||||
| <p>Let NAnt execute the targets named foo and bar in the build | |||||
| file nant.build in Ant's basedir and pass the property | |||||
| <code>-D:test=testvalue</code> to it:</p> | |||||
| <pre> | |||||
| <nant buildfile="nant.build"> | |||||
| <target name="foo"/> | |||||
| <target name="bar"/> | |||||
| <property name="test" value="testvalue"/> | |||||
| </nant> | |||||
| </pre> | |||||
| <p>Define a build file embeded into the task, let NAnt execute the | |||||
| echo target of that build file.</p> | |||||
| <pre> | |||||
| <nant> | |||||
| <target name="echo"> | |||||
| <build> | |||||
| <project basedir="." default="empty"> | |||||
| <target name="empty"/> | |||||
| <target name="echo"> | |||||
| <echo message="this is NAnt"/> | |||||
| </target> | |||||
| </project> | |||||
| </build> | |||||
| </nant> | |||||
| </pre> | |||||
| <p>Run NAnt's echo task:</p> | |||||
| <pre> | |||||
| <nant> | |||||
| <build> | |||||
| <echo message="this is NAnt"/> | |||||
| </build> | |||||
| </nant> | |||||
| </pre> | |||||
| <hr/> | |||||
| <p align="center">Copyright © 2003-2004 The Apache Software Foundation. All rights Reserved.</p> | |||||
| </body> | |||||
| </html> | |||||
| @@ -1,177 +0,0 @@ | |||||
| <html> | |||||
| <head> | |||||
| <meta http-equiv="Content-Language" content="en-us"></meta> | |||||
| <title>NUnit Task</title> | |||||
| </head> | |||||
| <body> | |||||
| <h2><a name="dotnetexec">NUnit</a></h2> | |||||
| <h3>Description</h3> | |||||
| <p>Runs the <a href="http://www.nunit.org/">NUnit</a> console | |||||
| test runner.</p> | |||||
| <h3>Parameters</h3> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td align="center" valign="top"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">vm</td> | |||||
| <td valign="top">Same as <a | |||||
| href="dotnetexec.html">dotnetexec</a>'s vm attribute. | |||||
| Specify the framework to use.</td> | |||||
| <td align="center">No.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">config</td> | |||||
| <td valign="top">Config file to use</td> | |||||
| <td align="center">No.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">output</td> | |||||
| <td valign="top">Where test output should go.</td> | |||||
| <td align="center">No.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">error</td> | |||||
| <td valign="top">Where test error output should go.</td> | |||||
| <td align="center">No.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">xmlout</td> | |||||
| <td valign="top">Where NUnit's XML output should go.</td> | |||||
| <td align="center">No.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">transform</td> | |||||
| <td valign="top">The transformation to apply.</td> | |||||
| <td align="center">No.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">thread</td> | |||||
| <td valign="top">Causes a separate thread to be created for | |||||
| running the tests - see the NUnit documentation for | |||||
| details.</td> | |||||
| <td align="center">No - defaults to false.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">noshadow</td> | |||||
| <td valign="top">Disables shadow copying of the assembly in | |||||
| order to provide improved performance..</td> | |||||
| <td align="center">No - defaults to false.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">fixture</td> | |||||
| <td valign="top">Test fixture to run.</td> | |||||
| <td align="center">No.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">labels</td> | |||||
| <td valign="top">Causes an identifying label to be displayed | |||||
| at the start of each test case.</td> | |||||
| <td align="center">No - defaults to false.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">failOnError</td> | |||||
| <td valign="top">Stops the build if NUnit returns with a code | |||||
| indicating an error or failure.</td> | |||||
| <td align="center">No - defaults to false.</td> | |||||
| </tr> | |||||
| </table> | |||||
| <h3>Parameters specified as nested elements</h3> | |||||
| <h4>testassembly</h4> | |||||
| <p><code>testassembly</code> has a single required attribute name - | |||||
| specifies an assembly or a project file holding tests.</p> | |||||
| <h4>include/exclude</h4> | |||||
| <p><code>in/exclude</code> have a single required attribute name - | |||||
| specifies a category to include or exclude from the tests.</p> | |||||
| <p><b>Note</b> that in current versions of NUnit (up to 2.2) you | |||||
| may choose to either include or exclude categories in a run, but | |||||
| not both. This task does <b>not</b> enforce this restriction | |||||
| since future versions of NUnit may change behavior.</p> | |||||
| <h4>redirector</h4> | |||||
| <p>A nested <a | |||||
| href="http://ant.apache.org/manual/CoreTypes/redirector.html">I/O | |||||
| Redirector</a> can be specified. Any file mapping is done using a | |||||
| <code>null</code> sourcefile; therefore not all <a | |||||
| href="http://ant.apache.org/manual/CoreTypes/mapper.html">Mapper</a> | |||||
| types will return results.</p> | |||||
| <h4>env</h4> <p>It is possible to specify environment variables to | |||||
| pass to the system command via nested <code><env></code> | |||||
| elements. They support the same attributes as the nested <a | |||||
| href="http://ant.apache.org/manual/CoreTasks/exec.html#env"><code>env</code> | |||||
| element of the <code><exec></code> task</a>.</p> | |||||
| <h3>Examples</h3> | |||||
| <h4>Specify an assembly or project:</h4> | |||||
| <pre> | |||||
| <nunit> | |||||
| <testassembly name="nunit.tests.dll"/> | |||||
| </nunit> | |||||
| </pre> | |||||
| <p>or</p> | |||||
| <pre> | |||||
| <nunit> | |||||
| <testassembly name="nunit.tests.csproj"/> | |||||
| </nunit> | |||||
| </pre> | |||||
| <h4>Specifying an Assembly and a Fixture</h4> | |||||
| <pre> | |||||
| <nunit fixture="NUnit.Tests.AssertionTests"> | |||||
| <testassembly name="nunit.tests.dll"/> | |||||
| </nunit> | |||||
| </pre> | |||||
| <h4>Specifying Test Categories to Include</h4> | |||||
| <pre> | |||||
| <nunit> | |||||
| <testassembly name="nunit.tests.dll"/> | |||||
| <include name="Baseline"/> | |||||
| </nunit> | |||||
| </pre> | |||||
| <h4>Specifying the XML file name</h4> | |||||
| <pre> | |||||
| <nunit xmlout="console-test.xml"> | |||||
| <testassembly name="nunit.tests.dll"/> | |||||
| </nunit> | |||||
| </pre> | |||||
| <p>changes the name of the output file to "console-test.xml" - | |||||
| note that this task will resolve file names relative to the | |||||
| project's base directory, not the current working directory.</p> | |||||
| <h4>Specifying Multiple Assemblies</h4> | |||||
| <pre> | |||||
| <nunit> | |||||
| <testassembly name="assembly1.dll"/> | |||||
| <testassembly name="assembly2.dll"/> | |||||
| <testassembly name="assembly3.dll"/> | |||||
| </nunit> | |||||
| </pre> | |||||
| <hr/> | |||||
| <p align="center">Copyright © 2004 The Apache Software Foundation. All rights Reserved.</p> | |||||
| </body> | |||||
| </html> | |||||
| @@ -1,177 +0,0 @@ | |||||
| <html> | |||||
| <head> | |||||
| <meta http-equiv="Content-Language" content="en-us"></meta> | |||||
| <title>Wix Task</title> | |||||
| </head> | |||||
| <body> | |||||
| <h2>Wix</h2> | |||||
| <h3>Description</h3> | |||||
| <p>Runs the candle, light or both from the <a | |||||
| href="http://sourceforge.net/projects/wix">Wix</a> toolset.</p> | |||||
| <h3>Parameters</h3> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td align="center" valign="top"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">source</td> | |||||
| <td valign="top">The single source file to process.</td> | |||||
| <td align="center">Either this or at least one nested | |||||
| <sources> set.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">target</td> | |||||
| <td valign="top">The expected target file.</td> | |||||
| <td align="center">Yes, unless you run candle without light.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">mode</td> | |||||
| <td valign="top">Which part of the toolset to run, one of | |||||
| "candle", "light" or | |||||
| "both".</td> | |||||
| <td align="center">No, default is "both".</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">vm</td> | |||||
| <td valign="top">Same as <a | |||||
| href="dotnetexec.html">dotnetexec</a>'s vm attribute. | |||||
| Specify the framework to use.</td> | |||||
| <td align="center">No.</td> | |||||
| </tr> | |||||
| </table> | |||||
| <h3>Parameters specified as nested elements</h3> | |||||
| <h4>sources</h4> | |||||
| <p>Specify source files that shall be passed on the command line. | |||||
| This is a <a | |||||
| href="http://ant.apache.org/manual/CoreTypes/fileset.html">fileset</a>.</p> | |||||
| <h4>moresources</h4> | |||||
| <p>Specify source files that shall not be passed on the command | |||||
| line. This is a <a | |||||
| href="http://ant.apache.org/manual/CoreTypes/fileset.html">fileset</a>.</p> | |||||
| <p>Typically this would list include files when running candle or | |||||
| the files that vecome part of the MSI file when running light. | |||||
| The files in this set are only used for timestamp comparisons. If | |||||
| neither these files nor the given "normal" sources are | |||||
| newer than the expected target, the task won't do anything.</p> | |||||
| <h3>Examples</h3> | |||||
| <p>Create <code>product.wixobj</code> from <code>product.wxs</code>:</p> | |||||
| <pre> | |||||
| <wix mode="candle" source="product.wxs"/> | |||||
| </pre> | |||||
| <p>The same but using a nested sources element:</p> | |||||
| <pre> | |||||
| <wix mode="candle"> | |||||
| <sources dir="."> | |||||
| <include name="product.wxs"/> | |||||
| </sources> | |||||
| </wix> | |||||
| </pre> | |||||
| <p>Create <code>product.msi</code> from <code>product.wixobj</code>:</p> | |||||
| <pre> | |||||
| <wix mode="light" source="product.wixobj" target="product.msi"/> | |||||
| </pre> | |||||
| <p>Combine the examples into a single step:</p> | |||||
| <pre> | |||||
| <wix source="product.wxs" target="product.msi"/> | |||||
| </pre> | |||||
| <p>Note that the task wouldn't do anything if | |||||
| <code>product.wxs</code> was older than | |||||
| <code>product.wixobj</code> and <code>product.wixobj</code> was | |||||
| older than <code>product.msi</code>.</p> | |||||
| <p>Compile multiple <code>.wxs</code> files at once:</p> | |||||
| <pre> | |||||
| <wix mode="candle"> | |||||
| <sources dir="."> | |||||
| <include name="*.wxs"/> | |||||
| </sources> | |||||
| </wix> | |||||
| </pre> | |||||
| <p>Compile multiple <code>.wxs</code> files at once, specify some | |||||
| include files in addition to that:</p> | |||||
| <pre> | |||||
| <wix mode="candle"> | |||||
| <sources dir="."> | |||||
| <include name="*.wxs"/> | |||||
| </sources> | |||||
| <moresources dir="."> | |||||
| <include name="*.wxi"/> | |||||
| </moresources> | |||||
| </wix> | |||||
| </pre> | |||||
| <p>Link multiple <code>.wixobj</code> files at once:</p> | |||||
| <pre> | |||||
| <wix mode="light" target="product.msi"> | |||||
| <sources dir="."> | |||||
| <include name="*.wixobj"/> | |||||
| </sources> | |||||
| </wix> | |||||
| </pre> | |||||
| <p>Link multiple <code>.wixobj</code> files at once and specify | |||||
| that the files in directory "source" will become part of | |||||
| the package:</p> | |||||
| <pre> | |||||
| <wix mode="light" target="product.msi"> | |||||
| <sources dir="."> | |||||
| <include name="*.wixobj"/> | |||||
| </sources> | |||||
| <moresources dir="source"/> | |||||
| </wix> | |||||
| </pre> | |||||
| <pre>Combine multiple <code>.wxs</code> files and include files | |||||
| into a single package and specify that the package will contain | |||||
| files from the source directory:</pre> | |||||
| <pre> | |||||
| <wix target="product.msi"> | |||||
| <sources dir="."> | |||||
| <include name="*.wxs"/> | |||||
| </sources> | |||||
| <moresources dir="."> | |||||
| <include name="*.wxi"/> | |||||
| </moresources> | |||||
| <moresources dir="source"/> | |||||
| </wix> | |||||
| </pre> | |||||
| <p>Again, if the intermediate <code>.wixobj</code> files are newer | |||||
| that the corresponding <code>.wxs</code> files (and all include | |||||
| files) the candle step will be skipped. If | |||||
| <code>product.msi</code> is newer than all files, the task won't | |||||
| do anything.</p> | |||||
| <hr/> | |||||
| <p align="center">Copyright © 2004 The Apache Software Foundation. All rights Reserved.</p> | |||||
| </body> | |||||
| </html> | |||||
| @@ -1,89 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2003-2004 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <project name="dotnet" basedir="." default="testCSC" | |||||
| xmlns:dn="antlib:org.apache.tools.ant.taskdefs.optional.dotnet"> | |||||
| <property environment="env"/> | |||||
| <property name="build.dir" location="build"/> | |||||
| <property name="src.dir" location="src"/> | |||||
| <property name="out.csc" location="${src.dir}/out.cs"/> | |||||
| <property name="out.app" location="${build.dir}/out.exe"/> | |||||
| <property name="out.type" value="exe"/> | |||||
| <taskdef | |||||
| uri="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||||
| resource="org/apache/tools/ant/taskdefs/optional/dotnet/antlib.xml"> | |||||
| <classpath> | |||||
| <pathelement location="../../../build/lib/dotnet.jar"/> | |||||
| </classpath> | |||||
| </taskdef> | |||||
| <target name="probe_for_apps" > | |||||
| <condition property="csc.found"> | |||||
| <or> | |||||
| <available file="csc" filepath="${env.PATH}" /> | |||||
| <available file="csc.exe" filepath="${env.PATH}" /> | |||||
| <available file="csc.exe" filepath="${env.Path}" /> | |||||
| </or> | |||||
| </condition> | |||||
| <echo> csc.found=${csc.found}</echo> | |||||
| <!-- Mono C# compiler --> | |||||
| <condition property="mcs.found"> | |||||
| <available file="mcs" filepath="${env.PATH}" /> | |||||
| </condition> | |||||
| <echo> mcs.found=${mcs.found}</echo> | |||||
| <!-- any C# compiler --> | |||||
| <condition property="c#.found"> | |||||
| <or> | |||||
| <isset property="csc.found"/> | |||||
| <isset property="mcs.found"/> | |||||
| </or> | |||||
| </condition> | |||||
| </target> | |||||
| <target name="init" depends="probe_for_apps"> | |||||
| <mkdir dir="${build.dir}"/> | |||||
| <property name="testCSC.exe" | |||||
| location="${build.dir}/ExampleCsc.exe" /> | |||||
| </target> | |||||
| <target name="teardown"> | |||||
| <delete dir="${build.dir}"/> | |||||
| </target> | |||||
| <target name="validate_csc" depends="init"> | |||||
| <fail unless="c#.found">Needed C# compiler is missing</fail> | |||||
| </target> | |||||
| <target name="testCSC" depends="validate_csc"> | |||||
| <csc | |||||
| destFile="${testCSC.exe}" | |||||
| targetType="exe"> | |||||
| <src dir="${src.dir}" includes="ex*.cs"/> | |||||
| </csc> | |||||
| <available property="app.created" file="${testCSC.exe}"/> | |||||
| <fail unless="app.created">No app ${testCSC.exe} created</fail> | |||||
| <dn:dotnetexec executable="${testCSC.exe}" failonerror="true" /> | |||||
| <delete file="${testCSC.exe}"/> | |||||
| </target> | |||||
| </project> | |||||
| @@ -1,73 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2003-2004 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <project name="msbuild" basedir="." default="echo" | |||||
| xmlns:dn="antlib:org.apache.tools.ant.taskdefs.optional.dotnet"> | |||||
| <taskdef | |||||
| uri="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||||
| resource="org/apache/tools/ant/taskdefs/optional/dotnet/antlib.xml"> | |||||
| <classpath> | |||||
| <pathelement location="../../../build/lib/dotnet.jar"/> | |||||
| </classpath> | |||||
| </taskdef> | |||||
| <property environment="env"/> | |||||
| <condition property="msbuild.found"> | |||||
| <or> | |||||
| <available file="MSBuild.exe" filepath="${env.PATH}"/> | |||||
| <available file="MSBuild.exe" filepath="${env.Path}"/> | |||||
| <available file="MSBuild.exe"/> | |||||
| </or> | |||||
| </condition> | |||||
| <target name="echo"> | |||||
| <msbuild | |||||
| buildfile="src/msbuild.proj" | |||||
| xmlns="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||||
| > | |||||
| <target name="echo"/> | |||||
| <property name="foo" value="bar"/> | |||||
| </msbuild> | |||||
| </target> | |||||
| <target name="nested-file"> | |||||
| <property name="foo" value="bar"/> | |||||
| <msbuild | |||||
| xmlns="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||||
| > | |||||
| <build> | |||||
| <Project DefaultTargets="echo"> | |||||
| <Target Name="echo"> | |||||
| <Task Name="Echo" Message="foo is ${foo}"/> | |||||
| </Target> | |||||
| </Project> | |||||
| </build> | |||||
| </msbuild> | |||||
| </target> | |||||
| <target name="nested-task"> | |||||
| <property name="foo" value="bar"/> | |||||
| <msbuild | |||||
| xmlns="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||||
| > | |||||
| <build> | |||||
| <Task Name="Echo" Message="foo is ${foo}"/> | |||||
| </build> | |||||
| </msbuild> | |||||
| </target> | |||||
| </project> | |||||
| @@ -1,72 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2003-2004 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <project name="nant" basedir="." default="echo" | |||||
| xmlns:dn="antlib:org.apache.tools.ant.taskdefs.optional.dotnet"> | |||||
| <taskdef | |||||
| uri="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||||
| resource="org/apache/tools/ant/taskdefs/optional/dotnet/antlib.xml"> | |||||
| <classpath> | |||||
| <pathelement location="../../../build/lib/dotnet.jar"/> | |||||
| </classpath> | |||||
| </taskdef> | |||||
| <property environment="env"/> | |||||
| <condition property="nant.found"> | |||||
| <or> | |||||
| <available file="NAnt.exe" filepath="${env.PATH}"/> | |||||
| <available file="NAnt.exe" filepath="${env.Path}"/> | |||||
| <available file="NAnt.exe"/> | |||||
| </or> | |||||
| </condition> | |||||
| <target name="echo"> | |||||
| <nant | |||||
| buildfile="src/nant.build" | |||||
| xmlns="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||||
| > | |||||
| <target name="echo"/> | |||||
| <property name="foo" value="bar"/> | |||||
| </nant> | |||||
| </target> | |||||
| <target name="nested-file"> | |||||
| <property name="foo" value="bar"/> | |||||
| <nant | |||||
| xmlns="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||||
| > | |||||
| <build> | |||||
| <project basedir="." default="echo"> | |||||
| <target name="echo"> | |||||
| <echo message="foo is ${foo}"/> | |||||
| </target> | |||||
| </project> | |||||
| </build> | |||||
| </nant> | |||||
| </target> | |||||
| <target name="nested-task"> | |||||
| <property name="foo" value="bar"/> | |||||
| <nant | |||||
| xmlns="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||||
| > | |||||
| <build> | |||||
| <echo message="foo is ${foo}"/> | |||||
| </build> | |||||
| </nant> | |||||
| </target> | |||||
| </project> | |||||
| @@ -1,81 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2004 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <project name="nunit" basedir="." default="echo" | |||||
| xmlns:dn="antlib:org.apache.tools.ant.taskdefs.optional.dotnet"> | |||||
| <property name="build.dir" value="build"/> | |||||
| <property name="src.dir" location="src"/> | |||||
| <taskdef | |||||
| uri="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||||
| resource="org/apache/tools/ant/taskdefs/optional/dotnet/antlib.xml"> | |||||
| <classpath> | |||||
| <pathelement location="../../../build/lib/dotnet.jar"/> | |||||
| </classpath> | |||||
| </taskdef> | |||||
| <property environment="env"/> | |||||
| <condition property="nunit.found"> | |||||
| <or> | |||||
| <available file="nunit-console.exe" filepath="${env.PATH}"/> | |||||
| <available file="nunit-console.exe" filepath="${env.Path}"/> | |||||
| <available file="nunit-console.exe"/> | |||||
| </or> | |||||
| </condition> | |||||
| <target name="no-assembly"> | |||||
| <dn:nunit/> | |||||
| </target> | |||||
| <target name="compile-pass"> | |||||
| <mkdir dir="${build.dir}"/> | |||||
| <csc destFile="${build.dir}/Pass.dll" | |||||
| targetType="library" references="nunit.framework.dll"> | |||||
| <src dir="${src.dir}" includes="pass.cs"/> | |||||
| </csc> | |||||
| </target> | |||||
| <target name="compile-fail"> | |||||
| <mkdir dir="${build.dir}"/> | |||||
| <csc destFile="${build.dir}/Fail.dll" | |||||
| targetType="library" references="nunit.framework.dll"> | |||||
| <src dir="${src.dir}" includes="fail.cs"/> | |||||
| </csc> | |||||
| </target> | |||||
| <target name="passing-test" depends="compile-pass"> | |||||
| <dn:nunit> | |||||
| <testassembly name="${build.dir}/Pass.dll"/> | |||||
| </dn:nunit> | |||||
| </target> | |||||
| <target name="failing-test" depends="compile-fail"> | |||||
| <dn:nunit> | |||||
| <testassembly name="${build.dir}/Fail.dll"/> | |||||
| </dn:nunit> | |||||
| </target> | |||||
| <target name="failing-test-with-fail" depends="compile-fail"> | |||||
| <dn:nunit failonerror="true"> | |||||
| <testassembly name="${build.dir}/Fail.dll"/> | |||||
| </dn:nunit> | |||||
| </target> | |||||
| <target name="teardown"> | |||||
| <delete dir="${build.dir}"/> | |||||
| </target> | |||||
| </project> | |||||
| @@ -1,25 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2001-2004 The Apache Software Foundation | |||||
| * | |||||
| * 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. | |||||
| * | |||||
| */ | |||||
| using System; | |||||
| public class Example { | |||||
| public static void Main(String[] args) { | |||||
| Example2.echo(); | |||||
| } | |||||
| } | |||||
| @@ -1,31 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2001-2004 The Apache Software Foundation | |||||
| * | |||||
| * 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. | |||||
| * | |||||
| */ | |||||
| using System; | |||||
| /** | |||||
| * this is just here to create confusion | |||||
| */ | |||||
| public class Example2 { | |||||
| public int some_variable=3; | |||||
| public static void echo() { | |||||
| Console.WriteLine("hello, I look like Java, but I'm really .NET"); | |||||
| } | |||||
| } | |||||
| @@ -1,30 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * 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. | |||||
| * | |||||
| */ | |||||
| using System; | |||||
| using NUnit.Framework; | |||||
| [TestFixture] | |||||
| public class FailingTest | |||||
| { | |||||
| [Test] | |||||
| public void Fail() | |||||
| { | |||||
| Assert.IsTrue(false); | |||||
| } | |||||
| } | |||||
| @@ -1,24 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2003-2004 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <Project DefaultTargets="empty"> | |||||
| <Target Name="empty"/> | |||||
| <Target Name="echo"> | |||||
| <Task Name="Echo" Message="foo is ${foo}"/> | |||||
| </Target> | |||||
| </Project> | |||||
| @@ -1,24 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2003-2004 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <project basedir="." default="empty"> | |||||
| <target name="empty"/> | |||||
| <target name="echo"> | |||||
| <echo message="foo is ${foo}"/> | |||||
| </target> | |||||
| </project> | |||||
| @@ -1,30 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * 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. | |||||
| * | |||||
| */ | |||||
| using System; | |||||
| using NUnit.Framework; | |||||
| [TestFixture] | |||||
| public class PassingTest | |||||
| { | |||||
| [Test] | |||||
| public void Pass() | |||||
| { | |||||
| Assert.IsTrue(true); | |||||
| } | |||||
| } | |||||
| @@ -1,259 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2003-2004 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.util.DOMElementWriter; | |||||
| import org.apache.tools.ant.util.FileUtils; | |||||
| import org.apache.tools.ant.util.XMLFragment; | |||||
| import org.w3c.dom.DocumentFragment; | |||||
| import org.w3c.dom.Element; | |||||
| import java.io.File; | |||||
| import java.io.FileOutputStream; | |||||
| import java.io.IOException; | |||||
| import java.util.ArrayList; | |||||
| import java.util.List; | |||||
| /** | |||||
| * Base class for NAntTask and MSBuildTask. | |||||
| */ | |||||
| public abstract class AbstractBuildTask extends Task { | |||||
| /** | |||||
| * The buildfile to invoke the build tool for. | |||||
| */ | |||||
| private File buildFile; | |||||
| /** | |||||
| * The targets to execute. | |||||
| */ | |||||
| private List targets = new ArrayList(); | |||||
| /** | |||||
| * Properties to set. | |||||
| */ | |||||
| private List properties = new ArrayList(1); | |||||
| /** | |||||
| * Nested build file fragment. | |||||
| */ | |||||
| private XMLFragment buildSnippet; | |||||
| /** | |||||
| * The vm attribute - if given. | |||||
| */ | |||||
| private String vm; | |||||
| /** | |||||
| * Empty constructor. | |||||
| */ | |||||
| protected AbstractBuildTask() { | |||||
| } | |||||
| /** | |||||
| * Sets the name of the build file. | |||||
| */ | |||||
| public final void setBuildfile(File f) { | |||||
| buildFile = f; | |||||
| } | |||||
| /** | |||||
| * Adds a build file fragment. | |||||
| */ | |||||
| public void addBuild(XMLFragment f) { | |||||
| if (buildSnippet == null) { | |||||
| buildSnippet = f; | |||||
| } else { | |||||
| throw new BuildException("You must not specify more than one " | |||||
| + "build element"); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Set the name of the executable for the virtual machine. | |||||
| * | |||||
| * @param value the name of the executable for the virtual machine | |||||
| */ | |||||
| public void setVm(String value) { | |||||
| this.vm = value; | |||||
| } | |||||
| /** | |||||
| * A target. | |||||
| */ | |||||
| public static class Target { | |||||
| private String name; | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * A target to execute. | |||||
| */ | |||||
| public final void addTarget(Target t) { | |||||
| targets.add(t); | |||||
| } | |||||
| /** | |||||
| * A property. | |||||
| */ | |||||
| // XXX, could have reused Property or Environment.Variable | |||||
| // - not decided so far | |||||
| public static class Property { | |||||
| private String name; | |||||
| private String value; | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setValue(String value) { | |||||
| this.value = value; | |||||
| } | |||||
| public String getValue() { | |||||
| return value; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * A target to execute. | |||||
| */ | |||||
| public final void addProperty(Property t) { | |||||
| properties.add(t); | |||||
| } | |||||
| /** | |||||
| * Must return the executable. | |||||
| * | |||||
| * @return must not return null | |||||
| */ | |||||
| protected abstract String getExecutable(); | |||||
| /** | |||||
| * Must return buildfile argument(s). | |||||
| * | |||||
| * @param buildFile the absolute File for the buildfile or null if | |||||
| * the user didn't specify a buildfile. | |||||
| * | |||||
| * @return must not return null | |||||
| */ | |||||
| protected abstract String[] getBuildfileArguments(File buildFile); | |||||
| /** | |||||
| * Must return target argument(s). | |||||
| * | |||||
| * @return must not return null | |||||
| */ | |||||
| protected abstract String[] getTargetArguments(List targets); | |||||
| /** | |||||
| * Must return property argument(s). | |||||
| * | |||||
| * @return must not return null | |||||
| */ | |||||
| protected abstract String[] getPropertyArguments(List properties); | |||||
| /** | |||||
| * Turn the DoucmentFragment into a DOM tree suitable as a build | |||||
| * file when serialized. | |||||
| * | |||||
| * <p>Must throw a BuildException if the snippet can not be turned | |||||
| * into a build file.</p> | |||||
| */ | |||||
| protected abstract Element makeTree(DocumentFragment f); | |||||
| /** | |||||
| * Perform the build. | |||||
| */ | |||||
| public void execute() { | |||||
| if (buildFile != null && buildSnippet != null) { | |||||
| throw new BuildException("You must not specify the build file" | |||||
| + " attribute and a nested build at the" | |||||
| + " same time"); | |||||
| } | |||||
| DotNetExecTask exec = DotNetExecTask.getTask(this, vm, | |||||
| getExecutable(), null); | |||||
| String[] args = getPropertyArguments(properties); | |||||
| for (int i = 0; i < args.length; i++) { | |||||
| exec.createArg().setValue(args[i]); | |||||
| } | |||||
| args = getTargetArguments(targets); | |||||
| for (int i = 0; i < args.length; i++) { | |||||
| exec.createArg().setValue(args[i]); | |||||
| } | |||||
| File generatedFile = null; | |||||
| if (buildSnippet != null) { | |||||
| try { | |||||
| generatedFile = getBuildFile(); | |||||
| } catch (IOException e) { | |||||
| throw new BuildException(e); | |||||
| } | |||||
| args = getBuildfileArguments(generatedFile); | |||||
| } else { | |||||
| args = getBuildfileArguments(buildFile); | |||||
| } | |||||
| for (int i = 0; i < args.length; i++) { | |||||
| exec.createArg().setValue(args[i]); | |||||
| } | |||||
| try { | |||||
| exec.execute(); | |||||
| } finally { | |||||
| if (generatedFile != null) { | |||||
| generatedFile.delete(); | |||||
| } | |||||
| } | |||||
| } | |||||
| private File getBuildFile() throws IOException { | |||||
| File f = null; | |||||
| if (buildSnippet != null) { | |||||
| Element e = makeTree(buildSnippet.getFragment()); | |||||
| f = FileUtils.newFileUtils().createTempFile("build", ".xml", null); | |||||
| f.deleteOnExit(); | |||||
| FileOutputStream out = null; | |||||
| try { | |||||
| out = new FileOutputStream(f); | |||||
| (new DOMElementWriter()).write(e, out); | |||||
| } finally { | |||||
| if (out != null) { | |||||
| out.close(); | |||||
| } | |||||
| } | |||||
| } | |||||
| return f; | |||||
| } | |||||
| } | |||||
| @@ -1,150 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2003-2004 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.taskdefs.ExecTask; | |||||
| import org.apache.tools.ant.taskdefs.condition.Os; | |||||
| import org.apache.tools.ant.types.Environment; | |||||
| /** | |||||
| * Specialized <exec> that knows how to deal with Mono vs. Microsoft's | |||||
| * VM - and maybe Rotor at some point. | |||||
| */ | |||||
| public class DotNetExecTask extends ExecTask { | |||||
| /** | |||||
| * "Magic" VM argument for Microsoft's VM. | |||||
| */ | |||||
| private static final String MS_VM = "microsoft"; | |||||
| /** | |||||
| * The user supplied executable attribute. | |||||
| */ | |||||
| private String executable; | |||||
| /** | |||||
| * The .NET VM to use. | |||||
| * | |||||
| * <p>Defaults to Microsoft's on Windows and mono on any other | |||||
| * platform.</p> | |||||
| */ | |||||
| private String vm = Os.isFamily("windows") ? MS_VM : "mono"; | |||||
| /** | |||||
| * Empty Constructor. | |||||
| */ | |||||
| public DotNetExecTask() { | |||||
| super(); | |||||
| } | |||||
| /** | |||||
| * Set the name of the executable program. | |||||
| * @param value the name of the executable program | |||||
| */ | |||||
| public void setExecutable(String value) { | |||||
| this.executable = value; | |||||
| } | |||||
| /** | |||||
| * Set the name of the executable for the virtual machine or the | |||||
| * magic name "microsoft" which implies that we can invoke the | |||||
| * executable directly. | |||||
| * | |||||
| * @param value the name of the executable for the virtual machine | |||||
| */ | |||||
| public void setVm(String value) { | |||||
| this.vm = value; | |||||
| } | |||||
| /** | |||||
| * Do the work. | |||||
| * | |||||
| * @throws BuildException if executable is empty or <exec> | |||||
| * throws an exception. | |||||
| */ | |||||
| public void execute() throws BuildException { | |||||
| if (executable == null) { | |||||
| throw new BuildException("The executable attribute is required"); | |||||
| } | |||||
| setupCommandline(); | |||||
| super.execute(); | |||||
| } | |||||
| /** | |||||
| * If the inherited Commandline doesn't know about the executable | |||||
| * yet, set it and deal with the vm attribute. | |||||
| * | |||||
| * <p>The inherited Commandline may know the executable already if | |||||
| * this task instance is getting reused.</p> | |||||
| */ | |||||
| protected void setupCommandline() { | |||||
| if (cmdl.getExecutable() == null) { | |||||
| if (vm.equals(MS_VM)) { | |||||
| // can invoke executable directly | |||||
| super.setExecutable(executable); | |||||
| } else { | |||||
| boolean b = getResolveExecutable(); | |||||
| // Mono wants the absolte path of the assembly | |||||
| setResolveExecutable(b || isMono(vm)); | |||||
| super.setExecutable(vm); | |||||
| cmdl.createArgument(true) | |||||
| .setValue(resolveExecutable(executable, isMono(vm))); | |||||
| setResolveExecutable(b); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Whether the given vm looks like the Mono executable. | |||||
| */ | |||||
| protected final static boolean isMono(String vm) { | |||||
| return "mono".equals(vm) || "mint".equals(vm); | |||||
| } | |||||
| /** | |||||
| * Creates an instance of this task based on a different tasks settings. | |||||
| */ | |||||
| public static DotNetExecTask getTask(Task t, String vm, | |||||
| String executable, | |||||
| Environment env) { | |||||
| DotNetExecTask exec = new DotNetExecTask(); | |||||
| if (vm != null) { | |||||
| exec.setVm(vm); | |||||
| } | |||||
| exec.setProject(t.getProject()); | |||||
| exec.setExecutable(executable); | |||||
| exec.setTaskName(t.getTaskName()); | |||||
| if (env != null) { | |||||
| String[] environment = env.getVariables(); | |||||
| if (environment != null) { | |||||
| for (int i = 0; i < environment.length; i++) { | |||||
| int idx = environment[i].indexOf("="); | |||||
| Environment.Variable v = new Environment.Variable(); | |||||
| v.setKey(environment[i].substring(0, idx)); | |||||
| v.setValue(environment[i].substring(idx + 1)); | |||||
| exec.addEnv(v); | |||||
| } | |||||
| } | |||||
| } | |||||
| return exec; | |||||
| } | |||||
| } | |||||
| @@ -1,120 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2003-2004 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import java.io.File; | |||||
| import java.util.Iterator; | |||||
| import java.util.ArrayList; | |||||
| import java.util.List; | |||||
| import org.w3c.dom.DocumentFragment; | |||||
| import org.w3c.dom.Element; | |||||
| import org.w3c.dom.Node; | |||||
| import org.w3c.dom.NodeList; | |||||
| /** | |||||
| * Runs a MSBuild build process. | |||||
| */ | |||||
| public class MSBuildTask extends AbstractBuildTask { | |||||
| private static final String TARGET = "generated-by-ant"; | |||||
| public MSBuildTask() { | |||||
| super(); | |||||
| } | |||||
| protected String getExecutable() { | |||||
| return "MSBuild.exe"; | |||||
| } | |||||
| protected String[] getBuildfileArguments(File buildFile) { | |||||
| if (buildFile != null) { | |||||
| return new String[] { | |||||
| buildFile.getAbsolutePath() | |||||
| }; | |||||
| } else { | |||||
| return new String[0]; | |||||
| } | |||||
| } | |||||
| protected String[] getTargetArguments(List targets) { | |||||
| if (targets.size() > 0) { | |||||
| StringBuffer sb = new StringBuffer("/targets:"); | |||||
| Iterator iter = targets.iterator(); | |||||
| boolean first = true; | |||||
| while (iter.hasNext()) { | |||||
| AbstractBuildTask.Target t = | |||||
| (AbstractBuildTask.Target) iter.next(); | |||||
| if (!first) { | |||||
| sb.append(";"); | |||||
| } | |||||
| sb.append(t.getName()); | |||||
| } | |||||
| return new String[]{sb.toString()}; | |||||
| } else { | |||||
| return new String[0]; | |||||
| } | |||||
| } | |||||
| protected String[] getPropertyArguments(List properties) { | |||||
| if (properties.size() > 0) { | |||||
| StringBuffer sb = new StringBuffer("/property:"); | |||||
| Iterator iter = properties.iterator(); | |||||
| boolean first = true; | |||||
| while (iter.hasNext()) { | |||||
| AbstractBuildTask.Property p = | |||||
| (AbstractBuildTask.Property) iter.next(); | |||||
| if (!first) { | |||||
| sb.append(";"); | |||||
| } | |||||
| sb.append(p.getName()).append("=").append(p.getValue()); | |||||
| } | |||||
| return new String[]{sb.toString()}; | |||||
| } else { | |||||
| return new String[0]; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Turn the DocumentFragment into a DOM tree suitable as a build | |||||
| * file when serialized. | |||||
| * | |||||
| * <p>If we have exactly one <Project> child, return that. | |||||
| * Otherwise if we have only <Task> children, wrap them into a | |||||
| * <Target> which in turn gets wrapped into a <Project>. | |||||
| * Otherwise, fail.</p> | |||||
| */ | |||||
| protected Element makeTree(DocumentFragment f) { | |||||
| NodeList nl = f.getChildNodes(); | |||||
| if (nl.getLength() == 1 | |||||
| && nl.item(0).getNodeType() == Node.ELEMENT_NODE | |||||
| && nl.item(0).getNodeName().equals("Project")) { | |||||
| return (Element) nl.item(0); | |||||
| } else { | |||||
| Element p = f.getOwnerDocument().createElement("Project"); | |||||
| p.setAttribute("DefaultTargets", TARGET); | |||||
| Element t = f.getOwnerDocument().createElement("Target"); | |||||
| t.setAttribute("Name", TARGET); | |||||
| p.appendChild(t); | |||||
| t.appendChild(f); | |||||
| return p; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,94 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2003-2004 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import java.io.File; | |||||
| import java.util.Iterator; | |||||
| import java.util.ArrayList; | |||||
| import java.util.List; | |||||
| import org.w3c.dom.DocumentFragment; | |||||
| import org.w3c.dom.Element; | |||||
| import org.w3c.dom.Node; | |||||
| import org.w3c.dom.NodeList; | |||||
| /** | |||||
| * Runs a NAnt build process. | |||||
| */ | |||||
| public class NAntTask extends AbstractBuildTask { | |||||
| public NAntTask() { | |||||
| super(); | |||||
| } | |||||
| protected String getExecutable() { | |||||
| return "NAnt.exe"; | |||||
| } | |||||
| protected String[] getBuildfileArguments(File buildFile) { | |||||
| if (buildFile != null) { | |||||
| return new String[] { | |||||
| "-buildfile:" + buildFile.getAbsolutePath() | |||||
| }; | |||||
| } else { | |||||
| return new String[0]; | |||||
| } | |||||
| } | |||||
| protected String[] getTargetArguments(List targets) { | |||||
| ArrayList al = new ArrayList(targets.size()); | |||||
| Iterator iter = targets.iterator(); | |||||
| while (iter.hasNext()) { | |||||
| AbstractBuildTask.Target t = (AbstractBuildTask.Target) iter.next(); | |||||
| al.add(t.getName()); | |||||
| } | |||||
| return (String[]) al.toArray(new String[al.size()]); | |||||
| } | |||||
| protected String[] getPropertyArguments(List properties) { | |||||
| ArrayList al = new ArrayList(properties.size()); | |||||
| Iterator iter = properties.iterator(); | |||||
| while (iter.hasNext()) { | |||||
| AbstractBuildTask.Property p = | |||||
| (AbstractBuildTask.Property) iter.next(); | |||||
| al.add("-D:" + p.getName() + "=" + p.getValue()); | |||||
| } | |||||
| return (String[]) al.toArray(new String[al.size()]); | |||||
| } | |||||
| /** | |||||
| * Turn the DocumentFragment into a DOM tree suitable as a build | |||||
| * file when serialized. | |||||
| * | |||||
| * <p>If we have exactly one <project> child, return that. | |||||
| * Otherwise assume that this is a valid build file snippet that | |||||
| * just needs an empty project wrapped around it.</p> | |||||
| */ | |||||
| protected Element makeTree(DocumentFragment f) { | |||||
| NodeList nl = f.getChildNodes(); | |||||
| if (nl.getLength() == 1 | |||||
| && nl.item(0).getNodeType() == Node.ELEMENT_NODE | |||||
| && nl.item(0).getNodeName().equals("project")) { | |||||
| return (Element) nl.item(0); | |||||
| } else { | |||||
| Element e = f.getOwnerDocument().createElement("project"); | |||||
| e.appendChild(f); | |||||
| return e; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,335 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.types.Environment; | |||||
| import org.apache.tools.ant.types.RedirectorElement; | |||||
| import java.io.File; | |||||
| import java.util.ArrayList; | |||||
| import java.util.Iterator; | |||||
| /** | |||||
| * Task to run the NUnit Console test runner. | |||||
| * | |||||
| * @see http://www.nunit.org/ | |||||
| */ | |||||
| public class NUnitTask extends Task { | |||||
| /** | |||||
| * The vm attribute - if given. | |||||
| */ | |||||
| private String vm; | |||||
| /** | |||||
| * Test assemblies. | |||||
| */ | |||||
| private ArrayList testAssemblies = new ArrayList(); | |||||
| /** | |||||
| * The /config argument. | |||||
| */ | |||||
| private File configFile; | |||||
| /** | |||||
| * The /output argument. | |||||
| */ | |||||
| private File out; | |||||
| /** | |||||
| * The /err argument. | |||||
| */ | |||||
| private File err; | |||||
| /** | |||||
| * The /xml argument. | |||||
| */ | |||||
| private File xmlOut; | |||||
| /** | |||||
| * The /transform argument. | |||||
| */ | |||||
| private File transform; | |||||
| /** | |||||
| * The /thread argument. | |||||
| */ | |||||
| private boolean thread = false; | |||||
| /** | |||||
| * The /fixture argument. | |||||
| */ | |||||
| private String fixture; | |||||
| /** | |||||
| * Categories to include. | |||||
| */ | |||||
| private ArrayList includes = new ArrayList(); | |||||
| /** | |||||
| * Categories to exclude. | |||||
| */ | |||||
| private ArrayList excludes = new ArrayList(); | |||||
| /** | |||||
| * The /noshadow argument. | |||||
| */ | |||||
| private boolean noshadow = false; | |||||
| /** | |||||
| * The /labels argument. | |||||
| */ | |||||
| private boolean labels = false; | |||||
| /** | |||||
| * Redirects everything that NUnit wants to send to the console. | |||||
| */ | |||||
| private RedirectorElement redirectorElement; | |||||
| /** | |||||
| * Whether a failure should stop the build. | |||||
| */ | |||||
| private boolean failOnError = false; | |||||
| /** | |||||
| * Support for nested environment variables. | |||||
| */ | |||||
| private Environment env = new Environment(); | |||||
| public NUnitTask() { | |||||
| super(); | |||||
| } | |||||
| /** | |||||
| * Set the name of the executable for the virtual machine. | |||||
| * | |||||
| * @param value the name of the executable for the virtual machine | |||||
| */ | |||||
| public void setVm(String value) { | |||||
| this.vm = value; | |||||
| } | |||||
| /** | |||||
| * Sets the name of the config file. | |||||
| */ | |||||
| public void setConfig(File c) { | |||||
| configFile = c; | |||||
| } | |||||
| /** | |||||
| * The /output argument. | |||||
| */ | |||||
| public void setOut(File out) { | |||||
| this.out = out; | |||||
| } | |||||
| /** | |||||
| * The /err argument. | |||||
| */ | |||||
| public void setError(File err) { | |||||
| this.err = err; | |||||
| } | |||||
| /** | |||||
| * The /xml argument. | |||||
| */ | |||||
| public void setXmlOut(File out) { | |||||
| this.xmlOut = out; | |||||
| } | |||||
| /** | |||||
| * The /transform argument. | |||||
| */ | |||||
| public void setTransform(File transform) { | |||||
| this.transform = transform; | |||||
| } | |||||
| /** | |||||
| * The /thread argument. | |||||
| */ | |||||
| public void setThread(boolean thread) { | |||||
| this.thread = thread; | |||||
| } | |||||
| /** | |||||
| * The /fixture argument. | |||||
| */ | |||||
| public void setFixture(String fixture) { | |||||
| this.fixture = fixture; | |||||
| } | |||||
| /** | |||||
| * The /noshadow argument. | |||||
| */ | |||||
| public void setNoshadow(boolean noshadow) { | |||||
| this.noshadow = noshadow; | |||||
| } | |||||
| /** | |||||
| * The /labels argument. | |||||
| */ | |||||
| public void setLabels(boolean labels) { | |||||
| this.labels = labels; | |||||
| } | |||||
| /** | |||||
| * Whether a failure should stop the build. | |||||
| */ | |||||
| public void setFailOnError(boolean b) { | |||||
| failOnError = b; | |||||
| } | |||||
| /** | |||||
| * Adds a test assembly by name. | |||||
| */ | |||||
| public void addTestAssembly(NamedElement a) { | |||||
| testAssemblies.add(a); | |||||
| } | |||||
| /** | |||||
| * Adds a category to the include list. | |||||
| */ | |||||
| public void addInclude(NamedElement a) { | |||||
| includes.add(a); | |||||
| } | |||||
| /** | |||||
| * Adds a category to the exclude list. | |||||
| */ | |||||
| public void addExclude(NamedElement a) { | |||||
| excludes.add(a); | |||||
| } | |||||
| /** | |||||
| * Add an environment variable to the launched process. | |||||
| * | |||||
| * @param var new environment variable | |||||
| */ | |||||
| public void addEnv(Environment.Variable var) { | |||||
| env.addVariable(var); | |||||
| } | |||||
| /** | |||||
| * Add a <code>RedirectorElement</code> to this task. | |||||
| * | |||||
| * <p>This does not use the <code>out</code> and | |||||
| * <code>error</code> attributes, it only captures NUnits output | |||||
| * that has not been redirected by those attributes.</p> | |||||
| */ | |||||
| public void addConfiguredRedirector(RedirectorElement redirectorElement) { | |||||
| if (this.redirectorElement != null) { | |||||
| throw new BuildException("cannot have > 1 nested <redirector>s"); | |||||
| } else { | |||||
| this.redirectorElement = redirectorElement; | |||||
| } | |||||
| } | |||||
| public void execute() { | |||||
| if (testAssemblies.size() == 0) { | |||||
| throw new BuildException("You must specify at least one test " | |||||
| + "assembly."); | |||||
| } | |||||
| DotNetExecTask exec = DotNetExecTask.getTask(this, vm, | |||||
| "nunit-console.exe", | |||||
| env); | |||||
| Iterator iter = testAssemblies.iterator(); | |||||
| while (iter.hasNext()) { | |||||
| NamedElement a = (NamedElement) iter.next(); | |||||
| exec.createArg().setValue(a.getName()); | |||||
| } | |||||
| if (configFile != null) { | |||||
| exec.createArg().setValue("/config=" | |||||
| + configFile.getAbsolutePath()); | |||||
| } | |||||
| exec.createArg().setValue("/nologo"); | |||||
| if (out != null) { | |||||
| exec.createArg().setValue("/output=" + out.getAbsolutePath()); | |||||
| } | |||||
| if (err != null) { | |||||
| exec.createArg().setValue("/err=" + err.getAbsolutePath()); | |||||
| } | |||||
| if (xmlOut != null) { | |||||
| exec.createArg().setValue("/xml=" + xmlOut.getAbsolutePath()); | |||||
| } | |||||
| if (transform != null) { | |||||
| exec.createArg().setValue("/transform=" | |||||
| + transform.getAbsolutePath()); | |||||
| } | |||||
| if (thread) { | |||||
| exec.createArg().setValue("/thread"); | |||||
| } | |||||
| if (noshadow) { | |||||
| exec.createArg().setValue("/noshadow"); | |||||
| } | |||||
| if (labels) { | |||||
| exec.createArg().setValue("/labels"); | |||||
| } | |||||
| if (fixture != null) { | |||||
| exec.createArg().setValue("/fixture=" + fixture); | |||||
| } | |||||
| if (includes.size() > 0) { | |||||
| StringBuffer sb = new StringBuffer("/include="); | |||||
| iter = includes.iterator(); | |||||
| boolean first = false; | |||||
| while (iter.hasNext()) { | |||||
| if (first) { | |||||
| first = false; | |||||
| } else { | |||||
| sb.append(","); | |||||
| } | |||||
| NamedElement a = (NamedElement) iter.next(); | |||||
| sb.append(a.getName()); | |||||
| } | |||||
| exec.createArg().setValue(sb.toString()); | |||||
| } | |||||
| if (excludes.size() > 0) { | |||||
| StringBuffer sb = new StringBuffer("/exclude="); | |||||
| iter = excludes.iterator(); | |||||
| boolean first = false; | |||||
| while (iter.hasNext()) { | |||||
| if (first) { | |||||
| first = false; | |||||
| } else { | |||||
| sb.append(","); | |||||
| } | |||||
| NamedElement a = (NamedElement) iter.next(); | |||||
| sb.append(a.getName()); | |||||
| } | |||||
| exec.createArg().setValue(sb.toString()); | |||||
| } | |||||
| if (redirectorElement != null) { | |||||
| exec.addConfiguredRedirector(redirectorElement); | |||||
| } | |||||
| exec.setFailonerror(failOnError); | |||||
| exec.execute(); | |||||
| } | |||||
| public static class NamedElement { | |||||
| private String name; | |||||
| public String getName() {return name;} | |||||
| public void setName(String s) {name = s;} | |||||
| } | |||||
| } | |||||
| @@ -1,296 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.DirectoryScanner; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.types.EnumeratedAttribute; | |||||
| import org.apache.tools.ant.types.FileSet; | |||||
| import java.io.File; | |||||
| import java.util.ArrayList; | |||||
| import java.util.Iterator; | |||||
| import java.util.List; | |||||
| /** | |||||
| * Task to run the WiX utility to create MSI files from an XML description. | |||||
| * | |||||
| * @see http://sf.net/projects/wix | |||||
| */ | |||||
| public class WixTask extends Task { | |||||
| /** | |||||
| * The vm attribute - if given. | |||||
| */ | |||||
| private String vm; | |||||
| /** | |||||
| * The source files. | |||||
| */ | |||||
| private ArrayList sources = new ArrayList(); | |||||
| /** | |||||
| * Additional source files (include files in the case of candle, | |||||
| * or media/files/whatever in the case of light). | |||||
| */ | |||||
| private ArrayList moreSources = new ArrayList(); | |||||
| /** | |||||
| * A single source file. | |||||
| */ | |||||
| private File source; | |||||
| /** | |||||
| * The target file. | |||||
| */ | |||||
| private File target; | |||||
| /** | |||||
| * What to do. | |||||
| */ | |||||
| private Mode mode; | |||||
| public WixTask() { | |||||
| super(); | |||||
| } | |||||
| /** | |||||
| * Set the name of the executable for the virtual machine. | |||||
| * | |||||
| * @param value the name of the executable for the virtual machine | |||||
| */ | |||||
| public void setVm(String value) { | |||||
| this.vm = value; | |||||
| } | |||||
| /** | |||||
| * The main source file. | |||||
| * | |||||
| * <p><code>candle</code> may include more files than this one, | |||||
| * the main source is the one passed on the command line.</p> | |||||
| * | |||||
| * @param File object of the main source file. | |||||
| */ | |||||
| public void setSource(File f) { | |||||
| source = f; | |||||
| } | |||||
| /** | |||||
| * A set of source files. | |||||
| */ | |||||
| public void addSources(FileSet fs) { | |||||
| sources.add(fs); | |||||
| } | |||||
| /** | |||||
| * A set of additional source files (include files in the case of | |||||
| * candle, or media/files/whatever in the case of light). | |||||
| * | |||||
| * <p>Unlike the files specified as sources, these will not be | |||||
| * passed on the command line, they only help Ant to determine | |||||
| * whether the target is out-of-date.</p> | |||||
| */ | |||||
| public void addMoreSources(FileSet fs) { | |||||
| moreSources.add(fs); | |||||
| } | |||||
| public void execute() { | |||||
| if (source == null && sources.size() == 0) { | |||||
| throw new BuildException("You must specify at least one source" | |||||
| + " file."); | |||||
| } | |||||
| String m = Mode.BOTH; | |||||
| if (mode != null) { | |||||
| m = mode.getValue(); | |||||
| } | |||||
| if (target == null && !m.equals(Mode.CANDLE)) { | |||||
| throw new BuildException("You must specify the target if you want" | |||||
| + " to run light."); | |||||
| } | |||||
| List lightSources = new ArrayList(); | |||||
| if (!m.equals(Mode.LIGHT)) { | |||||
| doCandle(lightSources); | |||||
| } else { | |||||
| if (source != null) { | |||||
| lightSources.add(source); | |||||
| } | |||||
| if (sources.size() > 0) { | |||||
| lightSources.addAll(grabFiles(sources)); | |||||
| } | |||||
| } | |||||
| List moreLightSources = new ArrayList(); | |||||
| if (moreSources.size() > 0) { | |||||
| moreLightSources = grabFiles(moreSources); | |||||
| } | |||||
| if (!m.equals(Mode.CANDLE)) { | |||||
| doLight(lightSources, moreLightSources); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Invoke candle on all sources that are newer than their targets. | |||||
| * | |||||
| * @param lightSources list that will be filled with File objects | |||||
| * pointing to the generated object files. | |||||
| */ | |||||
| private void doCandle(List lightSources) { | |||||
| List s = new ArrayList(); | |||||
| if (source != null) { | |||||
| s.add(source); | |||||
| } | |||||
| if (sources != null) { | |||||
| s.addAll(grabFiles(sources)); | |||||
| } | |||||
| List ms = new ArrayList(); | |||||
| if (moreSources != null) { | |||||
| ms.addAll(grabFiles(moreSources)); | |||||
| } | |||||
| Iterator iter = s.iterator(); | |||||
| List toProcess = new ArrayList(); | |||||
| while (iter.hasNext()) { | |||||
| File thisSource = (File) iter.next(); | |||||
| File t = target; | |||||
| if (t == null) { | |||||
| t = getTarget(thisSource); | |||||
| } | |||||
| if (isOutOfDate(t, thisSource, ms)) { | |||||
| toProcess.add(thisSource); | |||||
| lightSources.add(t); | |||||
| } | |||||
| } | |||||
| if (toProcess.size() != 0) { | |||||
| runCandle(toProcess); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Invoke light on all sources that are newer than their targets. | |||||
| */ | |||||
| private void doLight(List lightSources, List moreLightSources) { | |||||
| List tmp = new ArrayList(lightSources); | |||||
| tmp.addAll(moreLightSources); | |||||
| if (isOutOfDate(target, tmp)) { | |||||
| runLight(lightSources); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Run candle passing all files in list on the command line. | |||||
| */ | |||||
| private void runCandle(List s) { | |||||
| run("candle.exe", s, null); | |||||
| } | |||||
| /** | |||||
| * Run light passing all files in list on the command line. | |||||
| */ | |||||
| private void runLight(List s) { | |||||
| run("light.exe", s, target); | |||||
| } | |||||
| /** | |||||
| * Runs the specified command passing list on the command line an | |||||
| * potentially adding an /out parameter. | |||||
| */ | |||||
| private void run(String executable, List s, File target) { | |||||
| DotNetExecTask exec = DotNetExecTask.getTask(this, vm, | |||||
| executable, null); | |||||
| Iterator iter = s.iterator(); | |||||
| while (iter.hasNext()) { | |||||
| File f = (File) iter.next(); | |||||
| exec.createArg().setValue(f.getAbsolutePath()); | |||||
| } | |||||
| if (target != null) { | |||||
| exec.createArg().setValue("/out"); | |||||
| exec.createArg().setValue(target.getAbsolutePath()); | |||||
| } | |||||
| exec.execute(); | |||||
| } | |||||
| /** | |||||
| * Is t older than s or any of the files in list? | |||||
| */ | |||||
| private boolean isOutOfDate(File t, File s, List l) { | |||||
| return t.lastModified() < s.lastModified() || isOutOfDate(t, l); | |||||
| } | |||||
| /** | |||||
| * Is t older than any of the files in list? | |||||
| */ | |||||
| private boolean isOutOfDate(File t, List l) { | |||||
| Iterator iter = l.iterator(); | |||||
| while (iter.hasNext()) { | |||||
| File f = (File) iter.next(); | |||||
| if (t.lastModified() < f.lastModified()) { | |||||
| return true; | |||||
| } | |||||
| } | |||||
| return false; | |||||
| } | |||||
| /** | |||||
| * Turn the fileset collection into a list of Files. | |||||
| */ | |||||
| private List grabFiles(List s) { | |||||
| List r = new ArrayList(); | |||||
| Iterator iter = s.iterator(); | |||||
| while (iter.hasNext()) { | |||||
| FileSet fs = (FileSet) iter.next(); | |||||
| DirectoryScanner ds = fs.getDirectoryScanner(getProject()); | |||||
| String[] f = ds.getIncludedFiles(); | |||||
| File base = fs.getDir(getProject()); | |||||
| for (int i = 0; i < f.length; i++) { | |||||
| r.add(new File(base, f[i])); | |||||
| } | |||||
| } | |||||
| return r; | |||||
| } | |||||
| /** | |||||
| * Generates the name of a candle target from the source file. | |||||
| * | |||||
| * <p>Simply chops of the extension and adds .wixobj.</p> | |||||
| */ | |||||
| private File getTarget(File s) { | |||||
| String name = s.getAbsolutePath(); | |||||
| int dot = name.lastIndexOf("."); | |||||
| if (dot > -1) { | |||||
| return new File(name.substring(0, dot) + ".wixobj"); | |||||
| } else { | |||||
| return new File(name + ".wixobj"); | |||||
| } | |||||
| } | |||||
| public static class Mode extends EnumeratedAttribute { | |||||
| private final static String CANDLE = "candle"; | |||||
| private final static String LIGHT = "light"; | |||||
| private final static String BOTH = "both"; | |||||
| public Mode() { | |||||
| super(); | |||||
| } | |||||
| public String[] getValues() { | |||||
| return new String[] {CANDLE, LIGHT, BOTH,}; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,38 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2003-2004 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <antlib> | |||||
| <taskdef | |||||
| name="dotnetexec" | |||||
| classname="org.apache.tools.ant.taskdefs.optional.dotnet.DotNetExecTask" | |||||
| /> | |||||
| <taskdef | |||||
| name="msbuild" | |||||
| classname="org.apache.tools.ant.taskdefs.optional.dotnet.MSBuildTask" | |||||
| /> | |||||
| <taskdef | |||||
| name="nant" | |||||
| classname="org.apache.tools.ant.taskdefs.optional.dotnet.NAntTask" | |||||
| /> | |||||
| <taskdef | |||||
| name="wix" | |||||
| classname="org.apache.tools.ant.taskdefs.optional.dotnet.WixTask" | |||||
| /> | |||||
| <taskdef | |||||
| name="nunit" | |||||
| classname="org.apache.tools.ant.taskdefs.optional.dotnet.NUnitTask" | |||||
| /> | |||||
| </antlib> | |||||
| @@ -1,65 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2003-2004 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import org.apache.tools.ant.BuildFileTest; | |||||
| /** | |||||
| * Tests the DotNetExecTask task, based off Ant's DotnetTest. | |||||
| * | |||||
| */ | |||||
| public class DotNetExecTaskTest extends BuildFileTest { | |||||
| /** | |||||
| * Description of the Field | |||||
| */ | |||||
| private final static String TASKDEFS_DIR = "src/etc/testcases/"; | |||||
| /** | |||||
| * Constructor | |||||
| * | |||||
| * @param name testname | |||||
| */ | |||||
| public DotNetExecTaskTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| /** | |||||
| * The JUnit setup method | |||||
| */ | |||||
| public void setUp() { | |||||
| configureProject(TASKDEFS_DIR + "dotnetexec.xml"); | |||||
| } | |||||
| /** | |||||
| * The teardown method for JUnit | |||||
| */ | |||||
| public void tearDown() { | |||||
| executeTarget("teardown"); | |||||
| } | |||||
| /** | |||||
| * A unit test for JUnit | |||||
| */ | |||||
| public void testCSC() throws Exception { | |||||
| executeTarget("testCSC"); | |||||
| } | |||||
| } | |||||
| @@ -1,64 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2003-2004 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import org.apache.tools.ant.BuildFileTest; | |||||
| /** | |||||
| * Tests the MSBuildTask task. | |||||
| */ | |||||
| public class MSBuildTaskTest extends BuildFileTest { | |||||
| /** | |||||
| * Description of the Field | |||||
| */ | |||||
| private final static String TASKDEFS_DIR = "src/etc/testcases/"; | |||||
| /** | |||||
| * Constructor | |||||
| * | |||||
| * @param name testname | |||||
| */ | |||||
| public MSBuildTaskTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| /** | |||||
| * The JUnit setup method | |||||
| */ | |||||
| public void setUp() { | |||||
| configureProject(TASKDEFS_DIR + "msbuild.xml"); | |||||
| } | |||||
| public void testEcho() throws Exception { | |||||
| if (getProject().getProperty("msbuild.found") != null) { | |||||
| expectLogContaining("echo", "foo is bar"); | |||||
| } | |||||
| } | |||||
| public void testNestedFile() throws Exception { | |||||
| if (getProject().getProperty("msbuild.found") != null) { | |||||
| expectLogContaining("nested-file", "foo is bar"); | |||||
| } | |||||
| } | |||||
| public void testNestedTask() throws Exception { | |||||
| if (getProject().getProperty("msbuild.found") != null) { | |||||
| expectLogContaining("nested-task", "foo is bar"); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,64 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2003-2004 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import org.apache.tools.ant.BuildFileTest; | |||||
| /** | |||||
| * Tests the NAntTask task. | |||||
| */ | |||||
| public class NAntTaskTest extends BuildFileTest { | |||||
| /** | |||||
| * Description of the Field | |||||
| */ | |||||
| private final static String TASKDEFS_DIR = "src/etc/testcases/"; | |||||
| /** | |||||
| * Constructor | |||||
| * | |||||
| * @param name testname | |||||
| */ | |||||
| public NAntTaskTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| /** | |||||
| * The JUnit setup method | |||||
| */ | |||||
| public void setUp() { | |||||
| configureProject(TASKDEFS_DIR + "nant.xml"); | |||||
| } | |||||
| public void testEcho() throws Exception { | |||||
| if (getProject().getProperty("nant.found") != null) { | |||||
| expectLogContaining("echo", "foo is bar"); | |||||
| } | |||||
| } | |||||
| public void testNestedFile() throws Exception { | |||||
| if (getProject().getProperty("nant.found") != null) { | |||||
| expectLogContaining("nested-file", "foo is bar"); | |||||
| } | |||||
| } | |||||
| public void testNestedTask() throws Exception { | |||||
| if (getProject().getProperty("nant.found") != null) { | |||||
| expectLogContaining("nested-task", "foo is bar"); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,79 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.optional.dotnet; | |||||
| import org.apache.tools.ant.BuildFileTest; | |||||
| /** | |||||
| * Tests the NUnitTask task. | |||||
| */ | |||||
| public class NUnitTaskTest extends BuildFileTest { | |||||
| /** | |||||
| * Description of the Field | |||||
| */ | |||||
| private final static String TASKDEFS_DIR = "src/etc/testcases/"; | |||||
| /** | |||||
| * Constructor | |||||
| * | |||||
| * @param name testname | |||||
| */ | |||||
| public NUnitTaskTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| /** | |||||
| * The JUnit setup method | |||||
| */ | |||||
| public void setUp() { | |||||
| configureProject(TASKDEFS_DIR + "nunit.xml"); | |||||
| } | |||||
| /** | |||||
| * The teardown method for JUnit | |||||
| */ | |||||
| public void tearDown() { | |||||
| executeTarget("teardown"); | |||||
| } | |||||
| public void testNoAssembly() { | |||||
| expectSpecificBuildException("no-assembly", "no assembly", | |||||
| "You must specify at least one test assembly."); | |||||
| } | |||||
| public void testPass() { | |||||
| if (getProject().getProperty("nunit.found") != null) { | |||||
| expectLogContaining("passing-test", | |||||
| "Tests run: 1, Failures: 0, Not run: 0"); | |||||
| } | |||||
| } | |||||
| public void testFail() { | |||||
| if (getProject().getProperty("nunit.found") != null) { | |||||
| expectLogContaining("failing-test", | |||||
| "Tests run: 1, Failures: 1, Not run: 0"); | |||||
| } | |||||
| } | |||||
| public void testFailOnFail() { | |||||
| if (getProject().getProperty("nunit.found") != null) { | |||||
| expectBuildException("failing-test-with-fail", "test should fail"); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,20 +1 @@ | |||||
| This library provides Ant task(s) as wrapper(s) over the svn command | |||||
| line utility. | |||||
| Alternative approaches like JNI or even a native Java SVN client exist | |||||
| and have been taken by other teams. In particular we know (this list | |||||
| is certainly incomplete): | |||||
| * <http://subclipse.tigris.org/svnant.html> using javahl JNI bindings | |||||
| of subversion | |||||
| * <http://tmate.org/svn/ant.html> using a pure Java SVN client | |||||
| each of which provides Ant tasks. | |||||
| The task(s) of this library only provides very rudimentary support for | |||||
| SVN, matching what the traditional Ant task(s) for CVS could do. | |||||
| If you need more than what this libary provides, we encourage you to | |||||
| check out the existing alternatives. | |||||
| Moved to http://svn.apache.org/repos/asf/ant/sandbox/antlibs/svn/trunk/ | |||||
| @@ -1,91 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2005 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <project default="compile"> | |||||
| <target name="setup"> | |||||
| <property name="build" value="build"/> | |||||
| <property name="build.classes" value="${build}/classes"/> | |||||
| <property name="build.testclasses" value="${build}/test-classes"/> | |||||
| <property name="build.lib" value="${build}/lib"/> | |||||
| <property name="jarname" value="${build.lib}/ant-svn.jar"/> | |||||
| <mkdir dir="${build.classes}"/> | |||||
| <mkdir dir="${build.testclasses}"/> | |||||
| <mkdir dir="${build.lib}"/> | |||||
| </target> | |||||
| <target name="compile" depends="setup"> | |||||
| <javac | |||||
| srcdir="src/main" | |||||
| destdir="${build.classes}" | |||||
| debug="true" | |||||
| /> | |||||
| </target> | |||||
| <target name="antlib" depends="compile"> | |||||
| <copy todir="${build.classes}"> | |||||
| <fileset dir="src/main" includes="**/antlib.xml"/> | |||||
| </copy> | |||||
| <jar | |||||
| destfile="${jarname}" | |||||
| basedir="${build.classes}" | |||||
| /> | |||||
| </target> | |||||
| <target name="setup-for-tests" depends="setup"> | |||||
| <ant | |||||
| antfile="../../../build.xml" | |||||
| target="test-jar" | |||||
| inheritall="false" | |||||
| /> | |||||
| </target> | |||||
| <target name="compile-tests" depends="setup-for-tests, antlib"> | |||||
| <javac | |||||
| srcdir="src/testcases" | |||||
| destdir="${build.testclasses}" | |||||
| debug="true" | |||||
| > | |||||
| <classpath> | |||||
| <pathelement location="${jarname}"/> | |||||
| <pathelement location="../../../build/lib/ant-testutil.jar"/> | |||||
| </classpath> | |||||
| </javac> | |||||
| </target> | |||||
| <target name="test" depends="compile-tests"> | |||||
| <junit | |||||
| printsummary="false" | |||||
| haltonfailure="false" | |||||
| failureproperty="tests.failed" | |||||
| filtertrace="false" | |||||
| > | |||||
| <classpath> | |||||
| <pathelement location="${jarname}"/> | |||||
| <pathelement location="../../../build/lib/ant-testutil.jar"/> | |||||
| <pathelement location="${build.testclasses}"/> | |||||
| </classpath> | |||||
| <batchtest> | |||||
| <fileset dir="src/testcases"/> | |||||
| </batchtest> | |||||
| <formatter type="plain" usefile="false"/> | |||||
| </junit> | |||||
| <fail if="tests.failed">At least one test has failed.</fail> | |||||
| </target> | |||||
| </project> | |||||
| @@ -1,217 +0,0 @@ | |||||
| <html> | |||||
| <head> | |||||
| <meta http-equiv="Content-Language" content="en-us"> | |||||
| <title>ChangeLog Task</title> | |||||
| </head> | |||||
| <body> | |||||
| <h2><a name="changelog">ChangeLog</a></h2> | |||||
| <h3>Description</h3> | |||||
| <p>Generates an XML-formatted report file of the change logs recorded | |||||
| in a <a href="http://subversion.tigris.org/" | |||||
| target="_top">Subversion</a> repository. </p> | |||||
| <p><b>Important:</b> This task needs "svn" on the path. If it isn't, | |||||
| you will get an error (such as error 2 on windows). If | |||||
| <code><svn></code> doesn't work, try to execute svn.exe from the | |||||
| command line in the target directory in which you are working.</p> | |||||
| <h3>Parameters</h3> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td align="center" valign="top"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td colspan="3">Attributes from parent <a href="svn.html">svn | |||||
| task</a> which are meaningful here<br/> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">svnURL</td> | |||||
| <td valign="top">the URL the subcommand should apply to.</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">dest</td> | |||||
| <td valign="top">the directory where the checked out files are.</td> | |||||
| <td align="center" valign="top">No, default is project's basedir.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">failonerror</td> | |||||
| <td valign="top">Stop the build process if the command exits with a | |||||
| return code other than <code>0</code>. Defaults to false</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td colspan="3">Specific attributes</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">dir</td> | |||||
| <td valign="top">The directory from which to run the CVS <em>log</em> | |||||
| command.</td> | |||||
| <td align="center" valign="top">No; defaults to ${basedir}.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">destfile</td> | |||||
| <td valign="top">The file in which to write the change log report.</td> | |||||
| <td align="center" valign="top">Yes</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">usersfile</td> | |||||
| <td valign="top">Property file that contains name-value pairs mapping | |||||
| user IDs and names that should be used in the report in place of | |||||
| the user ID.</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">daysinpast</td> | |||||
| <td valign="top">Sets the number of days into the past for which the | |||||
| change log information should be retrieved.</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">start</td> | |||||
| <td valign="top">The earliest revision/date from which change logs | |||||
| are to be included in the report.</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">end</td> | |||||
| <td valign="top">The latest revision/date to which change logs are to be | |||||
| included in the report.</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| </table> | |||||
| <h3>Parameters specified as nested elements</h3> | |||||
| <h4><a name="user">user</a></h4> | |||||
| <p>The nested <code><user></code> element allows you to specify | |||||
| a mapping between a user ID as it appears on the Subversion server and | |||||
| a name to include in the formatted report. Anytime the specified user | |||||
| ID has made a change in the repository, the | |||||
| <code><author></code> tag in the report file will include the | |||||
| name specified in <code>displayname</code> rather than the user | |||||
| ID.</p> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td align="center" valign="top"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">displayname</td> | |||||
| <td valign="top">The name to be used in the Subversion change log | |||||
| report.</td> | |||||
| <td valign="top" align="center">Yes</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">userid</td> | |||||
| <td valign="top">The userid of the person as it exists on the | |||||
| Subversion server. | |||||
| </td> | |||||
| <td valign="top" align="center">Yes</td> | |||||
| </tr> | |||||
| </table> | |||||
| <h3>Examples</h3> | |||||
| <pre> <changelog dir="dve/network" | |||||
| destfile="changelog.xml" | |||||
| /></pre> | |||||
| <p>Generates a change log report for all the changes that have been made | |||||
| under the <code>dve/network</code> directory. | |||||
| It writes these changes into the file <code>changelog.xml</code>.</p> | |||||
| <pre> <changelog dir="dve/network" | |||||
| destfile="changelog.xml" | |||||
| daysinpast="10" | |||||
| /></pre> | |||||
| <p>Generates a change log report for any changes that were made | |||||
| under the <code>dve/network</code> directory in the past 10 days. | |||||
| It writes these changes into the file <code>changelog.xml</code>.</p> | |||||
| <pre> <changelog dir="dve/network" | |||||
| destfile="changelog.xml" | |||||
| start="{2002-02-20}" | |||||
| end="{2002-03-20}" | |||||
| /></pre> | |||||
| <p>Generates a change log report for any changes that were made | |||||
| between February 20, 2002 and March 20, 2002 | |||||
| under the <code>dve/network</code> directory. | |||||
| It writes these changes into the file <code>changelog.xml</code>.</p> | |||||
| <pre> <changelog dir="dve/network" | |||||
| destfile="changelog.xml" | |||||
| start="{2002-02-20}" | |||||
| /></pre> | |||||
| <p>Generates a change log report for any changes that were made | |||||
| after February 20, 2002 under the <code>dve/network</code> directory. | |||||
| It writes these changes into the file <code>changelog.xml</code>.</p> | |||||
| <pre> <changelog dir="dve/network" | |||||
| destfile="changelog.xml" | |||||
| start="1000" | |||||
| end="1500" | |||||
| /></pre> | |||||
| <p>Generates a change log report for any changes that were made | |||||
| between Subversion revisions 1000 and 1500 under the | |||||
| <code>dve/network</code> directory. It writes these changes into the | |||||
| file <code>changelog.xml</code>.</p> | |||||
| <pre> <changelog dir="dve/network" | |||||
| destfile="changelog.xml"> | |||||
| <user displayname="Esmerelda Weatherwax" userid="granny"/> | |||||
| </changelog></pre> | |||||
| <p>Generates a change log report for all the changes that were made | |||||
| under the <code>dve/network</code> directory, substituting the name | |||||
| "Esmerelda Weatherwax" in the <code><author></code> tags | |||||
| anytime it encounters a change made by the user ID "granny". | |||||
| It writes these changes into the file <code>changelog.xml</code>.</p> | |||||
| <h4>Generate Report</h4> | |||||
| <p>This antlib includes a basic XSLT stylesheet that you can use to | |||||
| generate a HTML report based on the xml output. The following example | |||||
| illustrates how to generate a HTML report from the XML report.</p> | |||||
| <pre> | |||||
| <style in="changelog.xml" | |||||
| out="changelog.html" | |||||
| style="your-path-to/etc/changelog.xsl"> | |||||
| <param name="title" expression="Jakarta BCEL ChangeLog"/> | |||||
| <param name="repo" expression="http://svn.apache.org/repos/asf"/> | |||||
| </style> | |||||
| </pre> | |||||
| <h4>Sample Output</h4> | |||||
| <pre> | |||||
| <entry> | |||||
| <date>2005-02-14</date> | |||||
| <time>01:55</time> | |||||
| <author><![CDATA[dbrosius]]></author> | |||||
| <revision>153687</revision> | |||||
| <path> | |||||
| <name><![CDATA[/jakarta/bcel/trunk/src/java/org/apache/bcel/util/BCELifier.java]]></name> | |||||
| <action>modified</action> | |||||
| </path> | |||||
| <message><![CDATA[Update BCELifier to handle the new method access flags (ACC_BRIDGE, ACC_VARARGS)]]></message> | |||||
| </entry> | |||||
| </pre> | |||||
| <hr><p align="center">Copyright © 2005 The Apache Software Foundation. All rights | |||||
| Reserved.</p> | |||||
| </body> | |||||
| </html> | |||||
| @@ -1,129 +0,0 @@ | |||||
| <html> | |||||
| <head> | |||||
| <meta http-equiv="Content-Language" content="en-us"> | |||||
| <title>RevisionDiff Task</title> | |||||
| </head> | |||||
| <body> | |||||
| <h2><a name="revisiondiff">RevisionDiff</a></h2> | |||||
| <h3>Description</h3> | |||||
| <p>Generates an XML-formatted report file of the changes between two | |||||
| revisions recorded in a <a href="http://subversion.tigris.org/" | |||||
| target="_top">Subversion</a> repository. </p> | |||||
| <p><b>Important:</b> This task needs "svn" on the path. If it isn't, | |||||
| you will get an error (such as error 2 on windows). If | |||||
| <code><svn></code> doesn't work, try to execute | |||||
| <code>svn.exe</code> from the command line in the target directory in | |||||
| which you are working.</p> | |||||
| <h3>Parameters</h3> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td align="center" valign="top"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">start</td> | |||||
| <td valign="top">The earliest revision from which diffs are to be | |||||
| included in the report.</td> | |||||
| <td align="center" valign="top">Yes.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">end</td> | |||||
| <td valign="top">The latest revision from which diffs are to be | |||||
| included in the report.</td> | |||||
| <td align="center" valign="top">Yes.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">destfile</td> | |||||
| <td valign="top">The file in which to write the diff report.</td> | |||||
| <td align="center" valign="top">Yes</td> | |||||
| </tr> | |||||
| </table> | |||||
| <h3>Parameters inherited from the <code>svn</code> task</h3> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td align="center" valign="top"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">svnURL</td> | |||||
| <td valign="top">the svn URL to diff.</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">failonerror</td> | |||||
| <td valign="top">Stop the buildprocess if the command exits with a | |||||
| returncode other than 0. Defaults to false</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| </table> | |||||
| <h3>Examples</h3> | |||||
| <pre> <revisiondiff | |||||
| svnURL="http://svn.apache.org/repos/asf/jakarta/bcel/trunk" | |||||
| destfile="diff.xml" | |||||
| start="152904" | |||||
| end="153682" | |||||
| /></pre> | |||||
| <p>Generates a revisiondiff report for all the changes that have been | |||||
| made in the <code>Apache BCEL</code> module between the revisions | |||||
| <code>152904</code> and <code>153682</code>. It writes these changes | |||||
| into the file <code>diff.xml</code>.</p> | |||||
| <pre> <revisiondiff | |||||
| destfile="diff.xml" | |||||
| package="ant" | |||||
| start="{2002-01-01}" | |||||
| end="{2002-02-01}" | |||||
| dest="my-working-copy-of-BCEL" | |||||
| /></pre> | |||||
| <p>Generates a diff report for all the changes that have been made in | |||||
| the <code>Apache BCEL</code> module in january 2002. In this example | |||||
| <code>svnURL</code> has not been set, it is assumed that | |||||
| <code>my-working-copy-of-BCEL</code> contains a checked out copy of | |||||
| the BCEL module. It writes these changes into the file | |||||
| <code>diff.xml</code>.</p> | |||||
| <h4>Generate Report</h4> | |||||
| <p>This antlib includes a basic XSLT stylesheet that you can use to | |||||
| generate a HTML report based on the xml output. The following example | |||||
| illustrates how to generate a HTML report from the XML report.</p> | |||||
| <pre> | |||||
| <style in="diff.xml" | |||||
| out="diff.html" | |||||
| style="your-path-to/etc/diff.xsl"> | |||||
| <param name="title" expression="Jakarta BCEL diff"/> | |||||
| <param name="repo" expression="http://svn.apache.org/repos/asf/jakarta/bcel/trunk"/> | |||||
| </style> | |||||
| </pre> | |||||
| <h4>(Shortened) Example Output</h4> | |||||
| <pre> | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <revisiondiff start="153872" end="152873" svnurl="http://svn.apache.org/repos/asf/jakarta/bcel/trunk" > | |||||
| <path> | |||||
| <name><![CDATA[LICENSE.txt]]></name> | |||||
| <action>modified</action> | |||||
| </path> | |||||
| <path> | |||||
| <name><![CDATA[NOTICE.txt]]></name> | |||||
| <action>deleted</action> | |||||
| </path> | |||||
| </revisiondiff> | |||||
| </pre> | |||||
| <hr><p align="center">Copyright © 2005 The Apache Software Foundation. All rights | |||||
| Reserved.</p> | |||||
| </body> | |||||
| </html> | |||||
| @@ -1,157 +0,0 @@ | |||||
| <html> | |||||
| <head> | |||||
| <meta http-equiv="Content-Language" content="en-us"> | |||||
| <title>Subversion Task</title> | |||||
| <link rel="stylesheet" type="text/css" href="../stylesheets/antmanual.css"> | |||||
| </head> | |||||
| <body> | |||||
| <h2><a name="svn">SVN</a></h2> | |||||
| <h3>Description</h3> | |||||
| <p>Handles packages/modules retrieved from a | |||||
| <a href="http://subversion.tigris.org/" target="_top">Subversion</a> repository.</p> | |||||
| <p><b>Important:</b> This task needs "<code>svn</code>" on the path. If it isn't, you will get | |||||
| an error (such as error <code>2</code> on windows). If <code><svn></code> doesn't work, try to execute <code>svn.exe</code> | |||||
| from the command line in the target directory in which you are working. | |||||
| <h3>Parameters</h3> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td align="center" valign="top"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">subcommand</td> | |||||
| <td valign="top">the SVN subcommand to execute.</td> | |||||
| <td align="center" valign="top">No, default "checkout".</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">svnURL</td> | |||||
| <td valign="top">the URL the subcommand should apply to.</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">dest</td> | |||||
| <td valign="top">the directory where the checked out files should | |||||
| be placed. Note that this is different from SVN's <code>-d</code> command line | |||||
| switch as Ant will never shorten pathnames to avoid empty | |||||
| directories.</td> | |||||
| <td align="center" valign="top">No, default is project's basedir.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">revision</td> | |||||
| <td valign="top">the revision or date of the subcommand should apply to</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">quiet</td> | |||||
| <td valign="top">suppress informational messages. This is the same as <code>--quiet</code> on the command line.</td> | |||||
| <td align="center" valign="top">No, default "false"</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">verbose</td> | |||||
| <td valign="top">Be verbose. This is the same as <code>--verbose</code> on the command line.</td> | |||||
| <td align="center" valign="top">No, default "false"</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">dryrun</td> | |||||
| <td valign="top">report only, don't change any files.</td> | |||||
| <td align="center" valign="top">No, default to "false"</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">file</td> | |||||
| <td valign="top">Uses the contents of the file passed as an | |||||
| argument to this switch for the specified subcommand.</td> | |||||
| <td align="center" valign="top">No.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">force</td> | |||||
| <td valign="top">Forces a particular command or operation to run.</td> | |||||
| <td align="center" valign="top">No, defaults to false.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">recursive</td> | |||||
| <td valign="top">Makes a subcommand recurse into | |||||
| subdirectories. Most subcommands recurse by default.</td> | |||||
| <td align="center" valign="top">No.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">targets</td> | |||||
| <td valign="top">Tells Subversion to get the list of files that you wish to | |||||
| operate on from the filename you provide instead of listing all | |||||
| the files on the command line.</td> | |||||
| <td align="center" valign="top">No.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">output</td> | |||||
| <td valign="top">the file to direct standard output from the command.</td> | |||||
| <td align="center" valign="top">No, default output to ANT Log as <code>MSG_INFO</code>.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">error</td> | |||||
| <td valign="top">the file to direct standard error from the command.</td> | |||||
| <td align="center" valign="top">No, default error to ANT Log as <code>MSG_WARN</code>.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">append</td> | |||||
| <td valign="top">whether to append output/error when redirecting to a file.</td> | |||||
| <td align="center" valign="top">No, default to "false".</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">failonerror</td> | |||||
| <td valign="top">Stop the build process if the command exits with a | |||||
| return code other than <code>0</code>. Defaults to "false"</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| </table> | |||||
| <h3>Examples</h3> | |||||
| <pre> <svn svnURL="http://svn.apache.org/repos/asf/httpd/httpd/trunk/" | |||||
| dest="${ws.dir}" | |||||
| /></pre> | |||||
| <p>checks out the URL | |||||
| "http://svn.apache.org/repos/asf/httpd/httpd/trunk/" and | |||||
| stores the files in "<code>${ws.dir}</code>".</p> | |||||
| <pre> <svn dest="${ws.dir}" command="update"/></pre> | |||||
| <p>updates the working copy that has previously been checked out into | |||||
| "<code>${ws.dir}</code>".</p> | |||||
| <pre> <svn command="-q diff" output="patch.txt"/></pre> | |||||
| <p>silently (<code>-q</code>) creates a file called <code>patch.txt</code> which contains a unified diff which can be used as input to patch. | |||||
| The equivalent, using <code><commandline></code> elements, is: | |||||
| </p> | |||||
| <pre> | |||||
| <svn output="patch"> | |||||
| <commandline> | |||||
| <argument value="-q"/> | |||||
| <argument value="diff"/> | |||||
| </commandline> | |||||
| </svn> | |||||
| </pre> | |||||
| or: | |||||
| <pre> | |||||
| <svn output="patch"> | |||||
| <commandline> | |||||
| <argument line="-q diff -u -N"/> | |||||
| </commandline> | |||||
| </svn> | |||||
| </pre> | |||||
| <p> | |||||
| You may include as many <code><commandline></code> elements as you like. | |||||
| Each will inherit the <code>failonerror</code> and other "global" parameters | |||||
| from the <code><svn></code> element. | |||||
| </p> | |||||
| <pre> <svn command="update"/></pre> | |||||
| <p>Updates from the head of repository creating any new directories as necessary.</p> | |||||
| <p>See <a href="http://svnbook.red-bean.com/en/1.1/ch09.html#svn-ch-9-sect-1" target="_top">Version Control with Subversion</a> for details, | |||||
| specifically the <a href="http://svnbook.red-bean.com/en/1.1/ch09.html#svn-ch-9-sect-1" target="_top">The Subversion Command Line Client: svn</a></p> | |||||
| <hr> | |||||
| <p align="center">Copyright © 2005 The Apache Software | |||||
| Foundation. All rights Reserved.</p> | |||||
| </body> | |||||
| </html> | |||||
| @@ -1,158 +0,0 @@ | |||||
| <html> | |||||
| <head> | |||||
| <meta http-equiv="Content-Language" content="en-us"> | |||||
| <title>RevisionDiff Task</title> | |||||
| </head> | |||||
| <body> | |||||
| <h2><a name="tagdiff">TagDiff</a></h2> | |||||
| <h3>Description</h3> | |||||
| <p>Generates an XML-formatted report file of the changes between two | |||||
| tags recorded in a <a href="http://subversion.tigris.org/" | |||||
| target="_top">Subversion</a> repository. </p> | |||||
| <p><b>Important:</b> This task needs "svn" on the path. If it isn't, | |||||
| you will get an error (such as error 2 on windows). If | |||||
| <code><svn></code> doesn't work, try to execute | |||||
| <code>svn.exe</code> from the command line in the target directory in | |||||
| which you are working.</p> | |||||
| <p>This task assumes that your repository follows the best-practice | |||||
| layout of</p> | |||||
| <pre> | |||||
| BASEURL | |||||
| | | |||||
| | | |||||
| -----> trunk | |||||
| -----> tags | |||||
| | | |||||
| | | |||||
| ----------> tag1 | |||||
| ----------> tag2 | |||||
| </pre> | |||||
| <h3>Parameters</h3> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td align="center" valign="top"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">tag1</td> | |||||
| <td valign="top">The first tag.</td> | |||||
| <td align="center" valign="top">Yes.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">tag2</td> | |||||
| <td valign="top">The second tag.</td> | |||||
| <td align="center" valign="top">No, defaults to "trunk/"</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">destfile</td> | |||||
| <td valign="top">The file in which to write the diff report.</td> | |||||
| <td align="center" valign="top">Yes</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">baseURL</td> | |||||
| <td valign="top">The baseURL of the repository, used to calculate | |||||
| the two URLs to compare.</td> | |||||
| <td align="center" valign="top">Yes</td> | |||||
| </tr> | |||||
| </table> | |||||
| <h3>Parameters inherited from the <code>svn</code> task</h3> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td align="center" valign="top"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">failonerror</td> | |||||
| <td valign="top">Stop the buildprocess if the command exits with a | |||||
| returncode other than 0. Defaults to false</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| </table> | |||||
| <h3>Examples</h3> | |||||
| <pre> | |||||
| <tagdiff failonerror="true" | |||||
| baseURL="http://svn.apache.org/repos/asf/jakarta/bcel/" | |||||
| destfile="diff.xml" | |||||
| tag1="initial" | |||||
| tag2="BCEL_5_0" | |||||
| /> | |||||
| </pre> | |||||
| <p>Generates a tagdiff report for all the changes that have been | |||||
| made in the <code>Apache BCEL</code> module between the tags | |||||
| <code>initial</code> and <code>BCEL_5_0</code>. It writes these changes | |||||
| into the file <code>diff.xml</code>.</p> | |||||
| <pre> | |||||
| <tagdiff failonerror="true" | |||||
| baseURL="http://svn.apache.org/repos/asf/jakarta/bcel/" | |||||
| destfile="diff.xml" | |||||
| tag1="BCEL_5_0" | |||||
| tag2="trunk" | |||||
| /> | |||||
| </pre> | |||||
| <p>Generates a tagdiff report for all the changes that have been made | |||||
| in the <code>Apache BCEL</code> module between the tag | |||||
| <code>BCEL_5_0</code> and the <code>trunk</code>. It writes these | |||||
| changes into the file <code>diff.xml</code>.</p> | |||||
| <pre> | |||||
| <tagdiff failonerror="true" | |||||
| baseURL="http://svn.apache.org/repos/asf/jakarta/bcel/" | |||||
| destfile="diff.xml" | |||||
| tag1="BCEL_5_0" | |||||
| /> | |||||
| </pre> | |||||
| <p>Does the same, using <code>trunk</code> as <code>tag2</code> | |||||
| implicitly.</p> | |||||
| <h4>Generate Report</h4> | |||||
| <p>This antlib includes a basic XSLT stylesheet that you can use to | |||||
| generate a HTML report based on the xml output. The following example | |||||
| illustrates how to generate a HTML report from the XML report.</p> | |||||
| <pre> | |||||
| <style in="diff.xml" | |||||
| out="diff.html" | |||||
| style="your-path-to/etc/diff.xsl"> | |||||
| <param name="title" expression="Jakarta BCEL diff"/> | |||||
| <param name="repo" expression="http://svn.apache.org/repos/asf/jakarta/bcel/trunk"/> | |||||
| </style> | |||||
| </pre> | |||||
| <h4>(Shortened) Example Output</h4> | |||||
| <pre> | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <tagdiff tag1="BCEL_5_0" svnurl="http://svn.apache.org/repos/asf/jakarta/bcel/" > | |||||
| <path> | |||||
| <name><![CDATA[default.properties]]></name> | |||||
| <action>added</action> | |||||
| </path> | |||||
| <path> | |||||
| <name><![CDATA[xdocs/images/classloader.gif]]></name> | |||||
| <action>modified</action> | |||||
| </path> | |||||
| <path> | |||||
| <name><![CDATA[README]]></name> | |||||
| <action>deleted</action> | |||||
| </path> | |||||
| </tagdiff> | |||||
| </pre> | |||||
| <hr><p align="center">Copyright © 2005 The Apache Software Foundation. All rights | |||||
| Reserved.</p> | |||||
| </body> | |||||
| </html> | |||||
| @@ -1,137 +0,0 @@ | |||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | |||||
| <xsl:stylesheet | |||||
| xmlns:xsl='http://www.w3.org/1999/XSL/Transform' | |||||
| version='1.0'> | |||||
| <!-- | |||||
| Copyright 2005 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <xsl:param name="title"/> | |||||
| <xsl:param name="repo"/> | |||||
| <xsl:output method="html" indent="yes" encoding="US-ASCII" | |||||
| doctype-public="-//W3C//DTD HTML 4.01//EN" | |||||
| doctype-system="http://www.w3.org/TR/html401/strict.dtd"/> | |||||
| <!-- Copy standard document elements. Elements that | |||||
| should be ignored must be filtered by apply-templates | |||||
| tags. --> | |||||
| <xsl:template match="*"> | |||||
| <xsl:copy> | |||||
| <xsl:copy-of select="attribute::*[. != '']"/> | |||||
| <xsl:apply-templates/> | |||||
| </xsl:copy> | |||||
| </xsl:template> | |||||
| <xsl:template match="changelog"> | |||||
| <html> | |||||
| <head> | |||||
| <title><xsl:value-of select="$title"/></title> | |||||
| <style type="text/css"> | |||||
| body, p { | |||||
| font-family: Verdana, Arial, Helvetica, sans-serif; | |||||
| font-size: 80%; | |||||
| color: #000000; | |||||
| background-color: #ffffff; | |||||
| } | |||||
| tr, td { | |||||
| font-family: Verdana, Arial, Helvetica, sans-serif; | |||||
| background: #eeeee0; | |||||
| } | |||||
| td { | |||||
| padding-left: 20px; | |||||
| } | |||||
| .dateAndAuthor { | |||||
| font-family: Verdana, Arial, Helvetica, sans-serif; | |||||
| font-weight: bold; | |||||
| text-align: left; | |||||
| background: #a6caf0; | |||||
| padding-left: 3px; | |||||
| } | |||||
| a { | |||||
| color: #000000; | |||||
| } | |||||
| pre { | |||||
| font-weight: bold; | |||||
| } | |||||
| </style> | |||||
| </head> | |||||
| <body> | |||||
| <h1> | |||||
| <a name="top"><xsl:value-of select="$title"/></a> | |||||
| </h1> | |||||
| <p style="text-align: right">Designed for use with <a href="http://ant.apache.org/">Apache Ant</a>.</p> | |||||
| <hr/> | |||||
| <table border="0" width="100%" cellspacing="1"> | |||||
| <xsl:apply-templates select=".//entry"> | |||||
| <xsl:sort select="date" data-type="text" order="descending"/> | |||||
| <xsl:sort select="time" data-type="text" order="descending"/> | |||||
| </xsl:apply-templates> | |||||
| </table> | |||||
| </body> | |||||
| </html> | |||||
| </xsl:template> | |||||
| <xsl:template match="entry"> | |||||
| <tr> | |||||
| <td class="dateAndAuthor"> | |||||
| <xsl:value-of select="date"/><xsl:text> </xsl:text><xsl:value-of select="time"/><xsl:text> </xsl:text><xsl:value-of select="author"/> | |||||
| </td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td> | |||||
| <pre> | |||||
| <xsl:apply-templates select="message"/></pre> | |||||
| <ul> | |||||
| <xsl:apply-templates select="path"/> | |||||
| </ul> | |||||
| </td> | |||||
| </tr> | |||||
| </xsl:template> | |||||
| <xsl:template match="date"> | |||||
| <i><xsl:value-of select="."/></i> | |||||
| </xsl:template> | |||||
| <xsl:template match="time"> | |||||
| <i><xsl:value-of select="."/></i> | |||||
| </xsl:template> | |||||
| <xsl:template match="author"> | |||||
| <i> | |||||
| <xsl:value-of select="."/> | |||||
| </i> | |||||
| </xsl:template> | |||||
| <xsl:template match="path"> | |||||
| <li> | |||||
| <a> | |||||
| <xsl:attribute name="href"><xsl:value-of select="$repo"/><xsl:value-of select="name"/></xsl:attribute><xsl:value-of select="$repo"/><xsl:value-of select="name"/></a> | |||||
| (<xsl:value-of select="action"/>) | |||||
| </li> | |||||
| </xsl:template> | |||||
| <!-- Any elements within a message are processed, | |||||
| so that we can preserve HTML tags. --> | |||||
| <xsl:template match="message"> | |||||
| <xsl:apply-templates/> | |||||
| </xsl:template> | |||||
| </xsl:stylesheet> | |||||
| @@ -1,140 +0,0 @@ | |||||
| <!-- | |||||
| Copyright 2005 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <xsl:stylesheet | |||||
| xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | |||||
| version="1.0"> | |||||
| <xsl:param name="title"/> | |||||
| <xsl:param name="repo"/> | |||||
| <xsl:output method="html" indent="yes"/> | |||||
| <!-- Copy standard document elements. Elements that | |||||
| should be ignored must be filtered by apply-templates | |||||
| tags. --> | |||||
| <xsl:template match="*"> | |||||
| <xsl:copy> | |||||
| <xsl:copy-of select="attribute::*[. != '']"/> | |||||
| <xsl:apply-templates/> | |||||
| </xsl:copy> | |||||
| </xsl:template> | |||||
| <xsl:template match="revisiondiff|tagdiff"> | |||||
| <HTML> | |||||
| <HEAD> | |||||
| <TITLE><xsl:value-of select="$title"/></TITLE> | |||||
| </HEAD> | |||||
| <BODY link="#000000" alink="#000000" vlink="#000000" text="#000000"> | |||||
| <style type="text/css"> | |||||
| body, p { | |||||
| font-family: verdana,arial,helvetica; | |||||
| font-size: 80%; | |||||
| color:#000000; | |||||
| } | |||||
| .dateAndAuthor { | |||||
| font-family: verdana,arial,helvetica; | |||||
| font-size: 80%; | |||||
| font-weight: bold; | |||||
| text-align:left; | |||||
| background:#a6caf0; | |||||
| } | |||||
| tr, td{ | |||||
| font-family: verdana,arial,helvetica; | |||||
| font-size: 80%; | |||||
| background:#eeeee0; | |||||
| } | |||||
| </style> | |||||
| <h1> | |||||
| <a name="top"><xsl:value-of select="$title"/></a> | |||||
| </h1> | |||||
| diff between <xsl:value-of select="@start"/><xsl:value-of select="@tag1"/> and <xsl:value-of select="@end"/><xsl:value-of select="@tag2"/> | |||||
| <p align="right">Designed for use with <a href="http://ant.apache.org/">Apache Ant</a>.</p> | |||||
| <hr size="2"/> | |||||
| <a name="TOP"/> | |||||
| <table width="100%"> | |||||
| <tr> | |||||
| <td align="right"> | |||||
| <a href="#New">New Files</a> | | |||||
| <a href="#Modified">Modified Files</a> | | |||||
| <a href="#Removed">Removed Files</a> | |||||
| </td> | |||||
| </tr> | |||||
| </table> | |||||
| <TABLE BORDER="0" WIDTH="100%" CELLPADDING="3" CELLSPACING="1"> | |||||
| <xsl:call-template name="show-paths"> | |||||
| <xsl:with-param name="title">New Files</xsl:with-param> | |||||
| <xsl:with-param name="anchor">New</xsl:with-param> | |||||
| <xsl:with-param name="paths" select=".//path[action='added']"/> | |||||
| </xsl:call-template> | |||||
| <xsl:call-template name="show-paths"> | |||||
| <xsl:with-param name="title">Modified Files</xsl:with-param> | |||||
| <xsl:with-param name="anchor">Modified</xsl:with-param> | |||||
| <xsl:with-param name="paths" select=".//path[action='modified']"/> | |||||
| </xsl:call-template> | |||||
| <xsl:call-template name="show-paths"> | |||||
| <xsl:with-param name="title">Removed Files</xsl:with-param> | |||||
| <xsl:with-param name="anchor">Removed</xsl:with-param> | |||||
| <xsl:with-param name="paths" select=".//path[action='deleted']"/> | |||||
| </xsl:call-template> | |||||
| </TABLE> | |||||
| </BODY> | |||||
| </HTML> | |||||
| </xsl:template> | |||||
| <xsl:template name="show-paths"> | |||||
| <xsl:param name="title"/> | |||||
| <xsl:param name="anchor"/> | |||||
| <xsl:param name="paths"/> | |||||
| <TR> | |||||
| <TD colspan="2" class="dateAndAuthor"> | |||||
| <a> | |||||
| <xsl:attribute name="name"><xsl:value-of select="$anchor"/></xsl:attribute> | |||||
| <xsl:value-of select="$title"/> - <xsl:value-of select="count($paths)"/> entries | |||||
| </a> | |||||
| <a href="#TOP">(back to top)</a> | |||||
| </TD> | |||||
| </TR> | |||||
| <TR> | |||||
| <TD width="20"> | |||||
| <xsl:text> </xsl:text> | |||||
| </TD> | |||||
| <TD> | |||||
| <ul> | |||||
| <xsl:apply-templates select="$paths"/> | |||||
| </ul> | |||||
| </TD> | |||||
| </TR> | |||||
| </xsl:template> | |||||
| <xsl:template match="path"> | |||||
| <li> | |||||
| <a target="_new"> | |||||
| <xsl:attribute name="href"><xsl:value-of select="$repo"/>/<xsl:value-of select="name" /></xsl:attribute> | |||||
| <xsl:value-of select="name" /> | |||||
| </a> | |||||
| </li> | |||||
| </xsl:template> | |||||
| <!-- Any elements within a msg are processed, | |||||
| so that we can preserve HTML tags. --> | |||||
| <xsl:template match="msg"> | |||||
| <b><xsl:apply-templates/></b> | |||||
| </xsl:template> | |||||
| </xsl:stylesheet> | |||||
| @@ -1,64 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2005 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <project name="abstractsvntask-test" basedir="../../../" | |||||
| default="all" xmlns:svn="antlib:org.apache.tools.ant.taskdefs.svn"> | |||||
| <property name="tmpdir" value="tmpdir"/> | |||||
| <property name="tpfdir" value="${tmpdir}/tpf"/> | |||||
| <property name="file" value="ebcdic.h"/> | |||||
| <target name="setup"> | |||||
| <mkdir dir="${tmpdir}"/> | |||||
| <svn:svn | |||||
| svnURL="http://svn.apache.org/repos/asf/httpd/httpd/trunk/os/tpf/" | |||||
| dest="${tmpdir}"/> | |||||
| </target> | |||||
| <target name="all" depends="setup"> | |||||
| <svn:svn failonerror="true" subcommand="status ${file}" dest="${tpfdir}"/> | |||||
| <svn:svn failonerror="true" dest="${tpfdir}"> | |||||
| <commandline> | |||||
| <argument value="up"/> | |||||
| <argument value="-r"/> | |||||
| <argument value="83750"/> | |||||
| <argument value="${file}"/> | |||||
| </commandline> | |||||
| </svn:svn> | |||||
| <svn:svn failonerror="true" subcommand="status ${file}" dest="${tpfdir}"/> | |||||
| <svn:svn failonerror="true" dest="${tpfdir}"> | |||||
| <commandline> | |||||
| <argument line="up -r HEAD ${file}" /> | |||||
| </commandline> | |||||
| </svn:svn> | |||||
| <svn:svn failonerror="true" subcommand="status ${file}" dest="${tpfdir}"/> | |||||
| </target> | |||||
| <target name="revision-attribute"> | |||||
| <mkdir dir="${tmpdir}" /> | |||||
| <svn:svn | |||||
| svnURL="http://svn.apache.org/repos/asf/httpd/httpd/trunk/os/tpf" | |||||
| dest="${tmpdir}" | |||||
| quiet="false" | |||||
| revision="83750"/> | |||||
| </target> | |||||
| <target name="cleanup"> | |||||
| <delete dir="${tmpdir}" /> | |||||
| </target> | |||||
| </project> | |||||
| @@ -1,69 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2005 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <project name="changelog-test" basedir="../../../" | |||||
| default="log" xmlns:svn="antlib:org.apache.tools.ant.taskdefs.svn"> | |||||
| <property name="tmpdir" value="tmpdir"/> | |||||
| <property name="trunkdir" value="${tmpdir}/trunk"/> | |||||
| <target name="setup"> | |||||
| <mkdir dir="${tmpdir}"/> | |||||
| <svn:svn | |||||
| svnURL="http://svn.apache.org/repos/asf/jakarta/bcel/trunk" | |||||
| dest="${tmpdir}"/> | |||||
| </target> | |||||
| <target name="log" depends="setup"> | |||||
| <svn:changelog failonerror="true" dest="${trunkdir}" | |||||
| destfile="${tmpdir}/log.xml" /> | |||||
| </target> | |||||
| <target name="start" depends="setup"> | |||||
| <svn:changelog failonerror="true" dest="${trunkdir}" | |||||
| destfile="${tmpdir}/log.xml" start="153000"/> | |||||
| </target> | |||||
| <target name="startDate" depends="setup"> | |||||
| <svn:changelog failonerror="true" dest="${trunkdir}" | |||||
| destfile="${tmpdir}/log.xml" start="{2005-02-10}"/> | |||||
| </target> | |||||
| <target name="end" depends="setup"> | |||||
| <svn:changelog failonerror="true" dest="${trunkdir}" | |||||
| destfile="${tmpdir}/log.xml" end="153000"/> | |||||
| </target> | |||||
| <target name="endDate" depends="setup"> | |||||
| <svn:changelog failonerror="true" dest="${trunkdir}" | |||||
| destfile="${tmpdir}/log.xml" end="{2005-02-10}"/> | |||||
| </target> | |||||
| <target name="report" depends="start"> | |||||
| <style in="${tmpdir}/log.xml" | |||||
| out="${tmpdir}/log.html" | |||||
| style="src/etc/changelog.xsl"> | |||||
| <param name="title" expression="Jakarta BCEL ChangeLog"/> | |||||
| <param name="repo" expression="http://svn.apache.org/repos/asf"/> | |||||
| </style> | |||||
| </target> | |||||
| <target name="cleanup"> | |||||
| <delete dir="${tmpdir}" /> | |||||
| </target> | |||||
| </project> | |||||
| @@ -1,58 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2005 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <project name="revisiondiff-test" basedir="../../../" | |||||
| default="diff" xmlns:svn="antlib:org.apache.tools.ant.taskdefs.svn"> | |||||
| <property name="tmpdir" value="tmpdir"/> | |||||
| <property name="trunkdir" value="${tmpdir}/trunk"/> | |||||
| <target name="dir-prep"> | |||||
| <mkdir dir="${tmpdir}"/> | |||||
| </target> | |||||
| <target name="setup" depends="dir-prep"> | |||||
| <svn:svn | |||||
| svnURL="http://svn.apache.org/repos/asf/jakarta/bcel/trunk" | |||||
| dest="${tmpdir}"/> | |||||
| </target> | |||||
| <target name="diff" depends="setup"> | |||||
| <svn:revisiondiff failonerror="true" dest="${trunkdir}" | |||||
| destfile="${tmpdir}/diff.xml" start="152904" end="153682"/> | |||||
| </target> | |||||
| <target name="diff-using-url" depends="dir-prep"> | |||||
| <svn:revisiondiff failonerror="true" | |||||
| svnURL="http://svn.apache.org/repos/asf/jakarta/bcel/trunk" | |||||
| destfile="${tmpdir}/diff.xml" start="152904" end="153682"/> | |||||
| </target> | |||||
| <target name="report" depends="diff-using-url"> | |||||
| <style in="${tmpdir}/diff.xml" | |||||
| out="${tmpdir}/diff.html" | |||||
| style="src/etc/diff.xsl"> | |||||
| <param name="title" expression="Jakarta BCEL diff"/> | |||||
| <param name="repo" expression="http://svn.apache.org/repos/asf/jakarta/bcel/trunk"/> | |||||
| </style> | |||||
| </target> | |||||
| <target name="cleanup"> | |||||
| <delete dir="${tmpdir}" /> | |||||
| </target> | |||||
| </project> | |||||
| @@ -1,63 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2005 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <project name="revisiondiff-test" basedir="../../../" | |||||
| default="diff-with-implicit-trunk" | |||||
| xmlns:svn="antlib:org.apache.tools.ant.taskdefs.svn"> | |||||
| <property name="tmpdir" value="tmpdir"/> | |||||
| <target name="dir-prep"> | |||||
| <mkdir dir="${tmpdir}"/> | |||||
| </target> | |||||
| <target name="diff-with-two-tags" depends="dir-prep"> | |||||
| <svn:tagdiff failonerror="true" | |||||
| baseURL="http://svn.apache.org/repos/asf/jakarta/bcel/" | |||||
| destfile="${tmpdir}/diff.xml" | |||||
| tag2="BCEL_5_0" tag1="initial"/> | |||||
| </target> | |||||
| <target name="diff-with-explicit-trunk" depends="dir-prep"> | |||||
| <svn:tagdiff failonerror="true" | |||||
| baseURL="http://svn.apache.org/repos/asf/jakarta/bcel/" | |||||
| destfile="${tmpdir}/diff.xml" | |||||
| tag1="BCEL_5_0" tag2="trunk"/> | |||||
| </target> | |||||
| <target name="diff-with-implicit-trunk" depends="dir-prep"> | |||||
| <svn:tagdiff failonerror="true" | |||||
| baseURL="http://svn.apache.org/repos/asf/jakarta/bcel/" | |||||
| destfile="${tmpdir}/diff.xml" | |||||
| tag1="BCEL_5_0"/> | |||||
| </target> | |||||
| <!--target name="report" depends="diff-with-implicit-trunk"--> | |||||
| <target name="report"> | |||||
| <style in="/tmp/diff.xml" | |||||
| out="/tmp/diff.html" | |||||
| style="src/etc/diff.xsl"> | |||||
| <param name="title" expression="Jakarta BCEL diff"/> | |||||
| <param name="repo" expression="http://svn.apache.org/repos/asf/jakarta/bcel/trunk"/> | |||||
| </style> | |||||
| </target> | |||||
| <target name="cleanup"> | |||||
| <delete dir="${tmpdir}" /> | |||||
| </target> | |||||
| </project> | |||||
| @@ -1,699 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| import java.io.BufferedOutputStream; | |||||
| import java.io.File; | |||||
| import java.io.FileOutputStream; | |||||
| import java.io.IOException; | |||||
| import java.io.OutputStream; | |||||
| import java.io.PrintStream; | |||||
| import java.util.Vector; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.taskdefs.Execute; | |||||
| import org.apache.tools.ant.taskdefs.ExecuteStreamHandler; | |||||
| import org.apache.tools.ant.taskdefs.LogOutputStream; | |||||
| import org.apache.tools.ant.taskdefs.PumpStreamHandler; | |||||
| import org.apache.tools.ant.types.Commandline; | |||||
| import org.apache.tools.ant.types.Environment; | |||||
| import org.apache.tools.ant.util.StringUtils; | |||||
| /** | |||||
| * Just like Ant's built-in CVS task, the main loginc lives in this | |||||
| * abstract task. | |||||
| */ | |||||
| public abstract class AbstractSvnTask extends Task { | |||||
| private Commandline cmd = new Commandline(); | |||||
| /** list of Commandline children */ | |||||
| private Vector vecCommandlines = new Vector(); | |||||
| /** | |||||
| * the URL the subcommand should apply to. | |||||
| */ | |||||
| private String svnURL; | |||||
| /** | |||||
| * the revision | |||||
| */ | |||||
| private String revision; | |||||
| /** | |||||
| * the default command. | |||||
| */ | |||||
| private static final String DEFAULT_SUBCOMMAND = "checkout"; | |||||
| /** | |||||
| * the SVN command to execute. | |||||
| */ | |||||
| private String subCommand = null; | |||||
| /** | |||||
| * suppress information messages. | |||||
| */ | |||||
| private boolean quiet = false; | |||||
| /** | |||||
| * be verbose | |||||
| */ | |||||
| private boolean verbose = false; | |||||
| /** | |||||
| * report only, don't change any files. | |||||
| */ | |||||
| private boolean dryrun = false; | |||||
| /** | |||||
| * the directory where the checked out files should be placed. | |||||
| */ | |||||
| private File dest; | |||||
| /** whether or not to append stdout/stderr to existing files */ | |||||
| private boolean append = false; | |||||
| /** | |||||
| * the file to direct standard output from the command. | |||||
| */ | |||||
| private File output; | |||||
| /** | |||||
| * the file to direct standard error from the command. | |||||
| */ | |||||
| private File error; | |||||
| /** | |||||
| * If true it will stop the build if svn exits with error. | |||||
| * Default is false. (Iulian) | |||||
| */ | |||||
| private boolean failOnError = false; | |||||
| /** | |||||
| * Uses the contents of the file passed as an argument to this | |||||
| * switch for the specified subcommand. | |||||
| */ | |||||
| private File file; | |||||
| /** | |||||
| * Forces a particular command or operation to run. | |||||
| */ | |||||
| private boolean force; | |||||
| /** | |||||
| * Makes a subcommand recurse into subdirectories. | |||||
| */ | |||||
| private Boolean recursive = null; | |||||
| /** | |||||
| * Tells Subversion to get the list of files that you wish to | |||||
| * operate on from the filename you provide instead of listing all | |||||
| * the files on the command line. | |||||
| */ | |||||
| private File targets; | |||||
| /** | |||||
| * Create accessors for the following, to allow different handling of | |||||
| * the output. | |||||
| */ | |||||
| private ExecuteStreamHandler executeStreamHandler; | |||||
| private OutputStream outputStream; | |||||
| private OutputStream errorStream; | |||||
| /** empty no-arg constructor*/ | |||||
| public AbstractSvnTask() { | |||||
| super(); | |||||
| } | |||||
| /** | |||||
| * sets the handler | |||||
| * @param handler a handler able of processing the output and error streams from the svn exe | |||||
| */ | |||||
| public void setExecuteStreamHandler(ExecuteStreamHandler handler) { | |||||
| this.executeStreamHandler = handler; | |||||
| } | |||||
| /** | |||||
| * find the handler and instantiate it if it does not exist yet | |||||
| * @return handler for output and error streams | |||||
| */ | |||||
| protected ExecuteStreamHandler getExecuteStreamHandler() { | |||||
| if (this.executeStreamHandler == null) { | |||||
| setExecuteStreamHandler(new PumpStreamHandler(getOutputStream(), | |||||
| getErrorStream())); | |||||
| } | |||||
| return this.executeStreamHandler; | |||||
| } | |||||
| /** | |||||
| * sets a stream to which the output from the svn executable should be sent | |||||
| * @param outputStream stream to which the stdout from svn should go | |||||
| */ | |||||
| protected void setOutputStream(OutputStream outputStream) { | |||||
| this.outputStream = outputStream; | |||||
| } | |||||
| /** | |||||
| * access the stream to which the stdout from svn should go | |||||
| * if this stream has already been set, it will be returned | |||||
| * if the stream has not yet been set, if the attribute output | |||||
| * has been set, the output stream will go to the output file | |||||
| * otherwise the output will go to ant's logging system | |||||
| * @return output stream to which svn' stdout should go to | |||||
| */ | |||||
| protected OutputStream getOutputStream() { | |||||
| if (this.outputStream == null) { | |||||
| if (output != null) { | |||||
| try { | |||||
| setOutputStream(new PrintStream( | |||||
| new BufferedOutputStream( | |||||
| new FileOutputStream(output | |||||
| .getPath(), | |||||
| append)))); | |||||
| } catch (IOException e) { | |||||
| throw new BuildException(e, getLocation()); | |||||
| } | |||||
| } else { | |||||
| setOutputStream(new LogOutputStream(this, Project.MSG_INFO)); | |||||
| } | |||||
| } | |||||
| return this.outputStream; | |||||
| } | |||||
| /** | |||||
| * sets a stream to which the stderr from the svn exe should go | |||||
| * @param errorStream an output stream willing to process stderr | |||||
| */ | |||||
| protected void setErrorStream(OutputStream errorStream) { | |||||
| this.errorStream = errorStream; | |||||
| } | |||||
| /** | |||||
| * access the stream to which the stderr from svn should go | |||||
| * if this stream has already been set, it will be returned | |||||
| * if the stream has not yet been set, if the attribute error | |||||
| * has been set, the output stream will go to the file denoted by the error attribute | |||||
| * otherwise the stderr output will go to ant's logging system | |||||
| * @return output stream to which svn' stderr should go to | |||||
| */ | |||||
| protected OutputStream getErrorStream() { | |||||
| if (this.errorStream == null) { | |||||
| if (error != null) { | |||||
| try { | |||||
| setErrorStream(new PrintStream( | |||||
| new BufferedOutputStream( | |||||
| new FileOutputStream(error.getPath(), | |||||
| append)))); | |||||
| } catch (IOException e) { | |||||
| throw new BuildException(e, getLocation()); | |||||
| } | |||||
| } else { | |||||
| setErrorStream(new LogOutputStream(this, Project.MSG_WARN)); | |||||
| } | |||||
| } | |||||
| return this.errorStream; | |||||
| } | |||||
| /** | |||||
| * Sets up the environment for toExecute and then runs it. | |||||
| * @param toExecute the command line to execute | |||||
| * @throws BuildException if failonError is set to true and the svn command fails | |||||
| */ | |||||
| protected void runCommand(Commandline toExecute) throws BuildException { | |||||
| Environment env = new Environment(); | |||||
| // | |||||
| // Just call the getExecuteStreamHandler() and let it handle | |||||
| // the semantics of instantiation or retrieval. | |||||
| // | |||||
| Execute exe = new Execute(getExecuteStreamHandler(), null); | |||||
| exe.setAntRun(getProject()); | |||||
| if (dest == null) { | |||||
| dest = getProject().getBaseDir(); | |||||
| } | |||||
| if (!dest.exists()) { | |||||
| dest.mkdirs(); | |||||
| } | |||||
| exe.setWorkingDirectory(dest); | |||||
| exe.setCommandline(toExecute.getCommandline()); | |||||
| exe.setEnvironment(env.getVariables()); | |||||
| try { | |||||
| String actualCommandLine = executeToString(exe); | |||||
| log(actualCommandLine, Project.MSG_VERBOSE); | |||||
| int retCode = exe.execute(); | |||||
| log("retCode=" + retCode, Project.MSG_DEBUG); | |||||
| /*Throw an exception if svn exited with error. (Iulian)*/ | |||||
| if (failOnError && Execute.isFailure(retCode)) { | |||||
| throw new BuildException("svn exited with error code " | |||||
| + retCode | |||||
| + StringUtils.LINE_SEP | |||||
| + "Command line was [" | |||||
| + actualCommandLine + "]", getLocation()); | |||||
| } | |||||
| } catch (IOException e) { | |||||
| if (failOnError) { | |||||
| throw new BuildException(e, getLocation()); | |||||
| } else { | |||||
| log("Caught exception: " + e.getMessage(), Project.MSG_WARN); | |||||
| } | |||||
| } catch (BuildException e) { | |||||
| if (failOnError) { | |||||
| throw(e); | |||||
| } else { | |||||
| Throwable t = e.getException(); | |||||
| if (t == null) { | |||||
| t = e; | |||||
| } | |||||
| log("Caught exception: " + t.getMessage(), Project.MSG_WARN); | |||||
| } | |||||
| } catch (Exception e) { | |||||
| if (failOnError) { | |||||
| throw new BuildException(e, getLocation()); | |||||
| } else { | |||||
| log("Caught exception: " + e.getMessage(), Project.MSG_WARN); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * do the work | |||||
| * @throws BuildException if failonerror is set to true and the svn command fails. | |||||
| */ | |||||
| public void execute() throws BuildException { | |||||
| String savedCommand = getSubCommand(); | |||||
| if (this.getSubCommand() == null && vecCommandlines.size() == 0) { | |||||
| // re-implement legacy behaviour: | |||||
| this.setSubCommand(AbstractSvnTask.DEFAULT_SUBCOMMAND); | |||||
| } | |||||
| String c = this.getSubCommand(); | |||||
| Commandline cloned = null; | |||||
| if (c != null) { | |||||
| cloned = (Commandline) cmd.clone(); | |||||
| cloned.createArgument(true).setLine(c); | |||||
| if (svnURL != null) { | |||||
| cloned.createArgument().setValue(svnURL); | |||||
| } | |||||
| this.addConfiguredCommandline(cloned, true); | |||||
| } | |||||
| try { | |||||
| for (int i = 0; i < vecCommandlines.size(); i++) { | |||||
| this.runCommand((Commandline) vecCommandlines.elementAt(i)); | |||||
| } | |||||
| } finally { | |||||
| if (cloned != null) { | |||||
| removeCommandline(cloned); | |||||
| } | |||||
| setSubCommand(savedCommand); | |||||
| if (outputStream != null) { | |||||
| try { | |||||
| outputStream.close(); | |||||
| } catch (IOException e) { | |||||
| //ignore | |||||
| } | |||||
| } | |||||
| if (errorStream != null) { | |||||
| try { | |||||
| errorStream.close(); | |||||
| } catch (IOException e) { | |||||
| //ignore | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| private String executeToString(Execute execute) { | |||||
| StringBuffer stringBuffer = | |||||
| new StringBuffer(Commandline.describeCommand(execute | |||||
| .getCommandline())); | |||||
| String newLine = StringUtils.LINE_SEP; | |||||
| String[] variableArray = execute.getEnvironment(); | |||||
| if (variableArray != null) { | |||||
| stringBuffer.append(newLine); | |||||
| stringBuffer.append(newLine); | |||||
| stringBuffer.append("environment:"); | |||||
| stringBuffer.append(newLine); | |||||
| for (int z = 0; z < variableArray.length; z++) { | |||||
| stringBuffer.append(newLine); | |||||
| stringBuffer.append("\t"); | |||||
| stringBuffer.append(variableArray[z]); | |||||
| } | |||||
| } | |||||
| return stringBuffer.toString(); | |||||
| } | |||||
| /** | |||||
| * The URL the subcommand should apply to. | |||||
| * | |||||
| * @param url the URL the subcommand should apply to. | |||||
| */ | |||||
| public void setSvnURL(String url) { | |||||
| // Check if not real svnroot => set it to null | |||||
| if (url != null) { | |||||
| if (url.trim().equals("")) { | |||||
| url = null; | |||||
| } | |||||
| } | |||||
| this.svnURL = url; | |||||
| } | |||||
| /** | |||||
| * access the svnURL variable | |||||
| * @return svnURL | |||||
| */ | |||||
| public String getSvnURL() { | |||||
| return this.svnURL; | |||||
| } | |||||
| /** | |||||
| * The directory where the checked out files should be placed. | |||||
| * | |||||
| * <p>Note that this is different from SVN's -d command line | |||||
| * switch as Ant will never shorten pathnames to avoid empty | |||||
| * directories.</p> | |||||
| * | |||||
| * @param dest directory where the checked out files should be placed | |||||
| */ | |||||
| public void setDest(File dest) { | |||||
| this.dest = dest; | |||||
| } | |||||
| /** | |||||
| * get the file where the checked out files should be placed | |||||
| * | |||||
| * @return directory where the checked out files should be placed | |||||
| */ | |||||
| public File getDest() { | |||||
| return this.dest; | |||||
| } | |||||
| /** | |||||
| * revision | |||||
| * @return revision | |||||
| */ | |||||
| public String getRevision() { | |||||
| return revision; | |||||
| } | |||||
| /** | |||||
| * The revision to operate upon. | |||||
| * @param p revision | |||||
| */ | |||||
| public void setRevision(String p) { | |||||
| // Check if not real revision => set it to null | |||||
| if (p != null && p.trim().length() > 0) { | |||||
| revision = p; | |||||
| addSubCommandArgument("--revision"); | |||||
| addSubCommandArgument(p); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Uses the contents of the file passed as an argument to this | |||||
| * switch for the specified subcommand. | |||||
| */ | |||||
| public void setFile(File file) { | |||||
| this.file = file; | |||||
| } | |||||
| /** | |||||
| * Uses the contents of the file passed as an argument to this | |||||
| * switch for the specified subcommand. | |||||
| */ | |||||
| public File getFile() { | |||||
| return file; | |||||
| } | |||||
| /** | |||||
| * Forces a particular command or operation to run. | |||||
| */ | |||||
| public void setForce(boolean force) { | |||||
| this.force = force; | |||||
| } | |||||
| /** | |||||
| * Forces a particular command or operation to run. | |||||
| */ | |||||
| public boolean getForce() { | |||||
| return force; | |||||
| } | |||||
| /** | |||||
| * Makes a subcommand recurse into subdirectories. Most | |||||
| * subcommands recurse by default. | |||||
| */ | |||||
| public void setRecursive(Boolean recursive) { | |||||
| this.recursive = recursive; | |||||
| } | |||||
| /** | |||||
| * Makes a subcommand recurse into subdirectories. Most | |||||
| * subcommands recurse by default. | |||||
| */ | |||||
| public Boolean getRecursive() { | |||||
| return recursive; | |||||
| } | |||||
| /** | |||||
| * Tells Subversion to get the list of files that you wish to | |||||
| * operate on from the filename you provide instead of listing all | |||||
| * the files on the command line. | |||||
| */ | |||||
| public void setTargets(File targets) { | |||||
| this.targets = targets; | |||||
| } | |||||
| /** | |||||
| * Tells Subversion to get the list of files that you wish to | |||||
| * operate on from the filename you provide instead of listing all | |||||
| * the files on the command line. | |||||
| */ | |||||
| public File getTargets() { | |||||
| return targets; | |||||
| } | |||||
| /** | |||||
| * This needs to be public to allow configuration | |||||
| * of commands externally. | |||||
| * @param arg command argument | |||||
| */ | |||||
| public void addSubCommandArgument(String arg) { | |||||
| this.addSubCommandArgument(cmd, arg); | |||||
| } | |||||
| /** | |||||
| * This method adds a command line argument to an external subcommand. | |||||
| * | |||||
| * @param c command line to which one argument should be added | |||||
| * @param arg argument to add | |||||
| */ | |||||
| protected void addSubCommandArgument(Commandline c, String arg) { | |||||
| c.createArgument().setValue(arg); | |||||
| } | |||||
| /** | |||||
| * The SVN command to execute. | |||||
| * | |||||
| * @param c a command as string | |||||
| */ | |||||
| public void setSubCommand(String c) { | |||||
| this.subCommand = c; | |||||
| } | |||||
| /** | |||||
| * accessor to a command line as string | |||||
| * | |||||
| * @return command line as string | |||||
| */ | |||||
| public String getSubCommand() { | |||||
| return this.subCommand; | |||||
| } | |||||
| /** | |||||
| * If true, suppress informational messages. | |||||
| * @param q if true, suppress informational messages | |||||
| */ | |||||
| public void setQuiet(boolean q) { | |||||
| quiet = q; | |||||
| } | |||||
| /** | |||||
| * If true, be verbose. | |||||
| * @param q if true, be verbose. | |||||
| */ | |||||
| public void setVerbose(boolean v) { | |||||
| verbose = v; | |||||
| } | |||||
| /** | |||||
| * If true, report only and don't change any files. | |||||
| * | |||||
| * @param ne if true, report only and do not change any files. | |||||
| */ | |||||
| public void setDryrun(boolean ne) { | |||||
| dryrun = ne; | |||||
| } | |||||
| /** | |||||
| * The file to direct standard output from the command. | |||||
| * @param output a file to which stdout should go | |||||
| */ | |||||
| public void setOutput(File output) { | |||||
| this.output = output; | |||||
| } | |||||
| /** | |||||
| * The file to direct standard error from the command. | |||||
| * | |||||
| * @param error a file to which stderr should go | |||||
| */ | |||||
| public void setError(File error) { | |||||
| this.error = error; | |||||
| } | |||||
| /** | |||||
| * Whether to append output/error when redirecting to a file. | |||||
| * @param value true indicated you want to append | |||||
| */ | |||||
| public void setAppend(boolean value) { | |||||
| this.append = value; | |||||
| } | |||||
| /** | |||||
| * Stop the build process if the command exits with | |||||
| * a return code other than 0. | |||||
| * Defaults to false. | |||||
| * @param failOnError stop the build process if the command exits with | |||||
| * a return code other than 0 | |||||
| */ | |||||
| public void setFailOnError(boolean failOnError) { | |||||
| this.failOnError = failOnError; | |||||
| } | |||||
| /** | |||||
| * Configure a commandline element for things like quiet, etc. | |||||
| * @param c the command line which will be configured | |||||
| * if the commandline is initially null, the function is a noop | |||||
| * otherwise the function append to the commandline arguments concerning | |||||
| * <ul> | |||||
| * <li> | |||||
| * svn | |||||
| * </li> | |||||
| * <li> | |||||
| * quiet | |||||
| * </li> | |||||
| * <li>verbose</li> | |||||
| * <li>dryrun</li> | |||||
| * </ul> | |||||
| */ | |||||
| protected void configureCommandline(Commandline c) { | |||||
| if (c == null) { | |||||
| return; | |||||
| } | |||||
| c.setExecutable("svn"); | |||||
| if (quiet) { | |||||
| c.createArgument(true).setValue("--quiet"); | |||||
| } | |||||
| if (verbose) { | |||||
| c.createArgument(true).setValue("--verbose"); | |||||
| } | |||||
| if (dryrun) { | |||||
| c.createArgument(true).setValue("--dry-run"); | |||||
| } | |||||
| if (file != null) { | |||||
| c.createArgument(true).setValue("--file"); | |||||
| c.createArgument(true).setFile(file); | |||||
| } | |||||
| if (force) { | |||||
| c.createArgument(true).setValue("--force"); | |||||
| } | |||||
| if (recursive != null) { | |||||
| if (recursive.booleanValue()) { | |||||
| c.createArgument(true).setValue("--recursive"); | |||||
| } else { | |||||
| c.createArgument(true).setValue("--non-recursive"); | |||||
| } | |||||
| } | |||||
| if (targets != null) { | |||||
| c.createArgument(true).setValue("--targets"); | |||||
| c.createArgument(true).setFile(targets); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * remove a particular command from a vector of command lines | |||||
| * @param c command line which should be removed | |||||
| */ | |||||
| protected void removeCommandline(Commandline c) { | |||||
| vecCommandlines.removeElement(c); | |||||
| } | |||||
| /** | |||||
| * Adds direct command-line to execute. | |||||
| * @param c command line to execute | |||||
| */ | |||||
| public void addConfiguredCommandline(Commandline c) { | |||||
| this.addConfiguredCommandline(c, false); | |||||
| } | |||||
| /** | |||||
| * Configures and adds the given Commandline. | |||||
| * @param c commandline to insert | |||||
| * @param insertAtStart If true, c is | |||||
| * inserted at the beginning of the vector of command lines | |||||
| */ | |||||
| public void addConfiguredCommandline(Commandline c, | |||||
| boolean insertAtStart) { | |||||
| if (c == null) { | |||||
| return; | |||||
| } | |||||
| this.configureCommandline(c); | |||||
| if (insertAtStart) { | |||||
| vecCommandlines.insertElementAt(c, 0); | |||||
| } else { | |||||
| vecCommandlines.addElement(c); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,134 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| import java.io.ByteArrayOutputStream; | |||||
| import java.io.IOException; | |||||
| import java.io.OutputStream; | |||||
| /** | |||||
| * Invokes {@link #processLine processLine} whenever a full line has | |||||
| * been written to this stream. | |||||
| * | |||||
| * <p>Tries to be smart about line separators.</p> | |||||
| */ | |||||
| public abstract class LineOrientedOutputStream extends OutputStream { | |||||
| /** Initial buffer size. */ | |||||
| private static final int INTIAL_SIZE = 132; | |||||
| /** Carriage return */ | |||||
| private static final int CR = 0x0d; | |||||
| /** Linefeed */ | |||||
| private static final int LF = 0x0a; | |||||
| private ByteArrayOutputStream buffer | |||||
| = new ByteArrayOutputStream(INTIAL_SIZE); | |||||
| private boolean skip = false; | |||||
| /** | |||||
| * Write the data to the buffer and flush the buffer, if a line | |||||
| * separator is detected. | |||||
| * | |||||
| * @param cc data to log (byte). | |||||
| */ | |||||
| public final void write(int cc) throws IOException { | |||||
| final byte c = (byte) cc; | |||||
| if ((c == '\n') || (c == '\r')) { | |||||
| if (!skip) { | |||||
| processBuffer(); | |||||
| } | |||||
| } else { | |||||
| buffer.write(cc); | |||||
| } | |||||
| skip = (c == '\r'); | |||||
| } | |||||
| /** | |||||
| * Flush this log stream | |||||
| */ | |||||
| public final void flush() throws IOException { | |||||
| if (buffer.size() > 0) { | |||||
| processBuffer(); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Converts the buffer to a string and sends it to | |||||
| * <code>processLine</code> | |||||
| */ | |||||
| private void processBuffer() throws IOException { | |||||
| try { | |||||
| processLine(buffer.toString()); | |||||
| } finally { | |||||
| buffer.reset(); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Processes a line. | |||||
| * | |||||
| * @param line the line to log. | |||||
| */ | |||||
| protected abstract void processLine(String line) throws IOException; | |||||
| /** | |||||
| * Writes all remaining | |||||
| */ | |||||
| public final void close() throws IOException { | |||||
| if (buffer.size() > 0) { | |||||
| processBuffer(); | |||||
| } | |||||
| super.close(); | |||||
| } | |||||
| /** | |||||
| * Write a block of characters to the output stream | |||||
| * | |||||
| * @param b the array containing the data | |||||
| * @param off the offset into the array where data starts | |||||
| * @param len the length of block | |||||
| * | |||||
| * @throws IOException if the data cannot be written into the stream. | |||||
| */ | |||||
| public final void write(byte[] b, int off, int len) throws IOException { | |||||
| // find the line breaks and pass other chars through in blocks | |||||
| int offset = off; | |||||
| int blockStartOffset = offset; | |||||
| int remaining = len; | |||||
| while (remaining > 0) { | |||||
| while (remaining > 0 && b[offset] != LF && b[offset] != CR) { | |||||
| offset++; | |||||
| remaining--; | |||||
| } | |||||
| // either end of buffer or a line separator char | |||||
| int blockLength = offset - blockStartOffset; | |||||
| if (blockLength > 0) { | |||||
| buffer.write(b, blockStartOffset, blockLength); | |||||
| } | |||||
| while (remaining > 0 && (b[offset] == LF || b[offset] == CR)) { | |||||
| write(b[offset]); | |||||
| offset++; | |||||
| remaining--; | |||||
| } | |||||
| blockStartOffset = offset; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,32 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| /** | |||||
| * Performs operations on a SVN repository. | |||||
| * | |||||
| * @ant.task category="scm" | |||||
| */ | |||||
| public class Svn extends AbstractSvnTask { | |||||
| /** | |||||
| * SVN Task - now implemented by the Abstract SVN Task base class | |||||
| */ | |||||
| public Svn() { | |||||
| } | |||||
| } | |||||
| @@ -1,188 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| import java.text.ParseException; | |||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.Date; | |||||
| import java.util.ArrayList; | |||||
| /** | |||||
| * A class used to parse the output of the svn log command. | |||||
| * | |||||
| */ | |||||
| class SvnChangeLogParser extends LineOrientedOutputStream { | |||||
| private final static int GET_ENTRY_LINE = 0; | |||||
| private final static int GET_REVISION_LINE = 1; | |||||
| private final static int GET_PATHS = 2; | |||||
| private final static int GET_MESSAGE = 3; | |||||
| private String message = ""; | |||||
| private Date date = null; | |||||
| private String author = null; | |||||
| private String revision = null; | |||||
| private ArrayList paths = new ArrayList(); | |||||
| /** input format for dates read in from cvs log */ | |||||
| private static final String PATTERN = "yyyy-MM-dd HH:mm:ss"; | |||||
| private static final SimpleDateFormat INPUT_DATE | |||||
| = new SimpleDateFormat(PATTERN); | |||||
| private final ArrayList entries = new ArrayList(); | |||||
| private int status = GET_ENTRY_LINE; | |||||
| /** | |||||
| * Get a list of rcs entries as an array. | |||||
| * | |||||
| * @return a list of rcs entries as an array | |||||
| */ | |||||
| public SvnEntry[] getEntrySetAsArray() { | |||||
| return (SvnEntry[]) entries.toArray(new SvnEntry[entries.size()]); | |||||
| } | |||||
| /** | |||||
| * Receive notification about the process writing | |||||
| * to standard output. | |||||
| * @param line the line to process | |||||
| */ | |||||
| public void processLine(final String line) { | |||||
| switch(status) { | |||||
| case GET_ENTRY_LINE: | |||||
| // make sure attributes are reset when | |||||
| // working on a 'new' file. | |||||
| reset(); | |||||
| processEntryStart(line); | |||||
| break; | |||||
| case GET_REVISION_LINE: | |||||
| processRevision(line); | |||||
| break; | |||||
| case GET_MESSAGE: | |||||
| processMessage(line); | |||||
| break; | |||||
| case GET_PATHS: | |||||
| processPath(line); | |||||
| break; | |||||
| default: | |||||
| // Do nothing | |||||
| break; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Process a line while in "GET_MESSAGE" state. | |||||
| * | |||||
| * @param line the line | |||||
| */ | |||||
| private void processMessage(final String line) { | |||||
| final String lineSeparator = System.getProperty("line.separator"); | |||||
| if (line.equals("------------------------------------------------------------------------")) { | |||||
| //We have ended changelog for that particular revision | |||||
| //so we can save it | |||||
| final int end | |||||
| = message.length() - lineSeparator.length(); | |||||
| message = message.substring(0, end); | |||||
| saveEntry(); | |||||
| status = GET_REVISION_LINE; | |||||
| } else { | |||||
| message += line + lineSeparator; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Process a line while in "GET_ENTRY_LINE" state. | |||||
| * | |||||
| * @param line the line to process | |||||
| */ | |||||
| private void processEntryStart(final String line) { | |||||
| if (line.equals("------------------------------------------------------------------------")) { | |||||
| status = GET_REVISION_LINE; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Process a line while in "REVISION" state. | |||||
| * | |||||
| * @param line the line to process | |||||
| */ | |||||
| private void processRevision(final String line) { | |||||
| int index = line.indexOf(" |"); | |||||
| if (line.startsWith("r") | |||||
| && (line.endsWith("lines") || line.endsWith("line")) | |||||
| && index > -1) { | |||||
| revision = line.substring(1, index); | |||||
| int end = line.indexOf(" |", index + 1); | |||||
| author = line.substring(index + 3, end); | |||||
| String d = line.substring(end + 3, end + 3 + PATTERN.length()); | |||||
| date = parseDate(d); | |||||
| status = GET_PATHS; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Process a line while in "GET_PATHS" state. | |||||
| * | |||||
| * @param line the line to process | |||||
| */ | |||||
| private void processPath(final String line) { | |||||
| if (line.startsWith("Changed paths:")) { | |||||
| // ignore | |||||
| } else if (line.equals("")) { | |||||
| status = GET_MESSAGE; | |||||
| } else if (line.length() > 5) { | |||||
| paths.add(new SvnEntry.Path(line.substring(5), line.charAt(3))); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Utility method that saves the current entry. | |||||
| */ | |||||
| private void saveEntry() { | |||||
| SvnEntry entry = new SvnEntry(date, revision, author, message, | |||||
| paths); | |||||
| entries.add(entry); | |||||
| reset(); | |||||
| } | |||||
| /** | |||||
| * Parse date out from expected format. | |||||
| * | |||||
| * @param date the string holding date | |||||
| * @return the date object or null if unknown date format | |||||
| */ | |||||
| private Date parseDate(final String date) { | |||||
| try { | |||||
| return INPUT_DATE.parse(date); | |||||
| } catch (ParseException e) { | |||||
| return null; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Reset all internal attributes except status. | |||||
| */ | |||||
| public void reset() { | |||||
| this.date = null; | |||||
| this.author = null; | |||||
| this.message = ""; | |||||
| this.revision = null; | |||||
| this.paths.clear(); | |||||
| } | |||||
| } | |||||
| @@ -1,399 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| import java.io.File; | |||||
| import java.io.FileInputStream; | |||||
| import java.io.FileOutputStream; | |||||
| import java.io.IOException; | |||||
| import java.io.OutputStreamWriter; | |||||
| import java.io.PrintWriter; | |||||
| import java.io.UnsupportedEncodingException; | |||||
| import java.text.ParseException; | |||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.Date; | |||||
| import java.util.Enumeration; | |||||
| import java.util.Properties; | |||||
| import java.util.Vector; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.DirectoryScanner; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.taskdefs.LogOutputStream; | |||||
| import org.apache.tools.ant.taskdefs.PumpStreamHandler; | |||||
| import org.apache.tools.ant.taskdefs.cvslib.CvsUser; | |||||
| import org.apache.tools.ant.types.FileSet; | |||||
| import org.apache.tools.ant.util.FileUtils; | |||||
| /** | |||||
| * Examines the output of svn log and group related changes together. | |||||
| * | |||||
| * It produces an XML output representing the list of changes. | |||||
| * <pre> | |||||
| * <font color=#0000ff><!-- Root element --></font> | |||||
| * <font color=#6a5acd><!ELEMENT</font> changelog <font color=#ff00ff>(entry</font><font color=#ff00ff>+</font><font color=#ff00ff>)</font><font color=#6a5acd>></font> | |||||
| * <font color=#0000ff><!-- SVN Entry --></font> | |||||
| * <font color=#6a5acd><!ELEMENT</font> entry <font color=#ff00ff>(date,time,revision,author,path</font><font color=#ff00ff>+,msg</font><font color=#ff00ff>,msg)</font><font color=#6a5acd>></font> | |||||
| * <font color=#0000ff><!-- Date of svn entry --></font> | |||||
| * <font color=#6a5acd><!ELEMENT</font> date <font color=#ff00ff>(#PCDATA)</font><font color=#6a5acd>></font> | |||||
| * <font color=#0000ff><!-- Time of svn entry --></font> | |||||
| * <font color=#6a5acd><!ELEMENT</font> time <font color=#ff00ff>(#PCDATA)</font><font color=#6a5acd>></font> | |||||
| * <font color=#0000ff><!-- Author of change --></font> | |||||
| * <font color=#6a5acd><!ELEMENT</font> author <font color=#ff00ff>(#PCDATA)</font><font color=#6a5acd>></font> | |||||
| * <font color=#0000ff><!-- commit message --></font> | |||||
| * <font color=#6a5acd><!ELEMENT</font> msg <font color=#ff00ff>(#PCDATA)</font><font color=#6a5acd>></font> | |||||
| * <font color=#0000ff><!-- List of paths affected --></font> | |||||
| * <font color=#6a5acd><!ELEMENT</font> path <font color=#ff00ff>(name,action)</font><font color=#ff00ff></font><font color=#ff00ff>)</font><font color=#6a5acd>></font> | |||||
| * <font color=#0000ff><!-- Name of the path --></font> | |||||
| * <font color=#6a5acd><!ELEMENT</font> name <font color=#ff00ff>(#PCDATA)</font><font color=#6a5acd>></font> | |||||
| * <font color=#6a5acd><!ELEMENT</font> action <font color=#ff00ff>(added|modified|deleted)</font><font color=#6a5acd>></font> | |||||
| * <font color=#0000ff><!-- Revision number --></font> | |||||
| * <font color=#6a5acd><!ELEMENT</font> revision <font color=#ff00ff>(#PCDATA)</font><font color=#6a5acd>></font> | |||||
| * </pre> | |||||
| * | |||||
| * @ant.task name="svnchangelog" category="scm" | |||||
| */ | |||||
| public class SvnChangeLogTask extends AbstractSvnTask { | |||||
| /** User list */ | |||||
| private File usersFile; | |||||
| /** User list */ | |||||
| private Vector svnUsers = new Vector(); | |||||
| /** Input dir */ | |||||
| private File inputDir; | |||||
| /** Output file */ | |||||
| private File destFile; | |||||
| /** The earliest revision at which to start processing entries. */ | |||||
| private String startRevision; | |||||
| /** The latest revision at which to stop processing entries. */ | |||||
| private String endRevision; | |||||
| /** | |||||
| * Filesets containing list of files against which the svn log will be | |||||
| * performed. If empty then all files in the working directory will | |||||
| * be checked. | |||||
| */ | |||||
| private final Vector filesets = new Vector(); | |||||
| /** | |||||
| * Set the base dir for svn. | |||||
| * | |||||
| * @param inputDir The new dir value | |||||
| */ | |||||
| public void setDir(final File inputDir) { | |||||
| this.inputDir = inputDir; | |||||
| } | |||||
| /** | |||||
| * Set the output file for the log. | |||||
| * | |||||
| * @param destFile The new destfile value | |||||
| */ | |||||
| public void setDestfile(final File destFile) { | |||||
| this.destFile = destFile; | |||||
| } | |||||
| /** | |||||
| * Set a lookup list of user names & addresses | |||||
| * | |||||
| * @param usersFile The file containing the users info. | |||||
| */ | |||||
| public void setUsersfile(final File usersFile) { | |||||
| this.usersFile = usersFile; | |||||
| } | |||||
| /** | |||||
| * Add a user to list changelog knows about. | |||||
| * | |||||
| * @param user the user | |||||
| */ | |||||
| public void addUser(final CvsUser user) { | |||||
| svnUsers.addElement(user); | |||||
| } | |||||
| /** | |||||
| * Set the revision at which the changelog should start. | |||||
| * | |||||
| * @param start The revision at which the changelog should start. | |||||
| */ | |||||
| public void setStart(final String start) { | |||||
| this.startRevision = start; | |||||
| } | |||||
| /** | |||||
| * Set the revision at which the changelog should stop. | |||||
| * | |||||
| * @param endRevision The revision at which the changelog should stop. | |||||
| */ | |||||
| public void setEnd(final String endRevision) { | |||||
| this.endRevision = endRevision; | |||||
| } | |||||
| /** | |||||
| * Set the number of days worth of log entries to process. | |||||
| * | |||||
| * @param days the number of days of log to process. | |||||
| */ | |||||
| public void setDaysinpast(final int days) { | |||||
| final long time = System.currentTimeMillis() | |||||
| - (long) days * 24 * 60 * 60 * 1000; | |||||
| final SimpleDateFormat outputDate = | |||||
| new SimpleDateFormat("{yyyy-MM-dd}"); | |||||
| setStart(outputDate.format(new Date(time))); | |||||
| } | |||||
| /** | |||||
| * Adds a set of files about which svn logs will be generated. | |||||
| * | |||||
| * @param fileSet a set of files about which svn logs will be generated. | |||||
| */ | |||||
| public void addFileset(final FileSet fileSet) { | |||||
| filesets.addElement(fileSet); | |||||
| } | |||||
| /** | |||||
| * Execute task | |||||
| * | |||||
| * @exception BuildException if something goes wrong executing the | |||||
| * svn command | |||||
| */ | |||||
| public void execute() throws BuildException { | |||||
| File savedDir = inputDir; // may be altered in validate | |||||
| try { | |||||
| validate(); | |||||
| final Properties userList = new Properties(); | |||||
| loadUserlist(userList); | |||||
| for (int i = 0, size = svnUsers.size(); i < size; i++) { | |||||
| final CvsUser user = (CvsUser) svnUsers.get(i); | |||||
| user.validate(); | |||||
| userList.put(user.getUserID(), user.getDisplayname()); | |||||
| } | |||||
| setSubCommand("log"); | |||||
| setVerbose(true); | |||||
| if (null != startRevision) { | |||||
| if (null != endRevision) { | |||||
| setRevision(startRevision + ":" + endRevision); | |||||
| } else { | |||||
| setRevision(startRevision + ":HEAD"); | |||||
| } | |||||
| } | |||||
| // Check if list of files to check has been specified | |||||
| if (!filesets.isEmpty()) { | |||||
| final Enumeration e = filesets.elements(); | |||||
| while (e.hasMoreElements()) { | |||||
| final FileSet fileSet = (FileSet) e.nextElement(); | |||||
| final DirectoryScanner scanner = | |||||
| fileSet.getDirectoryScanner(getProject()); | |||||
| final String[] files = scanner.getIncludedFiles(); | |||||
| for (int i = 0; i < files.length; i++) { | |||||
| addSubCommandArgument(files[i]); | |||||
| } | |||||
| } | |||||
| } | |||||
| final SvnChangeLogParser parser = new SvnChangeLogParser(); | |||||
| final PumpStreamHandler handler = | |||||
| new PumpStreamHandler(parser, | |||||
| new LogOutputStream(this, | |||||
| Project.MSG_ERR)); | |||||
| log(getSubCommand(), Project.MSG_VERBOSE); | |||||
| setDest(inputDir); | |||||
| setExecuteStreamHandler(handler); | |||||
| super.execute(); | |||||
| final SvnEntry[] entrySet = parser.getEntrySetAsArray(); | |||||
| final SvnEntry[] filteredEntrySet = filterEntrySet(entrySet); | |||||
| replaceAuthorIdWithName(userList, filteredEntrySet); | |||||
| writeChangeLog(filteredEntrySet); | |||||
| } finally { | |||||
| inputDir = savedDir; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Validate the parameters specified for task. | |||||
| * | |||||
| * @throws BuildException if fails validation checks | |||||
| */ | |||||
| private void validate() | |||||
| throws BuildException { | |||||
| if (null == inputDir) { | |||||
| inputDir = getDest(); | |||||
| } | |||||
| if (null == destFile) { | |||||
| final String message = "Destfile must be set."; | |||||
| throw new BuildException(message); | |||||
| } | |||||
| if (!inputDir.exists()) { | |||||
| final String message = "Cannot find base dir " | |||||
| + inputDir.getAbsolutePath(); | |||||
| throw new BuildException(message); | |||||
| } | |||||
| if (null != usersFile && !usersFile.exists()) { | |||||
| final String message = "Cannot find user lookup list " | |||||
| + usersFile.getAbsolutePath(); | |||||
| throw new BuildException(message); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Load the userlist from the userList file (if specified) and add to | |||||
| * list of users. | |||||
| * | |||||
| * @param userList the file of users | |||||
| * @throws BuildException if file can not be loaded for some reason | |||||
| */ | |||||
| private void loadUserlist(final Properties userList) | |||||
| throws BuildException { | |||||
| if (null != usersFile) { | |||||
| try { | |||||
| userList.load(new FileInputStream(usersFile)); | |||||
| } catch (final IOException ioe) { | |||||
| throw new BuildException(ioe.toString(), ioe); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Filter the specified entries according to an appropriate rule. | |||||
| * | |||||
| * @param entrySet the entry set to filter | |||||
| * @return the filtered entry set | |||||
| */ | |||||
| private SvnEntry[] filterEntrySet(final SvnEntry[] entrySet) { | |||||
| final Vector results = new Vector(); | |||||
| for (int i = 0; i < entrySet.length; i++) { | |||||
| final SvnEntry svnEntry = entrySet[i]; | |||||
| if (null != endRevision && !isBeforeEndRevision(svnEntry)) { | |||||
| //Skip revisions that are too late | |||||
| continue; | |||||
| } | |||||
| results.addElement(svnEntry); | |||||
| } | |||||
| final SvnEntry[] resultArray = new SvnEntry[results.size()]; | |||||
| results.copyInto(resultArray); | |||||
| return resultArray; | |||||
| } | |||||
| /** | |||||
| * replace all known author's id's with their maven specified names | |||||
| */ | |||||
| private void replaceAuthorIdWithName(final Properties userList, | |||||
| final SvnEntry[] entrySet) { | |||||
| for (int i = 0; i < entrySet.length; i++) { | |||||
| final SvnEntry entry = entrySet[ i ]; | |||||
| if (userList.containsKey(entry.getAuthor())) { | |||||
| entry.setAuthor(userList.getProperty(entry.getAuthor())); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Print changelog to file specified in task. | |||||
| * | |||||
| * @param entrySet the entry set to write. | |||||
| * @throws BuildException if there is an error writing changelog. | |||||
| */ | |||||
| private void writeChangeLog(final SvnEntry[] entrySet) | |||||
| throws BuildException { | |||||
| FileOutputStream output = null; | |||||
| try { | |||||
| output = new FileOutputStream(destFile); | |||||
| final PrintWriter writer = | |||||
| new PrintWriter(new OutputStreamWriter(output, "UTF-8")); | |||||
| final SvnChangeLogWriter serializer = new SvnChangeLogWriter(); | |||||
| serializer.printChangeLog(writer, entrySet); | |||||
| } catch (final UnsupportedEncodingException uee) { | |||||
| getProject().log(uee.toString(), Project.MSG_ERR); | |||||
| } catch (final IOException ioe) { | |||||
| throw new BuildException(ioe.toString(), ioe); | |||||
| } finally { | |||||
| FileUtils.close(output); | |||||
| } | |||||
| } | |||||
| private static final String PATTERN = "yyyy-MM-dd"; | |||||
| private static final SimpleDateFormat INPUT_DATE | |||||
| = new SimpleDateFormat(PATTERN); | |||||
| /** | |||||
| * Checks whether a given entry is before the given end revision, | |||||
| * using revision numbers or date information as appropriate. | |||||
| */ | |||||
| private boolean isBeforeEndRevision(SvnEntry entry) { | |||||
| if (endRevision.startsWith("{") | |||||
| && endRevision.length() >= 2 + PATTERN.length() ) { | |||||
| try { | |||||
| Date endDate = | |||||
| INPUT_DATE.parse(endRevision.substring(1, | |||||
| PATTERN.length() | |||||
| + 1)); | |||||
| return entry.getDate().before(endDate); | |||||
| } catch (ParseException e) { | |||||
| } | |||||
| } else { | |||||
| try { | |||||
| int endRev = Integer.parseInt(endRevision); | |||||
| int entryRev = Integer.parseInt(entry.getRevision()); | |||||
| return endRev >= entryRev; | |||||
| } catch (NumberFormatException e) { | |||||
| } // end of try-catch | |||||
| } | |||||
| // failed to parse revision, use a save fallback | |||||
| return true; | |||||
| } | |||||
| } | |||||
| @@ -1,96 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| import java.io.IOException; | |||||
| import java.io.PrintWriter; | |||||
| import java.text.SimpleDateFormat; | |||||
| import javax.xml.parsers.DocumentBuilder; | |||||
| import org.apache.tools.ant.util.DOMElementWriter; | |||||
| import org.apache.tools.ant.util.DOMUtils; | |||||
| import org.w3c.dom.Document; | |||||
| import org.w3c.dom.Element; | |||||
| /** | |||||
| * Class used to generate an XML changelog. | |||||
| */ | |||||
| public class SvnChangeLogWriter { | |||||
| /** output format for dates written to xml file */ | |||||
| private static final SimpleDateFormat OUTPUT_DATE | |||||
| = new SimpleDateFormat("yyyy-MM-dd"); | |||||
| /** output format for times written to xml file */ | |||||
| private static final SimpleDateFormat OUTPUT_TIME | |||||
| = new SimpleDateFormat("HH:mm"); | |||||
| /** stateless helper for writing the XML document */ | |||||
| private static final DOMElementWriter DOM_WRITER = new DOMElementWriter(); | |||||
| /** | |||||
| * Print out the specified entries. | |||||
| * | |||||
| * @param output writer to which to send output. | |||||
| * @param entries the entries to be written. | |||||
| */ | |||||
| public void printChangeLog(final PrintWriter output, | |||||
| final SvnEntry[] entries) throws IOException { | |||||
| output.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); | |||||
| Document doc = DOMUtils.newDocument(); | |||||
| Element root = doc.createElement("changelog"); | |||||
| DOM_WRITER.openElement(root, output, 0, "\t"); | |||||
| output.println(); | |||||
| for (int i = 0; i < entries.length; i++) { | |||||
| final SvnEntry entry = entries[i]; | |||||
| printEntry(output, entry, root); | |||||
| } | |||||
| DOM_WRITER.closeElement(root, output, 0, "\t", entries.length > 0); | |||||
| output.flush(); | |||||
| output.close(); | |||||
| } | |||||
| /** | |||||
| * Print out an individual entry in changelog. | |||||
| * | |||||
| * @param entry the entry to print | |||||
| * @param output writer to which to send output. | |||||
| */ | |||||
| private void printEntry(final PrintWriter output, final SvnEntry entry, | |||||
| final Element element) throws IOException { | |||||
| Document doc = element.getOwnerDocument(); | |||||
| Element ent = doc.createElement("entry"); | |||||
| DOMUtils.appendTextElement(ent, "date", | |||||
| OUTPUT_DATE.format(entry.getDate())); | |||||
| DOMUtils.appendTextElement(ent, "time", | |||||
| OUTPUT_TIME.format(entry.getDate())); | |||||
| DOMUtils.appendCDATAElement(ent, "author", entry.getAuthor()); | |||||
| DOMUtils.appendTextElement(ent, "revision", entry.getRevision()); | |||||
| SvnEntry.Path[] paths = entry.getPaths(); | |||||
| for (int i = 0; i < paths.length; i++) { | |||||
| Element path = DOMUtils.createChildElement(ent, "path"); | |||||
| DOMUtils.appendCDATAElement(path, "name", paths[i].getName()); | |||||
| DOMUtils.appendTextElement(path, "action", | |||||
| paths[i].getActionDescription()); | |||||
| } | |||||
| DOMUtils.appendCDATAElement(ent, "message", entry.getMessage()); | |||||
| DOM_WRITER.write(ent, output, 1, "\t"); | |||||
| } | |||||
| } | |||||
| @@ -1,207 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| import java.io.BufferedReader; | |||||
| import java.io.File; | |||||
| import java.io.FileOutputStream; | |||||
| import java.io.FileReader; | |||||
| import java.io.IOException; | |||||
| import java.io.OutputStreamWriter; | |||||
| import java.io.PrintWriter; | |||||
| import java.io.UnsupportedEncodingException; | |||||
| import java.util.ArrayList; | |||||
| import java.util.StringTokenizer; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.util.DOMElementWriter; | |||||
| import org.apache.tools.ant.util.DOMUtils; | |||||
| import org.apache.tools.ant.util.FileUtils; | |||||
| import org.w3c.dom.Document; | |||||
| import org.w3c.dom.Element; | |||||
| /** | |||||
| * Parses the output of a svn diff command and/or writes an XML report | |||||
| * based on such a diff output. | |||||
| * | |||||
| * It produces an XML output representing the list of changes. | |||||
| */ | |||||
| final class SvnDiffHandler { | |||||
| /** | |||||
| * Token to identify the word file in the rdiff log | |||||
| */ | |||||
| private static final String INDEX = "Index: "; | |||||
| /** | |||||
| * Token to identify a deleted file based on the Index line. | |||||
| */ | |||||
| private static final String DELETED = " (deleted)"; | |||||
| /** | |||||
| * Token to identify added files based on the diff line. | |||||
| */ | |||||
| private static final String IS_NEW = "\t(revision 0)"; | |||||
| /** | |||||
| * Token that starts diff line of old revision. | |||||
| */ | |||||
| private static final String DASHES = "--- "; | |||||
| /** stateless helper for writing the XML document */ | |||||
| private static final DOMElementWriter DOM_WRITER = new DOMElementWriter(); | |||||
| /** | |||||
| * Parse the tmpFile and return and array of entries to be written | |||||
| * in the output. | |||||
| * | |||||
| * @param tmpFile the File containing the output of the svn rdiff command | |||||
| * @return the entries in the output | |||||
| * @exception BuildException if an error occurs | |||||
| */ | |||||
| static SvnEntry.Path[] parseDiff(File tmpFile) throws BuildException { | |||||
| // parse the output of the command | |||||
| BufferedReader reader = null; | |||||
| try { | |||||
| reader = new BufferedReader(new FileReader(tmpFile)); | |||||
| ArrayList entries = new ArrayList(); | |||||
| String line = reader.readLine(); | |||||
| String name = null; | |||||
| String currDiffLine = null; | |||||
| boolean deleted = false; | |||||
| boolean added = false; | |||||
| while (null != line) { | |||||
| if (line.length() > INDEX.length()) { | |||||
| if (line.startsWith(INDEX)) { | |||||
| if (name != null) { | |||||
| SvnEntry.Path p = | |||||
| new SvnEntry.Path(name, | |||||
| deleted | |||||
| ? SvnEntry.Path.DELETED | |||||
| : (added | |||||
| ? SvnEntry.Path.ADDED | |||||
| : SvnEntry.Path.MODIFIED) | |||||
| ); | |||||
| entries.add(p); | |||||
| deleted = added = false; | |||||
| } | |||||
| name = line.substring(INDEX.length()); | |||||
| if (line.endsWith(DELETED)) { | |||||
| name = name.substring(0, name.length() | |||||
| - DELETED.length()); | |||||
| deleted = true; | |||||
| } | |||||
| currDiffLine = DASHES + name; | |||||
| } else if (currDiffLine != null | |||||
| && line.startsWith(currDiffLine) | |||||
| && line.endsWith(IS_NEW)) { | |||||
| added = true; | |||||
| } | |||||
| } | |||||
| line = reader.readLine(); | |||||
| } | |||||
| if (name != null) { | |||||
| SvnEntry.Path p = new SvnEntry.Path(name, | |||||
| deleted | |||||
| ? SvnEntry.Path.DELETED | |||||
| : (added | |||||
| ? SvnEntry.Path.ADDED | |||||
| : SvnEntry.Path.MODIFIED) | |||||
| ); | |||||
| entries.add(p); | |||||
| } | |||||
| SvnEntry.Path[] array = (SvnEntry.Path[]) | |||||
| entries.toArray(new SvnEntry.Path[entries.size()]); | |||||
| return array; | |||||
| } catch (IOException e) { | |||||
| throw new BuildException("Error in parsing", e); | |||||
| } finally { | |||||
| FileUtils.close(reader); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Write the diff log. | |||||
| * | |||||
| * @param entries a <code>SvnRevisionEntry[]</code> value | |||||
| * @exception BuildException if an error occurs | |||||
| */ | |||||
| static void writeDiff(File destFile, SvnEntry.Path[] entries, | |||||
| String rootElementName, | |||||
| String tag1Name, String tag1Value, | |||||
| String tag2Name, String tag2Value, | |||||
| String svnURL) throws BuildException { | |||||
| FileOutputStream output = null; | |||||
| try { | |||||
| output = new FileOutputStream(destFile); | |||||
| PrintWriter writer = new PrintWriter( | |||||
| new OutputStreamWriter(output, "UTF-8")); | |||||
| writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); | |||||
| Document doc = DOMUtils.newDocument(); | |||||
| Element root = doc.createElement(rootElementName); | |||||
| if (tag1Name != null && tag1Value != null) { | |||||
| root.setAttribute(tag1Name, tag1Value); | |||||
| } | |||||
| if (tag2Name != null && tag2Value != null) { | |||||
| root.setAttribute(tag2Name, tag2Value); | |||||
| } | |||||
| if (svnURL != null) { | |||||
| root.setAttribute("svnurl", svnURL); | |||||
| } | |||||
| DOM_WRITER.openElement(root, writer, 0, "\t"); | |||||
| writer.println(); | |||||
| for (int i = 0, c = entries.length; i < c; i++) { | |||||
| writeRevisionEntry(doc, writer, entries[i]); | |||||
| } | |||||
| DOM_WRITER.closeElement(root, writer, 0, "\t", true); | |||||
| writer.flush(); | |||||
| writer.close(); | |||||
| } catch (UnsupportedEncodingException uee) { | |||||
| throw new BuildException(uee); | |||||
| } catch (IOException ioe) { | |||||
| throw new BuildException(ioe.toString(), ioe); | |||||
| } finally { | |||||
| FileUtils.close(output); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Write a single entry to the given writer. | |||||
| * | |||||
| * @param doc Document used to create elements. | |||||
| * @param writer a <code>PrintWriter</code> value | |||||
| * @param entry a <code>SvnRevisionEntry</code> value | |||||
| */ | |||||
| private static void writeRevisionEntry(Document doc, | |||||
| PrintWriter writer, | |||||
| SvnEntry.Path entry) | |||||
| throws IOException { | |||||
| Element e = doc.createElement("path"); | |||||
| DOMUtils.appendCDATAElement(e, "name", entry.getName()); | |||||
| DOMUtils.appendTextElement(e, "action", entry.getActionDescription()); | |||||
| DOM_WRITER.write(e, writer, 1, "\t"); | |||||
| } | |||||
| } | |||||
| @@ -1,171 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| import java.util.ArrayList; | |||||
| import java.util.Collection; | |||||
| import java.util.Collections; | |||||
| import java.util.Date; | |||||
| public class SvnEntry { | |||||
| private final Date date; | |||||
| private final String revision; | |||||
| private String author; | |||||
| private final String message; | |||||
| private final ArrayList paths = new ArrayList(); | |||||
| /** | |||||
| * Creates a new instance of a SvnEntry | |||||
| * @param date the date | |||||
| * @param author the author | |||||
| * @param message a message to be added to the revision | |||||
| */ | |||||
| public SvnEntry(final Date date, final String revision, | |||||
| final String author, final String message) { | |||||
| this(date, revision, author, message, Collections.EMPTY_LIST); | |||||
| } | |||||
| /** | |||||
| * Creates a new instance of a SvnEntry | |||||
| * @param date the date | |||||
| * @param author the author | |||||
| * @param message a message to be added to the revision | |||||
| */ | |||||
| public SvnEntry(final Date date, final String revision, | |||||
| final String author, final String message, | |||||
| final Collection paths) { | |||||
| this.date = date; | |||||
| this.revision = revision; | |||||
| this.author = author; | |||||
| this.message = message; | |||||
| this.paths.addAll(paths); | |||||
| } | |||||
| /** | |||||
| * Adds a path to the SvnEntry | |||||
| * @param path the path to add | |||||
| * @param revision the revision | |||||
| */ | |||||
| public void addPath(final String name, final char action) { | |||||
| paths.add(new Path(name, action)); | |||||
| } | |||||
| /** | |||||
| * Gets the date of the SvnEntry | |||||
| * @return the date | |||||
| */ | |||||
| public Date getDate() { | |||||
| return date; | |||||
| } | |||||
| /** | |||||
| * Gets the revision of the SvnEntry | |||||
| * @return the date | |||||
| */ | |||||
| public String getRevision() { | |||||
| return revision; | |||||
| } | |||||
| /** | |||||
| * Sets the author of the SvnEntry | |||||
| * @param author the author | |||||
| */ | |||||
| public void setAuthor(final String author) { | |||||
| this.author = author; | |||||
| } | |||||
| /** | |||||
| * Gets the author of the SvnEntry | |||||
| * @return the author | |||||
| */ | |||||
| public String getAuthor() { | |||||
| return author; | |||||
| } | |||||
| /** | |||||
| * Gets the message for the SvnEntry | |||||
| * @return the message | |||||
| */ | |||||
| public String getMessage() { | |||||
| return message; | |||||
| } | |||||
| /** | |||||
| * Gets the paths in this SvnEntry | |||||
| * @return the files | |||||
| */ | |||||
| public Path[] getPaths() { | |||||
| return (Path[]) paths.toArray(new Path[paths.size()]); | |||||
| } | |||||
| public static class Path { | |||||
| private static final char ADDED_MARKER = 'A'; | |||||
| private static final char MODIFIED_MARKER = 'M'; | |||||
| private static final char DELETED_MARKER = 'D'; | |||||
| public static final int ADDED = 0; | |||||
| public static final int MODIFIED = 1; | |||||
| public static final int DELETED = 2; | |||||
| private static final String[] ACTIONS = { | |||||
| "added", "modified", "deleted", | |||||
| }; | |||||
| private final String name; | |||||
| private final int action; | |||||
| public Path(final String name, final char actionChar) { | |||||
| this.name = name; | |||||
| switch (actionChar) { | |||||
| case ADDED_MARKER: | |||||
| action = ADDED; | |||||
| break; | |||||
| case MODIFIED_MARKER: | |||||
| action = MODIFIED; | |||||
| break; | |||||
| case DELETED_MARKER: | |||||
| action = DELETED; | |||||
| break; | |||||
| default: | |||||
| throw new IllegalArgumentException("Unkown action; " | |||||
| + actionChar); | |||||
| } | |||||
| } | |||||
| public Path(final String name, final int action) { | |||||
| this.name = name; | |||||
| if (action != ADDED && action != DELETED && action != MODIFIED) { | |||||
| throw new IllegalArgumentException("Unkown action; " + action); | |||||
| } | |||||
| this.action = action; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public int getAction() { | |||||
| return action; | |||||
| } | |||||
| public String getActionDescription() { | |||||
| return ACTIONS[action]; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,162 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| import java.io.BufferedReader; | |||||
| import java.io.File; | |||||
| import java.io.FileOutputStream; | |||||
| import java.io.FileReader; | |||||
| import java.io.IOException; | |||||
| import java.io.OutputStreamWriter; | |||||
| import java.io.PrintWriter; | |||||
| import java.io.UnsupportedEncodingException; | |||||
| import java.util.ArrayList; | |||||
| import java.util.StringTokenizer; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.util.FileUtils; | |||||
| /** | |||||
| * Examines the output of svn diff between two revisions. | |||||
| * | |||||
| * It produces an XML output representing the list of changes. | |||||
| * <PRE> | |||||
| * <!-- Root element --> | |||||
| * <!ELEMENT revisiondiff ( paths? ) > | |||||
| * <!-- Start revision of the report --> | |||||
| * <!ATTLIST revisiondiff start NMTOKEN #IMPLIED > | |||||
| * <!-- End revision of the report --> | |||||
| * <!ATTLIST revisiondiff end NMTOKEN #IMPLIED > | |||||
| * <!-- Subversion URL if known --> | |||||
| * <!ATTLIST revisiondiff svnurl NMTOKEN #IMPLIED > | |||||
| * | |||||
| * <!-- Path added, changed or removed --> | |||||
| * <!ELEMENT path ( name,action ) > | |||||
| * <!-- Name of the file --> | |||||
| * <!ELEMENT name ( #PCDATA ) > | |||||
| * <!ELEMENT action (added|modified|deleted)> | |||||
| * </PRE> | |||||
| * | |||||
| * @ant.task name="svnrevisiondiff" | |||||
| */ | |||||
| public class SvnRevisionDiff extends AbstractSvnTask { | |||||
| /** | |||||
| * Used to create the temp file for svn log | |||||
| */ | |||||
| private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); | |||||
| /** | |||||
| * The earliest revision from which diffs are to be included in the report. | |||||
| */ | |||||
| private String mystartRevision; | |||||
| /** | |||||
| * The latest revision from which diffs are to be included in the report. | |||||
| */ | |||||
| private String myendRevision; | |||||
| /** | |||||
| * The file in which to write the diff report. | |||||
| */ | |||||
| private File mydestfile; | |||||
| /** | |||||
| * Set the start revision. | |||||
| * | |||||
| * @param s the start revision. | |||||
| */ | |||||
| public void setStart(String s) { | |||||
| mystartRevision = s; | |||||
| } | |||||
| /** | |||||
| * Set the end revision. | |||||
| * | |||||
| * @param s the end revision. | |||||
| */ | |||||
| public void setEnd(String s) { | |||||
| myendRevision = s; | |||||
| } | |||||
| /** | |||||
| * Set the output file for the diff. | |||||
| * | |||||
| * @param f the output file for the diff. | |||||
| */ | |||||
| public void setDestFile(File f) { | |||||
| mydestfile = f; | |||||
| } | |||||
| /** | |||||
| * Execute task. | |||||
| * | |||||
| * @exception BuildException if an error occurs | |||||
| */ | |||||
| public void execute() throws BuildException { | |||||
| // validate the input parameters | |||||
| validate(); | |||||
| // build the rdiff command | |||||
| setSubCommand("diff"); | |||||
| setRevision(mystartRevision + ":" + myendRevision); | |||||
| addSubCommandArgument("--no-diff-deleted"); | |||||
| File tmpFile = null; | |||||
| try { | |||||
| tmpFile = | |||||
| FILE_UTILS.createTempFile("svnrevisiondiff", ".log", null); | |||||
| tmpFile.deleteOnExit(); | |||||
| setOutput(tmpFile); | |||||
| // run the svn command | |||||
| super.execute(); | |||||
| // parse the diff | |||||
| SvnEntry.Path[] entries = SvnDiffHandler.parseDiff(tmpFile); | |||||
| // write the revision diff | |||||
| SvnDiffHandler.writeDiff(mydestfile, entries, "revisiondiff", | |||||
| "start", mystartRevision, | |||||
| "end", myendRevision, getSvnURL()); | |||||
| } finally { | |||||
| if (tmpFile != null) { | |||||
| tmpFile.delete(); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Validate the parameters specified for task. | |||||
| * | |||||
| * @exception BuildException if a parameter is not correctly set | |||||
| */ | |||||
| private void validate() throws BuildException { | |||||
| if (null == mydestfile) { | |||||
| throw new BuildException("Destfile must be set."); | |||||
| } | |||||
| if (null == mystartRevision) { | |||||
| throw new BuildException("Start revision or start date must be set."); | |||||
| } | |||||
| if (null == myendRevision) { | |||||
| throw new BuildException("End revision or end date must be set."); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,210 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| import java.io.BufferedReader; | |||||
| import java.io.File; | |||||
| import java.io.FileOutputStream; | |||||
| import java.io.FileReader; | |||||
| import java.io.IOException; | |||||
| import java.io.OutputStreamWriter; | |||||
| import java.io.PrintWriter; | |||||
| import java.io.UnsupportedEncodingException; | |||||
| import java.util.ArrayList; | |||||
| import java.util.StringTokenizer; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.util.FileUtils; | |||||
| /** | |||||
| * Examines the output of svn diff between two tags or a tag and trunk. | |||||
| * | |||||
| * <p>This task only works if you follow the best-practice structure of | |||||
| * <pre> | |||||
| * BASEURL | |||||
| * | | |||||
| * | | |||||
| * -----> trunk | |||||
| * -----> tags | |||||
| * | | |||||
| * | | |||||
| * ----------> tag1 | |||||
| * ----------> tag2 | |||||
| * </pre> | |||||
| * | |||||
| * It produces an XML output representing the list of changes. | |||||
| * <PRE> | |||||
| * <!-- Root element --> | |||||
| * <!ELEMENT tagdiff ( paths? ) > | |||||
| * <!-- First tag --> | |||||
| * <!ATTLIST tagdiff tag1 NMTOKEN #IMPLIED > | |||||
| * <!-- Second tag --> | |||||
| * <!ATTLIST tagdiff tag2 NMTOKEN #IMPLIED > | |||||
| * <!-- Subversion BaseURL --> | |||||
| * <!ATTLIST tagdiff svnurl NMTOKEN #IMPLIED > | |||||
| * | |||||
| * <!-- Path added, changed or removed --> | |||||
| * <!ELEMENT path ( name,action ) > | |||||
| * <!-- Name of the file --> | |||||
| * <!ELEMENT name ( #PCDATA ) > | |||||
| * <!ELEMENT action (added|modified|deleted)> | |||||
| * </PRE> | |||||
| * | |||||
| * @ant.task name="svntagdiff" | |||||
| */ | |||||
| public class SvnTagDiff extends AbstractSvnTask { | |||||
| /** | |||||
| * Used to create the temp file for svn log | |||||
| */ | |||||
| private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); | |||||
| /** | |||||
| * The earliest revision from which diffs are to be included in the report. | |||||
| */ | |||||
| private String tag1; | |||||
| /** | |||||
| * The latest revision from which diffs are to be included in the report. | |||||
| */ | |||||
| private String tag2; | |||||
| /** | |||||
| * The file in which to write the diff report. | |||||
| */ | |||||
| private File mydestfile; | |||||
| /** | |||||
| * Base URL. | |||||
| */ | |||||
| private String baseURL; | |||||
| /** | |||||
| * Set the first tag. | |||||
| * | |||||
| * @param s the first tag. | |||||
| */ | |||||
| public void setTag1(String s) { | |||||
| tag1 = s; | |||||
| } | |||||
| /** | |||||
| * Set the second tag. | |||||
| * | |||||
| * @param s the second tag. | |||||
| */ | |||||
| public void setTag2(String s) { | |||||
| tag2 = s; | |||||
| } | |||||
| /** | |||||
| * Set the output file for the diff. | |||||
| * | |||||
| * @param f the output file for the diff. | |||||
| */ | |||||
| public void setDestFile(File f) { | |||||
| mydestfile = f; | |||||
| } | |||||
| /** | |||||
| * Set the base URL from which to calculate tag URLs. | |||||
| * | |||||
| * @param u the base URL from which to calculate tag URLs. | |||||
| */ | |||||
| public void setBaseURL(String u) { | |||||
| baseURL = u; | |||||
| if (!u.endsWith("/")) { | |||||
| baseURL += "/"; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Execute task. | |||||
| * | |||||
| * @exception BuildException if an error occurs | |||||
| */ | |||||
| public void execute() throws BuildException { | |||||
| // validate the input parameters | |||||
| validate(); | |||||
| // build the rdiff command | |||||
| setSubCommand("diff"); | |||||
| addSubCommandArgument("--no-diff-deleted"); | |||||
| if (tag1.equals("trunk") || tag1.equals("trunk/")) { | |||||
| addSubCommandArgument(baseURL + "trunk/"); | |||||
| } else { | |||||
| if (tag1.endsWith("/")) { | |||||
| addSubCommandArgument(baseURL + "tags/" + tag1); | |||||
| } else { | |||||
| addSubCommandArgument(baseURL + "tags/" + tag1 + "/"); | |||||
| } | |||||
| } | |||||
| if (tag2 == null || tag2.equals("trunk") || tag2.equals("trunk/")) { | |||||
| addSubCommandArgument(baseURL + "trunk/"); | |||||
| } else { | |||||
| if (tag2.endsWith("/")) { | |||||
| addSubCommandArgument(baseURL + "tags/" + tag2); | |||||
| } else { | |||||
| addSubCommandArgument(baseURL + "tags/" + tag2 + "/"); | |||||
| } | |||||
| } | |||||
| File tmpFile = null; | |||||
| try { | |||||
| tmpFile = | |||||
| FILE_UTILS.createTempFile("svntagdiff", ".log", null); | |||||
| tmpFile.deleteOnExit(); | |||||
| setOutput(tmpFile); | |||||
| // run the svn command | |||||
| super.execute(); | |||||
| // parse the diff | |||||
| SvnEntry.Path[] entries = SvnDiffHandler.parseDiff(tmpFile); | |||||
| // write the revision diff | |||||
| SvnDiffHandler.writeDiff(mydestfile, entries, "tagdiff", | |||||
| "tag1", tag1, "tag2", | |||||
| tag2 == null ? "trunk" : tag2, | |||||
| baseURL); | |||||
| } finally { | |||||
| if (tmpFile != null) { | |||||
| tmpFile.delete(); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Validate the parameters specified for task. | |||||
| * | |||||
| * @exception BuildException if a parameter is not correctly set | |||||
| */ | |||||
| private void validate() throws BuildException { | |||||
| if (null == mydestfile) { | |||||
| throw new BuildException("Destfile must be set."); | |||||
| } | |||||
| if (null == tag1) { | |||||
| throw new BuildException("tag1 must be set."); | |||||
| } | |||||
| if (null == baseURL) { | |||||
| throw new BuildException("baseURL must be set."); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,34 +0,0 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Copyright 2005 The Apache Software Foundation | |||||
| 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. | |||||
| --> | |||||
| <antlib> | |||||
| <taskdef | |||||
| name="svn" | |||||
| classname="org.apache.tools.ant.taskdefs.svn.Svn" | |||||
| /> | |||||
| <taskdef | |||||
| name="changelog" | |||||
| classname="org.apache.tools.ant.taskdefs.svn.SvnChangeLogTask" | |||||
| /> | |||||
| <taskdef | |||||
| name="revisiondiff" | |||||
| classname="org.apache.tools.ant.taskdefs.svn.SvnRevisionDiff" | |||||
| /> | |||||
| <taskdef | |||||
| name="tagdiff" | |||||
| classname="org.apache.tools.ant.taskdefs.svn.SvnTagDiff" | |||||
| /> | |||||
| </antlib> | |||||
| @@ -1,53 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| import java.io.File; | |||||
| import org.apache.tools.ant.BuildFileTest; | |||||
| /** | |||||
| */ | |||||
| public class AbstractSvnTaskTest extends BuildFileTest { | |||||
| public AbstractSvnTaskTest() { | |||||
| this( "AbstractSvnTaskTest" ); | |||||
| } | |||||
| public AbstractSvnTaskTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| public void setUp() { | |||||
| configureProject("src/etc/testcases/abstractsvntask.xml"); | |||||
| } | |||||
| public void tearDown() { | |||||
| executeTarget("cleanup"); | |||||
| } | |||||
| public void testAbstractSvnTask() { | |||||
| executeTarget("all"); | |||||
| } | |||||
| public void testRevisionAttribute() { | |||||
| File f = getProject().resolveFile("tmpdir/tpf/ebcdic.h"); | |||||
| assertTrue("starting empty", !f.exists()); | |||||
| expectLogContaining("revision-attribute", "A tpf/ebcdic.h"); | |||||
| assertTrue("now it is there", f.exists()); | |||||
| } | |||||
| } | |||||
| @@ -1,146 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| import java.io.IOException; | |||||
| import java.io.FileReader; | |||||
| import org.apache.tools.ant.BuildFileTest; | |||||
| import org.apache.tools.ant.util.FileUtils; | |||||
| import junit.framework.Assert; | |||||
| /** | |||||
| */ | |||||
| public class SvnChangeLogTaskTest extends BuildFileTest { | |||||
| public SvnChangeLogTaskTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| public void setUp() { | |||||
| configureProject("src/etc/testcases/changelog.xml"); | |||||
| } | |||||
| public void tearDown() { | |||||
| executeTarget("cleanup"); | |||||
| } | |||||
| public void testLog() throws IOException { | |||||
| String log = executeTargetAndReadLogFully("log"); | |||||
| assertRev153687(log); | |||||
| assertRev152685(log); | |||||
| } | |||||
| public void testStart() throws IOException { | |||||
| String log = executeTargetAndReadLogFully("start"); | |||||
| assertRev153687(log); | |||||
| assertNoRev152685(log); | |||||
| } | |||||
| public void testStartDate() throws IOException { | |||||
| String log = executeTargetAndReadLogFully("startDate"); | |||||
| assertRev153687(log); | |||||
| assertNoRev152685(log); | |||||
| } | |||||
| public void testEnd() throws IOException { | |||||
| String log = executeTargetAndReadLogFully("end"); | |||||
| assertNoRev153687(log); | |||||
| assertRev152685(log); | |||||
| } | |||||
| public void testEndDate() throws IOException { | |||||
| String log = executeTargetAndReadLogFully("endDate"); | |||||
| assertNoRev153687(log); | |||||
| assertRev152685(log); | |||||
| } | |||||
| private String executeTargetAndReadLogFully(String target) | |||||
| throws IOException { | |||||
| executeTarget(target); | |||||
| FileReader r = new FileReader(getProject() | |||||
| .resolveFile("tmpdir/log.xml")); | |||||
| try { | |||||
| return FileUtils.readFully(r); | |||||
| } finally { | |||||
| r.close(); | |||||
| } | |||||
| } | |||||
| private static final void assertRev153687(String log) { | |||||
| int rev = log.indexOf("<revision>153687</revision>"); | |||||
| Assert.assertTrue(rev > -1); | |||||
| int entryBeforeRev = log.lastIndexOf("<entry>", rev); | |||||
| int entryAfterRev = log.indexOf("</entry>", rev); | |||||
| Assert.assertTrue(entryBeforeRev > -1); | |||||
| Assert.assertTrue(entryAfterRev > -1); | |||||
| Assert | |||||
| .assertTrue(log.lastIndexOf("<author><![CDATA[dbrosius]]></author>", | |||||
| rev) > entryBeforeRev); | |||||
| Assert | |||||
| .assertTrue(log.indexOf("<name><![CDATA[/jakarta/bcel/trunk/src" | |||||
| + "/java/org/apache/bcel/util/BCELifier." | |||||
| + "java]]></name>", rev) < entryAfterRev); | |||||
| Assert | |||||
| .assertTrue(log.indexOf("<action>modified</action>", rev) | |||||
| < entryAfterRev); | |||||
| Assert | |||||
| .assertTrue(log.indexOf("<message><![CDATA[Update BCELifier to " | |||||
| + "handle the new method access flags " | |||||
| + "(ACC_BRIDGE, ACC_VARARGS)]]></message>", | |||||
| rev) | |||||
| < entryAfterRev); | |||||
| } | |||||
| private static final void assertRev152685(String log) { | |||||
| int rev = log.indexOf("<revision>152685</revision>"); | |||||
| Assert.assertTrue(rev > -1); | |||||
| int entryBeforeRev = log.lastIndexOf("<entry>", rev); | |||||
| int entryAfterRev = log.indexOf("</entry>", rev); | |||||
| Assert.assertTrue(entryBeforeRev > -1); | |||||
| Assert.assertTrue(entryAfterRev > -1); | |||||
| Assert | |||||
| .assertTrue(log.lastIndexOf("<![CDATA[(no author)]]>", rev) | |||||
| > entryBeforeRev); | |||||
| Assert | |||||
| .assertTrue(log.indexOf("<name><![CDATA[/jakarta/bcel/branches]]>" | |||||
| + "</name>", rev) < entryAfterRev); | |||||
| Assert | |||||
| .assertTrue(log.indexOf("<action>added</action>", rev) | |||||
| < entryAfterRev); | |||||
| Assert | |||||
| .assertTrue(log.indexOf("<message><![CDATA[New repository " | |||||
| + "initialized by cvs2svn.]]></message>", | |||||
| rev) | |||||
| < entryAfterRev); | |||||
| } | |||||
| private static final void assertNoRev153687(String log) { | |||||
| int rev = log.indexOf("<revision>153687</revision>"); | |||||
| Assert.assertEquals(-1, rev); | |||||
| } | |||||
| private static final void assertNoRev152685(String log) { | |||||
| int rev = log.indexOf("<revision>152685</revision>"); | |||||
| Assert.assertEquals(-1, rev); | |||||
| } | |||||
| } | |||||
| @@ -1,136 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| import java.io.IOException; | |||||
| import java.io.FileReader; | |||||
| import org.apache.tools.ant.BuildFileTest; | |||||
| import org.apache.tools.ant.util.FileUtils; | |||||
| import junit.framework.Assert; | |||||
| /** | |||||
| */ | |||||
| public class SvnRevisionDiffTest extends BuildFileTest { | |||||
| public SvnRevisionDiffTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| public void setUp() { | |||||
| configureProject("src/etc/testcases/revisiondiff.xml"); | |||||
| } | |||||
| public void tearDown() { | |||||
| executeTarget("cleanup"); | |||||
| } | |||||
| public void testDiff() throws IOException { | |||||
| String log = executeTargetAndReadLogFully("diff"); | |||||
| assertAttributesNoURL(log); | |||||
| assertAdded(log); | |||||
| assertModified(log); | |||||
| assertDeleted(log); | |||||
| } | |||||
| public void testDiffUrl() throws IOException { | |||||
| String log = executeTargetAndReadLogFully("diff-using-url"); | |||||
| assertAttributesWithURL(log); | |||||
| assertAdded(log); | |||||
| assertModified(log); | |||||
| assertDeleted(log); | |||||
| } | |||||
| private String executeTargetAndReadLogFully(String target) | |||||
| throws IOException { | |||||
| executeTarget(target); | |||||
| FileReader r = new FileReader(getProject() | |||||
| .resolveFile("tmpdir/diff.xml")); | |||||
| try { | |||||
| return FileUtils.readFully(r); | |||||
| } finally { | |||||
| r.close(); | |||||
| } | |||||
| } | |||||
| private static final void assertAttributes(String log) { | |||||
| int start = log.indexOf("<revisiondiff"); | |||||
| Assert.assertTrue(start > -1); | |||||
| int end = log.indexOf(">", start); | |||||
| Assert.assertTrue(end > -1); | |||||
| Assert.assertTrue(log.indexOf("start=\"152904\"", start) > -1); | |||||
| Assert.assertTrue(log.indexOf("start=\"152904\"", start) < end); | |||||
| Assert.assertTrue(log.indexOf("end=\"153682\"", start) > -1); | |||||
| Assert.assertTrue(log.indexOf("end=\"153682\"", start) < end); | |||||
| } | |||||
| private static final void assertAttributesNoURL(String log) { | |||||
| assertAttributes(log); | |||||
| Assert.assertEquals(-1, log.indexOf("svnurl=")); | |||||
| } | |||||
| private static final void assertAttributesWithURL(String log) { | |||||
| assertAttributes(log); | |||||
| int start = log.indexOf("<revisiondiff"); | |||||
| int end = log.indexOf(">", start); | |||||
| Assert.assertTrue(log.indexOf("svnurl=\"http://svn.apache.org/repos/" | |||||
| + "asf/jakarta/bcel/trunk\"", start) | |||||
| > -1); | |||||
| Assert.assertTrue(log.indexOf("svnurl=\"http://svn.apache.org/repos/" | |||||
| + "asf/jakarta/bcel/trunk\"", start) | |||||
| < end); | |||||
| } | |||||
| private static final void assertAdded(String log) { | |||||
| int name = log.indexOf("<![CDATA[src/java/org/apache/bcel/classfile/" | |||||
| + "ElementValuePair.java]]>"); | |||||
| Assert.assertTrue(name > -1); | |||||
| int pathAfterName = log.indexOf("</path>", name); | |||||
| Assert.assertTrue(pathAfterName > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>added</action>", name) > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>added</action>", name) | |||||
| < pathAfterName); | |||||
| } | |||||
| private static final void assertModified(String log) { | |||||
| int name = log.indexOf("<name><![CDATA[xdocs/stylesheets/project." | |||||
| + "xml]]></name>"); | |||||
| Assert.assertTrue(name > -1); | |||||
| int pathAfterName = log.indexOf("</path>", name); | |||||
| Assert.assertTrue(pathAfterName > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>modified</action>", name) > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>modified</action>", name) | |||||
| < pathAfterName); | |||||
| } | |||||
| private static final void assertDeleted(String log) { | |||||
| int name = log.indexOf("<name><![CDATA[lib/CCK.jar]]></name>"); | |||||
| Assert.assertTrue(name > -1); | |||||
| int pathAfterName = log.indexOf("</path>", name); | |||||
| Assert.assertTrue(pathAfterName > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>deleted</action>", name) > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>deleted</action>", name) | |||||
| < pathAfterName); | |||||
| } | |||||
| } | |||||
| @@ -1,144 +0,0 @@ | |||||
| /* | |||||
| * Copyright 2005 The Apache Software Foundation | |||||
| * | |||||
| * 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.apache.tools.ant.taskdefs.svn; | |||||
| import java.io.IOException; | |||||
| import java.io.FileReader; | |||||
| import org.apache.tools.ant.BuildFileTest; | |||||
| import org.apache.tools.ant.util.FileUtils; | |||||
| import junit.framework.Assert; | |||||
| /** | |||||
| */ | |||||
| public class SvnTagDiffTest extends BuildFileTest { | |||||
| public SvnTagDiffTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| public void setUp() { | |||||
| configureProject("src/etc/testcases/tagdiff.xml"); | |||||
| } | |||||
| public void tearDown() { | |||||
| executeTarget("cleanup"); | |||||
| } | |||||
| public void testDiffWithTwoTags() throws IOException { | |||||
| String log = executeTargetAndReadLogFully("diff-with-two-tags"); | |||||
| assertAttributes(log, "initial", "BCEL_5_0"); | |||||
| assertAdded1(log); | |||||
| } | |||||
| public void testDiffWithExplicitTrunk() throws IOException { | |||||
| String log = executeTargetAndReadLogFully("diff-with-explicit-trunk"); | |||||
| assertDiffWithTrunk(log); | |||||
| } | |||||
| public void testDiffWithImplicitTrunk() throws IOException { | |||||
| String log = executeTargetAndReadLogFully("diff-with-implicit-trunk"); | |||||
| assertDiffWithTrunk(log); | |||||
| } | |||||
| private static void assertDiffWithTrunk(String log) { | |||||
| assertAttributes(log, "BCEL_5_0", "trunk"); | |||||
| assertAdded(log); | |||||
| assertModified(log); | |||||
| assertDeleted(log); | |||||
| } | |||||
| private String executeTargetAndReadLogFully(String target) | |||||
| throws IOException { | |||||
| executeTarget(target); | |||||
| FileReader r = new FileReader(getProject() | |||||
| .resolveFile("tmpdir/diff.xml")); | |||||
| try { | |||||
| return FileUtils.readFully(r); | |||||
| } finally { | |||||
| r.close(); | |||||
| } | |||||
| } | |||||
| private static final void assertAttributes(String log, String tag1, | |||||
| String tag2) { | |||||
| int start = log.indexOf("<tagdiff"); | |||||
| Assert.assertTrue(start > -1); | |||||
| int end = log.indexOf(">", start); | |||||
| Assert.assertTrue(end > -1); | |||||
| Assert.assertTrue(log.indexOf("tag1=\"" + tag1 + "\"", start) > -1); | |||||
| Assert.assertTrue(log.indexOf("tag1=\"" + tag1 + "\"", start) < end); | |||||
| Assert.assertTrue(log.indexOf("tag2=\"" + tag2 + "\"", start) > -1); | |||||
| Assert.assertTrue(log.indexOf("tag2=\"" + tag2 + "\"", start) < end); | |||||
| Assert.assertTrue(log.indexOf("svnurl=\"http://svn.apache.org/repos/" | |||||
| + "asf/jakarta/bcel/\"", start) > -1); | |||||
| Assert.assertTrue(log.indexOf("svnurl=\"http://svn.apache.org/repos/" | |||||
| + "asf/jakarta/bcel/\"", start) < end); | |||||
| } | |||||
| private static final void assertAdded(String log) { | |||||
| int name = log.indexOf("<![CDATA[LICENSE.txt]]>"); | |||||
| Assert.assertTrue(name > -1); | |||||
| int pathAfterName = log.indexOf("</path>", name); | |||||
| Assert.assertTrue(pathAfterName > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>added</action>", name) > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>added</action>", name) | |||||
| < pathAfterName); | |||||
| } | |||||
| private static final void assertModified(String log) { | |||||
| int name = log.indexOf("<name><![CDATA[src/java/org/apache/bcel/" | |||||
| + "Repository.java]]></name>"); | |||||
| Assert.assertTrue(name > -1); | |||||
| int pathAfterName = log.indexOf("</path>", name); | |||||
| Assert.assertTrue(pathAfterName > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>modified</action>", name) > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>modified</action>", name) | |||||
| < pathAfterName); | |||||
| } | |||||
| private static final void assertDeleted(String log) { | |||||
| int name = log.indexOf("<name><![CDATA[LICENSE]]></name>"); | |||||
| Assert.assertTrue(name > -1); | |||||
| int pathAfterName = log.indexOf("</path>", name); | |||||
| Assert.assertTrue(pathAfterName > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>deleted</action>", name) > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>deleted</action>", name) | |||||
| < pathAfterName); | |||||
| } | |||||
| private static final void assertAdded1(String log) { | |||||
| int name = log.indexOf("<name><![CDATA[src/java/org/apache/bcel/" | |||||
| + "Repository.java]]></name>"); | |||||
| Assert.assertTrue(name > -1); | |||||
| int pathAfterName = log.indexOf("</path>", name); | |||||
| Assert.assertTrue(pathAfterName > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>added</action>", name) > -1); | |||||
| Assert.assertTrue(log.indexOf("<action>added</action>", name) | |||||
| < pathAfterName); | |||||
| } | |||||
| } | |||||