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); | |||
| } | |||
| } | |||