1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-30 12:29:55 +00:00

wic: 'wic cp' to copy from image

currently 'wic cp' only works for copy file from local storage to
wic image.

enhance 'wic cp' to copy file/directory from wic image to local storage.

include selftest and 'wic help' updates.

[YOCTO#12169]

(From OE-Core rev: bd669c1809a378f93580eb9e0679a26ec6746cb8)

Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Chee Yang Lee
2019-11-21 14:28:52 +08:00
committed by Richard Purdie
parent 4d6a9708e6
commit 89288705c6
4 changed files with 76 additions and 21 deletions
+17
View File
@@ -866,6 +866,13 @@ class Wic2(WicTestCase):
self.assertEqual(8, len(result.output.split('\n'))) self.assertEqual(8, len(result.output.split('\n')))
self.assertTrue(os.path.basename(testdir) in result.output) self.assertTrue(os.path.basename(testdir) in result.output)
# copy the file from the partition and check if it success
dest = '%s-cp' % testfile.name
runCmd("wic cp %s:1/%s %s -n %s" % (images[0],
os.path.basename(testfile.name), dest, sysroot))
self.assertTrue(os.path.exists(dest))
def test_wic_rm(self): def test_wic_rm(self):
"""Test removing files and directories from the the wic image.""" """Test removing files and directories from the the wic image."""
runCmd("wic create mkefidisk " runCmd("wic create mkefidisk "
@@ -1005,6 +1012,16 @@ class Wic2(WicTestCase):
newdirs = set(line.split()[-1] for line in result.output.split('\n') if line) newdirs = set(line.split()[-1] for line in result.output.split('\n') if line)
self.assertEqual(newdirs.difference(dirs), set([os.path.basename(testfile.name)])) self.assertEqual(newdirs.difference(dirs), set([os.path.basename(testfile.name)]))
# check if the file to copy is in the partition
result = runCmd("wic ls %s:2/etc/ -n %s" % (images[0], sysroot))
self.assertTrue('fstab' in [line.split()[-1] for line in result.output.split('\n') if line])
# copy file from the partition, replace the temporary file content with it and
# check for the file size to validate the copy
runCmd("wic cp %s:2/etc/fstab %s -n %s" % (images[0], testfile.name, sysroot))
self.assertTrue(os.stat(testfile.name).st_size > 0)
def test_wic_rm_ext(self): def test_wic_rm_ext(self):
"""Test removing files from the ext partition.""" """Test removing files from the ext partition."""
runCmd("wic create mkefidisk " runCmd("wic create mkefidisk "
+27 -8
View File
@@ -323,16 +323,31 @@ class Disk:
self._get_part_image(pnum), self._get_part_image(pnum),
path)) path))
def copy(self, src, pnum, path): def copy(self, src, dest):
"""Copy partition image into wic image.""" """Copy partition image into wic image."""
pnum = dest.part if isinstance(src, str) else src.part
if self.partitions[pnum].fstype.startswith('ext'): if self.partitions[pnum].fstype.startswith('ext'):
cmd = "printf 'cd {}\nwrite {} {}\n' | {} -w {}".\ if isinstance(src, str):
format(path, src, os.path.basename(src), cmd = "printf 'cd {}\nwrite {} {}\n' | {} -w {}".\
format(os.path.dirname(dest.path), src, os.path.basename(src),
self.debugfs, self._get_part_image(pnum)) self.debugfs, self._get_part_image(pnum))
else: # copy from wic
# run both dump and rdump to support both files and directory
cmd = "printf 'cd {}\ndump /{} {}\nrdump /{} {}\n' | {} {}".\
format(os.path.dirname(src.path), src.path,
dest, src.path, dest, self.debugfs,
self._get_part_image(pnum))
else: # fat else: # fat
cmd = "{} -i {} -snop {} ::{}".format(self.mcopy, if isinstance(src, str):
cmd = "{} -i {} -snop {} ::{}".format(self.mcopy,
self._get_part_image(pnum), self._get_part_image(pnum),
src, path) src, dest.path)
else:
cmd = "{} -i {} -snop ::{} {}".format(self.mcopy,
self._get_part_image(pnum),
src.path, dest)
exec_cmd(cmd, as_shell=True) exec_cmd(cmd, as_shell=True)
self._put_part_image(pnum) self._put_part_image(pnum)
@@ -551,11 +566,15 @@ def wic_ls(args, native_sysroot):
def wic_cp(args, native_sysroot): def wic_cp(args, native_sysroot):
""" """
Copy local file or directory to the vfat partition of Copy file or directory to/from the vfat/ext partition of
partitioned image. partitioned image.
""" """
disk = Disk(args.dest.image, native_sysroot) if isinstance(args.dest, str):
disk.copy(args.src, args.dest.part, args.dest.path) disk = Disk(args.src.image, native_sysroot)
else:
disk = Disk(args.dest.image, native_sysroot)
disk.copy(args.src, args.dest)
def wic_rm(args, native_sysroot): def wic_rm(args, native_sysroot):
""" """
+19 -10
View File
@@ -341,12 +341,15 @@ DESCRIPTION
wic_cp_usage = """ wic_cp_usage = """
Copy files and directories to the vfat or ext* partition Copy files and directories to/from the vfat or ext* partition
usage: wic cp <src> <image>:<partition>[<path>] [--native-sysroot <path>] usage: wic cp <src> <dest> [--native-sysroot <path>]
This command copies local files or directories to the vfat or ext* partitions source/destination image in format <image>:<partition>[<path>]
of partitioned image.
This command copies files or directories either
- from local to vfat or ext* partitions of partitioned image
- from vfat or ext* partitions of partitioned image to local
See 'wic help cp' for more detailed instructions. See 'wic help cp' for more detailed instructions.
@@ -355,16 +358,18 @@ of partitioned image.
wic_cp_help = """ wic_cp_help = """
NAME NAME
wic cp - copy files and directories to the vfat or ext* partitions wic cp - copy files and directories to/from the vfat or ext* partitions
SYNOPSIS SYNOPSIS
wic cp <src> <image>:<partition> wic cp <src> <dest>:<partition>
wic cp <src> <image>:<partition><path> wic cp <src>:<partition> <dest>
wic cp <src> <image>:<partition><path> --native-sysroot <path> wic cp <src> <dest-image>:<partition><path>
wic cp <src> <dest-image>:<partition><path> --native-sysroot <path>
DESCRIPTION DESCRIPTION
This command copies files and directories to the vfat or ext* partition of This command copies files or directories either
the partitioned image. - from local to vfat or ext* partitions of partitioned image
- from vfat or ext* partitions of partitioned image to local
The first form of it copies file or directory to the root directory of The first form of it copies file or directory to the root directory of
the partition: the partition:
@@ -397,6 +402,10 @@ DESCRIPTION
4 files 0 bytes 4 files 0 bytes
15 675 392 bytes free 15 675 392 bytes free
The third form of the command copies file or directory from the specified directory
on the partition to local:
$ wic cp tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.wic:1/vmlinuz test
The -n option is used to specify the path to the native sysroot The -n option is used to specify the path to the native sysroot
containing the tools(parted and mtools) to use. containing the tools(parted and mtools) to use.
""" """
+13 -3
View File
@@ -392,9 +392,9 @@ def imgpathtype(arg):
def wic_init_parser_cp(subparser): def wic_init_parser_cp(subparser):
subparser.add_argument("src", subparser.add_argument("src",
help="source spec") help="image spec: <image>:<vfat partition>[<path>] or <file>")
subparser.add_argument("dest", type=imgpathtype, subparser.add_argument("dest",
help="image spec: <image>:<vfat partition>[<path>]") help="image spec: <image>:<vfat partition>[<path>] or <file>")
subparser.add_argument("-n", "--native-sysroot", subparser.add_argument("-n", "--native-sysroot",
help="path to the native sysroot containing the tools") help="path to the native sysroot containing the tools")
@@ -522,6 +522,16 @@ def main(argv):
hlpt[0](hlpt[1], hlpt[2]) hlpt[0](hlpt[1], hlpt[2])
return 0 return 0
# validate wic cp src and dest parameter to identify which one of it is
# image and cast it into imgtype
if args.command == "cp":
if ":" in args.dest:
args.dest = imgtype(args.dest)
elif ":" in args.src:
args.src = imgtype(args.src)
else:
raise argparse.ArgumentTypeError("no image or partition number specified.")
return hlp.invoke_subcommand(args, parser, hlp.wic_help_usage, subcommands) return hlp.invoke_subcommand(args, parser, hlp.wic_help_usage, subcommands)