From 58b0a65ada340fda3bc04fa9fcb648eb43246402 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Fri, 27 Jun 2025 10:12:06 +0100 Subject: [PATCH] bitbake: utils: Refactor filemode variable conversion to a function We have other places in the code where we need to take filemode/mask information from a bitbake variable and turn it into a real python number. Turn this internal code into public API in bb.utils and add some tests for it. (Bitbake rev: d89e30fb2fb15b09f2cb95c4e5aa9f749ca257ea) Signed-off-by: Richard Purdie --- bitbake/bin/bitbake-worker | 7 ++----- bitbake/lib/bb/tests/utils.py | 11 +++++++++++ bitbake/lib/bb/utils.py | 17 +++++++++++++++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/bitbake/bin/bitbake-worker b/bitbake/bin/bitbake-worker index 35fa1ab62b..d2b146a6a9 100755 --- a/bitbake/bin/bitbake-worker +++ b/bitbake/bin/bitbake-worker @@ -182,11 +182,8 @@ def fork_off_task(cfg, data, databuilder, workerdata, extraconfigdata, runtask): elif workerdata["umask"]: umask = workerdata["umask"] if umask: - # umask might come in as a number or text string.. - try: - umask = int(umask, 8) - except TypeError: - pass + # Convert to a python numeric value as it could be a string + umask = bb.utils.to_filemode(umask) dry_run = cfg.dry_run or runtask['dry_run'] diff --git a/bitbake/lib/bb/tests/utils.py b/bitbake/lib/bb/tests/utils.py index 48e61dfcea..52b7bf85bf 100644 --- a/bitbake/lib/bb/tests/utils.py +++ b/bitbake/lib/bb/tests/utils.py @@ -692,3 +692,14 @@ class EnvironmentTests(unittest.TestCase): self.assertIn("A", os.environ) self.assertEqual(os.environ["A"], "this is A") self.assertNotIn("B", os.environ) + +class FilemodeTests(unittest.TestCase): + def test_filemode_convert(self): + self.assertEqual(0o775, bb.utils.to_filemode("0o775")) + self.assertEqual(0o775, bb.utils.to_filemode(0o775)) + self.assertEqual(0o775, bb.utils.to_filemode("775")) + with self.assertRaises(ValueError): + bb.utils.to_filemode("xyz") + with self.assertRaises(ValueError): + bb.utils.to_filemode("999") + diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index a2806fd360..1cc74ed546 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py @@ -1211,6 +1211,23 @@ def which(path, item, direction = 0, history = False, executable=False): return "", hist return "" +def to_filemode(input): + """ + Take a bitbake variable contents defining a file mode and return + the proper python representation of the number + + Arguments: + + - ``input``: a string or number to convert, e.g. a bitbake variable + string, assumed to be an octal representation + + Returns the python file mode as a number + """ + # umask might come in as a number or text string.. + if type(input) is int: + return input + return int(input, 8) + @contextmanager def umask(new_mask): """