2
2
package nativeimgutil
3
3
4
4
import (
5
- "bytes"
6
- "errors"
7
5
"fmt"
8
6
"io"
9
7
"os"
@@ -12,6 +10,7 @@ import (
12
10
"github.com/containerd/continuity/fs"
13
11
"github.com/docker/go-units"
14
12
"github.com/lima-vm/go-qcow2reader"
13
+ "github.com/lima-vm/go-qcow2reader/convert"
15
14
"github.com/lima-vm/go-qcow2reader/image/qcow2"
16
15
"github.com/lima-vm/go-qcow2reader/image/raw"
17
16
"github.com/lima-vm/lima/pkg/progressbar"
@@ -75,17 +74,20 @@ func ConvertToRaw(source, dest string, size *int64, allowSourceWithBackingFile b
75
74
}
76
75
77
76
// Copy
78
- srcImgR := io .NewSectionReader (srcImg , 0 , srcImg .Size ())
79
77
bar , err := progressbar .New (srcImg .Size ())
80
78
if err != nil {
81
79
return err
82
80
}
83
- const bufSize = 1024 * 1024
81
+ conv , err := convert .New (convert.Options {})
82
+ if err != nil {
83
+ return err
84
+ }
84
85
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 ())
86
88
bar .Finish ()
87
89
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 )
89
91
}
90
92
91
93
// Resize
@@ -128,42 +130,6 @@ func convertRawToRaw(source, dest string, size *int64) error {
128
130
return nil
129
131
}
130
132
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
-
167
133
func MakeSparse (f * os.File , n int64 ) error {
168
134
if _ , err := f .Seek (n , io .SeekStart ); err != nil {
169
135
return err
0 commit comments