diff options
| -rw-r--r-- | scripts/lib/wic/filemap.py | 15 | 
1 files changed, 12 insertions, 3 deletions
| diff --git a/scripts/lib/wic/filemap.py b/scripts/lib/wic/filemap.py index 585b7ea84e..8fe302ab49 100644 --- a/scripts/lib/wic/filemap.py +++ b/scripts/lib/wic/filemap.py @@ -530,7 +530,8 @@ def filemap(image, log=None):      except ErrorNotSupp:          return FilemapSeek(image, log) -def sparse_copy(src_fname, dst_fname, offset=0, skip=0, api=None): +def sparse_copy(src_fname, dst_fname, offset=0, skip=0, +                length=0, api=None):      """Efficiently copy sparse file to or into another file."""      if not api:          api = filemap @@ -541,6 +542,7 @@ def sparse_copy(src_fname, dst_fname, offset=0, skip=0, api=None):          dst_file = open(dst_fname, 'wb')          dst_file.truncate(os.path.getsize(src_fname)) +    written = 0      for first, last in fmap.get_mapped_ranges(0, fmap.blocks_cnt):          start = first * fmap.block_size          end = (last + 1) * fmap.block_size @@ -561,7 +563,14 @@ def sparse_copy(src_fname, dst_fname, offset=0, skip=0, api=None):          while read < to_read:              if read + chunk_size > to_read:                  chunk_size = to_read - read -            chunk = fmap._f_image.read(chunk_size) +            size = chunk_size +            if length and written + size > length: +                size = length - written +            chunk = fmap._f_image.read(size)              dst_file.write(chunk) -            read += chunk_size +            read += size +            written += size +            if written == length: +                dst_file.close() +                return      dst_file.close() | 
