package com.erggroup.mass.ant.taskdefs; import com.erggroup.mass.ant.Utils; import java.io.*; import net.sourceforge.clearcase.api.IClearcase; import net.sourceforge.clearcase.simple.ClearcaseCLI; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; /** * */ public class CCLabel extends Task { public static final String COMPUTERNAME = "${env.COMPUTERNAME}"; public static final String USERNAME = "${env.USERNAME}"; /** * The name of the package being labelled */ private String packageName; /** * Indicates if a view should be created based on the created label */ private String mkview; /** * Indicates if a view should be created based on the created label */ private String mapview; /** * Provides a variable with which to populate the created view path */ private String lbl; /** * Find checkouts (optional) - looks for checkouts and aborts if any are * found. */ private String findCheckouts; /** * The fully qualified path of the view as created (if mkview is true) */ private String viewpath; /** * View config spec base filename (optional, if mkview is true) */ private String viewCS; /** * The name of the view as created (if mkview is true) */ private String viewnameProperty; /** * The version to apply a label against. */ private String version; /** */ public void execute() { if ( packageName == null ) { throw new BuildException("Attribute 'packageName' is mandatory."); } if ( version == null ) { throw new BuildException("Attribute 'version' is mandatory."); } String labelname = packageName + "_" + project.replaceProperties(version); String projectPath = getPath( project.getBaseDir().getAbsolutePath() ); IClearcase clearcase = new ClearcaseCLI(); // Before proceeding, look for checkouts and abort if any are found if ( findCheckouts != null && (findCheckouts.equalsIgnoreCase("true") || findCheckouts.equalsIgnoreCase("yes")) ) { project.log("Searching for checkouts in directory \'" + project.getBaseDir().getAbsolutePath() + "\'.",Project.MSG_INFO); IClearcase.Status lscheckout = clearcase.cleartool( "lscheckout -short -me -recurse -cview " + projectPath); if ( !lscheckout.status ) { project.log(lscheckout.message,Project.MSG_ERR); throw new BuildException("Could not find checkouts in directory \'" + project.getBaseDir().getAbsolutePath() + "\'."); } if ( lscheckout.message != null && lscheckout.message.length() > 0 ) { throw new BuildException("Build aborted.\nYou have the following files checked out:\n" + lscheckout.message ); } } // Do the labelling here. Utils.setWorkingDirectory(clearcase,project); project.log("Creating label \'" + labelname + "\'.",Project.MSG_INFO); IClearcase.Status makelabel = clearcase.cleartool( "mklbtype -global -nc " + labelname ); if ( ! makelabel.status ) { project.log(makelabel.message,Project.MSG_ERR); throw new BuildException("Could not create label \'" + labelname + "\'.\nMake sure that the label does not already exist."); } // Label the release directory and all files within... project.log("Labelling project, please wait (this could take some time for large projects)...",Project.MSG_INFO); IClearcase.Status label = clearcase.cleartool( "mklabel -replace -recurse -follow " + labelname + " " + projectPath ); if ( ! label.status ) { project.log(label.message,Project.MSG_ERR); throw new BuildException("Could not label '" + projectPath + "' with label \'" + labelname + "\'."); } File parentDirectory = project.getBaseDir().getParentFile(); while ( parentDirectory != null && parentDirectory.getParentFile() != null ) { String directoryPath = getPath( parentDirectory.getAbsolutePath() ); label = clearcase.cleartool( "mklabel -replace -follow " + labelname + " " + directoryPath ); if ( ! label.status ) { project.log(label.message,Project.MSG_ERR); throw new BuildException("Could not label '" + directoryPath + "' with label \'" + labelname + "\'."); } parentDirectory = parentDirectory.getParentFile(); } if ( lbl != null ) { project.setNewProperty( lbl, labelname ); } project.log("Successfully created label '" + labelname + "'.",Project.MSG_INFO); // Make a view (optional) if ( mkview != null && (mkview.equalsIgnoreCase("true") || mkview.equalsIgnoreCase("yes")) ) { String viewhost = project.replaceProperties(COMPUTERNAME); String username = project.replaceProperties(USERNAME); if ( viewhost != null && username != null && !viewhost.equals(COMPUTERNAME) && !username.equals(USERNAME) ) { String viewname = username + "_jats_build_" + labelname; project.log("Creating view '" + viewname + "'.",Project.MSG_INFO); try { IClearcase.Status mkview = clearcase.cleartool( "mkview -tag " + viewname + " \\\\" + viewhost + "\\Clearcase\\" + viewname ); if ( ! mkview.status ) { project.log(mkview.message,Project.MSG_ERR); throw new BuildException("Could not create view '" + viewname + "'."); } String viewspecFilename = "\\\\" + viewhost + "\\Clearcase\\" + viewname + "\\config_spec"; File viewspec = new File(viewspecFilename); viewspec.delete(); viewspec.createNewFile(); FileOutputStream fileOut = new FileOutputStream(viewspec); PrintWriter viewspecOut = new PrintWriter(fileOut,true); if (viewCS != null) { try { File viewCSFile = new File(viewCS); if (viewCSFile.exists()) { FileReader reader = new FileReader(viewCSFile); BufferedReader bufferedReader = new BufferedReader(reader); String line = bufferedReader.readLine(); while ( line != null ) { viewspecOut.println(line); line = bufferedReader.readLine(); } bufferedReader.close(); reader.close(); } } catch ( Exception x ) { project.log("Could not read config spec '" + viewCS + "'.",Project.MSG_ERR); throw new BuildException("Could not create view '" + viewname + "' - could not read config spec."); } } viewspecOut.println("element * " + labelname + " -nocheckout"); viewspecOut.close(); fileOut.close(); mkview = clearcase.cleartool( "setcs -tag " + viewname + " -current" ); if ( ! mkview.status ) { project.log(mkview.message,Project.MSG_ERR); throw new BuildException("Could not create view '" + viewname + "' - could not set config spec."); } if ( viewnameProperty != null ) { project.setNewProperty( viewnameProperty, viewname ); } if ( viewpath != null ) { String viewPathW32 = project.getBaseDir().getAbsolutePath(); int cpos = viewPathW32.indexOf(':'); viewPathW32 = "O:/" + viewname + viewPathW32.substring(cpos+1); try { if ( mapview != null ) { project.log("Mapping view to network drive '" + mapview + "'.",Project.MSG_INFO); Process p = Runtime.getRuntime().exec("subst "+ mapview + " O:/" + viewname ); int rv = p.waitFor(); if ( rv == 0 ) { viewPathW32 = project.getBaseDir().getAbsolutePath(); viewPathW32 = mapview + "/" + viewPathW32.substring(cpos+1); } } } catch ( InterruptedException x ) { project.log(x.getMessage(),Project.MSG_WARN); viewPathW32 = "O:/" + viewname + viewPathW32.substring(cpos+1); } catch ( IOException x ) { project.log(x.getMessage(),Project.MSG_WARN); viewPathW32 = "O:/" + viewname + viewPathW32.substring(cpos+1); } File viewDirectory = new File(viewPathW32); project.setNewProperty( viewpath, viewDirectory.getAbsolutePath() ); } project.log("Successfully created view '" + viewname + "'.",Project.MSG_INFO); } catch (Exception x) { project.log(x.getMessage(),Project.MSG_ERR); throw new BuildException("Could not create view."); } } } } public void setPackage(String value) { this.packageName = value; } public void setMkview(String value) { this.mkview = value; } public void setMapview(String value) { this.mapview = value; } public void setLabelname(String value) { this.lbl = value; } public void setViewpath(String value) { this.viewpath = value; } public void setViewname(String value) { this.viewnameProperty = value; } public void setViewcs(String value) { this.viewCS = value; } public void setFindCheckouts(String value) { findCheckouts = value; } public void setVersion(String value) { version = value; } private String getPath( String absolute ) { int cindex = absolute.indexOf(' '); if ( cindex >= 0 ) { if ( !absolute.startsWith("\"") ) { absolute = "\"" + absolute; } if ( !absolute.endsWith("\"") ) { absolute = absolute + "\""; } } return absolute; } }