Skip to content

Commit 015de75

Browse files
committed
add shortcut constructor (usable when using file as base layer)
1 parent f18a9b3 commit 015de75

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

image.go

+22
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@ import (
44
"bytes"
55
"fmt"
66
"io"
7+
"os"
78
"sort"
89
"strings"
10+
11+
"github.com/kaz/patchwork/overlay"
912
)
1013

1114
const (
@@ -32,6 +35,25 @@ func NewImage(dev Device) *Image {
3235
return &Image{dev}
3336
}
3437

38+
// Create instance from image file. Changes will be applied directly.
39+
// If you prefer to avoid change original file, use NewOverlayedImageFromFile instead.
40+
func NewImageFromFile(file string) (*Image, *os.File, error) {
41+
fh, err := os.OpenFile(file, os.O_RDWR, 0644)
42+
if err != nil {
43+
return nil, nil, fmt.Errorf("failed to open file: %w", err)
44+
}
45+
return NewImage(fh), fh, nil
46+
}
47+
48+
// Create instance from image file with overlay reader as a device. Changes won't be applied to original file.
49+
func NewOverlayedImageFromFile(file string) (*Image, *overlay.Overlay, error) {
50+
ol, err := overlay.NewFromFile(file)
51+
if err != nil {
52+
return nil, nil, fmt.Errorf("failed to initialize overlay: %w", err)
53+
}
54+
return &Image{ol}, ol, nil
55+
}
56+
3557
func (img *Image) setExtent(r *directoryRecord, buf []byte) error {
3658
if n, err := img.dev.WriteAt(buf, int64(r.ExtentLocation*SECTOR_SIZE)); err != nil {
3759
return fmt.Errorf("failed to write data to image: %w", err)

overlay/overlay.go

+10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"errors"
55
"fmt"
66
"io"
7+
"os"
78
)
89

910
type (
@@ -40,6 +41,15 @@ func New(base Base) (*Overlay, error) {
4041
return &Overlay{base, 0, end, []*layer{}}, nil
4142
}
4243

44+
// Create new instance which has os.File as base layer.
45+
func NewFromFile(file string) (*Overlay, error) {
46+
fh, err := os.Open(file)
47+
if err != nil {
48+
return nil, fmt.Errorf("failed to open file: %w", err)
49+
}
50+
return New(fh)
51+
}
52+
4353
func (o *Overlay) Close() error {
4454
if closer, ok := interface{}(o).(io.Closer); ok {
4555
return closer.Close()

0 commit comments

Comments
 (0)