Skip to content
This repository was archived by the owner on Nov 19, 2024. It is now read-only.

Commit 76ea0d6

Browse files
committed
Reuse code to determine stream size by seeking
1 parent e310539 commit 76ea0d6

File tree

3 files changed

+21
-21
lines changed

3 files changed

+21
-21
lines changed

archiver.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,26 @@ func isSymlink(info fs.FileInfo) bool {
264264
return info.Mode()&os.ModeSymlink != 0
265265
}
266266

267+
// streamSizeBySeeking determines the size of the stream by
268+
// seeking to the end, then back again, so the resulting
269+
// seek position upon returning is the same as when called
270+
// (assuming no errors).
271+
func streamSizeBySeeking(s io.Seeker) (int64, error) {
272+
currentPosition, err := s.Seek(0, io.SeekCurrent)
273+
if err != nil {
274+
return 0, fmt.Errorf("getting current offset: %w", err)
275+
}
276+
maxPosition, err := s.Seek(0, io.SeekEnd)
277+
if err != nil {
278+
return 0, fmt.Errorf("fast-forwarding to end: %w", err)
279+
}
280+
_, err = s.Seek(currentPosition, io.SeekStart)
281+
if err != nil {
282+
return 0, fmt.Errorf("returning to prior offset %d: %w", currentPosition, err)
283+
}
284+
return maxPosition, nil
285+
}
286+
267287
// skipList keeps a list of non-intersecting paths
268288
// as long as its add method is used. Identical
269289
// elements are rejected, more specific paths are

fs.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,10 @@ func FileSystem(ctx context.Context, filename string, stream ReaderAtSeeker) (fs
9898

9999
// determine size -- we know that the stream value we get back from
100100
// Identify is the same type as what we input because it is a Seeker
101-
size, err := stream.Seek(0, io.SeekEnd)
101+
size, err := streamSizeBySeeking(stream)
102102
if err != nil {
103103
return nil, fmt.Errorf("seeking for size: %w", err)
104104
}
105-
_, err = stream.Seek(0, io.SeekStart)
106-
if err != nil {
107-
return nil, fmt.Errorf("seeking back to beginning: %w", err)
108-
}
109105

110106
sr := io.NewSectionReader(stream, 0, size)
111107

zip.go

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -337,22 +337,6 @@ type seekReaderAt interface {
337337
io.Seeker
338338
}
339339

340-
func streamSizeBySeeking(s io.Seeker) (int64, error) {
341-
currentPosition, err := s.Seek(0, io.SeekCurrent)
342-
if err != nil {
343-
return 0, fmt.Errorf("getting current offset: %w", err)
344-
}
345-
maxPosition, err := s.Seek(0, io.SeekEnd)
346-
if err != nil {
347-
return 0, fmt.Errorf("fast-forwarding to end: %w", err)
348-
}
349-
_, err = s.Seek(currentPosition, io.SeekStart)
350-
if err != nil {
351-
return 0, fmt.Errorf("returning to prior offset %d: %w", currentPosition, err)
352-
}
353-
return maxPosition, nil
354-
}
355-
356340
// Additional compression methods not offered by archive/zip.
357341
// See https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT section 4.4.5.
358342
const (

0 commit comments

Comments
 (0)