diff --git a/WHATSNEW b/WHATSNEW
index b085be75e..96920b736 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -7,6 +7,9 @@ Fixed bugs:
* the ftp task could throw a NullPointerException if an error occured
Bugzilla Report 64438
+ * propertyset now also sees in-scope local properties
+ Bugzilla Report 50179
+
Changes from Ant 1.10.7 TO Ant 1.10.8
=====================================
diff --git a/src/etc/testcases/taskdefs/optional/echoproperties.xml b/src/etc/testcases/taskdefs/optional/echoproperties.xml
index 449f1716e..661df13f7 100644
--- a/src/etc/testcases/taskdefs/optional/echoproperties.xml
+++ b/src/etc/testcases/taskdefs/optional/echoproperties.xml
@@ -123,6 +123,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/org/apache/tools/ant/types/PropertySet.java b/src/main/org/apache/tools/ant/types/PropertySet.java
index 21d59fe27..b1b7d7934 100644
--- a/src/main/org/apache/tools/ant/types/PropertySet.java
+++ b/src/main/org/apache/tools/ant/types/PropertySet.java
@@ -18,6 +18,7 @@
package org.apache.tools.ant.types;
+import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -34,6 +35,7 @@ import java.util.stream.Stream;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
+import org.apache.tools.ant.PropertyHelper;
import org.apache.tools.ant.types.resources.MappedResource;
import org.apache.tools.ant.types.resources.PropertyResource;
import org.apache.tools.ant.util.FileNameMapper;
@@ -334,7 +336,16 @@ public class PropertySet extends DataType implements ResourceCollection {
private Map getEffectiveProperties() {
final Project prj = getProject();
- final Map result = prj == null ? getAllSystemProperties() : prj.getProperties();
+ final Map result;
+ if (prj == null) {
+ result = getAllSystemProperties();
+ } else {
+ final PropertyHelper ph = PropertyHelper.getPropertyHelper(prj);
+ result = prj.getPropertyNames().stream()
+ .map(n -> new AbstractMap.SimpleImmutableEntry<>(n, ph.getProperty(n)))
+ .filter(kv -> kv.getValue() != null)
+ .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+ }
//quick & dirty, to make nested mapped p-sets work:
for (PropertySet set : setRefs) {
result.putAll(set.getPropertyMap());
diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/EchoPropertiesTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/EchoPropertiesTest.java
index 0c561a4b3..b2c30541e 100644
--- a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/EchoPropertiesTest.java
+++ b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/EchoPropertiesTest.java
@@ -186,6 +186,12 @@ public class EchoPropertiesTest {
assertThat(buildRule.getFullLog(), containsString(MagicNames.ANT_VERSION + "="));
}
+ @Test
+ public void testLocalPropertyset() {
+ buildRule.executeTarget("testEchoLocalPropertyset");
+ assertThat(buildRule.getLog(), containsString("loc=foo"));
+ }
+
private void testEchoPrefixVarious(String target) throws Exception {
buildRule.executeTarget(target);
Properties props = loadPropFile(PREFIX_OUTFILE);