ICU-20764 Allow top-level include and exclude in data filter rules.
diff --git a/docs/userguide/icu_data/buildtool.md b/docs/userguide/icu_data/buildtool.md
index 1741575..b0930bd 100644
--- a/docs/userguide/icu_data/buildtool.md
+++ b/docs/userguide/icu_data/buildtool.md
@@ -222,7 +222,7 @@
| | Additive | Subtractive |
|-------------------------|-------------|-------------|
| Default Feature Filter | `"exclude"` | `"include"` |
-| Default Resource Filter | `"-/*"` | `"+/*"` |
+| Default Resource Filter | `"-/"` | `"+/"` |
To enable additive mode, add the following setting to your filter file:
diff --git a/icu4c/source/python/icutools/databuilder/filtration.py b/icu4c/source/python/icutools/databuilder/filtration.py
index a74a7a7..9150eb2 100644
--- a/icu4c/source/python/icutools/databuilder/filtration.py
+++ b/icu4c/source/python/icutools/databuilder/filtration.py
@@ -319,9 +319,9 @@
)
]
if self.strategy == "additive":
- self.rules_by_file = [["-/*"] for _ in range(len(files))]
+ self.rules_by_file = [["-/"] for _ in range(len(files))]
else:
- self.rules_by_file = [["+/*"] for _ in range(len(files))]
+ self.rules_by_file = [["+/"] for _ in range(len(files))]
def add_rules(self, file_filter, rules):
for file, rule_list in zip(self.input_files, self.rules_by_file):
diff --git a/icu4c/source/python/icutools/databuilder/filtration_schema.json b/icu4c/source/python/icutools/databuilder/filtration_schema.json
index a68011f..ba027ed 100644
--- a/icu4c/source/python/icutools/databuilder/filtration_schema.json
+++ b/icu4c/source/python/icutools/databuilder/filtration_schema.json
@@ -38,7 +38,7 @@
"type": "array",
"items": {
"type": "string",
- "pattern": "^[+-]/[\\S]+$"
+ "pattern": "^[+-]/[\\S]*$"
}
}
},
diff --git a/icu4c/source/test/intltest/restsnew.cpp b/icu4c/source/test/intltest/restsnew.cpp
index 6f86709..0a6a121 100644
--- a/icu4c/source/test/intltest/restsnew.cpp
+++ b/icu4c/source/test/intltest/restsnew.cpp
@@ -1270,13 +1270,11 @@
assertEquals("fornia", fornia.getType(), URES_TABLE);
{
+ // Filter: hawaii should not be included based on parent inheritance
ResourceBundle hawaii = fornia.get("hawaii", status);
- REQUIRE_SUCCESS(status);
- assertEquals("hawaii", hawaii.getType(), URES_STRING);
- assertEquals("hawaii", u"idaho", hawaii.getString(status));
- REQUIRE_SUCCESS(status);
+ REQUIRE_ERROR(U_MISSING_RESOURCE_ERROR, status);
- // Filter: illinois should not be included
+ // Filter: illinois should not be included based on direct rule
ResourceBundle illinois = fornia.get("illinois", status);
REQUIRE_ERROR(U_MISSING_RESOURCE_ERROR, status);
}
@@ -1350,6 +1348,20 @@
REQUIRE_ERROR(U_MISSING_RESOURCE_ERROR, status);
}
}
+
+ // Filter: northCarolina should be included based on direct rule,
+ // and so should its child, northDakota
+ ResourceBundle northCarolina = rb.get("northCarolina", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("northCarolina", northCarolina.getType(), URES_TABLE);
+
+ {
+ ResourceBundle northDakota = northCarolina.get("northDakota", status);
+ REQUIRE_SUCCESS(status);
+ assertEquals("northDakota", northDakota.getType(), URES_STRING);
+ assertEquals("northDakota", u"west-virginia", northDakota.getString(status));
+ REQUIRE_SUCCESS(status);
+ }
}
#if U_ENABLE_TRACING
diff --git a/icu4c/source/test/testdata/filters/filtertest.txt b/icu4c/source/test/testdata/filters/filtertest.txt
index 91c7801..f884dd1 100644
--- a/icu4c/source/test/testdata/filters/filtertest.txt
+++ b/icu4c/source/test/testdata/filters/filtertest.txt
@@ -1,6 +1,7 @@
# Copyright (C) 2018 and later: Unicode, Inc. and others.
# License & terms of use: http://www.unicode.org/copyright.html
+-/
-/alabama
+/alabama/alaska/arizona
-/fornia/illinois
@@ -9,3 +10,4 @@
+/mississippi/*/maine
-/mississippi/*/iowa
+/mississippi/louisiana/iowa
++/northCarolina
diff --git a/icu4c/source/test/testdata/filtertest.txt b/icu4c/source/test/testdata/filtertest.txt
index 4d9aeb5..1fbc71c 100644
--- a/icu4c/source/test/testdata/filtertest.txt
+++ b/icu4c/source/test/testdata/filtertest.txt
@@ -34,4 +34,7 @@
missouri {"new-york"}
}
}
+ northCarolina {
+ northDakota {"west-virginia"}
+ }
}
diff --git a/icu4c/source/tools/genrb/filterrb.cpp b/icu4c/source/tools/genrb/filterrb.cpp
index d62d185..dcc02fc 100644
--- a/icu4c/source/tools/genrb/filterrb.cpp
+++ b/icu4c/source/tools/genrb/filterrb.cpp
@@ -23,6 +23,9 @@
status = U_PARSE_ERROR;
return;
}
+ if (path.length() == 1) {
+ return;
+ }
size_t i;
size_t j = 0;
while (true) {