@@ -23,6 +23,9 @@ Other changes: | |||||
* New file selectors <executable>, <symlink> and <ownedBy>. | * New file selectors <executable>, <symlink> and <ownedBy>. | ||||
* New task <setpermissions> that provides the ability to set POSIX | |||||
compatible permssions via NIO's PosixFilePermission | |||||
Changes from Ant 1.9.6 TO Ant 1.9.7 | Changes from Ant 1.9.6 TO Ant 1.9.7 | ||||
=================================== | =================================== | ||||
@@ -57,6 +57,9 @@ directory tree), so you'll have to experiment a little.</p--> | |||||
the Windows command, you can use the task's os attribute and set its | the Windows command, you can use the task's os attribute and set its | ||||
value to your current os.</p> | value to your current os.</p> | ||||
<p>See the <a href="setpermissions.html">setpermissions</a> task for a | |||||
platform independent alternative.</p> | |||||
<h3>Parameters</h3> | <h3>Parameters</h3> | ||||
<table border="1" cellpadding="2" cellspacing="0"> | <table border="1" cellpadding="2" cellspacing="0"> | ||||
<tr> | <tr> | ||||
@@ -63,6 +63,9 @@ could use as initial value for these experiments.</p> | |||||
the Unix command, you can use the task's os attribute and set its | the Unix command, you can use the task's os attribute and set its | ||||
value to your current os.</p> | value to your current os.</p> | ||||
<p>See the <a href="setpermissions.html">setpermissions</a> task for a | |||||
platform independent alternative.</p> | |||||
<h3>Parameters</h3> | <h3>Parameters</h3> | ||||
<table border="1" cellpadding="2" cellspacing="0"> | <table border="1" cellpadding="2" cellspacing="0"> | ||||
<tr> | <tr> | ||||
@@ -0,0 +1,96 @@ | |||||
<!-- | |||||
Licensed to the Apache Software Foundation (ASF) under one or more | |||||
contributor license agreements. See the NOTICE file distributed with | |||||
this work for additional information regarding copyright ownership. | |||||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||||
(the "License"); you may not use this file except in compliance with | |||||
the License. You may obtain a copy of the License at | |||||
http://www.apache.org/licenses/LICENSE-2.0 | |||||
Unless required by applicable law or agreed to in writing, software | |||||
distributed under the License is distributed on an "AS IS" BASIS, | |||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
See the License for the specific language governing permissions and | |||||
limitations under the License. | |||||
--> | |||||
<html> | |||||
<head> | |||||
<meta http-equiv="Content-Language" content="en-us"> | |||||
<link rel="stylesheet" type="text/css" href="../stylesheets/style.css"> | |||||
<title>SetPermissions Task</title> | |||||
</head> | |||||
<body> | |||||
<h2><a name="setpermissions">SetPermissions</a></h2> | |||||
<p><em>Since Ant 1.10.0.</em></p> | |||||
<h3>Description</h3> | |||||
<p>Changes the file permissions using Java's NIO support for | |||||
permissions.</p> | |||||
<p>This task provides a subset of the platform specific abilities of | |||||
<a href="chmod.html">chmod</a> and <a href="attrib.html">attrib</a> | |||||
in a platform independent way.</p> | |||||
<p>If no permissions are specified either via the mode or the | |||||
permissions attribute, then all permissions will be removed from the | |||||
nested resources.</p> | |||||
<p>The task accepts aribitrary resources as part of the nested | |||||
resource collections, but not all resources support setting | |||||
permissions. This task won't do anything for resources that don't | |||||
support setting permissions - for example URLs.</p> | |||||
<p>The permissions are applied to all resources contained within the | |||||
nested resources collections. You may want to ensure the collection | |||||
only returns files or directories if you want different sets of | |||||
permissions to apply to either type of resource.</p> | |||||
<h3>Parameters</h3> | |||||
<table border="1" cellpadding="2" cellspacing="0"> | |||||
<tr> | |||||
<td valign="top"><b>Attribute</b></td> | |||||
<td valign="top"><b>Description</b></td> | |||||
<td align="center" valign="top"><b>Required</b></td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">permissions</td> | |||||
<td valign="top">The permissions to set as comma separated list of | |||||
names | |||||
of <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/file/attribute/PosixFilePermission.html">PosixFilePermission</a> | |||||
values.</td> | |||||
<td valign="top" align="center">No</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">mode</td> | |||||
<td valign="top">The permissions to set as tradional Unix | |||||
three-digit octal number.</td> | |||||
<td valign="top" align="center">No</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">failonerror</td> | |||||
<td valign="top">Whether to stop the build if setting permissions | |||||
fails.</td> | |||||
<td valign="top" align="center">No, defaults to true</td> | |||||
</tr> | |||||
</table> | |||||
<h3>Parameters specified as nested elements</h3> | |||||
<h4>any resource collection</h4> | |||||
<p><a href="../Types/resources.html#collection">Resource | |||||
Collection</a>s are used to select groups of resources.</p> | |||||
<h3>Examples</h3> | |||||
<blockquote><pre> | |||||
<setpermissions mode="755"> | |||||
<file file="${dist}/start.sh"/> | |||||
</setpermissions> | |||||
</pre></blockquote> | |||||
<p>makes the "start.sh" file readable and executable for | |||||
anyone and in addition writable by the owner.</p> | |||||
<blockquote><pre> | |||||
<setpermissions permissions="OWNER_READ,OWNER_WRITE,OWNER_EXECUTE,OTHERS_READ,OTHERS_EXECUTE,GROUP_READ,GROUP_EXECUTE"> | |||||
<file file="${dist}/start.sh"/> | |||||
</setpermissions> | |||||
</pre></blockquote> | |||||
<p>makes the "start.sh" file readable and executable for | |||||
anyone and in addition writable by the owner.</p> | |||||
</body> | |||||
</html> |
@@ -147,6 +147,7 @@ | |||||
<li><a href="Tasks/rexec.html">RExec</a></li> | <li><a href="Tasks/rexec.html">RExec</a></li> | ||||
<li><a href="Tasks/rmic.html">Rmic</a></li> | <li><a href="Tasks/rmic.html">Rmic</a></li> | ||||
<li><a href="Tasks/rpm.html">Rpm</a></li> | <li><a href="Tasks/rpm.html">Rpm</a></li> | ||||
<li><a href="Tasks/setpermissions.html">SetPermissions</a></li> | |||||
<li><a href="Tasks/schemavalidate.html">SchemaValidate</a></li> | <li><a href="Tasks/schemavalidate.html">SchemaValidate</a></li> | ||||
<li><a href="Tasks/scp.html">Scp</a></li> | <li><a href="Tasks/scp.html">Scp</a></li> | ||||
<li><a href="Tasks/script.html">Script</a></li> | <li><a href="Tasks/script.html">Script</a></li> | ||||
@@ -575,6 +575,11 @@ documentation.</p> | |||||
files.</p></td> | files.</p></td> | ||||
</tr> | </tr> | ||||
<tr valign="top"> | |||||
<td nowrap><a href="Tasks/setpermissions.html">SetPermissions</a></td> | |||||
<td><p>Changes the permissions of a collection of resources.</p></td> | |||||
</tr> | |||||
<tr valign="top"> | <tr valign="top"> | ||||
<td nowrap><a href="Tasks/sync.html">Sync</a></td> | <td nowrap><a href="Tasks/sync.html">Sync</a></td> | ||||
<td><p>Synchronize two directory trees.</p></td> | <td><p>Synchronize two directory trees.</p></td> | ||||
@@ -0,0 +1,112 @@ | |||||
/* | |||||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||||
* contributor license agreements. See the NOTICE file distributed with | |||||
* this work for additional information regarding copyright ownership. | |||||
* The ASF licenses this file to You under the Apache License, Version 2.0 | |||||
* (the "License"); you may not use this file except in compliance with | |||||
* the License. You may obtain a copy of the License at | |||||
* | |||||
* http://www.apache.org/licenses/LICENSE-2.0 | |||||
* | |||||
* Unless required by applicable law or agreed to in writing, software | |||||
* distributed under the License is distributed on an "AS IS" BASIS, | |||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
* See the License for the specific language governing permissions and | |||||
* limitations under the License. | |||||
* | |||||
*/ | |||||
package org.apache.tools.ant.taskdefs; | |||||
import java.io.IOException; | |||||
import java.nio.file.attribute.PosixFilePermission; | |||||
import java.util.Arrays; | |||||
import java.util.EnumSet; | |||||
import java.util.Set; | |||||
import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.Project; | |||||
import org.apache.tools.ant.Task; | |||||
import org.apache.tools.ant.types.Resource; | |||||
import org.apache.tools.ant.types.ResourceCollection; | |||||
import org.apache.tools.ant.types.resources.Resources; | |||||
import org.apache.tools.ant.util.PermissionUtils; | |||||
/** | |||||
* Sets {@link PosixFilePermission}s for resources. | |||||
* | |||||
* <p>This task provides a subset of {@link Chmod}'s and {@link | |||||
* org.apache.tools.ant.taskdefs.optional.windows.Attrib}'s abilities | |||||
* in a platform independent way.</p> | |||||
* | |||||
* @since Ant 1.10.0 | |||||
*/ | |||||
public class SetPermissions extends Task { | |||||
private final Set<PosixFilePermission> permissions = | |||||
EnumSet.noneOf(PosixFilePermission.class); | |||||
private Resources resources = null; | |||||
private boolean failonerror = true; | |||||
/** | |||||
* Adds permissions as a comma separated list. | |||||
* @param perms comma separated list of names of {@link PosixFilePermission}s. | |||||
*/ | |||||
public void setPermissions(String perms) { | |||||
if (perms != null) { | |||||
Arrays.stream(perms.split(",")) | |||||
.map(String::trim) | |||||
.filter(s -> !s.isEmpty()) | |||||
.map(s -> Enum.valueOf(PosixFilePermission.class, s)) | |||||
.forEach(permissions::add); | |||||
} | |||||
} | |||||
/** | |||||
* A 3 digit octal string, specify the user, group and | |||||
* other modes in the standard Unix fashion; | |||||
* @param octalString a <code>String</code> value | |||||
*/ | |||||
public void setMode(String octalString) { | |||||
int mode = Integer.parseInt(octalString, 8); | |||||
permissions.addAll(PermissionUtils.permissionsFromMode(mode)); | |||||
} | |||||
/** | |||||
* Set whether to fail when errors are encountered. If false, note errors | |||||
* to the output but keep going. Default is true. | |||||
* @param failonerror true or false. | |||||
*/ | |||||
public void setFailOnError(final boolean failonerror) { | |||||
this.failonerror = failonerror; | |||||
} | |||||
/** | |||||
* Adds a collection of resources to set permissions on. | |||||
* @param rc a resource collection | |||||
*/ | |||||
public void add(ResourceCollection rc) { | |||||
if (resources == null) { | |||||
resources = new Resources(); | |||||
} | |||||
resources.add(rc); | |||||
} | |||||
public void execute() { | |||||
if (resources == null) { | |||||
throw new BuildException("At least one resource-collection is required"); | |||||
} | |||||
for (Resource r : resources) { | |||||
try { | |||||
PermissionUtils.setPermissions(r, permissions); | |||||
} catch (IOException ioe) { | |||||
String msg = "Failed to set permissions on " + r + " due to " | |||||
+ ioe.getMessage(); | |||||
if (failonerror) { | |||||
throw new BuildException(msg, ioe); | |||||
} else { | |||||
log("Warning: " + msg, Project.MSG_ERR); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -91,6 +91,7 @@ replace=org.apache.tools.ant.taskdefs.Replace | |||||
resourcecount=org.apache.tools.ant.taskdefs.ResourceCount | resourcecount=org.apache.tools.ant.taskdefs.ResourceCount | ||||
retry=org.apache.tools.ant.taskdefs.Retry | retry=org.apache.tools.ant.taskdefs.Retry | ||||
rmic=org.apache.tools.ant.taskdefs.Rmic | rmic=org.apache.tools.ant.taskdefs.Rmic | ||||
setpermissions=org.apache.tools.ant.taskdefs.SetPermissions | |||||
sequential=org.apache.tools.ant.taskdefs.Sequential | sequential=org.apache.tools.ant.taskdefs.Sequential | ||||
signjar=org.apache.tools.ant.taskdefs.SignJar | signjar=org.apache.tools.ant.taskdefs.SignJar | ||||
sleep=org.apache.tools.ant.taskdefs.Sleep | sleep=org.apache.tools.ant.taskdefs.Sleep | ||||
@@ -0,0 +1,67 @@ | |||||
<?xml version="1.0"?> | |||||
<!-- | |||||
Licensed to the Apache Software Foundation (ASF) under one or more | |||||
contributor license agreements. See the NOTICE file distributed with | |||||
this work for additional information regarding copyright ownership. | |||||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||||
(the "License"); you may not use this file except in compliance with | |||||
the License. You may obtain a copy of the License at | |||||
http://www.apache.org/licenses/LICENSE-2.0 | |||||
Unless required by applicable law or agreed to in writing, software | |||||
distributed under the License is distributed on an "AS IS" BASIS, | |||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
See the License for the specific language governing permissions and | |||||
limitations under the License. | |||||
--> | |||||
<project xmlns:au="antlib:org.apache.ant.antunit" default="antunit"> | |||||
<import file="../antunit-base.xml" /> | |||||
<target name="setUp"> | |||||
<mkdir dir="${input}"/> | |||||
<property name="file" location="${input}/file"/> | |||||
<touch file="${file}"/> | |||||
</target> | |||||
<target name="testRequiresNestedResources" depends="setUp"> | |||||
<au:expectfailure expectedMessage="At least one resource-collection is required"> | |||||
<setpermissions mode="644" /> | |||||
</au:expectfailure> | |||||
</target> | |||||
<target name="testPermissionsSetViaPermissionsAttribute" | |||||
depends="setUp"> | |||||
<setpermissions permissions="OWNER_READ,GROUP_READ,OTHERS_READ"> | |||||
<file file="${file}"/> | |||||
</setpermissions> | |||||
<au:assertFalse> | |||||
<isfileselected file="${file}"> | |||||
<writable/> | |||||
</isfileselected> | |||||
</au:assertFalse> | |||||
<au:assertTrue> | |||||
<isfileselected file="${file}"> | |||||
<readable/> | |||||
</isfileselected> | |||||
</au:assertTrue> | |||||
</target> | |||||
<target name="testPermissionsSetViaModeAttribute" | |||||
depends="setUp"> | |||||
<setpermissions mode="444"> | |||||
<file file="${file}"/> | |||||
</setpermissions> | |||||
<au:assertFalse> | |||||
<isfileselected file="${file}"> | |||||
<writable/> | |||||
</isfileselected> | |||||
</au:assertFalse> | |||||
<au:assertTrue> | |||||
<isfileselected file="${file}"> | |||||
<readable/> | |||||
</isfileselected> | |||||
</au:assertTrue> | |||||
</target> | |||||
</project> |