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 <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie 2025-06-27 10:12:06 +01:00
parent c02b7accd5
commit 58b0a65ada
3 changed files with 30 additions and 5 deletions

View File

@ -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']

View File

@ -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")

View File

@ -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):
"""