Hi All,

        Attached is an updated version of the task, which supports linking
        into named directories (currently only a single source file can be
        named, filesets are coming).

        Cheers,

        Marcus

On Wed, 18 Apr 2001, Marcus Crafter wrote:

> Hi All,
> 
>       Attached is a simple link task which allows you to create unix
>       links from ant build files. It supports both hard and symbolic links.
> 
>       I'm definitely an ant beginner - so please feel free to point out any
>       mistakes. I want to learn the right way to do things.
> 
>       Couple of questions - how do we handle platform specific tasks like
>       this ? (ie. is it acceptable for general consumption ?, core or
>       optional, or neither ?).
> 
>       I'm intending to add support for target directories as well.
>       
>               ie. ln TARGET-0...[TARGET-N] DIRECTORY
>       
>       and the option of removing existing destination files, if people would
>       find that useful ?
> 
>       Any implementation ideas for non UNIX platforms ??
> 
>       Cheers,
> 
>       Marcus
> 
> 

-- 
        .....
     ,,$$$$$$$$$,      Marcus Crafter
    ;$'      '$$$$:    Computer Systems Engineer
    $:         $$$$:   Open Software Associates GmbH
     $       o_)$$$:   82-84 Mainzer Landstrasse
     ;$,    _/\ &&:'   60327 Frankfurt Germany
       '     /( &&&
           \_&&&&'     Email : [EMAIL PROTECTED]
          &&&&.        Business Hours : +49 69 9757 200
    &&&&&&&:           After Hours    : +49 69 49086750
/*
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 1999 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution, if
 *    any, must include the following acknowlegement:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowlegement may appear in the software itself,
 *    if and wherever such third-party acknowlegements normally appear.
 *
 * 4. The names "The Jakarta Project", "Ant", and "Apache Software
 *    Foundation" must not be used to endorse or promote products derived
 *    from this software without prior written permission. For written
 *    permission, please contact [EMAIL PROTECTED]
 *
 * 5. Products derived from this software may not be called "Apache"
 *    nor may "Apache" appear in their names without prior written
 *    permission of the Apache Group.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 */

package org.apache.tools.ant.taskdefs;

import java.io.*;
import org.apache.tools.ant.*;
import org.apache.tools.ant.types.Commandline;

/**
 * Task to create a link (optionally symbolic) from one file to another.
 *
 * @author [EMAIL PROTECTED]
 */
public class Link extends Task {

    public void setFile(File src) {
        this.src = src;
    }

    public void setToFile(File dest) {
        this.destfile = dest;
    }

    public void setToDir(File dest) {
    	this.destdir = dest;
    }

    public void setSymbolic(boolean symbolic) {
        this.symbolic = symbolic;
    }

    public void execute() throws BuildException {

        if (src == null || !src.exists()) {
            throw new BuildException(
              "The file attribute must be present, and name an existing file",
              location
            );
        }

	if ((destdir != null && destfile != null) ||
	(destdir == null && destfile == null))
	{
	    throw new BuildException(
	      "Either toDir or toFile must be specified as link targets",
	      location
	    );
	}

	if (destdir != null)              // directory target checks
	{
	    if (!destdir.isDirectory())
	       throw new BuildException(
	         "toDir must be the name of an existing directory.", location
               );
	    
	    String linkname =
	       destdir.getPath() + File.separator + src.getName();

	    if (new File(linkname).exists())
	       throw new BuildException(
	         "target " + linkname + " already exists.", location
	       );
	}
	else                              // file target checks
	{
	    if (destfile.exists())
	       throw new BuildException(
	         "toFile must name a file which does not exist.", location
	       );
	}

        File target = destfile == null ? destdir : destfile;

        log("Linking " + src + (symbolic ? ", symbolically" : "") +
	    (destfile == null ? " into directory " : " to ") +
            target, Project.MSG_INFO
           );

        linkFile(src, target, symbolic);
    }

    private void linkFile(File from, File to, boolean symbolic)
    throws BuildException {

        Commandline link = new Commandline();
        link.setExecutable("ln");

        if (symbolic)
            link.createArgument().setValue("-s");
        link.createArgument().setFile(from);
        link.createArgument().setFile(to);

        Execute ex =
          new Execute(
            new LogStreamHandler(
              this, Project.MSG_INFO, Project.MSG_WARN
            ), null
          );
        ex.setCommandline(link.getCommandline());

        try {
            ex.execute();
        } catch (IOException e) {
            throw new BuildException(e);
        }
    }

    private File src;
    private File destfile;
    private File destdir;
    private boolean symbolic = true;
}

Reply via email to