I am not aware of any built in task, but there is a method in FileUtils you 
could use.

Jan

        <scriptdef name="relpath" language="javascript">
            <attribute name="property"/>
            <attribute name="base"/>
            <attribute name="file"/>
            <![CDATA[
                importClass(Packages.org.apache.tools.ant.util.FileUtils);
                importClass(Packages.java.io.File);
                propName = attributes.get("property");
                baseFile = attributes.get("base");
                file     = attributes.get("file");
                relPath  = FileUtils.getRelativePath(new File(baseFile), new 
File(file) );
                project.setNewProperty(propName, relPath);
            ]]>
        </scriptdef>
        <relpath property="rel" base="x/a/b" file="x/a/b/c/d/e/f/g/file.txt"/>


or as java code (task)
        <taskdef name="relpath" classname="RelpathTask" classpath="."/>
        <relpath property="rel" base="x/a/b" file="x/a/b/c/d/e/f/g/file.txt"/>



import java.io.File;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.util.FileUtils;

public class RelpathTask extends Task {
    private File basefile;
    private File checkfile;
    private String propertyname;
    
    public void setBase(File base) {
        basefile = base;
    }
    
    public void setFile(File file) {
        checkfile = file;
    }
    
    public void setProperty(String propName) {
        propertyname = propName;
    }
    
    public void execute() {
        checkSettings();
        try {
            String relPath = FileUtils.getRelativePath(basefile, checkfile);
            getProject().setNewProperty(propertyname, relPath);
        } catch (Exception e) {
            throw new BuildException(e);
        }
    }
    
    protected void checkSettings() {
        if (basefile == null) {
            throw new BuildException("'basefile' must be set.", getLocation());
        }
        if (checkfile == null) {
            throw new BuildException("'checkfile' must be set.", getLocation());
        }
        if (propertyname == null) {
            throw new BuildException("'propertyname' must be set.", 
getLocation());
        }
    }
} 

>-----Ursprüngliche Nachricht-----
>Von: Andy Stevens [mailto:insomniacpeng...@googlemail.com] 
>Gesendet: Dienstag, 8. September 2009 08:42
>An: user
>Betreff: calculating relative paths
>
>Hi,
>
>Is there an easy way to calculate an arbitrary relative path 
>between two files?
>Part of my Ant script copies a default configuration file to a build
>folder, in the course of which I modify it (with xmltask) with the
>location of some source files.  At the moment I'm using <property
>location="${src.dir}" .../> to get the absolute path, but I'm curious
>whether there's a way to get a relative path instead .  Since I know
>where it's being copied to, I could just use "../../${src.dir}", but
>that's a bit fragile if the build directory changes (which it will do
>- locally on my machine I use ${basedir}/build, but on our CI server
>it's likely to override this with some other directory).
>Ideally, I suppose I'd like to use something like <property
>location="${src.dir}" basedir="${build.dir}" .../>  Is there anything
>like this in one of the "extras" libraries, or some other easy way to
>achieve it?
>
>
>Andy
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: user-unsubscr...@ant.apache.org
>For additional commands, e-mail: user-h...@ant.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@ant.apache.org
For additional commands, e-mail: user-h...@ant.apache.org

Reply via email to