Browse Source

Make index loading funcs use reader interfaces

Bonus fix: no longer use a bytes.Buffer to load the index.xml entry in the jar
entirely into memory
pull/8/head
Daniel Martí 11 years ago
parent
commit
644bb6dd2c
  1. 17
      cmd/fdroidcl/main.go
  2. 25
      index.go

17
cmd/fdroidcl/main.go

@ -157,10 +157,23 @@ func init() {
}
}
func indexPath(repoName string) string {
return repoName + ".jar"
}
func mustLoadIndex(repoName string) *fdroidcl.Index {
index, err := fdroidcl.LoadIndex(repoName)
path := indexPath(repoName)
f, err := os.Open(path)
if err != nil {
log.Fatalf("Could not open index file: %v", err)
}
stat, err := f.Stat()
if err != nil {
log.Fatalf("Could not stat index file: %v", err)
}
index, err := fdroidcl.LoadIndexJar(f, stat.Size())
if err != nil {
log.Fatalf("Could not load apps: %v", err)
log.Fatalf("Could not load index: %v", err)
}
return index
}

25
index.go

@ -5,7 +5,6 @@ package fdroidcl
import (
"archive/zip"
"bytes"
"encoding/xml"
"errors"
"fmt"
@ -231,32 +230,30 @@ func (al appList) Len() int { return len(al) }
func (al appList) Swap(i, j int) { al[i], al[j] = al[j], al[i] }
func (al appList) Less(i, j int) bool { return al[i].ID < al[j].ID }
func LoadIndex(repoName string) (*Index, error) {
path := indexPath(repoName)
r, err := zip.OpenReader(path)
func LoadIndexJar(r io.ReaderAt, size int64) (*Index, error) {
reader, err := zip.NewReader(r, size)
if err != nil {
return nil, err
}
defer r.Close()
buf := new(bytes.Buffer)
for _, f := range r.File {
var rc io.ReadCloser
for _, f := range reader.File {
if f.Name != "index.xml" {
continue
}
rc, err := f.Open()
rc, err = f.Open()
if err != nil {
return nil, err
}
if _, err = io.Copy(buf, rc); err != nil {
return nil, err
}
rc.Close()
break
}
defer rc.Close()
return LoadIndexXml(rc)
}
func LoadIndexXml(r io.Reader) (*Index, error) {
var index Index
if err := xml.Unmarshal(buf.Bytes(), &index); err != nil {
decoder := xml.NewDecoder(r)
if err := decoder.Decode(&index); err != nil {
return nil, err
}

Loading…
Cancel
Save