Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
fbb3830
Add example1.ini file (for tests)
ccp-chargeback Dec 1, 2025
31479c2
Add vcpkg inih to project
ccp-chargeback Dec 1, 2025
9ce31fa
Add first ResourceFilterTest
ccp-chargeback Dec 2, 2025
4a0a0d8
Update ExampleIniParsing test
ccp-chargeback Dec 2, 2025
dbbfb83
Rename the ResourceFilterTest class
ccp-chargeback Dec 3, 2025
fd26db0
Add scaffolding for the Filter classes
ccp-chargeback Dec 3, 2025
40ec602
Include exclude filter implementation without regex
ccp-chargeback Dec 5, 2025
ede9636
Simplify FilterResourceFilter::ParseFilters()
ccp-chargeback Dec 5, 2025
b79fe7e
Add error tests for FilterResourceFilter::ParseFilters()
ccp-chargeback Dec 5, 2025
a2bd883
Add tests for Condensed but valid filter strings
ccp-chargeback Dec 8, 2025
1a406b3
Add Doxygen markdown comments to FilterResourceFilter class.
ccp-chargeback Dec 8, 2025
c65e3c4
Change scaffolding of FilterResourceFilter
ccp-chargeback Dec 9, 2025
5d151d0
Move Filter logic into tools
ccp-chargeback Dec 10, 2025
c8b8bcd
Make filter tool classes part of ResourceTools namespace
ccp-chargeback Dec 10, 2025
5fed2b9
Fix Filter tests to now use new ResourceTools namespace
ccp-chargeback Dec 10, 2025
369e3c8
Add test for multiline respaths with empty lines
ccp-chargeback Dec 10, 2025
f9d4965
Refactor of ResourceLing and PrefixMap
ccp-chargeback Dec 11, 2025
8a68f53
Add FilterPrefixMap and Entry classes
ccp-chargeback Dec 12, 2025
e90027b
Add tests for FilterPrefixMap and Entry
ccp-chargeback Dec 15, 2025
cd967c2
Include and function signature cleanup
ccp-chargeback Dec 15, 2025
a84ebd9
Add tests for class FilterDefaultSection
ccp-chargeback Dec 15, 2025
12e4d74
Fixup NamedSection and related classes.
ccp-chargeback Jan 8, 2026
3ce25ae
Add test for Duplicate Filter in Overrides
ccp-chargeback Jan 8, 2026
f96197d
Change m_parentPrefixMap to a const reference
ccp-chargeback Jan 9, 2026
698874b
Change m_parentSectionFilter to a const reference
ccp-chargeback Jan 9, 2026
74de122
Remove un-necessary default constructors
ccp-chargeback Jan 9, 2026
022b0cf
Rename and gorup Resource Filter tests by class tested
ccp-chargeback Jan 9, 2026
7b31e28
Add FilterNamedSection tests
ccp-chargeback Jan 12, 2026
073a220
Add FilterResourceFile class
ccp-chargeback Jan 13, 2026
c885982
Add test for FilterResourceFile class (example1.ini)
ccp-chargeback Jan 13, 2026
b842fb7
Treat empty top-level and inline filters differently
ccp-chargeback Jan 15, 2026
c82711e
Add tests for NamedSection different inline filters
ccp-chargeback Jan 15, 2026
825ffee
Add tests for loading invalid example .ini files
ccp-chargeback Jan 15, 2026
183d0c0
Add ResourceFilter class
ccp-chargeback Jan 21, 2026
4ecb4a7
Merge branch 'main' into add-resource-filtering
ccp-chargeback Jan 21, 2026
42f2006
Fix formatting
ccp-chargeback Jan 21, 2026
eb4917e
Remove TODOs
ccp-chargeback Jan 21, 2026
31989f8
Add a complex include/exclude via different relative paths test
ccp-chargeback Jan 22, 2026
93b6942
Add ResourceFilter test using two .ini files
ccp-chargeback Jan 23, 2026
cf59252
Hook up CLI argument --filter-files
ccp-chargeback Jan 26, 2026
5158d92
Make the CurrentWorkingDirectoryChanger helper class available for al…
ccp-chargeback Jan 26, 2026
6d3c1fb
Add resourceFilterIniFiles info to PrintStartBanner()
ccp-chargeback Jan 26, 2026
cec67ec
Make CLI parameter --filter-files singular
ccp-chargeback Jan 26, 2026
43bdd0f
Update helpString for --filter-file
ccp-chargeback Jan 26, 2026
bef0e53
Create CLI test for filtering using validSimpleExample1.ini
ccp-chargeback Jan 26, 2026
201dcff
Create more CLI filter tests
ccp-chargeback Jan 26, 2026
d80b9e6
Fix formatting of FilterResources CLI tests
ccp-chargeback Jan 26, 2026
56dbfb0
Remove unnecessary comments in class CurrentWorkingDirectoryChanger
ccp-chargeback Jan 26, 2026
215803d
Merge branch 'main' into add-resource-filtering
ccp-chargeback Jan 30, 2026
ae101d9
Update include statements
ccp-chargeback Jan 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,6 @@ CMakeUserPresets.json
### VCPKG ###
# Temporary measure which fixes build agent issue
vcpkg_registry_cache/

