Skip to content

Commit f3593f6

Browse files
authored
Merge pull request #195 from ktock/import-esgz
Make estargz lib importable independently
2 parents a85d05d + 6776885 commit f3593f6

File tree

3,411 files changed

+376
-1054545
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

3,411 files changed

+376
-1054545
lines changed

estargz/build.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ import (
2828
"sync"
2929

3030
"github.com/containerd/stargz-snapshotter/estargz/stargz"
31-
"github.com/containerd/stargz-snapshotter/util/positionwatcher"
32-
"github.com/containerd/stargz-snapshotter/util/tempfiles"
31+
"github.com/containerd/stargz-snapshotter/estargz/tempfiles"
32+
"github.com/containerd/stargz-snapshotter/estargz/positionwatcher"
3333
digest "github.com/opencontainers/go-digest"
3434
"github.com/pkg/errors"
3535
"golang.org/x/sync/errgroup"

estargz/go.mod

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module github.com/containerd/stargz-snapshotter/estargz
2+
3+
go 1.13
4+
5+
require (
6+
github.com/hashicorp/go-multierror v1.1.0
7+
github.com/opencontainers/go-digest v1.0.0
8+
github.com/pkg/errors v0.9.1
9+
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a
10+
)

estargz/go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
2+
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
3+
github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=
4+
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
5+
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
6+
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
7+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
8+
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
9+
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs=
10+
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
Copyright The containerd Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package positionwatcher
18+
19+
import (
20+
"fmt"
21+
"io"
22+
"sync"
23+
)
24+
25+
func NewPositionWatcher(r io.ReaderAt) (*PositionWatcher, error) {
26+
if r == nil {
27+
return nil, fmt.Errorf("Target ReaderAt is empty")
28+
}
29+
pos := int64(0)
30+
return &PositionWatcher{r: r, cPos: &pos}, nil
31+
}
32+
33+
type PositionWatcher struct {
34+
r io.ReaderAt
35+
cPos *int64
36+
37+
mu sync.Mutex
38+
}
39+
40+
func (pwr *PositionWatcher) Read(p []byte) (int, error) {
41+
pwr.mu.Lock()
42+
defer pwr.mu.Unlock()
43+
44+
n, err := pwr.r.ReadAt(p, *pwr.cPos)
45+
if err == nil {
46+
*pwr.cPos += int64(n)
47+
}
48+
return n, err
49+
}
50+
51+
func (pwr *PositionWatcher) Seek(offset int64, whence int) (int64, error) {
52+
pwr.mu.Lock()
53+
defer pwr.mu.Unlock()
54+
55+
switch whence {
56+
default:
57+
return 0, fmt.Errorf("Unknown whence: %v", whence)
58+
case io.SeekStart:
59+
case io.SeekCurrent:
60+
offset += *pwr.cPos
61+
case io.SeekEnd:
62+
return 0, fmt.Errorf("Unsupported whence: %v", whence)
63+
}
64+
65+
if offset < 0 {
66+
return 0, fmt.Errorf("invalid offset")
67+
}
68+
*pwr.cPos = offset
69+
return offset, nil
70+
}
71+
72+
func (pwr *PositionWatcher) CurrentPos() int64 {
73+
pwr.mu.Lock()
74+
defer pwr.mu.Unlock()
75+
76+
return *pwr.cPos
77+
}
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
/*
2+
Copyright The containerd Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package positionwatcher
18+
19+
import (
20+
"bytes"
21+
"io"
22+
"testing"
23+
)
24+
25+
type operations func(*PositionWatcher) error
26+
27+
func TestPositionWatcher(t *testing.T) {
28+
tests := []struct {
29+
name string
30+
ops operations
31+
wantPos int64
32+
}{
33+
{
34+
name: "nop",
35+
ops: func(pw *PositionWatcher) error {
36+
return nil
37+
},
38+
wantPos: 0,
39+
},
40+
{
41+
name: "read",
42+
ops: func(pw *PositionWatcher) error {
43+
size := 5
44+
if _, err := pw.Read(make([]byte, size)); err != nil {
45+
return err
46+
}
47+
return nil
48+
},
49+
wantPos: 5,
50+
},
51+
{
52+
name: "readtwice",
53+
ops: func(pw *PositionWatcher) error {
54+
size1, size2 := 5, 3
55+
if _, err := pw.Read(make([]byte, size1)); err != nil {
56+
if err != io.EOF {
57+
return err
58+
}
59+
}
60+
if _, err := pw.Read(make([]byte, size2)); err != nil {
61+
if err != io.EOF {
62+
return err
63+
}
64+
}
65+
return nil
66+
},
67+
wantPos: 8,
68+
},
69+
{
70+
name: "seek_start",
71+
ops: func(pw *PositionWatcher) error {
72+
size := int64(5)
73+
if _, err := pw.Seek(size, io.SeekStart); err != nil {
74+
if err != io.EOF {
75+
return err
76+
}
77+
}
78+
return nil
79+
},
80+
wantPos: 5,
81+
},
82+
{
83+
name: "seek_start_twice",
84+
ops: func(pw *PositionWatcher) error {
85+
size1, size2 := int64(5), int64(3)
86+
if _, err := pw.Seek(size1, io.SeekStart); err != nil {
87+
if err != io.EOF {
88+
return err
89+
}
90+
}
91+
if _, err := pw.Seek(size2, io.SeekStart); err != nil {
92+
if err != io.EOF {
93+
return err
94+
}
95+
}
96+
return nil
97+
},
98+
wantPos: 3,
99+
},
100+
{
101+
name: "seek_current",
102+
ops: func(pw *PositionWatcher) error {
103+
size := int64(5)
104+
if _, err := pw.Seek(size, io.SeekCurrent); err != nil {
105+
if err != io.EOF {
106+
return err
107+
}
108+
}
109+
return nil
110+
},
111+
wantPos: 5,
112+
},
113+
{
114+
name: "seek_current_twice",
115+
ops: func(pw *PositionWatcher) error {
116+
size1, size2 := int64(5), int64(3)
117+
if _, err := pw.Seek(size1, io.SeekCurrent); err != nil {
118+
if err != io.EOF {
119+
return err
120+
}
121+
}
122+
if _, err := pw.Seek(size2, io.SeekCurrent); err != nil {
123+
if err != io.EOF {
124+
return err
125+
}
126+
}
127+
return nil
128+
},
129+
wantPos: 8,
130+
},
131+
{
132+
name: "seek_current_twice_negative",
133+
ops: func(pw *PositionWatcher) error {
134+
size1, size2 := int64(5), int64(-3)
135+
if _, err := pw.Seek(size1, io.SeekCurrent); err != nil {
136+
if err != io.EOF {
137+
return err
138+
}
139+
}
140+
if _, err := pw.Seek(size2, io.SeekCurrent); err != nil {
141+
if err != io.EOF {
142+
return err
143+
}
144+
}
145+
return nil
146+
},
147+
wantPos: 2,
148+
},
149+
{
150+
name: "mixed",
151+
ops: func(pw *PositionWatcher) error {
152+
size1, size2, size3, size4, size5 := int64(5), int64(-3), int64(4), int64(-1), int64(6)
153+
if _, err := pw.Read(make([]byte, size1)); err != nil {
154+
if err != io.EOF {
155+
return err
156+
}
157+
}
158+
if _, err := pw.Seek(size2, io.SeekCurrent); err != nil {
159+
if err != io.EOF {
160+
return err
161+
}
162+
}
163+
if _, err := pw.Seek(size3, io.SeekStart); err != nil {
164+
if err != io.EOF {
165+
return err
166+
}
167+
}
168+
if _, err := pw.Seek(size4, io.SeekCurrent); err != nil {
169+
if err != io.EOF {
170+
return err
171+
}
172+
}
173+
if _, err := pw.Read(make([]byte, size5)); err != nil {
174+
if err != io.EOF {
175+
return err
176+
}
177+
}
178+
return nil
179+
},
180+
wantPos: 9,
181+
},
182+
}
183+
184+
for _, tt := range tests {
185+
t.Run(tt.name, func(t *testing.T) {
186+
pw, err := NewPositionWatcher(bytes.NewReader(make([]byte, 100)))
187+
if err != nil {
188+
t.Fatalf("failed to make position watcher: %q", err)
189+
}
190+
191+
if err := tt.ops(pw); err != nil {
192+
t.Fatalf("failed to operate position watcher: %q", err)
193+
}
194+
195+
gotPos := pw.CurrentPos()
196+
if tt.wantPos != gotPos {
197+
t.Errorf("current position: %d; want %d", gotPos, tt.wantPos)
198+
}
199+
})
200+
}
201+
202+
}

estargz/tempfiles/tempfiles.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
Copyright The containerd Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package tempfiles
18+
19+
import (
20+
"io/ioutil"
21+
"os"
22+
"sync"
23+
24+
"github.com/hashicorp/go-multierror"
25+
)
26+
27+
func NewTempFiles() *TempFiles {
28+
return &TempFiles{}
29+
}
30+
31+
type TempFiles struct {
32+
files []*os.File
33+
filesMu sync.Mutex
34+
}
35+
36+
func (tf *TempFiles) TempFile(dir, pattern string) (*os.File, error) {
37+
f, err := ioutil.TempFile(dir, pattern)
38+
if err != nil {
39+
return nil, err
40+
}
41+
tf.filesMu.Lock()
42+
tf.files = append(tf.files, f)
43+
tf.filesMu.Unlock()
44+
return f, nil
45+
}
46+
47+
func (tf *TempFiles) CleanupAll() (allErr error) {
48+
tf.filesMu.Lock()
49+
defer tf.filesMu.Unlock()
50+
for _, f := range tf.files {
51+
if err := f.Close(); err != nil {
52+
allErr = multierror.Append(allErr, err)
53+
}
54+
if err := os.Remove(f.Name()); err != nil {
55+
allErr = multierror.Append(allErr, err)
56+
}
57+
}
58+
tf.files = nil
59+
return nil
60+
}

0 commit comments

Comments
 (0)