diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/swupd/bundles.py | 21 | ||||
-rw-r--r-- | lib/swupd/path.py | 24 | ||||
-rw-r--r-- | lib/swupd/rootfs.py | 6 |
3 files changed, 30 insertions, 21 deletions
diff --git a/lib/swupd/bundles.py b/lib/swupd/bundles.py index 78ffaa5..8a47a09 100644 --- a/lib/swupd/bundles.py +++ b/lib/swupd/bundles.py @@ -70,24 +70,25 @@ def copy_core_contents(d): corefile + imagesuffix, unwanted_files) + # Create full.tar.gz instead of directory - speeds up + # do_stage_swupd_input from ~11min in the Ostro CI to 6min. + # Where we take the data from depends on whether we have bundles: + # without them, there's also no "mega" bundle and we work + # directly with the rootfs of the main image recipe. havebundles = (d.getVar('SWUPD_BUNDLES', True) or '') != '' - imgrootfs = d.getVar('MEGA_IMAGE_ROOTFS', True) if not havebundles: - imgrootfs = rootfs for suffix in (contentsuffix, imagesuffix): shutil.copy2(corefile + suffix, fullfile + suffix) + bb.debug(1, "Copying from image rootfs (%s) to full bundle (%s)" % (imgrootfs, bundle)) + swupd.path.copyxattrfiles(d, manifest_files, imgrootfs, bundle, True) else: - swupd.utils.create_content_manifests(imgrootfs, + mega_rootfs = d.getVar('MEGA_IMAGE_ROOTFS', True) + mega_archive = d.getVar('MEGA_IMAGE_ARCHIVE', True) + swupd.utils.create_content_manifests(mega_rootfs, fullfile + contentsuffix, fullfile + imagesuffix, unwanted_files) - manifest_files = swupd.utils.manifest_to_file_list(fullfile + contentsuffix) + \ - swupd.utils.manifest_to_file_list(fullfile + imagesuffix) - - bb.debug(1, "Copying from image (%s) to full bundle (%s)" % (imgrootfs, bundle)) - # Create full.tar.gz instead of directory - speeds up - # do_stage_swupd_input from ~11min in the Ostro CI to 6min. - swupd.path.copyxattrfiles(d, manifest_files, imgrootfs, bundle, True) + os.link(mega_archive, bundle) def stage_image_bundle_contents(d, bundle): diff --git a/lib/swupd/path.py b/lib/swupd/path.py index 580d0b6..61e979e 100644 --- a/lib/swupd/path.py +++ b/lib/swupd/path.py @@ -9,7 +9,7 @@ def copyxattrtree(src, dst): dst -- the destination to copy to """ import subprocess - cmd = "tar --xattrs --xattrs-include='*' -cf - -C %s -p . | tar -p --xattrs --xattrs-include='*' -xf - -C %s" % (src, dst) + cmd = "bsdtar -cf - -C %s . | bsdtar -xf - -C %s" % (src, dst) subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT) @@ -19,8 +19,8 @@ def copyxattrfiles(d, filelist, src, dst, archive=False): d -- the bitbake data store filelist -- a list of file paths - src -- where to copy the files from - dst -- where to copy the files to + src -- where to copy the files from (directory or archive, auto-detected) + dst -- where to copy the files to (directory or archive, depending on archive parameter) archive -- create archive at dst instead of writing into that directory """ import subprocess @@ -29,19 +29,27 @@ def copyxattrfiles(d, filelist, src, dst, archive=False): bb.utils.mkdirhier(os.path.dirname(dst) if archive else dst) files = sorted(filelist) + fromdir = os.path.isdir(src) workdir = d.getVar('WORKDIR', True) fd, copyfile = tempfile.mkstemp(dir=workdir) os.close(fd) with open(copyfile, 'w') as fdest: - fdest.write('-C%s\n' % src) for f in files: fdest.write('%s\n' % f) - if archive: - cmd = "tar --xattrs --xattrs-include='*' --no-recursion -zcf %s -T %s -p" % (dst, copyfile) + if fromdir: + if archive: + cmd = "bsdtar --no-recursion -C %s -zcf %s -T %s -p" % (src, dst, copyfile) + else: + cmd = "bsdtar --no-recursion -C %s -cf - -T %s -p | bsdtar -p -xf - -C %s" % (src, copyfile, dst) else: - cmd = "tar --xattrs --xattrs-include='*' --no-recursion -cf - -T %s -p | tar -p --xattrs --xattrs-include='*' -xf - -C %s" % (copyfile, dst) - subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT) + if archive: + # archive->archive not needed at the moment and cannot be done easily, + # because although bsdtar supports reading from an archive with @<archive>, + # filtering entries isn't supported in that mode. + bb.fatal('Extracting files from an archive and writing into an archive not implemented yet.') + else: + cmd = "bsdtar --no-recursion -C %s -xf %s -T %s" % (dst, src, copyfile) output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT) if output: bb.fatal('Unexpected output from the following command:\n%s\n%s' % (cmd, output)) diff --git a/lib/swupd/rootfs.py b/lib/swupd/rootfs.py index 9cf9b37..b0bed27 100644 --- a/lib/swupd/rootfs.py +++ b/lib/swupd/rootfs.py @@ -65,9 +65,9 @@ def create_rootfs(d): for suffix in suffixes: rootfs_contents.update(manifest_to_file_list(manifest + suffix)) - mega_rootfs = d.getVar('MEGA_IMAGE_ROOTFS', True) - bb.debug(2, 'Re-copying rootfs contents from mega image %s to %s' % (mega_rootfs, rootfs)) - copyxattrfiles(d, rootfs_contents, mega_rootfs, rootfs) + mega_archive = d.getVar('MEGA_IMAGE_ARCHIVE', True) + bb.debug(2, 'Re-copying rootfs contents from mega image %s to %s' % (mega_archive, rootfs)) + copyxattrfiles(d, rootfs_contents, mega_archive, rootfs) deploy_dir = d.getVar('IMGDEPLOYDIR', True) link_name = d.getVar('IMAGE_LINK_NAME', True) |