Checks out files from a StarTeam project.
It also creates all working directories on the
local directory if appropriate. Ant Usage:
| Method from org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckout Detail: |
protected View createSnapshotView(View raw) throws BuildException {
int labelID = getLabelID(raw);
// if a label has been supplied and it is a view label, use it
// to configure the view
if (this.isUsingViewLabel()) {
return new View(raw, ViewConfiguration.createFromLabel(labelID));
// if a label has been supplied and it is a revision label, use the raw
// the view as the snapshot
} else if (this.isUsingRevisionLabel()) {
return raw;
}
// if a date has been supplied use a view configured to the date.
View view = getViewConfiguredByDate(raw);
if (view != null) {
return view;
// otherwise, use this view configured as the tip.
} else {
return new View(raw, ViewConfiguration.createTip());
}
}
Override of base-class abstract function creates an
appropriately configured view for checkouts - either
the current view or a view from this.label or the raw
view itself in the case of a revision label. |
public boolean getUseRepositoryTimeStamp() {
return this.useRepositoryTimeStamp;
}
returns the value of the useRepositoryTimestamp member |
protected void logOperationDescription(Folder starteamrootFolder,
File targetrootFolder) {
log((this.isRecursive() ? "Recursive" : "Non-recursive")
+ " Checkout from: " + starteamrootFolder.getFolderHierarchy());
log(" Checking out to"
+ (null == getRootLocalFolder() ? "(default): " : ": ")
+ targetrootFolder.getAbsolutePath());
logLabel();
logAsOfDate();
logIncludes();
logExcludes();
if (this.lockStatus == Item.LockType.EXCLUSIVE) {
log(" Items will be checked out with Exclusive locks.");
} else if (this.lockStatus == Item.LockType.UNLOCKED) {
log(" Items will be checked out unlocked "
+ "(even if presently locked).");
} else {
log(" Items will be checked out with no change in lock status.");
}
log(" Items will be checked out with "
+ (this.useRepositoryTimeStamp ? "repository timestamps."
: "the current timestamp."));
log(" Items will be checked out "
+ (this.isForced() ? "regardless of" : "in accordance with")
+ " repository status.");
if (this.deleteUncontrolled) {
log(" Local items not found in the repository will be deleted.");
}
log(" Items will be checked out "
+ (this.convertEOL ? "using the local machine's EOL convention"
: "without changing the EOL convention used on the server"));
log(" Directories will be created"
+ (this.createDirs ? " wherever they exist in the repository, even if empty."
: " only where needed to check out files."));
}
extenders should emit to the log an entry describing the parameters
that will be used by this operation. |
public void setAsOfDate(String asOfDateParam) {
_setAsOfDate(asOfDateParam);
}
List files, dates, and statuses as of this date; optional.
If not specified, the most recent version of each file will be listed. |
public void setAsOfDateFormat(String asOfDateFormat) {
_setAsOfDateFormat(asOfDateFormat);
}
Date Format with which asOfDate parameter to be parsed; optional.
Must be a SimpleDateFormat compatible string.
If not specified, and asOfDateParam is specified, parse will use ISO8601
datetime and date formats. |
public void setConvertEOL(boolean value) {
this.convertEOL = value;
}
Set whether or not files should be checked out using the
local machine's EOL convention.
Optional, defaults to true. |
public void setCreateWorkingDirs(boolean value) {
this.createDirs = value;
}
flag (defaults to true) to create all directories
that are in the Starteam repository even if they are empty. |
public void setDeleteUncontrolled(boolean value) {
this.deleteUncontrolled = value;
}
Whether or not all local files not in StarTeam should be deleted.
Optional, defaults to true. |
public void setLabel(String label) {
_setLabel(label);
}
Sets the label StarTeam is to use for checkout; defaults to the most recent file.
The label must exist in starteam or an exception will be thrown. |
public void setLocked(boolean v) throws BuildException {
setLockStatus(v, Item.LockType.EXCLUSIVE);
}
Set to do a locked checkout; optional default is false. |
public void setUnlocked(boolean v) throws BuildException {
setLockStatus(v, Item.LockType.UNLOCKED);
}
Set to do an unlocked checkout. Default is false; |
public void setUseRepositoryTimeStamp(boolean useRepositoryTimeStamp) {
this.useRepositoryTimeStamp = useRepositoryTimeStamp;
}
sets the useRepositoryTimestmp member. |
protected void testPreconditions() throws BuildException {
if (this.isUsingRevisionLabel() && this.createDirs) {
log("Ignoring createworkingdirs while using a revision label."
+ " Folders will be created only as needed.",
Project.MSG_WARN);
this.createDirs = false;
}
if (lockStatus != Item.LockType.UNCHANGED) {
boolean lockStatusBad = false;
if (null != getLabel()) {
log("Neither locked nor unlocked may be true"
+ " when checking out a labeled version.",
Project.MSG_ERR);
lockStatusBad = true;
} else if (null != getAsOfDate()) {
log("Neither locked nor unlocked may be true"
+ " when checking out by date.",
Project.MSG_ERR);
lockStatusBad = true;
}
if (lockStatusBad) {
throw new BuildException(
"Lock status may not be changed"
+ " when checking out a non-current version.");
}
}
if (null != getLabel() && null != getAsOfDate()) {
throw new BuildException(
"Both label and asOfDate specified. "
+ "Unable to process request.");
}
}
Implements base-class abstract function to define tests for
any preconditons required by the task. |
protected void visit(Folder starteamFolder,
File targetFolder) throws BuildException {
try {
if (null != getRootLocalFolder()) {
starteamFolder.setAlternatePathFragment(
targetFolder.getAbsolutePath());
}
if (!targetFolder.exists()) {
if (!this.isUsingRevisionLabel()) {
if (this.createDirs) {
if (targetFolder.mkdirs()) {
log("Creating folder: " + targetFolder);
} else {
throw new BuildException(
"Failed to create local folder " + targetFolder);
}
}
}
}
Folder[] foldersList = starteamFolder.getSubFolders();
Item[] filesList = starteamFolder.getItems(getTypeNames().FILE);
if (this.isUsingRevisionLabel()) {
// prune away any files not belonging to the revision label
// this is one ugly API from Starteam SDK
Hashtable labelItems = new Hashtable(filesList.length);
int s = filesList.length;
int[] ids = new int[s];
for (int i = 0; i < s; i++) {
ids[i] = filesList[i].getItemID();
labelItems.put(new Integer(ids[i]), new Integer(i));
}
int[] foundIds = getLabelInUse().getLabeledItemIDs(ids);
s = foundIds.length;
Item[] labeledFiles = new Item[s];
for (int i = 0; i < s; i++) {
Integer id = new Integer(foundIds[i]);
labeledFiles[i] =
filesList[((Integer) labelItems.get(id)).intValue()];
}
filesList = labeledFiles;
}
// note, it's important to scan the items BEFORE we make the
// Unmatched file map because that creates a bunch of NEW
// folders and files (unattached to repository) and we
// don't want to include those in our traversal.
UnmatchedFileMap ufm =
new CheckoutMap().
init(targetFolder.getAbsoluteFile(), starteamFolder);
for (int i = 0; i < foldersList.length; i++) {
Folder stFolder = foldersList[i];
java.io.File subfolder =
new java.io.File(targetFolder, stFolder.getName());
ufm.removeControlledItem(subfolder);
if (isRecursive()) {
visit(stFolder, subfolder);
}
}
for (int i = 0; i < filesList.length; i++) {
com.starbase.starteam.File stFile =
(com.starbase.starteam.File) filesList[i];
processFile(stFile, targetFolder);
ufm.removeControlledItem(
new java.io.File(targetFolder, stFile.getName()));
}
if (this.deleteUncontrolled) {
ufm.processUncontrolledItems();
}
} catch (IOException e) {
throw new BuildException(e);
}
}
Implements base-class abstract function to perform the checkout
operation on the files in each folder of the tree. |