|
|
@@ -0,0 +1,324 @@ |
|
|
|
/* |
|
|
|
* 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 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.starteam; |
|
|
|
|
|
|
|
import java.io.FileInputStream; |
|
|
|
import java.io.IOException; |
|
|
|
import java.util.Enumeration; |
|
|
|
import java.util.Hashtable; |
|
|
|
|
|
|
|
import com.starbase.starteam.File; |
|
|
|
import com.starbase.starteam.Folder; |
|
|
|
import com.starbase.starteam.Item; |
|
|
|
import com.starbase.starteam.Status; |
|
|
|
import com.starbase.starteam.View; |
|
|
|
import com.starbase.starteam.ViewConfiguration; |
|
|
|
|
|
|
|
import org.apache.tools.ant.BuildException; |
|
|
|
import org.apache.tools.ant.Project; |
|
|
|
|
|
|
|
/** |
|
|
|
* StarTeamCheckIn.java |
|
|
|
* |
|
|
|
* |
|
|
|
* Created: Sat Dec 15 20:26:07 2001 |
|
|
|
* |
|
|
|
* @author <a href="mailto:scohen@localhost.localdomain">Steve Cohen</a> |
|
|
|
* @version 1.0 |
|
|
|
*/ |
|
|
|
public class StarTeamCheckin extends TreeBasedTask { |
|
|
|
|
|
|
|
public StarTeamCheckin() { |
|
|
|
// we want this to have a false default, unlike for Checkin. |
|
|
|
setRecursive(false); |
|
|
|
} |
|
|
|
|
|
|
|
private boolean createFolders = true; |
|
|
|
|
|
|
|
/** |
|
|
|
* The comment which will be stored with the checkin. |
|
|
|
*/ |
|
|
|
private String comment = null; |
|
|
|
|
|
|
|
/** |
|
|
|
* holder for the add Uncontrolled attribute. If true, all |
|
|
|
* local files not in StarTeam will be added to the repository. |
|
|
|
*/ |
|
|
|
private boolean addUncontrolled = false; |
|
|
|
|
|
|
|
/** |
|
|
|
* Sets the value of createFolders |
|
|
|
* |
|
|
|
* @param argCreateFolders Value to assign to this.createFolders |
|
|
|
*/ |
|
|
|
public void setCreateFolders(boolean argCreateFolders) { |
|
|
|
this.createFolders = argCreateFolders; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Get the comment attribute for this operation |
|
|
|
* @return value of comment. |
|
|
|
*/ |
|
|
|
public String getComment() { |
|
|
|
return this.comment; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Set the value of comment. |
|
|
|
* @param comment Value to assign to comment. |
|
|
|
*/ |
|
|
|
public void setComment(String comment) { |
|
|
|
this.comment = comment; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Get the value of addUncontrolled. |
|
|
|
* @return value of addUncontrolled. |
|
|
|
*/ |
|
|
|
public boolean isAddUncontrolled() { |
|
|
|
return this.addUncontrolled; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Set the value of addUncontrolled. |
|
|
|
* @param addUncontrolled Value to assign to addUncontrolled. |
|
|
|
*/ |
|
|
|
public void setAddUncontrolled(boolean addUncontrolled) { |
|
|
|
this.addUncontrolled = addUncontrolled; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* This attribute tells whether unlocked files on checkin (so that |
|
|
|
* other users may access them) checkout or to leave the checkout status |
|
|
|
* alone (default). |
|
|
|
* @see setUnlocked() |
|
|
|
*/ |
|
|
|
private int lockStatus = Item.LockType.UNCHANGED; |
|
|
|
|
|
|
|
/** |
|
|
|
* Set to do an unlocked checkout. Default is false; |
|
|
|
* @param v true means do an unlocked checkout |
|
|
|
* false means leave status alone. |
|
|
|
*/ |
|
|
|
public void setUnlocked(boolean v) { |
|
|
|
if (v) { |
|
|
|
this.lockStatus = Item.LockType.UNLOCKED; |
|
|
|
} else { |
|
|
|
this.lockStatus = Item.LockType.UNCHANGED; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Override of base-class abstract function creates an |
|
|
|
* appropriately configured view. For checkins this is |
|
|
|
* always the current or "tip" view. |
|
|
|
* |
|
|
|
* @param raw the unconfigured <code>View</code> |
|
|
|
* @return the snapshot <code>View</code> appropriately configured. |
|
|
|
*/ |
|
|
|
protected View createSnapshotView(View raw) { |
|
|
|
return new View(raw, ViewConfiguration.createTip()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Implements base-class abstract function to define tests for |
|
|
|
* any preconditons required by the task |
|
|
|
* |
|
|
|
* @exception BuildException not thrown in this implementation |
|
|
|
*/ |
|
|
|
protected void testPreconditions() throws BuildException { |
|
|
|
if (null != getRootLocalFolder() && !isForced()) { |
|
|
|
log("Warning: rootLocalFolder specified, but forcing off.", |
|
|
|
Project.MSG_WARN); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Implements base-class abstract function to perform the checkout |
|
|
|
* operation on the files in each folder of the tree. |
|
|
|
* |
|
|
|
* @param starteamFolder the StarTeam folder to which files |
|
|
|
* will be checked in |
|
|
|
* @param localFolder local folder from which files will be checked in |
|
|
|
* @exception BuildException if any error occurs |
|
|
|
*/ |
|
|
|
protected void visit(Folder starteamFolder, java.io.File targetFolder) |
|
|
|
throws BuildException { |
|
|
|
try { |
|
|
|
Hashtable localFiles = listLocalFiles(targetFolder); |
|
|
|
|
|
|
|
// If we have been told to create the working folders |
|
|
|
// For all Files in this folder, we need to check |
|
|
|
// if there have been modifications. |
|
|
|
|
|
|
|
Item[] files = starteamFolder.getItems("File"); |
|
|
|
for (int i = 0; i < files.length; i++) { |
|
|
|
File eachFile = (File) files[i]; |
|
|
|
String filename = eachFile.getName(); |
|
|
|
java.io.File localFile = |
|
|
|
new java.io.File(targetFolder, filename); |
|
|
|
|
|
|
|
delistLocalFile(localFiles, localFile); |
|
|
|
|
|
|
|
// If the file doesn't pass the include/exclude tests, skip it. |
|
|
|
if (!shouldProcess(filename)) { |
|
|
|
log("Skipping " + eachFile.toString(), Project.MSG_INFO); |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// If forced is not set then we may save ourselves some work by |
|
|
|
// looking at the status flag. |
|
|
|
// Otherwise, we care nothing about these statuses. |
|
|
|
|
|
|
|
if (!isForced()) { |
|
|
|
int fileStatus = (eachFile.getStatus()); |
|
|
|
|
|
|
|
// We try to update the status once to give StarTeam |
|
|
|
// another chance. |
|
|
|
if (fileStatus == Status.MERGE |
|
|
|
|| fileStatus == Status.UNKNOWN) { |
|
|
|
eachFile.updateStatus(true, true); |
|
|
|
fileStatus = (eachFile.getStatus()); |
|
|
|
} |
|
|
|
if (fileStatus == Status.CURRENT) { |
|
|
|
log("Not processing " + eachFile.toString() |
|
|
|
+ " as it is current.", |
|
|
|
Project.MSG_INFO); |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Check in anything else. |
|
|
|
|
|
|
|
log("Checking In: " + (localFile.toString()), Project.MSG_INFO); |
|
|
|
eachFile.checkinFrom(localFile, this.comment, |
|
|
|
this.lockStatus, |
|
|
|
true, true, true); |
|
|
|
} |
|
|
|
|
|
|
|
// Now we recursively call this method on all sub folders in this |
|
|
|
// folder unless recursive attribute is off. |
|
|
|
Folder[] subFolders = starteamFolder.getSubFolders(); |
|
|
|
for (int i = 0; i < subFolders.length; i++) { |
|
|
|
java.io.File targetSubfolder = |
|
|
|
new java.io.File(targetFolder, subFolders[i].getName()); |
|
|
|
delistLocalFile(localFiles, targetSubfolder); |
|
|
|
|
|
|
|
if (isRecursive()) { |
|
|
|
visit(subFolders[i], targetSubfolder); |
|
|
|
} |
|
|
|
} |
|
|
|
if (this.addUncontrolled) { |
|
|
|
addUncontrolledItems(localFiles, starteamFolder); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} catch (IOException e) { |
|
|
|
throw new BuildException(e); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Adds to the StarTeam repository everything on the local machine that |
|
|
|
* is not currently in the repository. |
|
|
|
* @param folder - StarTeam folder to which these items are to be added. |
|
|
|
*/ |
|
|
|
private void addUncontrolledItems(Hashtable localFiles, Folder folder) |
|
|
|
throws IOException { |
|
|
|
try { |
|
|
|
Enumeration e = localFiles.keys(); |
|
|
|
while (e.hasMoreElements()) { |
|
|
|
java.io.File file = |
|
|
|
new java.io.File(e.nextElement().toString()); |
|
|
|
add(folder, file); |
|
|
|
} |
|
|
|
} catch (SecurityException e) { |
|
|
|
log("Error adding file: " + e, Project.MSG_ERR); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Deletes the file from the local drive. |
|
|
|
* @param file the file or directory to delete. |
|
|
|
* @return true if the file was successfully deleted otherwise false. |
|
|
|
*/ |
|
|
|
private void add(Folder parentFolder, java.io.File file) |
|
|
|
throws IOException { |
|
|
|
// If the current file is a Directory, we need to process all |
|
|
|
// of its children as well. |
|
|
|
if (file.isDirectory()) { |
|
|
|
log("Adding new folder to repository: " + file.getAbsolutePath(), |
|
|
|
Project.MSG_INFO); |
|
|
|
Folder newFolder = new Folder(parentFolder); |
|
|
|
newFolder.setName(file.getName()); |
|
|
|
newFolder.update(); |
|
|
|
|
|
|
|
// now visit this new folder to take care of adding any files |
|
|
|
// or subfolders within it. |
|
|
|
if (isRecursive()) { |
|
|
|
visit(newFolder, file); |
|
|
|
} |
|
|
|
} else { |
|
|
|
log("Adding new file to repository: " + file.getAbsolutePath(), |
|
|
|
Project.MSG_INFO); |
|
|
|
File newFile = new File(parentFolder); |
|
|
|
newFile.addFromStream(new FileInputStream(file), |
|
|
|
file.getName(), |
|
|
|
null, this.comment, 3, true); |
|
|
|
} |
|
|
|
} |
|
|
|
} |