From 6409f0ec87cfcc04196be80e0c72aec39a76ec04 Mon Sep 17 00:00:00 2001 From: Conor MacNeill Date: Tue, 11 Feb 2003 11:43:10 +0000 Subject: [PATCH] iStarteam - when checking out to a revision label, directories are never created unless needed. PR: 14295 Submitted By: Steve Cohen git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274054 13f79535-47bb-0310-9956-ffa450edef68 --- .../optional/starteam/StarTeamCheckout.java | 73 ++++++++++++++++--- .../optional/starteam/TreeBasedTask.java | 12 ++- 2 files changed, 72 insertions(+), 13 deletions(-) diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/starteam/StarTeamCheckout.java b/src/main/org/apache/tools/ant/taskdefs/optional/starteam/StarTeamCheckout.java index bdb3d712e..48132a124 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/starteam/StarTeamCheckout.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/starteam/StarTeamCheckout.java @@ -241,7 +241,12 @@ public class StarTeamCheckout extends TreeBasedTask { * and viewRootLocalFolder are defined */ protected void testPreconditions() throws BuildException { - //intentionally do nothing + 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; + } } /** @@ -288,9 +293,9 @@ public class StarTeamCheckout extends TreeBasedTask { if (this.deleteUncontrolled) { log(" Local items not found in the repository will be deleted."); } - log(" Working directories will "+ - (this.createDirs ? "be created as needed." - : "not be created.")); + log(" Directories will be created"+ + (this.createDirs ? " wherever they exist in the repository, even if empty." + : " only where needed to check out files.")); } /** @@ -313,9 +318,45 @@ public class StarTeamCheckout extends TreeBasedTask { 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 @@ -338,17 +379,9 @@ public class StarTeamCheckout extends TreeBasedTask { ufm.removeControlledItem(subfolder); if (isRecursive()) { - if (!subfolder.exists()) { - if (this.createDirs) { - log("Creating folder: " + subfolder); - subfolder.mkdirs(); - } - } - if (subfolder.exists()) { visit(stFolder, subfolder); } } - } for (int i = 0; i < filesList.length; i++) { com.starbase.starteam.File stFile = @@ -413,6 +446,14 @@ public class StarTeamCheckout extends TreeBasedTask { } if (this.isUsingRevisionLabel()) { + if (!targetFolder.exists()) { + if (targetFolder.mkdirs()) { + log("Creating folder: " + targetFolder); + } else { + throw new BuildException( + "Failed to create local folder " + targetFolder); + } + } boolean success = eachFile.checkoutByLabelID( localFile, getIDofLabelInUse(), @@ -472,6 +513,14 @@ public class StarTeamCheckout extends TreeBasedTask { } if (checkout) { + if (!targetFolder.exists()) { + if (targetFolder.mkdirs()) { + log("Creating folder: " + targetFolder); + } else { + throw new BuildException( + "Failed to create local folder " + targetFolder); + } + } eachFile.checkout(this.lockStatus, !this.useRepositoryTimeStamp, true, true); } diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/starteam/TreeBasedTask.java b/src/main/org/apache/tools/ant/taskdefs/optional/starteam/TreeBasedTask.java index 266c715c2..7baffa10d 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/starteam/TreeBasedTask.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/starteam/TreeBasedTask.java @@ -380,6 +380,15 @@ public abstract class TreeBasedTask extends StarTeamTask { this.labelInUse.isRevisionLabel(); } + /** + * returns the label being used + * + * @return + */ + protected Label getLabelInUse() { + return this.labelInUse; + } + /** * show the label in the log and its type. */ @@ -532,7 +541,6 @@ public abstract class TreeBasedTask extends StarTeamTask { public final void execute() throws BuildException { try { - testPreconditions(); Folder starteamrootfolder = configureRootStarteamFolder(); @@ -540,6 +548,8 @@ public abstract class TreeBasedTask extends StarTeamTask { java.io.File localrootfolder = getLocalRootMapping(starteamrootfolder); + testPreconditions(); + // Tell user what he is doing logOperationDescription(starteamrootfolder, localrootfolder);