### Ignored Test Run Files ###
/tests/testData/IgnoredTestOutputFiles/
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ include(cmake/CcpPackageConfigHelpers.cmake)
include(cmake/CcpBuildConfigurations.cmake)

find_package(yaml-cpp CONFIG REQUIRED)
find_package(unofficial-inih CONFIG REQUIRED)

# Add subdirectory for resource tools static library
add_subdirectory(tools)
Expand Down Expand Up @@ -66,7 +67,7 @@ endif ()

target_compile_definitions(resources PUBLIC CARBON_RESOURCES_STATIC)

target_link_libraries(resources PRIVATE $<BUILD_LOCAL_INTERFACE:resources-tools> yaml-cpp::yaml-cpp)
target_link_libraries(resources PRIVATE $<BUILD_LOCAL_INTERFACE:resources-tools> yaml-cpp::yaml-cpp unofficial::inih::inireader)

target_include_directories(resources
PUBLIC
Expand Down
80 changes: 59 additions & 21 deletions cli/src/CreateResourceGroupCliOperation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ CreateResourceGroupCliOperation::CreateResourceGroupCliOperation() :
m_createResourceGroupSkipCompressionCalculationId( "--skip-compression" ),
m_createResourceGroupExportResourcesId( "--export-resources" ),
m_createResourceGroupExportResourcesDestinationTypeId( "--export-resources-destination-type" ),
m_createResourceGroupExportResourcesDestinationPathId( "--export-resources-destination-path" )
m_createResourceGroupExportResourcesDestinationPathId( "--export-resources-destination-path" ),
m_createResourceGroupIniFilterFilesArgumentId( "--filter-file" )
{

AddRequiredPositionalArgument( m_createResourceGroupPathArgumentId, "Base directory to create resource group from." );
Expand All @@ -32,25 +33,27 @@ CreateResourceGroupCliOperation::CreateResourceGroupCliOperation() :
AddArgument( m_createResourceGroupDocumentVersionArgumentId, "Document version for created resource group.", false, false, VersionToString( defaultImportParams.outputDocumentVersion ) );

AddArgument( m_createResourceGroupResourcePrefixArgumentId, R"(Optional resource path prefix, such as "res" or "app")", false, false, "" );

AddArgumentFlag( m_createResourceGroupSkipCompressionCalculationId, "Set skip compression calculations on resources." );

AddArgumentFlag( m_createResourceGroupExportResourcesId, "Export resources after processing. see --export-resources-destination-type and --export-resources-destination-path" );
AddArgumentFlag( m_createResourceGroupSkipCompressionCalculationId, "Set skip compression calculations on resources." );

AddArgument( m_createResourceGroupExportResourcesDestinationTypeId, "Represents the type of repository where exported resources will be saved. Requires --export-resources", false, false, DestinationTypeToString( defaultImportParams.exportResourcesDestinationSettings.destinationType ), ResourceDestinationTypeChoicesAsString() );
AddArgumentFlag( m_createResourceGroupExportResourcesId, "Export resources after processing. see --export-resources-destination-type and --export-resources-destination-path" );

AddArgument( m_createResourceGroupExportResourcesDestinationTypeId, "Represents the type of repository where exported resources will be saved. Requires --export-resources", false, false, DestinationTypeToString( defaultImportParams.exportResourcesDestinationSettings.destinationType ), ResourceDestinationTypeChoicesAsString() );

AddArgument( m_createResourceGroupExportResourcesDestinationPathId, "Represents the base path where the exported resources will be saved. Requires --export-resources", false, false, defaultImportParams.exportResourcesDestinationSettings.basePath.string() );

AddArgument( m_createResourceGroupIniFilterFilesArgumentId, "Path to INI file(s) for resource filtering.", false, true, "" );
}

bool CreateResourceGroupCliOperation::Execute( std::string& returnErrorMessage ) const
{
CarbonResources::CreateResourceGroupFromDirectoryParams createResourceGroupParams;

CarbonResources::ResourceGroupExportToFileParams exportParams;
CarbonResources::ResourceGroupExportToFileParams exportParams;

createResourceGroupParams.directory = m_argumentParser->get<std::string>( m_createResourceGroupPathArgumentId );
createResourceGroupParams.directory = m_argumentParser->get<std::string>( m_createResourceGroupPathArgumentId );

bool versionIsValid = ParseDocumentVersion( m_argumentParser->get( m_createResourceGroupDocumentVersionArgumentId ), createResourceGroupParams.outputDocumentVersion );
bool versionIsValid = ParseDocumentVersion( m_argumentParser->get( m_createResourceGroupDocumentVersionArgumentId ), createResourceGroupParams.outputDocumentVersion );

if( !versionIsValid )
{
Expand All @@ -63,7 +66,7 @@ bool CreateResourceGroupCliOperation::Execute( std::string& returnErrorMessage )

createResourceGroupParams.calculateCompressions = !m_argumentParser->get<bool>( m_createResourceGroupSkipCompressionCalculationId );

createResourceGroupParams.exportResources = m_argumentParser->get<bool>( m_createResourceGroupExportResourcesId );
createResourceGroupParams.exportResources = m_argumentParser->get<bool>( m_createResourceGroupExportResourcesId );

if( createResourceGroupParams.exportResources )
{
Expand All @@ -79,17 +82,36 @@ bool CreateResourceGroupCliOperation::Execute( std::string& returnErrorMessage )
createResourceGroupParams.exportResourcesDestinationSettings.basePath = m_argumentParser->get<std::string>( m_createResourceGroupExportResourcesDestinationPathId );
}

exportParams.filename = m_argumentParser->get<std::string>( m_createResourceGroupOutputFileArgumentId );

exportParams.filename = m_argumentParser->get<std::string>( m_createResourceGroupOutputFileArgumentId );
exportParams.outputDocumentVersion = createResourceGroupParams.outputDocumentVersion;

exportParams.outputDocumentVersion = createResourceGroupParams.outputDocumentVersion;
if( m_argumentParser->is_used( m_createResourceGroupIniFilterFilesArgumentId ))
{
std::vector<std::filesystem::path> filterIniFilePaths;
auto iniFileStringVector = m_argumentParser->get<std::vector<std::string>>( m_createResourceGroupIniFilterFilesArgumentId );

for( const auto& iniPathStr : iniFileStringVector )
{
if( !iniPathStr.empty() )
{
filterIniFilePaths.push_back( iniPathStr );
}
}
if ( !filterIniFilePaths.empty() )
{
createResourceGroupParams.resourceFilterIniFiles = filterIniFilePaths;
}
}

PrintStartBanner( createResourceGroupParams, exportParams );

return CreateResourceGroup( createResourceGroupParams, exportParams );
}

void CreateResourceGroupCliOperation::PrintStartBanner( CarbonResources::CreateResourceGroupFromDirectoryParams& createResourceGroupFromDirectoryParams, CarbonResources::ResourceGroupExportToFileParams& ResourceGroupExportToFileParams ) const
void CreateResourceGroupCliOperation::PrintStartBanner(
CarbonResources::CreateResourceGroupFromDirectoryParams& createResourceGroupFromDirectoryParams,
CarbonResources::ResourceGroupExportToFileParams& ResourceGroupExportToFileParams ) const
{
if( s_verbosityLevel == CarbonResources::StatusLevel::OFF )
{
Expand All @@ -104,41 +126,57 @@ void CreateResourceGroupCliOperation::PrintStartBanner( CarbonResources::CreateR

std::cout << "Output File: " << ResourceGroupExportToFileParams.filename << std::endl;

std::cout << "Output Document Version: " << VersionToString(ResourceGroupExportToFileParams.outputDocumentVersion) << std::endl;
std::cout << "Output Document Version: " << VersionToString( ResourceGroupExportToFileParams.outputDocumentVersion ) << std::endl;

std::cout << "Resource Prefix: " << createResourceGroupFromDirectoryParams.resourcePrefix << std::endl;

if( createResourceGroupFromDirectoryParams.calculateCompressions)
{
if( createResourceGroupFromDirectoryParams.calculateCompressions )
{
std::cout << "Calculate Compression: On" << std::endl;
}
}
else
{
std::cout << "Calculate Compression: Off" << std::endl;
}

if( createResourceGroupFromDirectoryParams.exportResources )
if( createResourceGroupFromDirectoryParams.exportResources )
{
std::cout << "Export Resources: On" << std::endl;

std::cout << "Export Resources Type: " << DestinationTypeToString( createResourceGroupFromDirectoryParams.exportResourcesDestinationSettings.destinationType ) << std::endl;
std::cout << "Export Resources Type: " << DestinationTypeToString( createResourceGroupFromDirectoryParams.exportResourcesDestinationSettings.destinationType ) << std::endl;

std::cout << "Export Resources Base Path: " << createResourceGroupFromDirectoryParams.exportResourcesDestinationSettings.basePath << std::endl;
std::cout << "Export Resources Base Path: " << createResourceGroupFromDirectoryParams.exportResourcesDestinationSettings.basePath << std::endl;
}
else
{
std::cout << "Export Resources: Off" << std::endl;
}

if( createResourceGroupFromDirectoryParams.resourceFilterIniFiles.size() > 0 )
{
std::cout << "Resource Filter INI File(s) used: " << std::endl;

for( const auto& iniPath : createResourceGroupFromDirectoryParams.resourceFilterIniFiles )
{
std::cout << " - " << iniPath.generic_string() << std::endl;
}
}
else
{
std::cout << "Resource Filter INI File(s) used: None" << std::endl;
}

std::cout << "----------------------------\n"
<< std::endl;
}

bool CreateResourceGroupCliOperation::CreateResourceGroup( CarbonResources::CreateResourceGroupFromDirectoryParams& createResourceGroupFromDirectoryParams, CarbonResources::ResourceGroupExportToFileParams& ResourceGroupExportToFileParams ) const
bool CreateResourceGroupCliOperation::CreateResourceGroup(
CarbonResources::CreateResourceGroupFromDirectoryParams& createResourceGroupFromDirectoryParams,
CarbonResources::ResourceGroupExportToFileParams& ResourceGroupExportToFileParams ) const
{
CarbonResources::ResourceGroup resourceGroup;

createResourceGroupFromDirectoryParams.statusCallback = GetStatusCallback();
createResourceGroupFromDirectoryParams.statusCallback = GetStatusCallback();

if( createResourceGroupFromDirectoryParams.statusCallback )
{
Expand Down
22 changes: 14 additions & 8 deletions cli/src/CreateResourceGroupCliOperation.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,13 @@ class CreateResourceGroupCliOperation : public CliOperation
virtual bool Execute( std::string& returnErrorMessage ) const final;

private:
void PrintStartBanner( CarbonResources::CreateResourceGroupFromDirectoryParams& createResourceGroupFromDirectoryParams, CarbonResources::ResourceGroupExportToFileParams& ResourceGroupExportToFileParams ) const;
void PrintStartBanner(
CarbonResources::CreateResourceGroupFromDirectoryParams& createResourceGroupFromDirectoryParams,
CarbonResources::ResourceGroupExportToFileParams& ResourceGroupExportToFileParams ) const;

bool CreateResourceGroup( CarbonResources::CreateResourceGroupFromDirectoryParams& createResourceGroupFromDirectoryParams, CarbonResources::ResourceGroupExportToFileParams& ResourceGroupExportToFileParams ) const;
bool CreateResourceGroup(
CarbonResources::CreateResourceGroupFromDirectoryParams& createResourceGroupFromDirectoryParams,
CarbonResources::ResourceGroupExportToFileParams& ResourceGroupExportToFileParams ) const;

private:
std::string m_createResourceGroupPathArgumentId;
Expand All @@ -30,14 +34,16 @@ class CreateResourceGroupCliOperation : public CliOperation
std::string m_createResourceGroupDocumentVersionArgumentId;

std::string m_createResourceGroupResourcePrefixArgumentId;

std::string m_createResourceGroupSkipCompressionCalculationId;

std::string m_createResourceGroupExportResourcesId;
std::string m_createResourceGroupSkipCompressionCalculationId;

std::string m_createResourceGroupExportResourcesDestinationTypeId;

std::string m_createResourceGroupExportResourcesDestinationPathId;
std::string m_createResourceGroupExportResourcesId;

std::string m_createResourceGroupExportResourcesDestinationTypeId;

std::string m_createResourceGroupExportResourcesDestinationPathId;

std::string m_createResourceGroupIniFilterFilesArgumentId;
};

#endif // CreateResourceGroupCliOperation_H
6 changes: 6 additions & 0 deletions include/Enums.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,10 @@ using StatusCallback = std::function<void( StatusLevel statusLevel, StatusProgre
* Required resource not found
* @var REQUIRED_INPUT_PARAMETER_NOT_SET
* A required input parameter was not set
* @var FAILED_TO_INITIALIZE_RESOURCE_FILTER
* Failed to initialize ResourceFilter from .ini file
* @var FAILED_TO_APPLY_RESOURCE_FILTER_RULES
* Unable to decide on include/exclude filtering rules for resource
*/
enum class ResultType
{
Expand Down Expand Up @@ -175,6 +179,8 @@ enum class ResultType
RESOURCE_LIST_NOT_SET,
RESOURCE_NOT_FOUND,
REQUIRED_INPUT_PARAMETER_NOT_SET,
FAILED_TO_INITIALIZE_RESOURCE_FILTER,
FAILED_TO_APPLY_RESOURCE_FILTER_RULES,
//NOTE: if adding to this enum, a complimentary entry must be added to resultToString.
};

Expand Down
4 changes: 4 additions & 0 deletions include/ResourceGroup.h
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,8 @@ struct ResourceGroupExportToFileParams
* @var CreateResourceGroupFromDirectoryParams::exportResourcesDestinationSettings
* If export resources is set, specifies where the produced PatchResourceGroup will be saved.
* @see CreateResourceGroupFromDirectoryParams::exportResources
* @var CreateResourceGroupFromDirectoryParams::resourceFilterIniFiles
* List of INI file(s) containing include/exclude rules for resource filtering
*/
struct CreateResourceGroupFromDirectoryParams
{
Expand All @@ -222,6 +224,8 @@ struct CreateResourceGroupFromDirectoryParams
bool exportResources = false;

ResourceDestinationSettings exportResourcesDestinationSettings = { CarbonResources::ResourceDestinationType::LOCAL_CDN, "ExportedResources" };

std::vector<std::filesystem::path> resourceFilterIniFiles = {};
};

/** @struct ResourceGroupMergeParams
Expand Down
8 changes: 8 additions & 0 deletions src/Enums.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,14 @@ bool ResultTypeToString( ResultType resultType, std::string& output )
case ResultType::REQUIRED_INPUT_PARAMETER_NOT_SET:
output = "A required parameter was not set";
return true;

case ResultType::FAILED_TO_INITIALIZE_RESOURCE_FILTER:
output = "Failed to initialize ResourceFilter from .ini file";
return true;

case ResultType::FAILED_TO_APPLY_RESOURCE_FILTER_RULES:
output = "Unable to decide on include/exclude filtering rules for resource";
return true;
}

output = "Error code unrecognised. This is an internal library error which shouldn't be encountered. If you encounter this error contact API addministrators.";
Expand Down
Loading