This is an automated email from the git hooks/post-receive script.

guillem pushed a commit to branch main
in repository dpkg.

View the commit online:
https://git.dpkg.org/cgit/dpkg/dpkg.git/commit/?id=d5ef1bfa677d37e1daa1aeb4235d18fc679a76d2

commit d5ef1bfa677d37e1daa1aeb4235d18fc679a76d2
Author: Guillem Jover <[email protected]>
AuthorDate: Fri Nov 28 23:09:01 2025 +0100

    Dpkg::BuildProfiles: Add new build_profile_is_invalid function
    
    This function validates whether a build profile formula is valid.
---
 scripts/Dpkg/BuildProfiles.pm  | 54 +++++++++++++++++++++++++++++++++++++++++-
 scripts/t/Dpkg_BuildProfiles.t | 23 +++++++++++++++++-
 2 files changed, 75 insertions(+), 2 deletions(-)

diff --git a/scripts/Dpkg/BuildProfiles.pm b/scripts/Dpkg/BuildProfiles.pm
index b3b2961d8..2444a313c 100644
--- a/scripts/Dpkg/BuildProfiles.pm
+++ b/scripts/Dpkg/BuildProfiles.pm
@@ -26,13 +26,14 @@ profiles.
 
 =cut
 
-package Dpkg::BuildProfiles 1.00;
+package Dpkg::BuildProfiles 1.01;
 
 use v5.36;
 
 our @EXPORT_OK = qw(
     get_build_profiles
     set_build_profiles
+    build_profile_is_invalid
     parse_build_profiles
     evaluate_restriction_formula
 );
@@ -82,6 +83,53 @@ sub set_build_profiles {
     Dpkg::BuildEnv::set('DEB_BUILD_PROFILES', join ' ', @profiles);
 }
 
+=item $bool = build_profile_is_invalid($string)
+
+Validate a build profile formula.
+
+=cut
+
+my $profile_name_regex = qr{
+    !?
+    # Be lenient for now. Accept operators for extensibility, uppercase,
+    # and package name characters.
+    [
+        ?/;:=@%*~_
+        A-Z
+        a-z0-9+.\-
+    ]+
+}x;
+
+my $restriction_list_regex = qr{
+    <
+    \s*
+    (
+        $profile_name_regex
+        (?:
+            \s+
+            $profile_name_regex
+        )*
+    )
+    \s*
+    >
+}x;
+
+my $restriction_formula_regex = qr{
+    ^
+    (?:
+        \s*
+        $restriction_list_regex
+    )*
+    \s*
+    $
+}x;
+
+
+sub build_profile_is_invalid($string)
+{
+    return $string !~ $restriction_formula_regex;
+}
+
 =item @profiles = parse_build_profiles($string)
 
 Parses a build profiles specification, into an array of array references.
@@ -138,6 +186,10 @@ sub evaluate_restriction_formula {
 
 =head1 CHANGES
 
+=head2 Version 1.01 (dpkg 1.23.0)
+
+New functions: build_profile_is_invalid().
+
 =head2 Version 1.00 (dpkg 1.17.17)
 
 Mark the module as public.
diff --git a/scripts/t/Dpkg_BuildProfiles.t b/scripts/t/Dpkg_BuildProfiles.t
index 94676a352..2b5f5f3ea 100644
--- a/scripts/t/Dpkg_BuildProfiles.t
+++ b/scripts/t/Dpkg_BuildProfiles.t
@@ -15,9 +15,10 @@
 
 use v5.36;
 
-use Test::More tests => 8;
+use Test::More tests => 17;
 
 use ok 'Dpkg::BuildProfiles', qw(
+    build_profile_is_invalid
     parse_build_profiles
     set_build_profiles
     get_build_profiles
@@ -27,6 +28,26 @@ use ok 'Dpkg::BuildProfiles', qw(
 
 my $formula;
 
+ok(!build_profile_is_invalid(''),
+    'check that build profiles with no characters are valid');
+ok(!build_profile_is_invalid('<nocheck>'),
+    'check that build profiles with a valid single element are valid');
+ok(!build_profile_is_invalid('<nocheck nodoc> <pkg/dpkg/author-checks>'),
+    'check that build profiles with a valid formula are valid');
+
+ok(build_profile_is_invalid('<invalid> + <characters>'),
+    'check that build profiles with invalid characters are invalid');
+ok(build_profile_is_invalid('missing angle brackets'),
+    'check that build profiles with missing opening/closing angle brackets are 
invalid');
+ok(build_profile_is_invalid('<missing angle brackets <here too'),
+    'check that build profiles with missing closing angle brackets are invalid 
1');
+ok(build_profile_is_invalid('<missing angle brackets <here too>'),
+    'check that build profiles with missing closing angle brackets are invalid 
2');
+ok(build_profile_is_invalid('missing angle> brackets>'),
+    'check that build profiles with missing opening angle brackets are invalid 
1');
+ok(build_profile_is_invalid('missing angle> <brackets>'),
+    'check that build profiles with missing opening angle brackets are invalid 
2');
+
 $formula = [ ];
 is_deeply([ parse_build_profiles('') ], $formula,
     'parse build profiles formula empty');

-- 
Dpkg.Org's dpkg

Reply via email to