(Used the wrong from address in my last post attempt, so this may get double posted - my apologies in advance if it does)
I was looking for a Windows equiv of the chmod task and couldn't find it. Attrib is the equivalent command, and the company I'm with is cross platform. We use a locking repository and check in the jars (resulting in script failure on jar update), so I wrote an Attrib task (a blatant rip-off of chmod). It's below, and is all yours if you want it. Could definitely be improved by using a common superclass with chmod, and would be nice to also have a MakeWritable task (or some such) that used both of these as servants. Does not support the post-file args that attrib offers (like /s for recursive), but could fairly easily. <chmod file="${test.jar}" perm="uga+w"/> <taskdef name="attrib" classname="org.apache.tools.ant.taskdefs.Attrib" classpathref="ant.path"/> <attrib file="${test.jar}" perm="-R"/> package org.apache.tools.ant.taskdefs; import java.io.File; import java.io.IOException; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.condition.Os; import org.apache.tools.ant.types.Commandline; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.PatternSet; /** * Attrib equivalent for Windows-like environments. * * @author Robert Bushman [EMAIL PROTECTED] * * @ant.task category="filesystem" */ public class Attrib extends ExecuteOn { private FileSet defaultSet = new FileSet(); private boolean defaultSetDefined = false; private boolean havePerm = false; /** * Attrib task for setting file and directory attributes. */ public Attrib() { super.setExecutable( "attrib" ); super.setParallel( true ); super.setSkipEmptyFilesets( true ); } /** * @see org.apache.tools.ant.ProjectComponent#setProject */ public void setProject( Project project ) { super.setProject( project ); defaultSet.setProject( project ); } /** * The file or single directory of which the permissions must be changed. * @param src */ public void setFile( File src ) { FileSet fs = new FileSet(); fs.setDir( new File( src.getParent() ) ); fs.createInclude().setName( src.getName() ); addFileset( fs ); } /** * The directory which holds the files whose permissions must be changed. */ public void setDir( File src ) { defaultSet.setDir( src ); } /** * The new permissions. * <br>+ Sets an attribute. * <br>- Clears an attribute. * <br>R Read-only file attribute. * <br>A Archive file attribute. * <br>S System file attribute. * <br>H Hidden file attribute. * <br>EG: "-R" (remove read only) * @param perm */ public void setPerm( String perm ) { createArg().setValue( perm ); havePerm = true; } /** * Add a name entry on the include list. */ public PatternSet.NameEntry createInclude() { defaultSetDefined = true; return defaultSet.createInclude(); } /** * Add a name entry on the exclude list. */ public PatternSet.NameEntry createExclude() { defaultSetDefined = true; return defaultSet.createExclude(); } /** * Add a set of patterns. */ public PatternSet createPatternSet() { defaultSetDefined = true; return defaultSet.createPatternSet(); } /** * Sets the set of include pattersn. Patterns may be separated by a comma * or a space. * * @param includes the string containing the include patterns */ public void setIncludes( String includes ) { defaultSetDefined = true; defaultSet.setIncludes( includes ); } /** * Sets the set of exclude patterns. Patterns may be separated by a comma * or a space. * * @param excludes the string containing the exclude patterns */ public void setExcludes( String excludes ) { defaultSetDefined = true; defaultSet.setExcludes( excludes ); } /** * Sets whether default exclusions should be used or not. * * @param useDefaultExcludes "true"|"on"|"yes" when default exclusions * should be used, "false"|"off"|"no" when they * shouldn't be used. */ public void setDefaultexcludes(boolean useDefaultExcludes) { defaultSetDefined = true; defaultSet.setDefaultexcludes(useDefaultExcludes); } protected void checkConfiguration() { if (!havePerm) { throw new BuildException("Required attribute perm not set in chmod", location); } if (defaultSetDefined && defaultSet.getDir(project) != null) { addFileset(defaultSet); } super.checkConfiguration(); } public void execute() throws BuildException { if( defaultSetDefined || defaultSet.getDir( project ) == null ) { try { super.execute(); } finally { if( defaultSetDefined && defaultSet.getDir( project ) != null ) { filesets.removeElement( defaultSet ); } } } else if( isValidOs() ) { // we are attribbing the given directory Execute execute = prepareExec(); Commandline cloned = (Commandline) cmdl.clone(); cloned.createArgument().setValue( defaultSet.getDir( project ) .getPath() ); try { execute.setCommandline( cloned.getCommandline() ); runExecute( execute ); } catch( IOException e ) { throw new BuildException( "Execute failed: " + e, e, location ); } finally { // close the output file if required logFlush(); } } } /** * @ant.attribute ignore="true" */ public void setExecutable( String e ) { throw new BuildException ( taskType + " doesn\'t support the executable attribute", location ); } /** * @ant.attribute ignore="true" */ public void setCommand( Commandline cmdl ) { throw new BuildException ( taskType + " doesn\'t support the command attribute.", location ); } /** * @ant.attribute ignore="true" */ public void setSkipEmptyFilesets(boolean skip) { throw new BuildException(taskType + " doesn\'t support the skipemptyfileset attribute", location); } protected boolean isValidOs() { return Os.isFamily("windows") && super.isValidOs(); } } ---------------------------------------------------------------------- Fill yer hands you sonofabitch. - Rooster Cogburn ---------------------------------------------------------------------- --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]