blob: ca2dfec903618c2c253fcceded2ebe2a36ec2675 [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 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 apache@apache.org.
*
* 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.optional.clearcase;
import java.util.Vector;
import java.util.Hashtable;
import java.util.Enumeration;
import java.io.File;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.taskdefs.MatchingTask;
/**
* Creates a file or directory element.
*
* @see http://clearcase.rational.com/doc/latest/ccase_ux/ccref/mkelem.html
*
*/
public class CCMkelem extends CCMatchingTask {
private String type;
private boolean nocheckout;
private boolean checkin;
private boolean preserveTime;
private Hashtable codirs = new Hashtable();
public void execute(String[] args, CCFile file) throws BuildException {
CCFile parent = (CCFile)codirs.get(file.getParent());
if (parent == null){
parent = new CCFile(file.getParent());
if ( !parent.isVersioned() ){
mkelemDirectory(parent);
// ensure versioned dir
} else if ( parent.isCheckedIn() ){
utils.checkout( parent );
}
codirs.put(parent.getPath(), parent);
}
args[args.length - 1] = file.getAbsolutePath();
CmdResult res = CCUtils.cleartool(args);
if (res.getStatus() != 0) {
throw new BuildException(res.getStdErr());
}
}
protected void postExecute() {
// checkin back all co directories
Enumeration dirs = codirs.elements();
while( dirs.hasMoreElements() ){
File dir = (File)dirs.nextElement();
utils.checkin( dir );
}
super.postExecute();
}
/** create the command line options based on user input */
protected Vector getOptions(){
Vector v = new Vector();
v.addElement("mkelem");
if (type != null){
v.addElement("-eltype");
v.addElement(type);
}
if (comment == null){
v.addElement("-nc");
} else {
commentFile = CCUtils.createCommentFile(comment);
v.addElement("-cfi");
v.addElement(commentFile.getAbsolutePath());
}
if (nocheckout){
v.addElement("-nco");
} else if (checkin){
v.addElement("-ci");
if (preserveTime){
v.addElement("-ptime");
}
}
v.addElement("<pname>"); // dummy arg for file
return v;
}
private void mkelemDirectory(CCFile dir) throws BuildException {
// resolve symoblic link if any...
dir = new CCFile( utils.resolveSymbolicLink(dir.getAbsoluteFile()).getAbsolutePath() );
// make sure that the parent is versioned...
CCFile parent = new CCFile(dir.getParent());
boolean should_ci = false;
if ( !parent.isVersioned() ){
mkelemDirectory(parent);
codirs.put(parent.getPath(), parent.getAbsoluteFile());
}
// ...and checkout it if already checked in.
if ( parent.isCheckedIn() ){
utils.checkout(parent.getAbsoluteFile());
codirs.put(parent.getPath(), parent.getAbsoluteFile());
}
// rename the unversioned directory into a temporary one...
File mkelem_file = new File(dir.getAbsolutePath() + "_mkelem");
dir.renameTo( mkelem_file );
// then create it via Clearcase...
utils.mkdir( dir );
codirs.put(dir.getPath(), dir.getAbsoluteFile());
// .. and populate it back with its files...
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++){
File newFile = new File(dir, files[i].getName());
if ( !files[i].renameTo( newFile ) ) {
throw new BuildException("Could not rename dir '" + files[i] + "' into '" + newFile + "'" );
}
}
// delete this one only if things went smoothly...
mkelem_file.delete();
}
// bean setters
public void setType(String value){
type = value;
}
public void setNoCheckout(boolean value){
nocheckout = value;
}
public void setCheckin(boolean value){
checkin = value;
}
public void setPreserveTime(boolean value){
preserveTime = value;
}
}