-default dest, repository -override properties -changes to tests to keep working -enhancements to tests so they work behind a firewall if ~/.ant/proxy.properties contains the settings git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277397 13f79535-47bb-0310-9956-ffa450edef68master
@@ -42,7 +42,7 @@ | |||
<td valign="top">destDir</td> | |||
<td valign="top">Destination directory for all downloads | |||
</td> | |||
<td valign="top" align="center">Yes</td> | |||
<td valign="top" align="center">No - default is ${user.home}/.maven/repository</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">offline</td> | |||
@@ -68,10 +68,15 @@ | |||
<td valign="top">repositoryRef</td> | |||
<td valign="top">Reference to a predefined repository | |||
</td> | |||
<td valign="top" align="center">Only if no repository is defined inline</td> | |||
<td valign="top" align="center">No</td> | |||
</tr> | |||
</table> | |||
<p> | |||
The default destination is that used by Maven, | |||
${user.home}/.maven/repository . It can be overridden by setting the | |||
property <code>ant.maven.repository.dir</code> to a new location. | |||
</p> | |||
</table> | |||
<h3>Nested Elements</h3> | |||
@@ -127,9 +132,12 @@ This is the core of the system; a library to (potentially) download. | |||
</table> | |||
<h4>Repository</h4> | |||
<p> | |||
A repository is Ant datatype that extends the <code>Repository</code> type. | |||
Ant only ships with one: the mavenrepository; | |||
Ant only ships with one: the mavenrepository. If no repository is | |||
declared inline, and no repositoryref attribute set, the task | |||
will default to the maven repository. | |||
</p> | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
<tr> | |||
@@ -143,12 +151,6 @@ Ant only ships with one: the mavenrepository; | |||
</td> | |||
<td valign="top" align="center">No</td> | |||
</tr> | |||
<tr> | |||
<td valign="top"></td> | |||
<td valign="top"> | |||
</td> | |||
<td valign="top" align="center">No</td> | |||
</tr> | |||
</table> | |||
<p>Example:</p> | |||
@@ -158,6 +160,15 @@ Ant only ships with one: the mavenrepository; | |||
<h4>mavenrepository</h4> | |||
<p> | |||
This connects to the Maven repository at ibiblio.org, or another | |||
chosen. Private repositories should copy the existing layout. | |||
</p> | |||
<p> | |||
If no <code>url</code> is set, the default URL is | |||
<code>http://ibiblio.org/maven</code>, unless the property | |||
<code>ant.maven.repository.url</code> is set to something else. | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
<tr> | |||
<td valign="top"><b>Attribute</b></td> | |||
@@ -276,6 +276,18 @@ org.apache.tools.ant.Executor implementation specified here. | |||
<a href="listeners.html#AnsiColorLogger">AnsiColorLogger</a>. | |||
</td> | |||
</tr> | |||
<tr> | |||
<td><code>ant.maven.repository.dir</code></td> | |||
<td>directory e.g. ${user.home}/.maven/repository </td> | |||
<td>Override the default download location for <a href="CoreTasks/libraries.html">libraries</a>. | |||
</td> | |||
</tr> | |||
<tr> | |||
<td><code>ant.maven.repository.url</code></td> | |||
<td>URL e.g. <code>http://ibiblio.org/maven</code> </td> | |||
<td>Override the default source location for <a href="CoreTasks/libraries.html">libraries</a>. | |||
</td> | |||
</tr> | |||
<tr> | |||
<td><code>ant.netrexxc.*</code></td> | |||
<td>several formats</td> | |||
@@ -2,10 +2,28 @@ | |||
<project name="getlibraries" basedir="." default="init"> | |||
<!-- use the normal one at ibiblio--> | |||
<mavenrepository id="maven"/> | |||
<target name="init"> | |||
<!-- configure an HTTP proxy --> | |||
<target name="setproxy" unless="setproxy.disabled" > | |||
<!-- put your proxy settings here --> | |||
<property file="${user.home}/.ant/proxy.properties" /> | |||
<property name="proxy.host" value="" /> | |||
<property name="proxy.port" value="80" /> | |||
<property name="proxy.user" value="" /> | |||
<property name="proxy.pass" value="" /> | |||
<echo level="verbose"> | |||
proxy: ${proxy.host}:${proxy.port} [${proxy.user}/${proxy.pass}] | |||
</echo> | |||
<setproxy proxyhost="${proxy.host}" proxyport="${proxy.port}" | |||
proxyuser="${proxy.user}" proxypassword="${proxy.pass}" /> | |||
</target> | |||
<target name="init" depends="setproxy"> | |||
<property name="lib.dir" value="getlib"/> | |||
<property name="commons.logging.project" value="commons-logging"/> | |||
@@ -15,6 +33,9 @@ | |||
<property name="commons.logging" | |||
value="${commons.logging.project}/jars/${commons.logging.filename}"/> | |||
<property name="maven.repository.dir" | |||
location="${user.home}/.maven/repository" /> | |||
<presetdef name="gl1"> | |||
<libraries destDir="${lib.dir}"> | |||
</libraries> | |||
@@ -28,6 +49,21 @@ | |||
</presetdef> | |||
<macrodef name="assert-downloaded"> | |||
<attribute name="library" default="${commons.logging}"/> | |||
<attribute name="repository" default="${lib.dir}"/> | |||
<sequential> | |||
<fail > | |||
Not found: "@{repository}/@{library}" | |||
<condition> | |||
<not> | |||
<available file="@{repository}/@{library}"/> | |||
</not> | |||
</condition> | |||
</fail> | |||
</sequential> | |||
</macrodef> | |||
<!-- <macrodef name="assert-downloaded"> | |||
<attribute name="library" default="${commons.logging}"/> | |||
<sequential> | |||
<property name="@{library}.path" location="${lib.dir}/@{library}" /> | |||
@@ -37,20 +73,21 @@ | |||
Not found: ${@{library}.path} | |||
</fail> | |||
</sequential> | |||
</macrodef> | |||
</macrodef> --> | |||
<macrodef name="assert-not-downloaded"> | |||
<attribute name="library" default="${commons.logging}"/> | |||
<attribute name="repository" default="${lib.dir}"/> | |||
<sequential> | |||
<property name="@{library}.path" location="${lib.dir}/@{library}" /> | |||
<available property="@{library}.exists" | |||
file="${@{library}.path}"/> | |||
<fail if="@{library}.exists"> | |||
Found: ${@{library}.path} | |||
<fail> | |||
Unexpectedly found: "@{repository}/@{library}" | |||
<condition> | |||
<available file="@{repository}/@{library}"/> | |||
</condition> | |||
</fail> | |||
</sequential> | |||
</macrodef> | |||
</target> | |||
<target name="cleanup" depends="init"> | |||
@@ -77,6 +114,7 @@ | |||
<target name="testNoRepo" depends="init"> | |||
<getlib/> | |||
<assert-downloaded/> | |||
</target> | |||
<target name="testUnknownReference" depends="init"> | |||
@@ -85,7 +123,6 @@ | |||
</getlib> | |||
</target> | |||
<target name="testFunctionalInline" depends="init"> | |||
<getlib repositoryref="maven"> | |||
</getlib> | |||
@@ -202,12 +239,10 @@ | |||
<target name="testForceDisabled" depends="init"> | |||
<getlib> | |||
<mavenrepository/> | |||
<force enabled="true" /> | |||
<assertdownloaded count="1" /> | |||
</getlib> | |||
<getlib > | |||
<mavenrepository/> | |||
<force enabled="false" /> | |||
<assertdownloaded count="0" /> | |||
</getlib> | |||
@@ -215,7 +250,6 @@ | |||
<target name="testAbsentFiles" depends="init"> | |||
<getlib > | |||
<mavenrepository/> | |||
<absentfiles enabled="true" /> | |||
<assertdownloaded count="1" /> | |||
</getlib> | |||
@@ -223,7 +257,6 @@ | |||
<target name="testAbsentFilesTwice" depends="testAbsentFiles"> | |||
<getlib > | |||
<mavenrepository/> | |||
<absentfiles enabled="true" /> | |||
<assertdownloaded count="0" /> | |||
</getlib> | |||
@@ -85,7 +85,7 @@ public final class Libraries extends Task { | |||
private boolean flatten = false; | |||
public static final String ERROR_ONE_REPOSITORY_ONLY = "Only one repository is allowed"; | |||
public static final String ERROR_NO_DEST_DIR = "No destination directory"; | |||
//public static final String ERROR_NO_DEST_DIR = "No destination directory"; | |||
public static final String ERROR_NO_REPOSITORY = "No repository defined"; | |||
public static final String ERROR_NO_LIBRARIES = "No libraries declared"; | |||
public static final String ERROR_REPO_PROBE_FAILED = "Repository probe failed with "; | |||
@@ -95,6 +95,22 @@ public final class Libraries extends Task { | |||
public static final String MSG_NO_LIBRARIES_TO_FETCH = "No libraries marked for retrieval"; | |||
/** | |||
* where maven stores stuff, and where we save stuff too, unless | |||
* declared otherwise. | |||
*/ | |||
public static final String MAVEN_LOCATION=".maven/repository"; | |||
/** | |||
* name of the property which can provide an override of the repository dir | |||
* from {@link #MAVEN_LOCATION} | |||
*/ | |||
public static final String REPOSITORY_DIR_PROPERTY="ant.maven.repository.dir"; | |||
/** | |||
* name of the property which can provide an override of the repository URL | |||
*/ | |||
public static final String REPOSITORY_URL_PROPERTY = "ant.maven.repository.url"; | |||
/** | |||
* Init the task | |||
* | |||
@@ -107,6 +123,23 @@ public final class Libraries extends Task { | |||
add(new AbsentFilesPolicy()); | |||
} | |||
/** | |||
* locate the default directory, by looking for the property | |||
* {@link #REPOSITORY_DIR_PROPERTY}, and if not defined, | |||
* ${user.home}/.maven/repository | |||
* @return file for the default dest dir; may not exist yet. | |||
*/ | |||
private File locateDefaultDestDirectory() { | |||
//set the dest dir up to the default. | |||
File mavenDir | |||
= new File(System.getProperty("user.home"), MAVEN_LOCATION); | |||
String propertyDir = getProject().getProperty(REPOSITORY_DIR_PROPERTY); | |||
if(propertyDir!=null) { | |||
mavenDir=getProject().resolveFile(propertyDir); | |||
} | |||
return mavenDir; | |||
} | |||
/** | |||
* add a repository. Only one is (currently) supported | |||
* | |||
@@ -325,13 +358,12 @@ public final class Libraries extends Task { | |||
* @throws BuildException | |||
*/ | |||
public void validate() { | |||
if (destDir == null | |||
// || !destDir.isDirectory() | |||
) { | |||
throw new BuildException(ERROR_NO_DEST_DIR); | |||
if (destDir == null) { | |||
destDir=locateDefaultDestDirectory(); | |||
} | |||
if (repository == null) { | |||
throw new BuildException(ERROR_NO_REPOSITORY); | |||
MavenRepository maven=(MavenRepository)getProject().createDataType(MavenRepository.TYPE_NAME); | |||
repository=maven; | |||
} | |||
Iterator it = libraries.iterator(); | |||
while (it.hasNext()) { | |||
@@ -365,9 +397,12 @@ public final class Libraries extends Task { | |||
*/ | |||
private void doExecute() throws BuildException { | |||
destDir.mkdirs(); | |||
//get the ultimate repository | |||
Repository repo = repository.resolve(); | |||
//validate it | |||
repo.validate(); | |||
if (libraries.size() == 0) { | |||
//bail out on an empty library | |||
throw new BuildException(ERROR_NO_LIBRARIES); | |||
} | |||
log("Getting libraries from " + repo.toString(), Project.MSG_VERBOSE); | |||
@@ -18,6 +18,7 @@ | |||
package org.apache.tools.ant.taskdefs.repository; | |||
import org.apache.tools.ant.util.FileUtils; | |||
import org.apache.tools.ant.BuildException; | |||
import java.io.File; | |||
import java.io.FileInputStream; | |||
@@ -48,12 +49,12 @@ public class MavenRepository extends HttpRepository { | |||
* this is what we think the MD5 type is | |||
*/ | |||
protected static final String MAVEN_MD5_FILE_TYPE = "US-ASCII"; | |||
public static final String TYPE_NAME = "mavenrepository"; | |||
/** | |||
* bind to the main maven repository | |||
*/ | |||
public MavenRepository() { | |||
setUrl(MAVEN_URL); | |||
} | |||
@@ -65,6 +66,29 @@ public class MavenRepository extends HttpRepository { | |||
this.checkMD5 = checkMD5; | |||
} | |||
/** | |||
* Validation time is where the final fixup of repositories exist; this | |||
* is the last chance to examine properties to see if there is an override. | |||
* | |||
* @throws BuildException if unhappy | |||
*/ | |||
public void validate() { | |||
if(getUrl()==null) { | |||
//we have no URL yet; so use the maven one | |||
if(getProject()!=null) { | |||
String urlProperty=getProject() | |||
.getProperty(Libraries.REPOSITORY_URL_PROPERTY); | |||
if(urlProperty!=null) { | |||
setUrl(urlProperty); | |||
} else { | |||
setUrl(MAVEN_URL); | |||
} | |||
} | |||
} | |||
super.validate(); | |||
} | |||
/** | |||
* Get the path to a remote library. This is the full URL | |||
* | |||
@@ -27,9 +27,9 @@ import java.io.IOException; | |||
* retrieval. To use this type, you must use a non-abstract class, either one | |||
* that ships with Ant, or one you implement and declare yourself. | |||
* <p/> | |||
* The <getlibraries> task lets you supply a repository by reference | |||
* The <libraries> task lets you supply a repository by reference | |||
* inline {@link Libraries#add(Repository)} or on the command line {@link | |||
* GetLibraries#setRepositoryRef(org.apache.tools.ant.types.Reference)} | |||
* Libraries#setRepositoryRef(org.apache.tools.ant.types.Reference)} | |||
* | |||
* @since Ant1.7 | |||
*/ | |||
@@ -47,11 +47,11 @@ public class LibrariesTest extends BuildFileTest { | |||
} | |||
public void testEmpty() { | |||
expectBuildException("testEmpty",Libraries.ERROR_NO_DEST_DIR); | |||
expectBuildException("testEmpty", Libraries.ERROR_NO_LIBRARIES); | |||
} | |||
public void testEmpty2() { | |||
expectBuildException("testEmpty2", Libraries.ERROR_NO_REPOSITORY); | |||
expectBuildException("testEmpty2", Libraries.ERROR_NO_LIBRARIES); | |||
} | |||
public void testEmpty3() { | |||
@@ -59,7 +59,7 @@ public class LibrariesTest extends BuildFileTest { | |||
} | |||
public void testNoRepo() { | |||
expectBuildException("testNoRepo", Libraries.ERROR_NO_REPOSITORY); | |||
execIfOnline("testNoRepo"); | |||
} | |||
public void testUnknownReference() { | |||