From: Trevor Woerner <twoerner@gmail.com>
To: openembedded-core@lists.openembedded.org
Subject: [PATCH v4 04/10] oeqa/selftest/wic: drop redundant per-test PATH overrides
Date: Fri, 24 Jul 2026 05:01:40 -0400 [thread overview]
Message-ID: <20260724090146.19924-5-twoerner@gmail.com> (raw)
In-Reply-To: <20260724090146.19924-1-twoerner@gmail.com>
setUpLocal() already puts wic and its tools on PATH for every test: it
sets os.environ['PATH'] to the wic binary's directory followed by the
whole wic-tools native-sysroot PATH, and tearDownLocal() restores the
original. A number of individual tests then re-set
os.environ['PATH'] = get_bb_var("PATH", "wic-tools")
inside a try/finally, which is a narrower subset of what setUpLocal
already established (it drops the wic bindir prepend and the original
PATH tail) and adds nothing: wic and every tool it runs are reachable
from the PATH setUpLocal installs.
Remove these per-test overrides and their try/finally wrappers. The
tests keep passing the explicit --native-sysroot / RECIPE_SYSROOT_NATIVE
that some of them build, which is a separate concern from PATH.
The diff looks large and noisy, but the change is mechanical: dropping
each try/finally means the whole test body dedents by one level, so
almost every line in the affected tests shows up as removed-and-re-added
with different leading whitespace. The test logic is otherwise
unchanged; reviewing with a whitespace-insensitive diff (git show -w)
shows only the removed override, try: and finally: lines.
AI-Generated: codex/claude-opus 4.8 (xhigh)
Signed-off-by: Trevor Woerner <twoerner@gmail.com>
---
changes in v4:
- new in v4
---
meta/lib/oeqa/selftest/cases/wic.py | 792 +++++++++++++---------------
1 file changed, 362 insertions(+), 430 deletions(-)
diff --git a/meta/lib/oeqa/selftest/cases/wic.py b/meta/lib/oeqa/selftest/cases/wic.py
index 6a2706fc2c8f..37673392c271 100644
--- a/meta/lib/oeqa/selftest/cases/wic.py
+++ b/meta/lib/oeqa/selftest/cases/wic.py
@@ -536,104 +536,97 @@ class Wic(WicTestCase):
def test_exclude_path(self):
"""Test --exclude-path wks option."""
- oldpath = os.environ['PATH']
- os.environ['PATH'] = get_bb_var("PATH", "wic-tools")
-
- try:
- wks_file = 'temp.wks'
- with open(wks_file, 'w') as wks:
- rootfs_dir = get_bb_var('IMAGE_ROOTFS', 'core-image-minimal')
- wks.write("""
+ wks_file = 'temp.wks'
+ with open(wks_file, 'w') as wks:
+ rootfs_dir = get_bb_var('IMAGE_ROOTFS', 'core-image-minimal')
+ wks.write("""
part / --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path usr
part /usr --source rootfs --ondisk mmcblk0 --fstype=ext4 --rootfs-dir %s/usr
part /etc --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path bin/ --rootfs-dir %s/usr
part /mnt --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path bin/whoami --rootfs-dir %s/usr"""
- % (rootfs_dir, rootfs_dir, rootfs_dir))
- runCmd("wic create %s -e core-image-minimal -o %s" \
- % (wks_file, self.resultdir))
-
- os.remove(wks_file)
- wicout = glob(os.path.join(self.resultdir, "%s-*direct" % 'temp'))
- self.assertEqual(1, len(wicout))
+ % (rootfs_dir, rootfs_dir, rootfs_dir))
+ runCmd("wic create %s -e core-image-minimal -o %s" \
+ % (wks_file, self.resultdir))
- wicimg = wicout[0]
-
- # verify partition size with wic
- res = runCmd("parted -m %s unit b p" % wicimg, stderr=subprocess.PIPE)
-
- # parse parted output which looks like this:
- # BYT;\n
- # /var/tmp/wic/build/tmpfwvjjkf_-201611101222-hda.direct:200MiB:file:512:512:msdos::;\n
- # 1:0.00MiB:200MiB:200MiB:ext4::;\n
- partlns = res.output.splitlines()[2:]
+ os.remove(wks_file)
+ wicout = glob(os.path.join(self.resultdir, "%s-*direct" % 'temp'))
+ self.assertEqual(1, len(wicout))
- self.assertEqual(4, len(partlns))
+ wicimg = wicout[0]
- for part in [1, 2, 3, 4]:
- part_file = os.path.join(self.resultdir, "selftest_img.part%d" % part)
- partln = partlns[part-1].split(":")
- self.assertEqual(7, len(partln))
- start = int(partln[1].rstrip("B")) / 512
- length = int(partln[3].rstrip("B")) / 512
- runCmd("dd if=%s of=%s skip=%d count=%d" %
- (wicimg, part_file, start, length))
-
- # Test partition 1, should contain the normal root directories, except
- # /usr.
- res = runCmd("debugfs -R 'ls -p' %s" % \
- os.path.join(self.resultdir, "selftest_img.part1"), stderr=subprocess.PIPE)
- files = extract_files(res.output)
- self.assertIn("etc", files)
- self.assertNotIn("usr", files)
-
- # Partition 2, should contain common directories for /usr, not root
- # directories.
- res = runCmd("debugfs -R 'ls -p' %s" % \
- os.path.join(self.resultdir, "selftest_img.part2"), stderr=subprocess.PIPE)
- files = extract_files(res.output)
- self.assertNotIn("etc", files)
- self.assertNotIn("usr", files)
- self.assertIn("share", files)
-
- # Partition 3, should contain the same as partition 2, including the bin
- # directory, but not the files inside it.
- res = runCmd("debugfs -R 'ls -p' %s" % \
- os.path.join(self.resultdir, "selftest_img.part3"), stderr=subprocess.PIPE)
- files = extract_files(res.output)
- self.assertNotIn("etc", files)
- self.assertNotIn("usr", files)
- self.assertIn("share", files)
- self.assertIn("bin", files)
- res = runCmd("debugfs -R 'ls -p bin' %s" % \
- os.path.join(self.resultdir, "selftest_img.part3"), stderr=subprocess.PIPE)
- files = extract_files(res.output)
- self.assertIn(".", files)
- self.assertIn("..", files)
- self.assertEqual(2, len(files))
-
- # Partition 4, should contain the same as partition 2, including the bin
- # directory, but not whoami (a symlink to busybox.nosuid) inside it.
- res = runCmd("debugfs -R 'ls -p' %s" % \
- os.path.join(self.resultdir, "selftest_img.part4"), stderr=subprocess.PIPE)
- files = extract_files(res.output)
- self.assertNotIn("etc", files)
- self.assertNotIn("usr", files)
- self.assertIn("share", files)
- self.assertIn("bin", files)
- res = runCmd("debugfs -R 'ls -p bin' %s" % \
- os.path.join(self.resultdir, "selftest_img.part4"), stderr=subprocess.PIPE)
- files = extract_files(res.output)
- self.assertIn(".", files)
- self.assertIn("..", files)
- self.assertIn("who", files)
- self.assertNotIn("whoami", files)
-
- for part in [1, 2, 3, 4]:
- part_file = os.path.join(self.resultdir, "selftest_img.part%d" % part)
- os.remove(part_file)
+ # verify partition size with wic
+ res = runCmd("parted -m %s unit b p" % wicimg, stderr=subprocess.PIPE)
- finally:
- os.environ['PATH'] = oldpath
+ # parse parted output which looks like this:
+ # BYT;\n
+ # /var/tmp/wic/build/tmpfwvjjkf_-201611101222-hda.direct:200MiB:file:512:512:msdos::;\n
+ # 1:0.00MiB:200MiB:200MiB:ext4::;\n
+ partlns = res.output.splitlines()[2:]
+
+ self.assertEqual(4, len(partlns))
+
+ for part in [1, 2, 3, 4]:
+ part_file = os.path.join(self.resultdir, "selftest_img.part%d" % part)
+ partln = partlns[part-1].split(":")
+ self.assertEqual(7, len(partln))
+ start = int(partln[1].rstrip("B")) / 512
+ length = int(partln[3].rstrip("B")) / 512
+ runCmd("dd if=%s of=%s skip=%d count=%d" %
+ (wicimg, part_file, start, length))
+
+ # Test partition 1, should contain the normal root directories, except
+ # /usr.
+ res = runCmd("debugfs -R 'ls -p' %s" % \
+ os.path.join(self.resultdir, "selftest_img.part1"), stderr=subprocess.PIPE)
+ files = extract_files(res.output)
+ self.assertIn("etc", files)
+ self.assertNotIn("usr", files)
+
+ # Partition 2, should contain common directories for /usr, not root
+ # directories.
+ res = runCmd("debugfs -R 'ls -p' %s" % \
+ os.path.join(self.resultdir, "selftest_img.part2"), stderr=subprocess.PIPE)
+ files = extract_files(res.output)
+ self.assertNotIn("etc", files)
+ self.assertNotIn("usr", files)
+ self.assertIn("share", files)
+
+ # Partition 3, should contain the same as partition 2, including the bin
+ # directory, but not the files inside it.
+ res = runCmd("debugfs -R 'ls -p' %s" % \
+ os.path.join(self.resultdir, "selftest_img.part3"), stderr=subprocess.PIPE)
+ files = extract_files(res.output)
+ self.assertNotIn("etc", files)
+ self.assertNotIn("usr", files)
+ self.assertIn("share", files)
+ self.assertIn("bin", files)
+ res = runCmd("debugfs -R 'ls -p bin' %s" % \
+ os.path.join(self.resultdir, "selftest_img.part3"), stderr=subprocess.PIPE)
+ files = extract_files(res.output)
+ self.assertIn(".", files)
+ self.assertIn("..", files)
+ self.assertEqual(2, len(files))
+
+ # Partition 4, should contain the same as partition 2, including the bin
+ # directory, but not whoami (a symlink to busybox.nosuid) inside it.
+ res = runCmd("debugfs -R 'ls -p' %s" % \
+ os.path.join(self.resultdir, "selftest_img.part4"), stderr=subprocess.PIPE)
+ files = extract_files(res.output)
+ self.assertNotIn("etc", files)
+ self.assertNotIn("usr", files)
+ self.assertIn("share", files)
+ self.assertIn("bin", files)
+ res = runCmd("debugfs -R 'ls -p bin' %s" % \
+ os.path.join(self.resultdir, "selftest_img.part4"), stderr=subprocess.PIPE)
+ files = extract_files(res.output)
+ self.assertIn(".", files)
+ self.assertIn("..", files)
+ self.assertIn("who", files)
+ self.assertNotIn("whoami", files)
+
+ for part in [1, 2, 3, 4]:
+ part_file = os.path.join(self.resultdir, "selftest_img.part%d" % part)
+ os.remove(part_file)
def test_exclude_path_with_extra_space(self):
"""Test having --exclude-path with IMAGE_ROOTFS_EXTRA_SPACE. [Yocto #15555]"""
@@ -672,75 +665,61 @@ part /mnt --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path bin/whoa
def test_include_path(self):
"""Test --include-path wks option."""
- oldpath = os.environ['PATH']
- os.environ['PATH'] = get_bb_var("PATH", "wic-tools")
-
- try:
- include_path = os.path.join(self.resultdir, 'test-include')
- os.makedirs(include_path)
- with open(os.path.join(include_path, 'test-file'), 'w') as t:
- t.write("test\n")
- wks_file = os.path.join(include_path, 'temp.wks')
- with open(wks_file, 'w') as wks:
- rootfs_dir = get_bb_var('IMAGE_ROOTFS', 'core-image-minimal')
- wks.write("""
+ include_path = os.path.join(self.resultdir, 'test-include')
+ os.makedirs(include_path)
+ with open(os.path.join(include_path, 'test-file'), 'w') as t:
+ t.write("test\n")
+ wks_file = os.path.join(include_path, 'temp.wks')
+ with open(wks_file, 'w') as wks:
+ rootfs_dir = get_bb_var('IMAGE_ROOTFS', 'core-image-minimal')
+ wks.write("""
part /part1 --source rootfs --ondisk mmcblk0 --fstype=ext4
part /part2 --source rootfs --ondisk mmcblk0 --fstype=ext4 --include-path %s"""
- % (include_path))
- runCmd("wic create %s -e core-image-minimal -o %s" \
- % (wks_file, self.resultdir))
-
- part1 = glob(os.path.join(self.resultdir, 'temp-*.direct.p1'))[0]
- part2 = glob(os.path.join(self.resultdir, 'temp-*.direct.p2'))[0]
+ % (include_path))
+ runCmd("wic create %s -e core-image-minimal -o %s" \
+ % (wks_file, self.resultdir))
- # Test partition 1, should not contain 'test-file'
- res = runCmd("debugfs -R 'ls -p' %s" % (part1), stderr=subprocess.PIPE)
- files = extract_files(res.output)
- self.assertNotIn('test-file', files)
- self.assertEqual(True, files_own_by_root(res.output))
+ part1 = glob(os.path.join(self.resultdir, 'temp-*.direct.p1'))[0]
+ part2 = glob(os.path.join(self.resultdir, 'temp-*.direct.p2'))[0]
- # Test partition 2, should contain 'test-file'
- res = runCmd("debugfs -R 'ls -p' %s" % (part2), stderr=subprocess.PIPE)
- files = extract_files(res.output)
- self.assertIn('test-file', files)
- self.assertEqual(True, files_own_by_root(res.output))
+ # Test partition 1, should not contain 'test-file'
+ res = runCmd("debugfs -R 'ls -p' %s" % (part1), stderr=subprocess.PIPE)
+ files = extract_files(res.output)
+ self.assertNotIn('test-file', files)
+ self.assertEqual(True, files_own_by_root(res.output))
- finally:
- os.environ['PATH'] = oldpath
+ # Test partition 2, should contain 'test-file'
+ res = runCmd("debugfs -R 'ls -p' %s" % (part2), stderr=subprocess.PIPE)
+ files = extract_files(res.output)
+ self.assertIn('test-file', files)
+ self.assertEqual(True, files_own_by_root(res.output))
def test_include_path_embeded(self):
"""Test --include-path wks option."""
- oldpath = os.environ['PATH']
- os.environ['PATH'] = get_bb_var("PATH", "wic-tools")
-
- try:
- include_path = os.path.join(self.resultdir, 'test-include')
- os.makedirs(include_path)
- with open(os.path.join(include_path, 'test-file'), 'w') as t:
- t.write("test\n")
- wks_file = os.path.join(include_path, 'temp.wks')
- with open(wks_file, 'w') as wks:
- wks.write("""
+ include_path = os.path.join(self.resultdir, 'test-include')
+ os.makedirs(include_path)
+ with open(os.path.join(include_path, 'test-file'), 'w') as t:
+ t.write("test\n")
+ wks_file = os.path.join(include_path, 'temp.wks')
+ with open(wks_file, 'w') as wks:
+ wks.write("""
part / --source rootfs --fstype=ext4 --include-path %s --include-path core-image-minimal-mtdutils export/"""
- % (include_path))
- runCmd("wic create %s -e core-image-minimal -o %s" \
- % (wks_file, self.resultdir))
-
- part1 = glob(os.path.join(self.resultdir, 'temp-*.direct.p1'))[0]
+ % (include_path))
+ runCmd("wic create %s -e core-image-minimal -o %s" \
+ % (wks_file, self.resultdir))
- res = runCmd("debugfs -R 'ls -p' %s" % (part1), stderr=subprocess.PIPE)
- files = extract_files(res.output)
- self.assertIn('test-file', files)
- self.assertEqual(True, files_own_by_root(res.output))
+ part1 = glob(os.path.join(self.resultdir, 'temp-*.direct.p1'))[0]
- res = runCmd("debugfs -R 'ls -p /export/etc/' %s" % (part1), stderr=subprocess.PIPE)
- files = extract_files(res.output)
- self.assertIn('passwd', files)
- self.assertEqual(True, files_own_by_root(res.output))
+ res = runCmd("debugfs -R 'ls -p' %s" % (part1), stderr=subprocess.PIPE)
+ files = extract_files(res.output)
+ self.assertIn('test-file', files)
+ self.assertEqual(True, files_own_by_root(res.output))
- finally:
- os.environ['PATH'] = oldpath
+ res = runCmd("debugfs -R 'ls -p /export/etc/' %s" % (part1), stderr=subprocess.PIPE)
+ files = extract_files(res.output)
+ self.assertIn('passwd', files)
+ self.assertEqual(True, files_own_by_root(res.output))
def test_include_path_errors(self):
"""Test --include-path wks option error handling."""
@@ -791,9 +770,6 @@ part / --source rootfs --fstype=ext4 --include-path %s --include-path core-imag
# prepare wicenv and rootfs
bitbake('core-image-minimal core-image-minimal-mtdutils -c do_rootfs_wicenv')
- oldpath = os.environ['PATH']
- os.environ['PATH'] = get_bb_var("PATH", "wic-tools")
-
t_normal = """
part / --source rootfs --fstype=ext4
"""
@@ -810,61 +786,50 @@ part /etc --source rootfs --fstype=ext4 --change-directory=etc
"""
tests = [t_normal, t_exclude, t_multi, t_change]
- try:
- for test in tests:
- include_path = os.path.join(self.resultdir, 'test-include')
- os.makedirs(include_path)
- wks_file = os.path.join(include_path, 'temp.wks')
- with open(wks_file, 'w') as wks:
- wks.write(test)
- runCmd("wic create %s -e core-image-minimal -o %s" \
- % (wks_file, self.resultdir))
-
- for part in glob(os.path.join(self.resultdir, 'temp-*.direct.p*')):
- res = runCmd("debugfs -R 'ls -p' %s" % (part), stderr=subprocess.PIPE)
- self.assertEqual(True, files_own_by_root(res.output))
+ for test in tests:
+ include_path = os.path.join(self.resultdir, 'test-include')
+ os.makedirs(include_path)
+ wks_file = os.path.join(include_path, 'temp.wks')
+ with open(wks_file, 'w') as wks:
+ wks.write(test)
+ runCmd("wic create %s -e core-image-minimal -o %s" \
+ % (wks_file, self.resultdir))
- config = 'IMAGE_FSTYPES += "wic"\nWKS_FILE = "%s"\n' % wks_file
- self.append_config(config)
- bitbake('core-image-minimal')
- tmpdir = os.path.join(get_bb_var('WORKDIR', 'core-image-minimal'),'build-wic')
+ for part in glob(os.path.join(self.resultdir, 'temp-*.direct.p*')):
+ res = runCmd("debugfs -R 'ls -p' %s" % (part), stderr=subprocess.PIPE)
+ self.assertEqual(True, files_own_by_root(res.output))
- # check each partition for permission
- for part in glob(os.path.join(tmpdir, 'temp-*.direct.p*')):
- res = runCmd("debugfs -R 'ls -p' %s" % (part), stderr=subprocess.PIPE)
- self.assertTrue(files_own_by_root(res.output)
- ,msg='Files permission incorrect using wks set "%s"' % test)
+ config = 'IMAGE_FSTYPES += "wic"\nWKS_FILE = "%s"\n' % wks_file
+ self.append_config(config)
+ bitbake('core-image-minimal')
+ tmpdir = os.path.join(get_bb_var('WORKDIR', 'core-image-minimal'),'build-wic')
- # clean config and result directory for next cases
- self.remove_config(config)
- rmtree(self.resultdir, ignore_errors=True)
+ # check each partition for permission
+ for part in glob(os.path.join(tmpdir, 'temp-*.direct.p*')):
+ res = runCmd("debugfs -R 'ls -p' %s" % (part), stderr=subprocess.PIPE)
+ self.assertTrue(files_own_by_root(res.output)
+ ,msg='Files permission incorrect using wks set "%s"' % test)
- finally:
- os.environ['PATH'] = oldpath
+ # clean config and result directory for next cases
+ self.remove_config(config)
+ rmtree(self.resultdir, ignore_errors=True)
def test_change_directory(self):
"""Test --change-directory wks option."""
- oldpath = os.environ['PATH']
- os.environ['PATH'] = get_bb_var("PATH", "wic-tools")
-
- try:
- include_path = os.path.join(self.resultdir, 'test-include')
- os.makedirs(include_path)
- wks_file = os.path.join(include_path, 'temp.wks')
- with open(wks_file, 'w') as wks:
- wks.write("part /etc --source rootfs --fstype=ext4 --change-directory=etc")
- runCmd("wic create %s -e core-image-minimal -o %s" \
- % (wks_file, self.resultdir))
-
- part1 = glob(os.path.join(self.resultdir, 'temp-*.direct.p1'))[0]
+ include_path = os.path.join(self.resultdir, 'test-include')
+ os.makedirs(include_path)
+ wks_file = os.path.join(include_path, 'temp.wks')
+ with open(wks_file, 'w') as wks:
+ wks.write("part /etc --source rootfs --fstype=ext4 --change-directory=etc")
+ runCmd("wic create %s -e core-image-minimal -o %s" \
+ % (wks_file, self.resultdir))
- res = runCmd("debugfs -R 'ls -p' %s" % (part1), stderr=subprocess.PIPE)
- files = extract_files(res.output)
- self.assertIn('passwd', files)
+ part1 = glob(os.path.join(self.resultdir, 'temp-*.direct.p1'))[0]
- finally:
- os.environ['PATH'] = oldpath
+ res = runCmd("debugfs -R 'ls -p' %s" % (part1), stderr=subprocess.PIPE)
+ files = extract_files(res.output)
+ self.assertIn('passwd', files)
def test_change_directory_errors(self):
"""Test --change-directory wks option error handling."""
@@ -887,41 +852,34 @@ part /etc --source rootfs --fstype=ext4 --change-directory=etc
def test_no_fstab_update(self):
"""Test --no-fstab-update wks option."""
- oldpath = os.environ['PATH']
- os.environ['PATH'] = get_bb_var("PATH", "wic-tools")
-
# Get stock fstab from base-files recipe
bitbake('base-files -c do_install')
bf_fstab = os.path.join(get_bb_var('D', 'base-files'), 'etc', 'fstab')
self.assertEqual(True, os.path.exists(bf_fstab))
bf_fstab_md5sum = runCmd('md5sum %s ' % bf_fstab).output.split(" ")[0]
- try:
- no_fstab_update_path = os.path.join(self.resultdir, 'test-no-fstab-update')
- os.makedirs(no_fstab_update_path)
- wks_file = os.path.join(no_fstab_update_path, 'temp.wks')
- with open(wks_file, 'w') as wks:
- wks.writelines(['part / --source rootfs --fstype=ext4 --label rootfs\n',
- 'part /mnt/p2 --source rootfs --rootfs-dir=core-image-minimal ',
- '--fstype=ext4 --label p2 --no-fstab-update\n'])
- runCmd("wic create %s -e core-image-minimal -o %s" \
- % (wks_file, self.resultdir))
-
- part_fstab_md5sum = []
- for i in range(1, 3):
- part = glob(os.path.join(self.resultdir, 'temp-*.direct.p') + str(i))[0]
- part_fstab = runCmd("debugfs -R 'cat etc/fstab' %s" % (part), stderr=subprocess.PIPE)
- part_fstab_md5sum.append(hashlib.md5((part_fstab.output + "\n\n").encode('utf-8')).hexdigest())
+ no_fstab_update_path = os.path.join(self.resultdir, 'test-no-fstab-update')
+ os.makedirs(no_fstab_update_path)
+ wks_file = os.path.join(no_fstab_update_path, 'temp.wks')
+ with open(wks_file, 'w') as wks:
+ wks.writelines(['part / --source rootfs --fstype=ext4 --label rootfs\n',
+ 'part /mnt/p2 --source rootfs --rootfs-dir=core-image-minimal ',
+ '--fstype=ext4 --label p2 --no-fstab-update\n'])
+ runCmd("wic create %s -e core-image-minimal -o %s" \
+ % (wks_file, self.resultdir))
- # '/etc/fstab' in partition 2 should contain the same stock fstab file
- # as the one installed by the base-file recipe.
- self.assertEqual(bf_fstab_md5sum, part_fstab_md5sum[1])
+ part_fstab_md5sum = []
+ for i in range(1, 3):
+ part = glob(os.path.join(self.resultdir, 'temp-*.direct.p') + str(i))[0]
+ part_fstab = runCmd("debugfs -R 'cat etc/fstab' %s" % (part), stderr=subprocess.PIPE)
+ part_fstab_md5sum.append(hashlib.md5((part_fstab.output + "\n\n").encode('utf-8')).hexdigest())
- # '/etc/fstab' in partition 1 should contain an updated fstab file.
- self.assertNotEqual(bf_fstab_md5sum, part_fstab_md5sum[0])
+ # '/etc/fstab' in partition 2 should contain the same stock fstab file
+ # as the one installed by the base-file recipe.
+ self.assertEqual(bf_fstab_md5sum, part_fstab_md5sum[1])
- finally:
- os.environ['PATH'] = oldpath
+ # '/etc/fstab' in partition 1 should contain an updated fstab file.
+ self.assertNotEqual(bf_fstab_md5sum, part_fstab_md5sum[0])
def test_no_fstab_update_errors(self):
"""Test --no-fstab-update wks option error handling."""
@@ -995,153 +953,139 @@ bootloader --ptable gpt""")
def test_wic_sector_size_env(self):
"""Test generation image sector size via environment (obsolete)"""
- oldpath = os.environ['PATH']
- os.environ['PATH'] = get_bb_var("PATH", "wic-tools")
+ # Add WIC_SECTOR_SIZE into config
+ config = 'WIC_SECTOR_SIZE = "4096"\n'\
+ 'WICVARS:append = " WIC_SECTOR_SIZE"\n'
+ self.append_config(config)
+ bitbake('core-image-minimal')
- try:
- # Add WIC_SECTOR_SIZE into config
- config = 'WIC_SECTOR_SIZE = "4096"\n'\
- 'WICVARS:append = " WIC_SECTOR_SIZE"\n'
- self.append_config(config)
- bitbake('core-image-minimal')
+ # Check WIC_SECTOR_SIZE apply to bitbake variable
+ wic_sector_size_str = get_bb_var('WIC_SECTOR_SIZE', 'core-image-minimal')
+ wic_sector_size = int(wic_sector_size_str)
+ self.assertEqual(4096, wic_sector_size)
- # Check WIC_SECTOR_SIZE apply to bitbake variable
- wic_sector_size_str = get_bb_var('WIC_SECTOR_SIZE', 'core-image-minimal')
- wic_sector_size = int(wic_sector_size_str)
- self.assertEqual(4096, wic_sector_size)
-
- self.logger.info("Test wic_sector_size: %d \n" % wic_sector_size)
-
- with NamedTemporaryFile("w", suffix=".wks") as wks:
- wks.writelines(
- ['bootloader --ptable gpt\n',
- 'part --fstype vfat --fstype vfat --label emptyfat --size 1M --mkfs-extraopts "-S 4096"\n',
- 'part --fstype ext4 --source rootfs --label rofs-a --mkfs-extraopts "-b 4096"\n',
- 'part --fstype ext4 --source rootfs --use-uuid --mkfs-extraopts "-b 4096"\n'])
- wks.flush()
- cmd = "wic create %s -e core-image-minimal -o %s" % (wks.name, self.resultdir)
- runCmd(cmd)
- wksname = os.path.splitext(os.path.basename(wks.name))[0]
- images = glob(os.path.join(self.resultdir, "%s-*direct" % wksname))
- self.assertEqual(1, len(images))
+ self.logger.info("Test wic_sector_size: %d \n" % wic_sector_size)
- sysroot = get_bb_var('RECIPE_SYSROOT_NATIVE', 'wic-tools')
- # list partitions
- result = runCmd("wic ls %s -n %s" % (images[0], sysroot))
- print(result.output)
- # Deprecated message + 4 lines of output: header + 3 partitions
- self.assertEqual(5, len(result.output.split('\n')))
+ with NamedTemporaryFile("w", suffix=".wks") as wks:
+ wks.writelines(
+ ['bootloader --ptable gpt\n',
+ 'part --fstype vfat --fstype vfat --label emptyfat --size 1M --mkfs-extraopts "-S 4096"\n',
+ 'part --fstype ext4 --source rootfs --label rofs-a --mkfs-extraopts "-b 4096"\n',
+ 'part --fstype ext4 --source rootfs --use-uuid --mkfs-extraopts "-b 4096"\n'])
+ wks.flush()
+ cmd = "wic create %s -e core-image-minimal -o %s" % (wks.name, self.resultdir)
+ runCmd(cmd)
+ wksname = os.path.splitext(os.path.basename(wks.name))[0]
+ images = glob(os.path.join(self.resultdir, "%s-*direct" % wksname))
+ self.assertEqual(1, len(images))
- # verify partition size with wic
- res = runCmd("export PARTED_SECTOR_SIZE=%d; parted -m %s unit b p" % (wic_sector_size, images[0]),
- stderr=subprocess.PIPE)
+ sysroot = get_bb_var('RECIPE_SYSROOT_NATIVE', 'wic-tools')
+ # list partitions
+ result = runCmd("wic ls %s -n %s" % (images[0], sysroot))
+ print(result.output)
+ # Deprecated message + 4 lines of output: header + 3 partitions
+ self.assertEqual(5, len(result.output.split('\n')))
- print(res.output)
- # parse parted output which looks like this:
- # BYT;\n
- # /var/tmp/wic/build/tmpgjzzefdd-202410281021-sda.direct:78569472B:file:4096:4096:gpt::;\n
- # 1:139264B:1187839B:1048576B::emptyfat:msftdata;
- # 2:1187840B:149270527B:148082688B:ext4:rofs-a:;
- # 3:149270528B:297353215B:148082688B:ext4:primary:;
- disk_info = res.output.splitlines()[1]
- # Check sector sizes
- sector_size_logical = int(disk_info.split(":")[3])
- sector_size_physical = int(disk_info.split(":")[4])
- self.assertEqual(wic_sector_size, sector_size_logical, "Logical sector size is not %d." % wic_sector_size)
- self.assertEqual(wic_sector_size, sector_size_physical, "Physical sector size is not %d." % wic_sector_size)
-
- # It is a known issue with parsed that a 4K FAT partition does
- # not have a recognized filesystem type of *fat.
- part_info = res.output.splitlines()[2]
- partname = part_info.split(":")[5]
- parttype = part_info.split(":")[6]
- self.assertEqual('emptyfat', partname)
- self.assertEqual('msftdata;', parttype)
-
- part_info = res.output.splitlines()[3]
- parttype = part_info.split(":")[4]
- partname = part_info.split(":")[5]
- self.assertEqual('ext4', parttype)
- self.assertEqual('rofs-a', partname)
-
- part_info = res.output.splitlines()[4]
- parttype = part_info.split(":")[4]
- partname = part_info.split(":")[5]
- self.assertEqual('ext4', parttype)
- self.assertEqual('primary', partname)
+ # verify partition size with wic
+ res = runCmd("export PARTED_SECTOR_SIZE=%d; parted -m %s unit b p" % (wic_sector_size, images[0]),
+ stderr=subprocess.PIPE)
- finally:
- os.environ['PATH'] = oldpath
+ print(res.output)
+ # parse parted output which looks like this:
+ # BYT;\n
+ # /var/tmp/wic/build/tmpgjzzefdd-202410281021-sda.direct:78569472B:file:4096:4096:gpt::;\n
+ # 1:139264B:1187839B:1048576B::emptyfat:msftdata;
+ # 2:1187840B:149270527B:148082688B:ext4:rofs-a:;
+ # 3:149270528B:297353215B:148082688B:ext4:primary:;
+ disk_info = res.output.splitlines()[1]
+ # Check sector sizes
+ sector_size_logical = int(disk_info.split(":")[3])
+ sector_size_physical = int(disk_info.split(":")[4])
+ self.assertEqual(wic_sector_size, sector_size_logical, "Logical sector size is not %d." % wic_sector_size)
+ self.assertEqual(wic_sector_size, sector_size_physical, "Physical sector size is not %d." % wic_sector_size)
+
+ # It is a known issue with parsed that a 4K FAT partition does
+ # not have a recognized filesystem type of *fat.
+ part_info = res.output.splitlines()[2]
+ partname = part_info.split(":")[5]
+ parttype = part_info.split(":")[6]
+ self.assertEqual('emptyfat', partname)
+ self.assertEqual('msftdata;', parttype)
+
+ part_info = res.output.splitlines()[3]
+ parttype = part_info.split(":")[4]
+ partname = part_info.split(":")[5]
+ self.assertEqual('ext4', parttype)
+ self.assertEqual('rofs-a', partname)
+
+ part_info = res.output.splitlines()[4]
+ parttype = part_info.split(":")[4]
+ partname = part_info.split(":")[5]
+ self.assertEqual('ext4', parttype)
+ self.assertEqual('primary', partname)
def test_wic_sector_size_cli(self):
"""Test sector size handling via CLI option."""
- oldpath = os.environ['PATH']
- os.environ['PATH'] = get_bb_var("PATH", "wic-tools")
-
- try:
- bitbake('core-image-minimal')
-
- with NamedTemporaryFile("w", suffix=".wks") as wks:
- wks.writelines(
- ['bootloader --ptable gpt\n',
- 'part --fstype vfat --fstype vfat --label emptyfat --size 1M\n',
- 'part --fstype ext4 --source rootfs --label rofs-a\n',
- 'part --fstype ext4 --source rootfs --use-uuid\n'])
- wks.flush()
- cmd = "wic create %s -e core-image-minimal -o %s --sector-size 4096" % (wks.name, self.resultdir)
- runCmd(cmd)
- wksname = os.path.splitext(os.path.basename(wks.name))[0]
- images = glob(os.path.join(self.resultdir, "%s-*direct" % wksname))
- self.assertEqual(1, len(images))
+ bitbake('core-image-minimal')
- sysroot = get_bb_var('RECIPE_SYSROOT_NATIVE', 'wic-tools')
- # list partitions
- result = runCmd("wic ls %s -n %s --sector-size 4096" % (images[0], sysroot))
- print(result.output)
- # 4 lines of output: header + 3 partitions
- self.assertEqual(4, len(result.output.split('\n')))
+ with NamedTemporaryFile("w", suffix=".wks") as wks:
+ wks.writelines(
+ ['bootloader --ptable gpt\n',
+ 'part --fstype vfat --fstype vfat --label emptyfat --size 1M\n',
+ 'part --fstype ext4 --source rootfs --label rofs-a\n',
+ 'part --fstype ext4 --source rootfs --use-uuid\n'])
+ wks.flush()
+ cmd = "wic create %s -e core-image-minimal -o %s --sector-size 4096" % (wks.name, self.resultdir)
+ runCmd(cmd)
+ wksname = os.path.splitext(os.path.basename(wks.name))[0]
+ images = glob(os.path.join(self.resultdir, "%s-*direct" % wksname))
+ self.assertEqual(1, len(images))
- # verify partition size with parted output
- res = runCmd("export PARTED_SECTOR_SIZE=%d; parted -m %s unit b p" % (4096, images[0]),
- stderr=subprocess.PIPE)
+ sysroot = get_bb_var('RECIPE_SYSROOT_NATIVE', 'wic-tools')
+ # list partitions
+ result = runCmd("wic ls %s -n %s --sector-size 4096" % (images[0], sysroot))
+ print(result.output)
+ # 4 lines of output: header + 3 partitions
+ self.assertEqual(4, len(result.output.split('\n')))
- print(res.output)
- # parse parted output which looks like this:
- # BYT;\n
- # /var/tmp/wic/build/tmpgjzzefdd-202410281021-sda.direct:78569472B:file:4096:4096:gpt::;\n
- # 1:139264B:1187839B:1048576B::emptyfat:msftdata;
- # 2:1187840B:149270527B:148082688B:ext4:rofs-a:;
- # 3:149270528B:297353215B:148082688B:ext4:primary:;
- disk_info = res.output.splitlines()[1]
- # Check sector sizes
- sector_size_logical = int(disk_info.split(":")[3])
- sector_size_physical = int(disk_info.split(":")[4])
- self.assertEqual(4096, sector_size_logical, "Logical sector size is not 4096.")
- self.assertEqual(4096, sector_size_physical, "Physical sector size is not 4096.")
-
- # It is a known issue with parsed that a 4K FAT partition does
- # not have a recognized filesystem type of *fat.
- part_info = res.output.splitlines()[2]
- partname = part_info.split(":")[5]
- parttype = part_info.split(":")[6]
- self.assertEqual('emptyfat', partname)
- self.assertEqual('msftdata;', parttype)
-
- part_info = res.output.splitlines()[3]
- parttype = part_info.split(":")[4]
- partname = part_info.split(":")[5]
- self.assertEqual('ext4', parttype)
- self.assertEqual('rofs-a', partname)
-
- part_info = res.output.splitlines()[4]
- parttype = part_info.split(":")[4]
- partname = part_info.split(":")[5]
- self.assertEqual('ext4', parttype)
- self.assertEqual('primary', partname)
+ # verify partition size with parted output
+ res = runCmd("export PARTED_SECTOR_SIZE=%d; parted -m %s unit b p" % (4096, images[0]),
+ stderr=subprocess.PIPE)
- finally:
- os.environ['PATH'] = oldpath
+ print(res.output)
+ # parse parted output which looks like this:
+ # BYT;\n
+ # /var/tmp/wic/build/tmpgjzzefdd-202410281021-sda.direct:78569472B:file:4096:4096:gpt::;\n
+ # 1:139264B:1187839B:1048576B::emptyfat:msftdata;
+ # 2:1187840B:149270527B:148082688B:ext4:rofs-a:;
+ # 3:149270528B:297353215B:148082688B:ext4:primary:;
+ disk_info = res.output.splitlines()[1]
+ # Check sector sizes
+ sector_size_logical = int(disk_info.split(":")[3])
+ sector_size_physical = int(disk_info.split(":")[4])
+ self.assertEqual(4096, sector_size_logical, "Logical sector size is not 4096.")
+ self.assertEqual(4096, sector_size_physical, "Physical sector size is not 4096.")
+
+ # It is a known issue with parsed that a 4K FAT partition does
+ # not have a recognized filesystem type of *fat.
+ part_info = res.output.splitlines()[2]
+ partname = part_info.split(":")[5]
+ parttype = part_info.split(":")[6]
+ self.assertEqual('emptyfat', partname)
+ self.assertEqual('msftdata;', parttype)
+
+ part_info = res.output.splitlines()[3]
+ parttype = part_info.split(":")[4]
+ partname = part_info.split(":")[5]
+ self.assertEqual('ext4', parttype)
+ self.assertEqual('rofs-a', partname)
+
+ part_info = res.output.splitlines()[4]
+ parttype = part_info.split(":")[4]
+ partname = part_info.split(":")[5]
+ self.assertEqual('ext4', parttype)
+ self.assertEqual('primary', partname)
class Wic2(WicTestCase):
@@ -1483,47 +1427,41 @@ run_wic_cmd() {
def test_extra_partition_space(self):
native_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "wic-tools")
- oldpath = os.environ['PATH']
- os.environ['PATH'] = get_bb_var("PATH", "wic-tools")
+ with NamedTemporaryFile("w", suffix=".wks") as tempf:
+ tempf.write("bootloader --ptable gpt\n" \
+ "part --ondisk hda --size 10M --extra-partition-space 10M --fstype=ext4\n" \
+ "part --ondisk hda --fixed-size 20M --extra-partition-space 10M --fstype=ext4\n" \
+ "part --source rootfs --ondisk hda --extra-partition-space 10M --fstype=ext4\n" \
+ "part --source rootfs --ondisk hda --fixed-size 200M --extra-partition-space 10M --fstype=ext4\n")
+ tempf.flush()
+
+ _, wicimg = self._get_wic(tempf.name)
- try:
- with NamedTemporaryFile("w", suffix=".wks") as tempf:
- tempf.write("bootloader --ptable gpt\n" \
- "part --ondisk hda --size 10M --extra-partition-space 10M --fstype=ext4\n" \
- "part --ondisk hda --fixed-size 20M --extra-partition-space 10M --fstype=ext4\n" \
- "part --source rootfs --ondisk hda --extra-partition-space 10M --fstype=ext4\n" \
- "part --source rootfs --ondisk hda --fixed-size 200M --extra-partition-space 10M --fstype=ext4\n")
- tempf.flush()
-
- _, wicimg = self._get_wic(tempf.name)
-
- res = runCmd("parted -m %s unit b p" % wicimg,
- native_sysroot=native_sysroot, stderr=subprocess.PIPE)
-
- # parse parted output which looks like this:
- # BYT;\n
- # /var/tmp/wic/build/tmpfwvjjkf_-201611101222-hda.direct:200MiB:file:512:512:msdos::;\n
- # 1:0.00MiB:200MiB:200MiB:ext4::;\n
- partlns = res.output.splitlines()[2:]
-
- self.assertEqual(4, len(partlns))
-
- # Test for each partitions that the extra part space exists
- for part in range(0, len(partlns)):
- part_file = os.path.join(self.resultdir, "selftest_img.part%d" % (part + 1))
- partln = partlns[part].split(":")
- self.assertEqual(7, len(partln))
- self.assertRegex(partln[3], r'^[0-9]+B$')
- part_size = int(partln[3].rstrip("B"))
- start = int(partln[1].rstrip("B")) / 512
- length = part_size / 512
- runCmd("dd if=%s of=%s skip=%d count=%d" %
- (wicimg, part_file, start, length))
- res = runCmd("dumpe2fs %s -h | grep \"^Block count\"" % part_file)
- fs_size = int(res.output.split(":")[1].strip()) * 1024
- self.assertLessEqual(fs_size + 10485760, part_size, "part file: %s" % part_file)
- finally:
- os.environ['PATH'] = oldpath
+ res = runCmd("parted -m %s unit b p" % wicimg,
+ native_sysroot=native_sysroot, stderr=subprocess.PIPE)
+
+ # parse parted output which looks like this:
+ # BYT;\n
+ # /var/tmp/wic/build/tmpfwvjjkf_-201611101222-hda.direct:200MiB:file:512:512:msdos::;\n
+ # 1:0.00MiB:200MiB:200MiB:ext4::;\n
+ partlns = res.output.splitlines()[2:]
+
+ self.assertEqual(4, len(partlns))
+
+ # Test for each partitions that the extra part space exists
+ for part in range(0, len(partlns)):
+ part_file = os.path.join(self.resultdir, "selftest_img.part%d" % (part + 1))
+ partln = partlns[part].split(":")
+ self.assertEqual(7, len(partln))
+ self.assertRegex(partln[3], r'^[0-9]+B$')
+ part_size = int(partln[3].rstrip("B"))
+ start = int(partln[1].rstrip("B")) / 512
+ length = part_size / 512
+ runCmd("dd if=%s of=%s skip=%d count=%d" %
+ (wicimg, part_file, start, length))
+ res = runCmd("dumpe2fs %s -h | grep \"^Block count\"" % part_file)
+ fs_size = int(res.output.split(":")[1].strip()) * 1024
+ self.assertLessEqual(fs_size + 10485760, part_size, "part file: %s" % part_file)
# TODO this test could also work on aarch64
@skipIfNotArch(['i586', 'i686', 'x86_64'])
@@ -1836,45 +1774,39 @@ INITRAMFS_IMAGE = "core-image-initramfs-boot"
testfile.write("test %s" % testfilename)
testfile.close()
- oldpath = os.environ['PATH']
- os.environ['PATH'] = get_bb_var("PATH", "wic-tools")
+ with NamedTemporaryFile("w", suffix=".wks") as wks:
+ wks.writelines([
+ 'part / --source extra_partition --ondisk sda --sourceparams "name=foo" --align 4 --size 5M\n',
+ 'part / --source extra_partition --ondisk sda --label foo --align 4 --size 5M\n',
+ 'part / --source extra_partition --ondisk sda --fstype=vfat --uuid e7d0824e-cda3-4bed-9f54-9ef5312d105d --align 4 --size 5M\n',
+ 'part / --source extra_partition --ondisk sda --fstype=ext4 --label bar --align 4 --size 5M\n',
+ 'bootloader --ptable gpt\n',
+ ])
+ wks.flush()
+ _, wicimg = self._get_wic(wks.name)
- try:
- with NamedTemporaryFile("w", suffix=".wks") as wks:
- wks.writelines([
- 'part / --source extra_partition --ondisk sda --sourceparams "name=foo" --align 4 --size 5M\n',
- 'part / --source extra_partition --ondisk sda --label foo --align 4 --size 5M\n',
- 'part / --source extra_partition --ondisk sda --fstype=vfat --uuid e7d0824e-cda3-4bed-9f54-9ef5312d105d --align 4 --size 5M\n',
- 'part / --source extra_partition --ondisk sda --fstype=ext4 --label bar --align 4 --size 5M\n',
- 'bootloader --ptable gpt\n',
- ])
- wks.flush()
- _, wicimg = self._get_wic(wks.name)
-
- result = runCmd("wic ls %s -n %s" % (wicimg, sysroot))
- partls = result.output.split('\n')[1:]
-
- # Assert the number of partitions is correct
- self.assertEqual(4, len(partls), msg="Expect 4 partitions, not %s" % result.output)
-
- # Fstype column from 'wic ls' should be fstype as given in the part command
- for part_id, part_fs in enumerate(["fat16", "fat16", "fat16", "ext4"]):
- self.assertIn(part_fs, partls[part_id])
-
- # For each partition, assert expected files exist
- for part, part_glob in enumerate([
- ["bar.conf"],
- ["foo.conf"],
- ["foobar.conf", "foobar2.conf", "bar3.conf", "bar4.conf"],
- ["bar.conf", "bar2.conf"],
- ]):
- for part_file in part_glob:
- result = runCmd("wic ls %s:%d/%s -n %s" % (wicimg, part + 1, part_file, sysroot))
- self.assertEqual(0, result.status, msg="File '%s' not found in the partition #%d" % (part_file, part))
+ result = runCmd("wic ls %s -n %s" % (wicimg, sysroot))
+ partls = result.output.split('\n')[1:]
- self.remove_config(config)
- finally:
- os.environ['PATH'] = oldpath
+ # Assert the number of partitions is correct
+ self.assertEqual(4, len(partls), msg="Expect 4 partitions, not %s" % result.output)
+
+ # Fstype column from 'wic ls' should be fstype as given in the part command
+ for part_id, part_fs in enumerate(["fat16", "fat16", "fat16", "ext4"]):
+ self.assertIn(part_fs, partls[part_id])
+
+ # For each partition, assert expected files exist
+ for part, part_glob in enumerate([
+ ["bar.conf"],
+ ["foo.conf"],
+ ["foobar.conf", "foobar2.conf", "bar3.conf", "bar4.conf"],
+ ["bar.conf", "bar2.conf"],
+ ]):
+ for part_file in part_glob:
+ result = runCmd("wic ls %s:%d/%s -n %s" % (wicimg, part + 1, part_file, sysroot))
+ self.assertEqual(0, result.status, msg="File '%s' not found in the partition #%d" % (part_file, part))
+
+ self.remove_config(config)
def test_fs_types(self):
"""Test filesystem types for empty and not empty partitions"""
--
2.50.0.173.g8b6f19ccfc3a
next prev parent reply other threads:[~2026-07-24 9:02 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-24 9:01 [PATCH v4 00/10] wic: ship its tools, and add an SDK_FEATURES lever Trevor Woerner
2026-07-24 9:01 ` [PATCH v4 01/10] wic-tools: move bootloader firmware staging into the wic oe-selftest Trevor Woerner
2026-07-24 9:01 ` [PATCH v4 02/10] wic: add runtime dependencies on the tools it invokes Trevor Woerner
2026-07-24 9:01 ` [PATCH v4 03/10] oeqa/selftest/wic: drop dead COREBASE/scripts wic lookup Trevor Woerner
2026-07-24 9:01 ` Trevor Woerner [this message]
2026-07-24 9:01 ` [PATCH v4 05/10] nativesdk-packagegroup-sdk-host: add an SDK_FEATURES lever Trevor Woerner
2026-07-24 9:01 ` [PATCH v4 06/10] nativesdk-packagegroup-sdk-host: add wic to SDK_FEATURES Trevor Woerner
2026-07-24 9:01 ` [PATCH v4 07/10] nativesdk-packagegroup-sdk-host: add an sbom SDK feature Trevor Woerner
2026-07-24 9:01 ` [PATCH v4 08/10] nativesdk-packagegroup-sdk-host: add an lldb " Trevor Woerner
2026-07-24 9:01 ` [PATCH v4 09/10] nativesdk-packagegroup-sdk-host: gate qemu behind SDK_FEATURES Trevor Woerner
2026-07-24 9:21 ` Patchtest results for " patchtest
2026-07-24 9:01 ` [PATCH v4 10/10] packagegroup-cross-canadian: gate gdb " Trevor Woerner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260724090146.19924-5-twoerner@gmail.com \
--to=twoerner@gmail.com \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.