git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270595 13f79535-47bb-0310-9956-ffa450edef68master
@@ -15,14 +15,14 @@ import java.io.FileOutputStream; | |||||
import java.io.FileReader; | import java.io.FileReader; | ||||
import java.io.FileWriter; | import java.io.FileWriter; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.io.OutputStream; | |||||
import java.text.MessageFormat; | import java.text.MessageFormat; | ||||
import java.text.ParseException; | import java.text.ParseException; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.Random; | |||||
import org.apache.myrmidon.api.AbstractTask; | |||||
import org.apache.myrmidon.api.TaskException; | import org.apache.myrmidon.api.TaskException; | ||||
import org.apache.tools.ant.taskdefs.exec.Execute; | import org.apache.tools.ant.taskdefs.exec.Execute; | ||||
import org.apache.tools.ant.taskdefs.exec.Execute2; | |||||
import org.apache.tools.ant.taskdefs.exec.LogOutputStream; | import org.apache.tools.ant.taskdefs.exec.LogOutputStream; | ||||
import org.apache.tools.ant.types.Commandline; | import org.apache.tools.ant.types.Commandline; | ||||
@@ -42,7 +42,8 @@ import org.apache.tools.ant.types.Commandline; | |||||
* @author <a href="mailto:donj@apogeenet.com">Don Jeffery</a> | * @author <a href="mailto:donj@apogeenet.com">Don Jeffery</a> | ||||
* @author <a href="snewton@standard.com">Steven E. Newton</a> | * @author <a href="snewton@standard.com">Steven E. Newton</a> | ||||
*/ | */ | ||||
public class Pvcs extends org.apache.tools.ant.Task | |||||
public class Pvcs | |||||
extends AbstractTask | |||||
{ | { | ||||
/** | /** | ||||
* Constant for the thing to execute | * Constant for the thing to execute | ||||
@@ -59,441 +60,344 @@ public class Pvcs extends org.apache.tools.ant.Task | |||||
* Constant for the thing to execute | * Constant for the thing to execute | ||||
*/ | */ | ||||
private final static String GET_EXE = "get"; | private final static String GET_EXE = "get"; | ||||
private String filenameFormat; | |||||
private String force; | |||||
private boolean ignorerc; | |||||
private String label; | |||||
private String lineStart; | |||||
private String promotiongroup; | |||||
private String pvcsProject; | |||||
private ArrayList pvcsProjects; | |||||
private String pvcsbin; | |||||
private String repository; | |||||
private boolean updateOnly; | |||||
private String workspace; | |||||
private String m_filenameFormat; | |||||
private boolean m_force; | |||||
private boolean m_ignoreReturnCode; | |||||
private String m_label; | |||||
private String m_lineStart; | |||||
private String m_promotiongroup; | |||||
private String m_pvcsProject; | |||||
private ArrayList m_pvcsProjects; | |||||
private String m_pvcsbin; | |||||
private String m_repository; | |||||
private boolean m_updateOnly; | |||||
private String m_workspace; | |||||
/** | /** | ||||
* Creates a Pvcs object | * Creates a Pvcs object | ||||
*/ | */ | ||||
public Pvcs() | public Pvcs() | ||||
{ | { | ||||
super(); | |||||
pvcsProject = null; | |||||
pvcsProjects = new ArrayList(); | |||||
workspace = null; | |||||
repository = null; | |||||
pvcsbin = null; | |||||
force = null; | |||||
promotiongroup = null; | |||||
label = null; | |||||
ignorerc = false; | |||||
updateOnly = false; | |||||
lineStart = "\"P:"; | |||||
filenameFormat = "{0}_arc({1})"; | |||||
m_pvcsProjects = new ArrayList(); | |||||
m_lineStart = "\"P:"; | |||||
m_filenameFormat = "{0}_arc({1})"; | |||||
} | } | ||||
public void setFilenameFormat( String f ) | |||||
public void setFilenameFormat( final String filenameFormat ) | |||||
{ | { | ||||
filenameFormat = f; | |||||
m_filenameFormat = filenameFormat; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the value of the force argument | * Specifies the value of the force argument | ||||
* | |||||
* @param f The new Force value | |||||
*/ | */ | ||||
public void setForce( String f ) | |||||
public void setForce( final boolean force ) | |||||
{ | { | ||||
if( f != null && f.equalsIgnoreCase( "yes" ) ) | |||||
force = "yes"; | |||||
else | |||||
force = "no"; | |||||
m_force = force; | |||||
} | } | ||||
/** | /** | ||||
* If set to true the return value from executing the pvcs commands are | * If set to true the return value from executing the pvcs commands are | ||||
* ignored. | * ignored. | ||||
* | |||||
* @param b The new IgnoreReturnCode value | |||||
*/ | */ | ||||
public void setIgnoreReturnCode( boolean b ) | |||||
public void setIgnoreReturnCode( final boolean ignoreReturnCode ) | |||||
{ | { | ||||
ignorerc = b; | |||||
m_ignoreReturnCode = ignoreReturnCode; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the name of the label argument | * Specifies the name of the label argument | ||||
* | |||||
* @param l The new Label value | |||||
*/ | */ | ||||
public void setLabel( String l ) | |||||
public void setLabel( final String label ) | |||||
{ | { | ||||
label = l; | |||||
m_label = label; | |||||
} | } | ||||
public void setLineStart( String l ) | |||||
public void setLineStart( final String lineStart ) | |||||
{ | { | ||||
lineStart = l; | |||||
m_lineStart = lineStart; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the name of the promotiongroup argument | * Specifies the name of the promotiongroup argument | ||||
* | |||||
* @param w The new Promotiongroup value | |||||
*/ | */ | ||||
public void setPromotiongroup( String w ) | |||||
public void setPromotiongroup( final String promotiongroup ) | |||||
{ | { | ||||
promotiongroup = w; | |||||
m_promotiongroup = promotiongroup; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the location of the PVCS bin directory | * Specifies the location of the PVCS bin directory | ||||
* | |||||
* @param bin The new Pvcsbin value | |||||
*/ | */ | ||||
public void setPvcsbin( String bin ) | |||||
public void setPvcsbin( final String pvcsbin ) | |||||
{ | { | ||||
pvcsbin = bin; | |||||
m_pvcsbin = pvcsbin; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the name of the project in the PVCS repository | * Specifies the name of the project in the PVCS repository | ||||
* | |||||
* @param prj String | |||||
*/ | */ | ||||
public void setPvcsproject( String prj ) | |||||
public void setPvcsproject( final String pvcsProject ) | |||||
{ | { | ||||
pvcsProject = prj; | |||||
m_pvcsProject = pvcsProject; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the network name of the PVCS repository | * Specifies the network name of the PVCS repository | ||||
* | |||||
* @param repo String | |||||
*/ | */ | ||||
public void setRepository( String repo ) | |||||
public void setRepository( final String repository ) | |||||
{ | { | ||||
repository = repo; | |||||
m_repository = repository; | |||||
} | } | ||||
/** | /** | ||||
* If set to true files are gotten only if newer than existing local files. | * If set to true files are gotten only if newer than existing local files. | ||||
* | |||||
* @param l The new UpdateOnly value | |||||
*/ | */ | ||||
public void setUpdateOnly( boolean l ) | |||||
public void setUpdateOnly( final boolean updateOnly ) | |||||
{ | { | ||||
updateOnly = l; | |||||
m_updateOnly = updateOnly; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the name of the workspace to store retrieved files | * Specifies the name of the workspace to store retrieved files | ||||
* | |||||
* @param ws String | |||||
*/ | |||||
public void setWorkspace( String ws ) | |||||
{ | |||||
workspace = ws; | |||||
} | |||||
public String getFilenameFormat() | |||||
{ | |||||
return filenameFormat; | |||||
} | |||||
/** | |||||
* Get value of force | |||||
* | |||||
* @return String | |||||
*/ | */ | ||||
public String getForce() | |||||
public void setWorkspace( final String workspace ) | |||||
{ | { | ||||
return force; | |||||
m_workspace = workspace; | |||||
} | } | ||||
/** | /** | ||||
* Get value of ignorereturncode | |||||
* | |||||
* @return String | |||||
* handles <pvcsproject> subelements | |||||
*/ | */ | ||||
public boolean getIgnoreReturnCode() | |||||
public void addPvcsproject( final PvcsProject pvcsProject ) | |||||
{ | { | ||||
return ignorerc; | |||||
m_pvcsProjects.add( pvcsProject ); | |||||
} | } | ||||
/** | |||||
* Get value of label | |||||
* | |||||
* @return String | |||||
*/ | |||||
public String getLabel() | |||||
public void execute() | |||||
throws TaskException | |||||
{ | { | ||||
return label; | |||||
} | |||||
int result = 0; | |||||
public String getLineStart() | |||||
{ | |||||
return lineStart; | |||||
} | |||||
validate(); | |||||
/** | |||||
* Get value of promotiongroup | |||||
* | |||||
* @return String | |||||
*/ | |||||
public String getPromotiongroup() | |||||
{ | |||||
return promotiongroup; | |||||
} | |||||
final File filelist = getFileList(); | |||||
/** | |||||
* Get name of the PVCS bin directory | |||||
* | |||||
* @return String | |||||
*/ | |||||
public String getPvcsbin() | |||||
{ | |||||
return pvcsbin; | |||||
final Commandline cmd = buildGetCommand( filelist ); | |||||
getLogger().info( "Getting files" ); | |||||
getLogger().debug( "Executing " + cmd.toString() ); | |||||
try | |||||
{ | |||||
final Execute2 exe = new Execute2(); | |||||
setupLogger( exe ); | |||||
exe.setWorkingDirectory( getBaseDirectory() ); | |||||
exe.setCommandline( cmd.getCommandline() ); | |||||
result = exe.execute(); | |||||
checkResultCode( result, cmd ); | |||||
} | |||||
catch( IOException e ) | |||||
{ | |||||
String msg = "Failed executing: " + cmd.toString() + ". Exception: " + e.getMessage(); | |||||
throw new TaskException( msg ); | |||||
} | |||||
finally | |||||
{ | |||||
if( filelist != null ) | |||||
{ | |||||
filelist.delete(); | |||||
} | |||||
} | |||||
} | } | ||||
/** | |||||
* Get name of the project in the PVCS repository | |||||
* | |||||
* @return String | |||||
*/ | |||||
public String getPvcsproject() | |||||
private Commandline buildGetCommand( final File filelist ) | |||||
{ | { | ||||
return pvcsProject; | |||||
} | |||||
final Commandline cmd = new Commandline(); | |||||
cmd.setExecutable( getExecutable( GET_EXE ) ); | |||||
/** | |||||
* Get name of the project in the PVCS repository | |||||
* | |||||
* @return ArrayList | |||||
*/ | |||||
public ArrayList getPvcsprojects() | |||||
{ | |||||
return pvcsProjects; | |||||
} | |||||
if( m_force ) | |||||
{ | |||||
cmd.createArgument().setValue( "-Y" ); | |||||
} | |||||
else | |||||
{ | |||||
cmd.createArgument().setValue( "-N" ); | |||||
} | |||||
/** | |||||
* Get network name of the PVCS repository | |||||
* | |||||
* @return String | |||||
*/ | |||||
public String getRepository() | |||||
{ | |||||
return repository; | |||||
} | |||||
if( null != m_promotiongroup ) | |||||
{ | |||||
cmd.createArgument().setValue( "-G" + m_promotiongroup ); | |||||
} | |||||
else if( null != m_label ) | |||||
{ | |||||
cmd.createArgument().setValue( "-r" + m_label ); | |||||
} | |||||
public boolean getUpdateOnly() | |||||
{ | |||||
return updateOnly; | |||||
} | |||||
if( m_updateOnly ) | |||||
{ | |||||
cmd.createArgument().setValue( "-U" ); | |||||
} | |||||
/** | |||||
* Get name of the workspace to store the retrieved files | |||||
* | |||||
* @return String | |||||
*/ | |||||
public String getWorkspace() | |||||
{ | |||||
return workspace; | |||||
cmd.createArgument().setValue( "@" + filelist.getAbsolutePath() ); | |||||
return cmd; | |||||
} | } | ||||
/** | |||||
* handles <pvcsproject> subelements | |||||
* | |||||
* @param p The feature to be added to the Pvcsproject attribute | |||||
*/ | |||||
public void addPvcsproject( PvcsProject p ) | |||||
private void checkResultCode( final int result, final Commandline cmd ) | |||||
throws TaskException | |||||
{ | { | ||||
pvcsProjects.add( p ); | |||||
if( result != 0 && !m_ignoreReturnCode ) | |||||
{ | |||||
final String message = "Failed executing: " + cmd.toString() + | |||||
". Return code was " + result; | |||||
throw new TaskException( message ); | |||||
} | |||||
} | } | ||||
/** | |||||
* @exception org.apache.tools.ant.TaskException Something is stopping the | |||||
* build... | |||||
*/ | |||||
public void execute() | |||||
private File getFileList() | |||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
int result = 0; | |||||
if( repository == null || repository.trim().equals( "" ) ) | |||||
throw new TaskException( "Required argument repository not specified" ); | |||||
// Check workspace exists | // Check workspace exists | ||||
// Launch PCLI listversionedfiles -z -aw | // Launch PCLI listversionedfiles -z -aw | ||||
// Capture output | // Capture output | ||||
// build the command line from what we got the format is | // build the command line from what we got the format is | ||||
Commandline commandLine = new Commandline(); | |||||
commandLine.setExecutable( getExecutable( PCLI_EXE ) ); | |||||
commandLine.createArgument().setValue( "lvf" ); | |||||
commandLine.createArgument().setValue( "-z" ); | |||||
commandLine.createArgument().setValue( "-aw" ); | |||||
if( getWorkspace() != null ) | |||||
commandLine.createArgument().setValue( "-sp" + getWorkspace() ); | |||||
commandLine.createArgument().setValue( "-pr" + getRepository() ); | |||||
// default pvcs project is "/" | |||||
if( getPvcsproject() == null && getPvcsprojects().isEmpty() ) | |||||
pvcsProject = "/"; | |||||
if( getPvcsproject() != null ) | |||||
commandLine.createArgument().setValue( getPvcsproject() ); | |||||
if( !getPvcsprojects().isEmpty() ) | |||||
{ | |||||
Iterator e = getPvcsprojects().iterator(); | |||||
while( e.hasNext() ) | |||||
{ | |||||
String projectName = ( (PvcsProject)e.next() ).getName(); | |||||
if( projectName == null || ( projectName.trim() ).equals( "" ) ) | |||||
throw new TaskException( "name is a required attribute of pvcsproject" ); | |||||
commandLine.createArgument().setValue( projectName ); | |||||
} | |||||
} | |||||
final Commandline cmd = buildPCLICommand(); | |||||
getLogger().debug( "Executing " + cmd.toString() ); | |||||
File tmp = null; | File tmp = null; | ||||
File tmp2 = null; | |||||
try | try | ||||
{ | { | ||||
Random rand = new Random( System.currentTimeMillis() ); | |||||
tmp = new File( "pvcs_ant_" + rand.nextLong() + ".log" ); | |||||
tmp2 = new File( "pvcs_ant_" + rand.nextLong() + ".log" ); | |||||
getLogger().debug( "Executing " + commandLine.toString() ); | |||||
result = runCmd( commandLine, new FileOutputStream( tmp ), | |||||
new LogOutputStream( getLogger(), true ) ); | |||||
if( result != 0 && !ignorerc ) | |||||
{ | |||||
String msg = "Failed executing: " + commandLine.toString(); | |||||
throw new TaskException( msg ); | |||||
} | |||||
tmp = File.createTempFile( "pvcs_ant_", ".log" ); | |||||
final File fileList = File.createTempFile( "pvcs_ant_", ".log" ); | |||||
final Execute exe = new Execute(); | |||||
exe.setOutput( new FileOutputStream( tmp ) ); | |||||
exe.setError( new LogOutputStream( getLogger(), true ) ); | |||||
exe.setWorkingDirectory( getBaseDirectory() ); | |||||
exe.setCommandline( cmd.getCommandline() ); | |||||
final int result = exe.execute(); | |||||
checkResultCode( result, cmd ); | |||||
if( !tmp.exists() ) | if( !tmp.exists() ) | ||||
throw new TaskException( "Communication between ant and pvcs failed. No output generated from executing PVCS commandline interface \"pcli\" and \"get\"" ); | |||||
{ | |||||
final String message = "Communication between ant and pvcs failed. No output " + | |||||
"generated from executing PVCS commandline interface \"pcli\" and \"get\""; | |||||
throw new TaskException( message ); | |||||
} | |||||
// Create folders in workspace | // Create folders in workspace | ||||
getLogger().info( "Creating folders" ); | getLogger().info( "Creating folders" ); | ||||
createFolders( tmp ); | createFolders( tmp ); | ||||
// Massage PCLI lvf output transforming '\' to '/' so get command works appropriately | // Massage PCLI lvf output transforming '\' to '/' so get command works appropriately | ||||
massagePCLI( tmp, tmp2 ); | |||||
// Launch get on output captured from PCLI lvf | |||||
commandLine.clearArgs(); | |||||
commandLine.setExecutable( getExecutable( GET_EXE ) ); | |||||
if( getForce() != null && getForce().equals( "yes" ) ) | |||||
commandLine.createArgument().setValue( "-Y" ); | |||||
else | |||||
commandLine.createArgument().setValue( "-N" ); | |||||
if( getPromotiongroup() != null ) | |||||
commandLine.createArgument().setValue( "-G" + getPromotiongroup() ); | |||||
else | |||||
{ | |||||
if( getLabel() != null ) | |||||
commandLine.createArgument().setValue( "-r" + getLabel() ); | |||||
} | |||||
if( updateOnly ) | |||||
{ | |||||
commandLine.createArgument().setValue( "-U" ); | |||||
} | |||||
commandLine.createArgument().setValue( "@" + tmp2.getAbsolutePath() ); | |||||
getLogger().info( "Getting files" ); | |||||
getLogger().debug( "Executing " + commandLine.toString() ); | |||||
final LogOutputStream output = new LogOutputStream( getLogger(), false ); | |||||
final LogOutputStream error = new LogOutputStream( getLogger(), true ); | |||||
result = runCmd( commandLine, output, error ); | |||||
if( result != 0 && !ignorerc ) | |||||
{ | |||||
String msg = "Failed executing: " + commandLine.toString() + ". Return code was " + result; | |||||
throw new TaskException( msg ); | |||||
} | |||||
massagePCLI( tmp, fileList ); | |||||
return fileList; | |||||
} | } | ||||
catch( FileNotFoundException e ) | |||||
catch( final ParseException pe ) | |||||
{ | { | ||||
String msg = "Failed executing: " + commandLine.toString() + ". Exception: " + e.getMessage(); | |||||
throw new TaskException( msg ); | |||||
} | |||||
catch( IOException e ) | |||||
{ | |||||
String msg = "Failed executing: " + commandLine.toString() + ". Exception: " + e.getMessage(); | |||||
throw new TaskException( msg ); | |||||
final String message = "Failed executing: " + | |||||
cmd.toString() + ". Exception: " + pe.getMessage(); | |||||
throw new TaskException( message ); | |||||
} | } | ||||
catch( ParseException e ) | |||||
catch( final IOException ioe ) | |||||
{ | { | ||||
String msg = "Failed executing: " + commandLine.toString() + ". Exception: " + e.getMessage(); | |||||
throw new TaskException( msg ); | |||||
final String message = "Failed executing: " + | |||||
cmd.toString() + ". Exception: " + ioe.getMessage(); | |||||
throw new TaskException( message ); | |||||
} | } | ||||
finally | finally | ||||
{ | { | ||||
if( tmp != null ) | |||||
if( null != tmp ) | |||||
{ | { | ||||
tmp.delete(); | tmp.delete(); | ||||
} | } | ||||
if( tmp2 != null ) | |||||
} | |||||
} | |||||
private Commandline buildPCLICommand() | |||||
throws TaskException | |||||
{ | |||||
final Commandline cmd = new Commandline(); | |||||
cmd.setExecutable( getExecutable( PCLI_EXE ) ); | |||||
cmd.createArgument().setValue( "lvf" ); | |||||
cmd.createArgument().setValue( "-z" ); | |||||
cmd.createArgument().setValue( "-aw" ); | |||||
if( m_workspace != null ) | |||||
{ | |||||
cmd.createArgument().setValue( "-sp" + m_workspace ); | |||||
} | |||||
cmd.createArgument().setValue( "-pr" + m_repository ); | |||||
if( m_pvcsProject != null ) | |||||
{ | |||||
cmd.createArgument().setValue( m_pvcsProject ); | |||||
} | |||||
if( !m_pvcsProjects.isEmpty() ) | |||||
{ | |||||
Iterator e = m_pvcsProjects.iterator(); | |||||
while( e.hasNext() ) | |||||
{ | { | ||||
tmp2.delete(); | |||||
final PvcsProject project = (PvcsProject)e.next(); | |||||
final String name = project.getName(); | |||||
if( name == null || ( name.trim() ).equals( "" ) ) | |||||
{ | |||||
final String message = "name is a required attribute of pvcsproject"; | |||||
throw new TaskException( message ); | |||||
} | |||||
cmd.createArgument().setValue( name ); | |||||
} | } | ||||
} | } | ||||
return cmd; | |||||
} | } | ||||
protected int runCmd( Commandline cmd, OutputStream output, OutputStream error ) | |||||
private void validate() | |||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
try | |||||
if( m_repository == null || m_repository.trim().equals( "" ) ) | |||||
{ | { | ||||
final Execute exe = new Execute(); | |||||
exe.setOutput( output ); | |||||
exe.setError( error ); | |||||
exe.setWorkingDirectory( getBaseDirectory() ); | |||||
exe.setCommandline( cmd.getCommandline() ); | |||||
return exe.execute(); | |||||
throw new TaskException( "Required argument repository not specified" ); | |||||
} | } | ||||
catch( java.io.IOException e ) | |||||
// default pvcs project is "/" | |||||
if( m_pvcsProject == null && m_pvcsProjects.isEmpty() ) | |||||
{ | { | ||||
String msg = "Failed executing: " + cmd.toString() + ". Exception: " + e.getMessage(); | |||||
throw new TaskException( msg ); | |||||
m_pvcsProject = "/"; | |||||
} | } | ||||
} | } | ||||
private String getExecutable( String exe ) | |||||
private String getExecutable( final String exe ) | |||||
{ | { | ||||
StringBuffer correctedExe = new StringBuffer(); | |||||
if( getPvcsbin() != null ) | |||||
if( pvcsbin.endsWith( File.separator ) ) | |||||
correctedExe.append( pvcsbin ); | |||||
final StringBuffer correctedExe = new StringBuffer(); | |||||
if( null != m_pvcsbin ) | |||||
{ | |||||
if( m_pvcsbin.endsWith( File.separator ) ) | |||||
{ | |||||
correctedExe.append( m_pvcsbin ); | |||||
} | |||||
else | else | ||||
correctedExe.append( pvcsbin ).append( File.separator ); | |||||
{ | |||||
correctedExe.append( m_pvcsbin ).append( File.separator ); | |||||
} | |||||
} | |||||
return correctedExe.append( exe ).toString(); | return correctedExe.append( exe ).toString(); | ||||
} | } | ||||
/** | /** | ||||
* Parses the file and creates the folders specified in the output section | * Parses the file and creates the folders specified in the output section | ||||
* | |||||
* @param file Description of Parameter | |||||
* @exception IOException Description of Exception | |||||
* @exception ParseException Description of Exception | |||||
*/ | */ | ||||
private void createFolders( File file ) | |||||
private void createFolders( final File file ) | |||||
throws IOException, ParseException | throws IOException, ParseException | ||||
{ | { | ||||
BufferedReader in = new BufferedReader( new FileReader( file ) ); | |||||
MessageFormat mf = new MessageFormat( getFilenameFormat() ); | |||||
final BufferedReader in = new BufferedReader( new FileReader( file ) ); | |||||
final MessageFormat mf = new MessageFormat( m_filenameFormat ); | |||||
String line = in.readLine(); | String line = in.readLine(); | ||||
while( line != null ) | while( line != null ) | ||||
{ | { | ||||
getLogger().debug( "Considering \"" + line + "\"" ); | getLogger().debug( "Considering \"" + line + "\"" ); | ||||
if( line.startsWith( "\"\\" ) || | if( line.startsWith( "\"\\" ) || | ||||
line.startsWith( "\"/" ) || | line.startsWith( "\"/" ) || | ||||
line.startsWith( getLineStart() ) ) | |||||
line.startsWith( m_lineStart ) ) | |||||
{ | { | ||||
Object[] objs = mf.parse( line ); | Object[] objs = mf.parse( line ); | ||||
String f = (String)objs[ 1 ]; | String f = (String)objs[ 1 ]; | ||||
@@ -536,21 +440,16 @@ public class Pvcs extends org.apache.tools.ant.Task | |||||
/** | /** | ||||
* Simple hack to handle the PVCS command-line tools botch when handling UNC | * Simple hack to handle the PVCS command-line tools botch when handling UNC | ||||
* notation. | * notation. | ||||
* | |||||
* @param in Description of Parameter | |||||
* @param out Description of Parameter | |||||
* @exception FileNotFoundException Description of Exception | |||||
* @exception IOException Description of Exception | |||||
*/ | */ | ||||
private void massagePCLI( File in, File out ) | |||||
private void massagePCLI( final File in, final File out ) | |||||
throws FileNotFoundException, IOException | throws FileNotFoundException, IOException | ||||
{ | { | ||||
BufferedReader inReader = new BufferedReader( new FileReader( in ) ); | |||||
BufferedWriter outWriter = new BufferedWriter( new FileWriter( out ) ); | |||||
final BufferedReader inReader = new BufferedReader( new FileReader( in ) ); | |||||
final BufferedWriter outWriter = new BufferedWriter( new FileWriter( out ) ); | |||||
String s = null; | String s = null; | ||||
while( ( s = inReader.readLine() ) != null ) | while( ( s = inReader.readLine() ) != null ) | ||||
{ | { | ||||
String sNormal = s.replace( '\\', '/' ); | |||||
final String sNormal = s.replace( '\\', '/' ); | |||||
outWriter.write( sNormal ); | outWriter.write( sNormal ); | ||||
outWriter.newLine(); | outWriter.newLine(); | ||||
} | } | ||||
@@ -15,14 +15,14 @@ import java.io.FileOutputStream; | |||||
import java.io.FileReader; | import java.io.FileReader; | ||||
import java.io.FileWriter; | import java.io.FileWriter; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.io.OutputStream; | |||||
import java.text.MessageFormat; | import java.text.MessageFormat; | ||||
import java.text.ParseException; | import java.text.ParseException; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.Random; | |||||
import org.apache.myrmidon.api.AbstractTask; | |||||
import org.apache.myrmidon.api.TaskException; | import org.apache.myrmidon.api.TaskException; | ||||
import org.apache.tools.ant.taskdefs.exec.Execute; | import org.apache.tools.ant.taskdefs.exec.Execute; | ||||
import org.apache.tools.ant.taskdefs.exec.Execute2; | |||||
import org.apache.tools.ant.taskdefs.exec.LogOutputStream; | import org.apache.tools.ant.taskdefs.exec.LogOutputStream; | ||||
import org.apache.tools.ant.types.Commandline; | import org.apache.tools.ant.types.Commandline; | ||||
@@ -42,7 +42,8 @@ import org.apache.tools.ant.types.Commandline; | |||||
* @author <a href="mailto:donj@apogeenet.com">Don Jeffery</a> | * @author <a href="mailto:donj@apogeenet.com">Don Jeffery</a> | ||||
* @author <a href="snewton@standard.com">Steven E. Newton</a> | * @author <a href="snewton@standard.com">Steven E. Newton</a> | ||||
*/ | */ | ||||
public class Pvcs extends org.apache.tools.ant.Task | |||||
public class Pvcs | |||||
extends AbstractTask | |||||
{ | { | ||||
/** | /** | ||||
* Constant for the thing to execute | * Constant for the thing to execute | ||||
@@ -59,441 +60,344 @@ public class Pvcs extends org.apache.tools.ant.Task | |||||
* Constant for the thing to execute | * Constant for the thing to execute | ||||
*/ | */ | ||||
private final static String GET_EXE = "get"; | private final static String GET_EXE = "get"; | ||||
private String filenameFormat; | |||||
private String force; | |||||
private boolean ignorerc; | |||||
private String label; | |||||
private String lineStart; | |||||
private String promotiongroup; | |||||
private String pvcsProject; | |||||
private ArrayList pvcsProjects; | |||||
private String pvcsbin; | |||||
private String repository; | |||||
private boolean updateOnly; | |||||
private String workspace; | |||||
private String m_filenameFormat; | |||||
private boolean m_force; | |||||
private boolean m_ignoreReturnCode; | |||||
private String m_label; | |||||
private String m_lineStart; | |||||
private String m_promotiongroup; | |||||
private String m_pvcsProject; | |||||
private ArrayList m_pvcsProjects; | |||||
private String m_pvcsbin; | |||||
private String m_repository; | |||||
private boolean m_updateOnly; | |||||
private String m_workspace; | |||||
/** | /** | ||||
* Creates a Pvcs object | * Creates a Pvcs object | ||||
*/ | */ | ||||
public Pvcs() | public Pvcs() | ||||
{ | { | ||||
super(); | |||||
pvcsProject = null; | |||||
pvcsProjects = new ArrayList(); | |||||
workspace = null; | |||||
repository = null; | |||||
pvcsbin = null; | |||||
force = null; | |||||
promotiongroup = null; | |||||
label = null; | |||||
ignorerc = false; | |||||
updateOnly = false; | |||||
lineStart = "\"P:"; | |||||
filenameFormat = "{0}_arc({1})"; | |||||
m_pvcsProjects = new ArrayList(); | |||||
m_lineStart = "\"P:"; | |||||
m_filenameFormat = "{0}_arc({1})"; | |||||
} | } | ||||
public void setFilenameFormat( String f ) | |||||
public void setFilenameFormat( final String filenameFormat ) | |||||
{ | { | ||||
filenameFormat = f; | |||||
m_filenameFormat = filenameFormat; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the value of the force argument | * Specifies the value of the force argument | ||||
* | |||||
* @param f The new Force value | |||||
*/ | */ | ||||
public void setForce( String f ) | |||||
public void setForce( final boolean force ) | |||||
{ | { | ||||
if( f != null && f.equalsIgnoreCase( "yes" ) ) | |||||
force = "yes"; | |||||
else | |||||
force = "no"; | |||||
m_force = force; | |||||
} | } | ||||
/** | /** | ||||
* If set to true the return value from executing the pvcs commands are | * If set to true the return value from executing the pvcs commands are | ||||
* ignored. | * ignored. | ||||
* | |||||
* @param b The new IgnoreReturnCode value | |||||
*/ | */ | ||||
public void setIgnoreReturnCode( boolean b ) | |||||
public void setIgnoreReturnCode( final boolean ignoreReturnCode ) | |||||
{ | { | ||||
ignorerc = b; | |||||
m_ignoreReturnCode = ignoreReturnCode; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the name of the label argument | * Specifies the name of the label argument | ||||
* | |||||
* @param l The new Label value | |||||
*/ | */ | ||||
public void setLabel( String l ) | |||||
public void setLabel( final String label ) | |||||
{ | { | ||||
label = l; | |||||
m_label = label; | |||||
} | } | ||||
public void setLineStart( String l ) | |||||
public void setLineStart( final String lineStart ) | |||||
{ | { | ||||
lineStart = l; | |||||
m_lineStart = lineStart; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the name of the promotiongroup argument | * Specifies the name of the promotiongroup argument | ||||
* | |||||
* @param w The new Promotiongroup value | |||||
*/ | */ | ||||
public void setPromotiongroup( String w ) | |||||
public void setPromotiongroup( final String promotiongroup ) | |||||
{ | { | ||||
promotiongroup = w; | |||||
m_promotiongroup = promotiongroup; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the location of the PVCS bin directory | * Specifies the location of the PVCS bin directory | ||||
* | |||||
* @param bin The new Pvcsbin value | |||||
*/ | */ | ||||
public void setPvcsbin( String bin ) | |||||
public void setPvcsbin( final String pvcsbin ) | |||||
{ | { | ||||
pvcsbin = bin; | |||||
m_pvcsbin = pvcsbin; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the name of the project in the PVCS repository | * Specifies the name of the project in the PVCS repository | ||||
* | |||||
* @param prj String | |||||
*/ | */ | ||||
public void setPvcsproject( String prj ) | |||||
public void setPvcsproject( final String pvcsProject ) | |||||
{ | { | ||||
pvcsProject = prj; | |||||
m_pvcsProject = pvcsProject; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the network name of the PVCS repository | * Specifies the network name of the PVCS repository | ||||
* | |||||
* @param repo String | |||||
*/ | */ | ||||
public void setRepository( String repo ) | |||||
public void setRepository( final String repository ) | |||||
{ | { | ||||
repository = repo; | |||||
m_repository = repository; | |||||
} | } | ||||
/** | /** | ||||
* If set to true files are gotten only if newer than existing local files. | * If set to true files are gotten only if newer than existing local files. | ||||
* | |||||
* @param l The new UpdateOnly value | |||||
*/ | */ | ||||
public void setUpdateOnly( boolean l ) | |||||
public void setUpdateOnly( final boolean updateOnly ) | |||||
{ | { | ||||
updateOnly = l; | |||||
m_updateOnly = updateOnly; | |||||
} | } | ||||
/** | /** | ||||
* Specifies the name of the workspace to store retrieved files | * Specifies the name of the workspace to store retrieved files | ||||
* | |||||
* @param ws String | |||||
*/ | |||||
public void setWorkspace( String ws ) | |||||
{ | |||||
workspace = ws; | |||||
} | |||||
public String getFilenameFormat() | |||||
{ | |||||
return filenameFormat; | |||||
} | |||||
/** | |||||
* Get value of force | |||||
* | |||||
* @return String | |||||
*/ | */ | ||||
public String getForce() | |||||
public void setWorkspace( final String workspace ) | |||||
{ | { | ||||
return force; | |||||
m_workspace = workspace; | |||||
} | } | ||||
/** | /** | ||||
* Get value of ignorereturncode | |||||
* | |||||
* @return String | |||||
* handles <pvcsproject> subelements | |||||
*/ | */ | ||||
public boolean getIgnoreReturnCode() | |||||
public void addPvcsproject( final PvcsProject pvcsProject ) | |||||
{ | { | ||||
return ignorerc; | |||||
m_pvcsProjects.add( pvcsProject ); | |||||
} | } | ||||
/** | |||||
* Get value of label | |||||
* | |||||
* @return String | |||||
*/ | |||||
public String getLabel() | |||||
public void execute() | |||||
throws TaskException | |||||
{ | { | ||||
return label; | |||||
} | |||||
int result = 0; | |||||
public String getLineStart() | |||||
{ | |||||
return lineStart; | |||||
} | |||||
validate(); | |||||
/** | |||||
* Get value of promotiongroup | |||||
* | |||||
* @return String | |||||
*/ | |||||
public String getPromotiongroup() | |||||
{ | |||||
return promotiongroup; | |||||
} | |||||
final File filelist = getFileList(); | |||||
/** | |||||
* Get name of the PVCS bin directory | |||||
* | |||||
* @return String | |||||
*/ | |||||
public String getPvcsbin() | |||||
{ | |||||
return pvcsbin; | |||||
final Commandline cmd = buildGetCommand( filelist ); | |||||
getLogger().info( "Getting files" ); | |||||
getLogger().debug( "Executing " + cmd.toString() ); | |||||
try | |||||
{ | |||||
final Execute2 exe = new Execute2(); | |||||
setupLogger( exe ); | |||||
exe.setWorkingDirectory( getBaseDirectory() ); | |||||
exe.setCommandline( cmd.getCommandline() ); | |||||
result = exe.execute(); | |||||
checkResultCode( result, cmd ); | |||||
} | |||||
catch( IOException e ) | |||||
{ | |||||
String msg = "Failed executing: " + cmd.toString() + ". Exception: " + e.getMessage(); | |||||
throw new TaskException( msg ); | |||||
} | |||||
finally | |||||
{ | |||||
if( filelist != null ) | |||||
{ | |||||
filelist.delete(); | |||||
} | |||||
} | |||||
} | } | ||||
/** | |||||
* Get name of the project in the PVCS repository | |||||
* | |||||
* @return String | |||||
*/ | |||||
public String getPvcsproject() | |||||
private Commandline buildGetCommand( final File filelist ) | |||||
{ | { | ||||
return pvcsProject; | |||||
} | |||||
final Commandline cmd = new Commandline(); | |||||
cmd.setExecutable( getExecutable( GET_EXE ) ); | |||||
/** | |||||
* Get name of the project in the PVCS repository | |||||
* | |||||
* @return ArrayList | |||||
*/ | |||||
public ArrayList getPvcsprojects() | |||||
{ | |||||
return pvcsProjects; | |||||
} | |||||
if( m_force ) | |||||
{ | |||||
cmd.createArgument().setValue( "-Y" ); | |||||
} | |||||
else | |||||
{ | |||||
cmd.createArgument().setValue( "-N" ); | |||||
} | |||||
/** | |||||
* Get network name of the PVCS repository | |||||
* | |||||
* @return String | |||||
*/ | |||||
public String getRepository() | |||||
{ | |||||
return repository; | |||||
} | |||||
if( null != m_promotiongroup ) | |||||
{ | |||||
cmd.createArgument().setValue( "-G" + m_promotiongroup ); | |||||
} | |||||
else if( null != m_label ) | |||||
{ | |||||
cmd.createArgument().setValue( "-r" + m_label ); | |||||
} | |||||
public boolean getUpdateOnly() | |||||
{ | |||||
return updateOnly; | |||||
} | |||||
if( m_updateOnly ) | |||||
{ | |||||
cmd.createArgument().setValue( "-U" ); | |||||
} | |||||
/** | |||||
* Get name of the workspace to store the retrieved files | |||||
* | |||||
* @return String | |||||
*/ | |||||
public String getWorkspace() | |||||
{ | |||||
return workspace; | |||||
cmd.createArgument().setValue( "@" + filelist.getAbsolutePath() ); | |||||
return cmd; | |||||
} | } | ||||
/** | |||||
* handles <pvcsproject> subelements | |||||
* | |||||
* @param p The feature to be added to the Pvcsproject attribute | |||||
*/ | |||||
public void addPvcsproject( PvcsProject p ) | |||||
private void checkResultCode( final int result, final Commandline cmd ) | |||||
throws TaskException | |||||
{ | { | ||||
pvcsProjects.add( p ); | |||||
if( result != 0 && !m_ignoreReturnCode ) | |||||
{ | |||||
final String message = "Failed executing: " + cmd.toString() + | |||||
". Return code was " + result; | |||||
throw new TaskException( message ); | |||||
} | |||||
} | } | ||||
/** | |||||
* @exception org.apache.tools.ant.TaskException Something is stopping the | |||||
* build... | |||||
*/ | |||||
public void execute() | |||||
private File getFileList() | |||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
int result = 0; | |||||
if( repository == null || repository.trim().equals( "" ) ) | |||||
throw new TaskException( "Required argument repository not specified" ); | |||||
// Check workspace exists | // Check workspace exists | ||||
// Launch PCLI listversionedfiles -z -aw | // Launch PCLI listversionedfiles -z -aw | ||||
// Capture output | // Capture output | ||||
// build the command line from what we got the format is | // build the command line from what we got the format is | ||||
Commandline commandLine = new Commandline(); | |||||
commandLine.setExecutable( getExecutable( PCLI_EXE ) ); | |||||
commandLine.createArgument().setValue( "lvf" ); | |||||
commandLine.createArgument().setValue( "-z" ); | |||||
commandLine.createArgument().setValue( "-aw" ); | |||||
if( getWorkspace() != null ) | |||||
commandLine.createArgument().setValue( "-sp" + getWorkspace() ); | |||||
commandLine.createArgument().setValue( "-pr" + getRepository() ); | |||||
// default pvcs project is "/" | |||||
if( getPvcsproject() == null && getPvcsprojects().isEmpty() ) | |||||
pvcsProject = "/"; | |||||
if( getPvcsproject() != null ) | |||||
commandLine.createArgument().setValue( getPvcsproject() ); | |||||
if( !getPvcsprojects().isEmpty() ) | |||||
{ | |||||
Iterator e = getPvcsprojects().iterator(); | |||||
while( e.hasNext() ) | |||||
{ | |||||
String projectName = ( (PvcsProject)e.next() ).getName(); | |||||
if( projectName == null || ( projectName.trim() ).equals( "" ) ) | |||||
throw new TaskException( "name is a required attribute of pvcsproject" ); | |||||
commandLine.createArgument().setValue( projectName ); | |||||
} | |||||
} | |||||
final Commandline cmd = buildPCLICommand(); | |||||
getLogger().debug( "Executing " + cmd.toString() ); | |||||
File tmp = null; | File tmp = null; | ||||
File tmp2 = null; | |||||
try | try | ||||
{ | { | ||||
Random rand = new Random( System.currentTimeMillis() ); | |||||
tmp = new File( "pvcs_ant_" + rand.nextLong() + ".log" ); | |||||
tmp2 = new File( "pvcs_ant_" + rand.nextLong() + ".log" ); | |||||
getLogger().debug( "Executing " + commandLine.toString() ); | |||||
result = runCmd( commandLine, new FileOutputStream( tmp ), | |||||
new LogOutputStream( getLogger(), true ) ); | |||||
if( result != 0 && !ignorerc ) | |||||
{ | |||||
String msg = "Failed executing: " + commandLine.toString(); | |||||
throw new TaskException( msg ); | |||||
} | |||||
tmp = File.createTempFile( "pvcs_ant_", ".log" ); | |||||
final File fileList = File.createTempFile( "pvcs_ant_", ".log" ); | |||||
final Execute exe = new Execute(); | |||||
exe.setOutput( new FileOutputStream( tmp ) ); | |||||
exe.setError( new LogOutputStream( getLogger(), true ) ); | |||||
exe.setWorkingDirectory( getBaseDirectory() ); | |||||
exe.setCommandline( cmd.getCommandline() ); | |||||
final int result = exe.execute(); | |||||
checkResultCode( result, cmd ); | |||||
if( !tmp.exists() ) | if( !tmp.exists() ) | ||||
throw new TaskException( "Communication between ant and pvcs failed. No output generated from executing PVCS commandline interface \"pcli\" and \"get\"" ); | |||||
{ | |||||
final String message = "Communication between ant and pvcs failed. No output " + | |||||
"generated from executing PVCS commandline interface \"pcli\" and \"get\""; | |||||
throw new TaskException( message ); | |||||
} | |||||
// Create folders in workspace | // Create folders in workspace | ||||
getLogger().info( "Creating folders" ); | getLogger().info( "Creating folders" ); | ||||
createFolders( tmp ); | createFolders( tmp ); | ||||
// Massage PCLI lvf output transforming '\' to '/' so get command works appropriately | // Massage PCLI lvf output transforming '\' to '/' so get command works appropriately | ||||
massagePCLI( tmp, tmp2 ); | |||||
// Launch get on output captured from PCLI lvf | |||||
commandLine.clearArgs(); | |||||
commandLine.setExecutable( getExecutable( GET_EXE ) ); | |||||
if( getForce() != null && getForce().equals( "yes" ) ) | |||||
commandLine.createArgument().setValue( "-Y" ); | |||||
else | |||||
commandLine.createArgument().setValue( "-N" ); | |||||
if( getPromotiongroup() != null ) | |||||
commandLine.createArgument().setValue( "-G" + getPromotiongroup() ); | |||||
else | |||||
{ | |||||
if( getLabel() != null ) | |||||
commandLine.createArgument().setValue( "-r" + getLabel() ); | |||||
} | |||||
if( updateOnly ) | |||||
{ | |||||
commandLine.createArgument().setValue( "-U" ); | |||||
} | |||||
commandLine.createArgument().setValue( "@" + tmp2.getAbsolutePath() ); | |||||
getLogger().info( "Getting files" ); | |||||
getLogger().debug( "Executing " + commandLine.toString() ); | |||||
final LogOutputStream output = new LogOutputStream( getLogger(), false ); | |||||
final LogOutputStream error = new LogOutputStream( getLogger(), true ); | |||||
result = runCmd( commandLine, output, error ); | |||||
if( result != 0 && !ignorerc ) | |||||
{ | |||||
String msg = "Failed executing: " + commandLine.toString() + ". Return code was " + result; | |||||
throw new TaskException( msg ); | |||||
} | |||||
massagePCLI( tmp, fileList ); | |||||
return fileList; | |||||
} | } | ||||
catch( FileNotFoundException e ) | |||||
catch( final ParseException pe ) | |||||
{ | { | ||||
String msg = "Failed executing: " + commandLine.toString() + ". Exception: " + e.getMessage(); | |||||
throw new TaskException( msg ); | |||||
} | |||||
catch( IOException e ) | |||||
{ | |||||
String msg = "Failed executing: " + commandLine.toString() + ". Exception: " + e.getMessage(); | |||||
throw new TaskException( msg ); | |||||
final String message = "Failed executing: " + | |||||
cmd.toString() + ". Exception: " + pe.getMessage(); | |||||
throw new TaskException( message ); | |||||
} | } | ||||
catch( ParseException e ) | |||||
catch( final IOException ioe ) | |||||
{ | { | ||||
String msg = "Failed executing: " + commandLine.toString() + ". Exception: " + e.getMessage(); | |||||
throw new TaskException( msg ); | |||||
final String message = "Failed executing: " + | |||||
cmd.toString() + ". Exception: " + ioe.getMessage(); | |||||
throw new TaskException( message ); | |||||
} | } | ||||
finally | finally | ||||
{ | { | ||||
if( tmp != null ) | |||||
if( null != tmp ) | |||||
{ | { | ||||
tmp.delete(); | tmp.delete(); | ||||
} | } | ||||
if( tmp2 != null ) | |||||
} | |||||
} | |||||
private Commandline buildPCLICommand() | |||||
throws TaskException | |||||
{ | |||||
final Commandline cmd = new Commandline(); | |||||
cmd.setExecutable( getExecutable( PCLI_EXE ) ); | |||||
cmd.createArgument().setValue( "lvf" ); | |||||
cmd.createArgument().setValue( "-z" ); | |||||
cmd.createArgument().setValue( "-aw" ); | |||||
if( m_workspace != null ) | |||||
{ | |||||
cmd.createArgument().setValue( "-sp" + m_workspace ); | |||||
} | |||||
cmd.createArgument().setValue( "-pr" + m_repository ); | |||||
if( m_pvcsProject != null ) | |||||
{ | |||||
cmd.createArgument().setValue( m_pvcsProject ); | |||||
} | |||||
if( !m_pvcsProjects.isEmpty() ) | |||||
{ | |||||
Iterator e = m_pvcsProjects.iterator(); | |||||
while( e.hasNext() ) | |||||
{ | { | ||||
tmp2.delete(); | |||||
final PvcsProject project = (PvcsProject)e.next(); | |||||
final String name = project.getName(); | |||||
if( name == null || ( name.trim() ).equals( "" ) ) | |||||
{ | |||||
final String message = "name is a required attribute of pvcsproject"; | |||||
throw new TaskException( message ); | |||||
} | |||||
cmd.createArgument().setValue( name ); | |||||
} | } | ||||
} | } | ||||
return cmd; | |||||
} | } | ||||
protected int runCmd( Commandline cmd, OutputStream output, OutputStream error ) | |||||
private void validate() | |||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
try | |||||
if( m_repository == null || m_repository.trim().equals( "" ) ) | |||||
{ | { | ||||
final Execute exe = new Execute(); | |||||
exe.setOutput( output ); | |||||
exe.setError( error ); | |||||
exe.setWorkingDirectory( getBaseDirectory() ); | |||||
exe.setCommandline( cmd.getCommandline() ); | |||||
return exe.execute(); | |||||
throw new TaskException( "Required argument repository not specified" ); | |||||
} | } | ||||
catch( java.io.IOException e ) | |||||
// default pvcs project is "/" | |||||
if( m_pvcsProject == null && m_pvcsProjects.isEmpty() ) | |||||
{ | { | ||||
String msg = "Failed executing: " + cmd.toString() + ". Exception: " + e.getMessage(); | |||||
throw new TaskException( msg ); | |||||
m_pvcsProject = "/"; | |||||
} | } | ||||
} | } | ||||
private String getExecutable( String exe ) | |||||
private String getExecutable( final String exe ) | |||||
{ | { | ||||
StringBuffer correctedExe = new StringBuffer(); | |||||
if( getPvcsbin() != null ) | |||||
if( pvcsbin.endsWith( File.separator ) ) | |||||
correctedExe.append( pvcsbin ); | |||||
final StringBuffer correctedExe = new StringBuffer(); | |||||
if( null != m_pvcsbin ) | |||||
{ | |||||
if( m_pvcsbin.endsWith( File.separator ) ) | |||||
{ | |||||
correctedExe.append( m_pvcsbin ); | |||||
} | |||||
else | else | ||||
correctedExe.append( pvcsbin ).append( File.separator ); | |||||
{ | |||||
correctedExe.append( m_pvcsbin ).append( File.separator ); | |||||
} | |||||
} | |||||
return correctedExe.append( exe ).toString(); | return correctedExe.append( exe ).toString(); | ||||
} | } | ||||
/** | /** | ||||
* Parses the file and creates the folders specified in the output section | * Parses the file and creates the folders specified in the output section | ||||
* | |||||
* @param file Description of Parameter | |||||
* @exception IOException Description of Exception | |||||
* @exception ParseException Description of Exception | |||||
*/ | */ | ||||
private void createFolders( File file ) | |||||
private void createFolders( final File file ) | |||||
throws IOException, ParseException | throws IOException, ParseException | ||||
{ | { | ||||
BufferedReader in = new BufferedReader( new FileReader( file ) ); | |||||
MessageFormat mf = new MessageFormat( getFilenameFormat() ); | |||||
final BufferedReader in = new BufferedReader( new FileReader( file ) ); | |||||
final MessageFormat mf = new MessageFormat( m_filenameFormat ); | |||||
String line = in.readLine(); | String line = in.readLine(); | ||||
while( line != null ) | while( line != null ) | ||||
{ | { | ||||
getLogger().debug( "Considering \"" + line + "\"" ); | getLogger().debug( "Considering \"" + line + "\"" ); | ||||
if( line.startsWith( "\"\\" ) || | if( line.startsWith( "\"\\" ) || | ||||
line.startsWith( "\"/" ) || | line.startsWith( "\"/" ) || | ||||
line.startsWith( getLineStart() ) ) | |||||
line.startsWith( m_lineStart ) ) | |||||
{ | { | ||||
Object[] objs = mf.parse( line ); | Object[] objs = mf.parse( line ); | ||||
String f = (String)objs[ 1 ]; | String f = (String)objs[ 1 ]; | ||||
@@ -536,21 +440,16 @@ public class Pvcs extends org.apache.tools.ant.Task | |||||
/** | /** | ||||
* Simple hack to handle the PVCS command-line tools botch when handling UNC | * Simple hack to handle the PVCS command-line tools botch when handling UNC | ||||
* notation. | * notation. | ||||
* | |||||
* @param in Description of Parameter | |||||
* @param out Description of Parameter | |||||
* @exception FileNotFoundException Description of Exception | |||||
* @exception IOException Description of Exception | |||||
*/ | */ | ||||
private void massagePCLI( File in, File out ) | |||||
private void massagePCLI( final File in, final File out ) | |||||
throws FileNotFoundException, IOException | throws FileNotFoundException, IOException | ||||
{ | { | ||||
BufferedReader inReader = new BufferedReader( new FileReader( in ) ); | |||||
BufferedWriter outWriter = new BufferedWriter( new FileWriter( out ) ); | |||||
final BufferedReader inReader = new BufferedReader( new FileReader( in ) ); | |||||
final BufferedWriter outWriter = new BufferedWriter( new FileWriter( out ) ); | |||||
String s = null; | String s = null; | ||||
while( ( s = inReader.readLine() ) != null ) | while( ( s = inReader.readLine() ) != null ) | ||||
{ | { | ||||
String sNormal = s.replace( '\\', '/' ); | |||||
final String sNormal = s.replace( '\\', '/' ); | |||||
outWriter.write( sNormal ); | outWriter.write( sNormal ); | ||||
outWriter.newLine(); | outWriter.newLine(); | ||||
} | } | ||||