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
 }