22package nativeimgutil
33
44import (
5- "bytes"
6- "errors"
75 "fmt"
86 "io"
97 "os"
@@ -12,6 +10,7 @@ import (
1210 "github.com/containerd/continuity/fs"
1311 "github.com/docker/go-units"
1412 "github.com/lima-vm/go-qcow2reader"
13+ "github.com/lima-vm/go-qcow2reader/convert"
1514 "github.com/lima-vm/go-qcow2reader/image/qcow2"
1615 "github.com/lima-vm/go-qcow2reader/image/raw"
1716 "github.com/lima-vm/lima/pkg/progressbar"
@@ -75,17 +74,20 @@ func ConvertToRaw(source, dest string, size *int64, allowSourceWithBackingFile b
7574 }
7675
7776 // Copy
78- srcImgR := io .NewSectionReader (srcImg , 0 , srcImg .Size ())
7977 bar , err := progressbar .New (srcImg .Size ())
8078 if err != nil {
8179 return err
8280 }
83- const bufSize = 1024 * 1024
81+ conv , err := convert .New (convert.Options {})
82+ if err != nil {
83+ return err
84+ }
8485 bar .Start ()
85- copied , err := copySparse (destTmpF , bar .NewProxyReader (srcImgR ), bufSize )
86+ pra := progressbar.ProxyReaderAt {ReaderAt : srcImg , Bar : bar }
87+ err = conv .Convert (destTmpF , & pra , srcImg .Size ())
8688 bar .Finish ()
8789 if err != nil {
88- return fmt .Errorf ("failed to call copySparse(), bufSize=%d, copied=%d : %w" , bufSize , copied , err )
90+ return fmt .Errorf ("failed to convert image : %w" , err )
8991 }
9092
9193 // Resize
@@ -128,42 +130,6 @@ func convertRawToRaw(source, dest string, size *int64) error {
128130 return nil
129131}
130132
131- func copySparse (w * os.File , r io.Reader , bufSize int64 ) (int64 , error ) {
132- var (
133- n int64
134- eof bool
135- )
136-
137- zeroBuf := make ([]byte , bufSize )
138- buf := make ([]byte , bufSize )
139- for ! eof {
140- rN , rErr := r .Read (buf )
141- if rErr != nil {
142- eof = errors .Is (rErr , io .EOF )
143- if ! eof {
144- return n , fmt .Errorf ("failed to read: %w" , rErr )
145- }
146- }
147- // TODO: qcow2reader should have a method to notify whether buf is zero
148- if bytes .Equal (buf [:rN ], zeroBuf [:rN ]) {
149- n += int64 (rN )
150- } else {
151- wN , wErr := w .WriteAt (buf [:rN ], n )
152- if wN > 0 {
153- n += int64 (wN )
154- }
155- if wErr != nil {
156- return n , fmt .Errorf ("failed to write: %w" , wErr )
157- }
158- if wN != rN {
159- return n , fmt .Errorf ("read %d, but wrote %d bytes" , rN , wN )
160- }
161- }
162- }
163-
164- return n , nil
165- }
166-
167133func MakeSparse (f * os.File , n int64 ) error {
168134 if _ , err := f .Seek (n , io .SeekStart ); err != nil {
169135 return err
0 commit comments