@@ -23,6 +23,9 @@ Other changes: | |||
* 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 | |||
=================================== | |||
@@ -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 | |||
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> | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
<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 | |||
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> | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
<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/rmic.html">Rmic</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/scp.html">Scp</a></li> | |||
<li><a href="Tasks/script.html">Script</a></li> | |||
@@ -575,6 +575,11 @@ documentation.</p> | |||
files.</p></td> | |||
</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"> | |||
<td nowrap><a href="Tasks/sync.html">Sync</a></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 | |||
retry=org.apache.tools.ant.taskdefs.Retry | |||
rmic=org.apache.tools.ant.taskdefs.Rmic | |||
setpermissions=org.apache.tools.ant.taskdefs.SetPermissions | |||
sequential=org.apache.tools.ant.taskdefs.Sequential | |||
signjar=org.apache.tools.ant.taskdefs.SignJar | |||
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> |