diff --git a/cmd/fdroidcl/main.go b/cmd/fdroidcl/main.go index ce4250f..3ea3ab1 100644 --- a/cmd/fdroidcl/main.go +++ b/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 } diff --git a/index.go b/index.go index a632155..2f4a3dc 100644 --- a/index.go +++ b/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 }