Skip to content

Commit 6a9e9d3

Browse files
authored
Merge pull request #201 from xiekeyang/refactor
improve walk function on returning result
2 parents 6e6d327 + 38fbdd4 commit 6a9e9d3

File tree

4 files changed

+25
-75
lines changed

4 files changed

+25
-75
lines changed

image/config.go

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,10 @@ func findConfig(w walker, d *descriptor) (*config, error) {
5353
var c config
5454
cpath := filepath.Join("blobs", d.normalizeDigest())
5555

56-
f := func(path string, info os.FileInfo, r io.Reader) error {
57-
if info.IsDir() {
58-
return nil
56+
if err := w.walk(func(path string, info os.FileInfo, r io.Reader) error {
57+
if info.IsDir() || filepath.Clean(path) != cpath {
58+
return fmt.Errorf("%s: config not found", cpath)
5959
}
60-
61-
if filepath.Clean(path) != cpath {
62-
return nil
63-
}
64-
6560
buf, err := ioutil.ReadAll(r)
6661
if err != nil {
6762
return errors.Wrapf(err, "%s: error reading config", path)
@@ -75,18 +70,10 @@ func findConfig(w walker, d *descriptor) (*config, error) {
7570
return err
7671
}
7772

78-
return errEOW
79-
}
80-
81-
switch err := w.walk(f); err {
82-
case nil:
83-
return nil, fmt.Errorf("%s: config not found", cpath)
84-
case errEOW:
85-
// found, continue below
86-
default:
73+
return nil
74+
}); err != nil {
8775
return nil, err
8876
}
89-
9077
return &c, nil
9178
}
9279

image/descriptor.go

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -41,58 +41,40 @@ func findDescriptor(w walker, name string) (*descriptor, error) {
4141
var d descriptor
4242
dpath := filepath.Join("refs", name)
4343

44-
f := func(path string, info os.FileInfo, r io.Reader) error {
45-
if info.IsDir() {
46-
return nil
47-
}
48-
49-
if filepath.Clean(path) != dpath {
50-
return nil
44+
if err := w.walk(func(path string, info os.FileInfo, r io.Reader) error {
45+
if info.IsDir() || filepath.Clean(path) != dpath {
46+
return fmt.Errorf("%s: descriptor not found", dpath)
5147
}
5248

5349
if err := json.NewDecoder(r).Decode(&d); err != nil {
5450
return err
5551
}
5652

57-
return errEOW
58-
}
59-
60-
switch err := w.walk(f); err {
61-
case nil:
62-
return nil, fmt.Errorf("%s: descriptor not found", dpath)
63-
case errEOW:
64-
// found, continue below
65-
default:
53+
return nil
54+
}); err != nil {
6655
return nil, err
6756
}
6857

6958
return &d, nil
7059
}
7160

7261
func (d *descriptor) validate(w walker) error {
73-
f := func(path string, info os.FileInfo, r io.Reader) error {
62+
if err := w.walk(func(path string, info os.FileInfo, r io.Reader) error {
7463
if info.IsDir() {
75-
return nil
64+
return fmt.Errorf("%s: not found", d.normalizeDigest())
7665
}
7766

7867
digest, err := filepath.Rel("blobs", filepath.Clean(path))
7968
if err != nil || d.normalizeDigest() != digest {
80-
return nil // ignore
69+
return fmt.Errorf("%s: not found", d.normalizeDigest())
8170
}
8271

8372
if err := d.validateContent(r); err != nil {
8473
return err
8574
}
8675

87-
return errEOW
88-
}
89-
90-
switch err := w.walk(f); err {
91-
case nil:
92-
return fmt.Errorf("%s: not found", d.normalizeDigest())
93-
case errEOW:
94-
// found, continue below
95-
default:
76+
return nil
77+
}); err != nil {
9678
return errors.Wrapf(err, "%s: validation failed", d.normalizeDigest())
9779
}
9880

image/manifest.go

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,9 @@ func findManifest(w walker, d *descriptor) (*manifest, error) {
4040
var m manifest
4141
mpath := filepath.Join("blobs", d.normalizeDigest())
4242

43-
f := func(path string, info os.FileInfo, r io.Reader) error {
44-
if info.IsDir() {
45-
return nil
46-
}
47-
48-
if filepath.Clean(path) != mpath {
49-
return nil
43+
if err := w.walk(func(path string, info os.FileInfo, r io.Reader) error {
44+
if info.IsDir() || filepath.Clean(path) != mpath {
45+
return fmt.Errorf("%s: manifest not found", mpath)
5046
}
5147

5248
buf, err := ioutil.ReadAll(r)
@@ -66,15 +62,8 @@ func findManifest(w walker, d *descriptor) (*manifest, error) {
6662
return fmt.Errorf("%s: no layers found", path)
6763
}
6864

69-
return errEOW
70-
}
71-
72-
switch err := w.walk(f); err {
73-
case nil:
74-
return nil, fmt.Errorf("%s: manifest not found", mpath)
75-
case errEOW:
76-
// found, continue below
77-
default:
65+
return nil
66+
}); err != nil {
7867
return nil, err
7968
}
8069

@@ -101,25 +90,22 @@ func (m *manifest) unpack(w walker, dest string) error {
10190
continue
10291
}
10392

104-
f := func(path string, info os.FileInfo, r io.Reader) error {
93+
if err := w.walk(func(path string, info os.FileInfo, r io.Reader) error {
10594
if info.IsDir() {
106-
return nil
95+
return fmt.Errorf("%s: blob digest not found", d.normalizeDigest())
10796
}
10897

10998
dd, err := filepath.Rel("blobs", filepath.Clean(path))
11099
if err != nil || d.normalizeDigest() != dd {
111-
return nil // ignore
100+
return fmt.Errorf("%s: blob digest not found", d.normalizeDigest())
112101
}
113102

114103
if err := unpackLayer(dest, r); err != nil {
115104
return errors.Wrap(err, "error extracting layer")
116105
}
117106

118-
return errEOW
119-
}
120-
121-
err := w.walk(f)
122-
if err != nil && err != errEOW {
107+
return nil
108+
}); err != nil {
123109
return err
124110
}
125111
}

image/walker.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,13 @@ package image
1616

1717
import (
1818
"archive/tar"
19-
"fmt"
2019
"io"
2120
"os"
2221
"path/filepath"
2322

2423
"github.com/pkg/errors"
2524
)
2625

27-
var (
28-
errEOW = fmt.Errorf("end of walk") // error to signal stop walking
29-
)
30-
3126
// walkFunc is a function type that gets called for each file or directory visited by the Walker.
3227
type walkFunc func(path string, _ os.FileInfo, _ io.Reader) error
3328

0 commit comments

Comments
 (0)