zoekt-archive-index: use io.ReadCloser to simplify io.Closer usage
Using io.ReadCloser allows us to avoid the tricky control flow we previously
had around setting an `io.Reader` and `io.Closer` separately.
Change-Id: Ifaccf2ba80b351de6753f78d7ea268119e1c8420
diff --git a/cmd/zoekt-archive-index/archive.go b/cmd/zoekt-archive-index/archive.go
index 60e1c3c..67b3db6 100644
--- a/cmd/zoekt-archive-index/archive.go
+++ b/cmd/zoekt-archive-index/archive.go
@@ -50,10 +50,7 @@
}
func (a *tarArchive) Close() error {
- if a.closer != nil {
- return a.closer.Close()
- }
- return nil
+ return a.closer.Close()
}
func detectContentType(r io.Reader) (string, io.Reader, error) {
@@ -69,14 +66,7 @@
return ct, io.MultiReader(bytes.NewReader(buf[:n]), r), nil
}
-// openArchive opens the tar at the URL or filepath u. Also supported is tgz
-// files over http.
-func openArchive(u string) (Archive, error) {
- var (
- r io.Reader
- closer io.Closer
- )
-
+func openReader(u string) (io.ReadCloser, error) {
if strings.HasPrefix(u, "https://") || strings.HasPrefix(u, "http://") {
resp, err := http.Get(u)
if err != nil {
@@ -84,7 +74,7 @@
}
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
b, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1024))
- resp.Body.Close()
+ _ = resp.Body.Close()
if err != nil {
return nil, err
}
@@ -94,35 +84,40 @@
Err: fmt.Errorf("%s: %s", resp.Status, string(b)),
}
}
- closer = resp.Body
- r = resp.Body
+ return resp.Body, nil
} else if u == "-" {
- r = os.Stdin
- } else {
- f, err := os.Open(u)
- if err != nil {
- return nil, err
- }
- closer = f
- r = f
+ return ioutil.NopCloser(os.Stdin), nil
}
- ct, r, err := detectContentType(r)
+ return os.Open(u)
+}
+
+// openArchive opens the tar at the URL or filepath u. Also supported is tgz
+// files over http.
+func openArchive(u string) (ar Archive, err error) {
+ readCloser, err := openReader(u)
+ if err != nil {
+ return nil, err
+ }
+ defer func() {
+ if err != nil {
+ _ = readCloser.Close()
+ }
+ }()
+
+ ct, r, err := detectContentType(readCloser)
if err != nil {
return nil, err
}
if ct == "application/x-gzip" {
r, err = gzip.NewReader(r)
if err != nil {
- if closer != nil {
- _ = closer.Close()
- }
return nil, err
}
}
return &tarArchive{
tr: tar.NewReader(r),
- closer: closer,
+ closer: readCloser,
}, nil
}