You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by mb...@apache.org on 2022/03/31 14:20:47 UTC

[ant-antlibs-s3] 04/07: exclude prefixes where possible

This is an automated email from the ASF dual-hosted git repository.

mbenson pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ant-antlibs-s3.git

commit 233cd38966cd39050ee54f6f9389537755c21235
Author: Matt Benson <mb...@apache.org>
AuthorDate: Thu Mar 31 08:41:56 2022 -0500

    exclude prefixes where possible
---
 src/main/org/apache/ant/s3/S3Finder.java | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/main/org/apache/ant/s3/S3Finder.java b/src/main/org/apache/ant/s3/S3Finder.java
index 659312a..95698ea 100644
--- a/src/main/org/apache/ant/s3/S3Finder.java
+++ b/src/main/org/apache/ant/s3/S3Finder.java
@@ -122,6 +122,7 @@ class S3Finder implements Supplier<Optional<ObjectResource>> {
         final String prefix;
         final TokenizedPath path;
         final Set<TokenizedPattern> includes;
+        final Set<TokenizedPattern> excludes;
         final int maxDepth;
         final Iterator<CommonPrefix> prefixes;
         final Iterator<Atom<?>> contents;
@@ -135,11 +136,12 @@ class S3Finder implements Supplier<Optional<ObjectResource>> {
 
             path = finder.path(prefix.get());
             includes = finder.patterns.getLeft();
+            excludes = finder.patterns.getRight();
             maxDepth = includes.stream().mapToInt(
                 include -> include.containsPattern(SelectorUtils.DEEP_TREE_MATCH) ? Integer.MAX_VALUE : include.depth())
                 .max().orElse(Integer.MAX_VALUE);
 
-            if (includes.isEmpty()) {
+            if (includes.isEmpty() && excludes.isEmpty()) {
                 this.prefixes = prefixes.iterator();
             } else {
                 final int recurseDepth = path.depth() + (finder.includePrefixes ? 0 : 1);
@@ -161,7 +163,12 @@ class S3Finder implements Supplier<Optional<ObjectResource>> {
         }
 
         final boolean allowPrefix(CommonPrefix prefix) {
-            return includes.stream().anyMatch(p -> p.matchStartOf(finder.path(prefix.prefix()), finder.caseSensitive));
+            final TokenizedPath asPath = finder.path(prefix.prefix());
+            if (maxDepth == asPath.depth()
+                && excludes.stream().anyMatch(p -> p.matchPath(asPath, finder.caseSensitive))) {
+                return false;
+            }
+            return includes.stream().anyMatch(p -> p.matchStartOf(asPath, finder.caseSensitive));
         }
 
         final boolean allow(Atom<?> atom) {