diff mbox series

devtool: reset: Escape command line input used in regular expression

Message ID 20250318232539.634222-1-pkj@axis.com
State New
Headers show
Series devtool: reset: Escape command line input used in regular expression | expand

Commit Message

Peter Kjellerstedt March 18, 2025, 11:25 p.m. UTC
Running, e.g., `devtool reset sdbus-c++` would result in the following
error:

  re.error: multiple repeat at position 35

This was due to the ++ in the recipe name, which would be treated as an
incorrect regular expression in _reset().

Use re.escape() to make sure all characters in the recipe name are
treated literally.

Signed-off-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
---
 .../devtool/devtool-test-reset-re++.bb        |  9 +++++++++
 .../devtool/devtool-test-reset-re++/file1     |  1 +
 meta/lib/oeqa/selftest/cases/devtool.py       | 19 +++++++++++++++++++
 scripts/lib/devtool/standard.py               |  2 +-
 4 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 meta-selftest/recipes-test/devtool/devtool-test-reset-re++.bb
 create mode 100644 meta-selftest/recipes-test/devtool/devtool-test-reset-re++/file1
diff mbox series

Patch

diff --git a/meta-selftest/recipes-test/devtool/devtool-test-reset-re++.bb b/meta-selftest/recipes-test/devtool/devtool-test-reset-re++.bb
new file mode 100644
index 0000000000..35672a5265
--- /dev/null
+++ b/meta-selftest/recipes-test/devtool/devtool-test-reset-re++.bb
@@ -0,0 +1,9 @@ 
+LICENSE = "CLOSED"
+INHIBIT_DEFAULT_DEPS = "1"
+
+SRC_URI = "file://file1"
+
+S = "${WORKDIR}/sources"
+UNPACKDIR = "${S}"
+
+EXCLUDE_FROM_WORLD = "1"
diff --git a/meta-selftest/recipes-test/devtool/devtool-test-reset-re++/file1 b/meta-selftest/recipes-test/devtool/devtool-test-reset-re++/file1
new file mode 100644
index 0000000000..51f466f2e4
--- /dev/null
+++ b/meta-selftest/recipes-test/devtool/devtool-test-reset-re++/file1
@@ -0,0 +1 @@ 
+A file
diff --git a/meta/lib/oeqa/selftest/cases/devtool.py b/meta/lib/oeqa/selftest/cases/devtool.py
index 115dc24d87..ddbc554af0 100644
--- a/meta/lib/oeqa/selftest/cases/devtool.py
+++ b/meta/lib/oeqa/selftest/cases/devtool.py
@@ -1757,6 +1757,8 @@  class DevtoolExtractTests(DevtoolBase):
         self.assertExists(os.path.join(tempdir, 'Makefile.am'), 'Extracted source could not be found')
         self._check_src_repo(tempdir)
 
+class DevtoolResetTests(DevtoolBase):
+
     def test_devtool_reset_all(self):
         tempdir = tempfile.mkdtemp(prefix='devtoolqa')
         self.track_for_cleanup(tempdir)
@@ -1783,6 +1785,21 @@  class DevtoolExtractTests(DevtoolBase):
         matches2 = glob.glob(stampprefix2 + '*')
         self.assertFalse(matches2, 'Stamp files exist for recipe %s that should have been cleaned' % testrecipe2)
 
+    def test_devtool_reset_re_plus_plus(self):
+        tempdir = tempfile.mkdtemp(prefix='devtoolqa')
+        self.track_for_cleanup(tempdir)
+        self.track_for_cleanup(self.workspacedir)
+        self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
+        testrecipe = 'devtool-test-reset-re++'
+        result = runCmd('devtool modify %s' % testrecipe)
+        result = runCmd('devtool reset -n %s' % testrecipe)
+        self.assertIn(testrecipe, result.output)
+        result = runCmd('devtool status')
+        self.assertNotIn(testrecipe, result.output)
+        self.assertNotExists(os.path.join(self.workspacedir, 'recipes', testrecipe), 'Recipe directory should not exist after resetting')
+
+class DevtoolDeployTargetTests(DevtoolBase):
+
     @OETestTag("runqemu")
     def test_devtool_deploy_target(self):
         self._check_runqemu_prerequisites()
@@ -1850,6 +1867,8 @@  class DevtoolExtractTests(DevtoolBase):
             result = runCmd('ssh %s root@%s %s' % (sshargs, qemu.ip, testcommand), ignore_status=True)
             self.assertNotEqual(result, 0, 'undeploy-target did not remove command as it should have')
 
+class DevtoolBuildImageTests(DevtoolBase):
+
     def test_devtool_build_image(self):
         """Test devtool build-image plugin"""
         # Check preconditions
diff --git a/scripts/lib/devtool/standard.py b/scripts/lib/devtool/standard.py
index 0cdb9c6cfb..cdfdba43ee 100644
--- a/scripts/lib/devtool/standard.py
+++ b/scripts/lib/devtool/standard.py
@@ -1951,7 +1951,7 @@  def _reset(recipes, no_clean, remove_work, config, basepath, workspace):
             lines = f.readlines()
             with open(new_layerconf_file, 'a') as nf:
                 for line in lines:
-                    pprovider_exp = r'^PREFERRED_PROVIDER_.*? = "' + pn + r'"$'
+                    pprovider_exp = r'^PREFERRED_PROVIDER_.*? = "' + re.escape(pn) + r'"$'
                     if not re.match(pprovider_exp, line):
                         nf.write(line)
                     else: