Cached calculation of package contents. #142

This commit is contained in:
Andrey Smirnov
2015-03-31 00:07:07 +03:00
parent ee3d414ed5
commit cc8a87b448
2 changed files with 87 additions and 3 deletions
+51 -3
View File
@@ -32,9 +32,10 @@ type Package struct {
// Is this >= 0.6 package? // Is this >= 0.6 package?
V06Plus bool V06Plus bool
// Offload fields // Offload fields
deps *PackageDependencies deps *PackageDependencies
extra *Stanza extra *Stanza
files *PackageFiles files *PackageFiles
contents []string
// Mother collection // Mother collection
collection *PackageCollection collection *PackageCollection
} }
@@ -345,6 +346,16 @@ func (p *Package) GetDependencies(options int) (dependencies []string) {
return return
} }
// QualifiedName returns [$SECTION/]$NAME
func (p *Package) QualifiedName() string {
section := p.Extra()["Section"]
if section != "" {
return section + "/" + p.Name
}
return p.Name
}
// Extra returns Stanza of extra fields (it may load it from collection) // Extra returns Stanza of extra fields (it may load it from collection)
func (p *Package) Extra() Stanza { func (p *Package) Extra() Stanza {
if p.extra == nil { if p.extra == nil {
@@ -383,6 +394,43 @@ func (p *Package) Files() PackageFiles {
return *p.files return *p.files
} }
// Contents returns cached package contents
func (p *Package) Contents(packagePool aptly.PackagePool) []string {
if p.IsSource {
return nil
}
if p.contents == nil {
if p.collection == nil {
panic("contents == nil && collection == nil")
}
p.contents = p.collection.loadContents(p, packagePool)
}
return p.contents
}
// CalculateContents looks up contents in package file
func (p *Package) CalculateContents(packagePool aptly.PackagePool) []string {
if p.IsSource {
return nil
}
file := p.Files()[0]
path, err := packagePool.Path(file.Filename, file.Checksums.MD5)
if err != nil {
panic(err)
}
contents, err := GetContentsFromDeb(path)
if err != nil {
panic(err)
}
return contents
}
// UpdateFiles saves new state of files // UpdateFiles saves new state of files
func (p *Package) UpdateFiles(files PackageFiles) { func (p *Package) UpdateFiles(files PackageFiles) {
p.files = &files p.files = &files
+36
View File
@@ -3,6 +3,7 @@ package deb
import ( import (
"bytes" "bytes"
"fmt" "fmt"
"github.com/smira/aptly/aptly"
"github.com/smira/aptly/database" "github.com/smira/aptly/database"
"github.com/ugorji/go/codec" "github.com/ugorji/go/codec"
"path/filepath" "path/filepath"
@@ -160,6 +161,41 @@ func (collection *PackageCollection) loadFiles(p *Package) *PackageFiles {
return files return files
} }
// loadContents loads or calculates and saves package contents
func (collection *PackageCollection) loadContents(p *Package, packagePool aptly.PackagePool) []string {
encoded, err := collection.db.Get(p.Key("xC"))
if err == nil {
contents := []string{}
decoder := codec.NewDecoderBytes(encoded, collection.codecHandle)
err = decoder.Decode(&contents)
if err != nil {
panic("unable to decode contents")
}
return contents
}
if err != database.ErrNotFound {
panic("unable to load contents")
}
contents := p.CalculateContents(packagePool)
var buf bytes.Buffer
err = codec.NewEncoder(&buf, collection.codecHandle).Encode(contents)
if err != nil {
panic("unable to encode contents")
}
err = collection.db.Put(p.Key("xC"), buf.Bytes())
if err != nil {
panic("unable to save contents")
}
return contents
}
// Update adds or updates information about package in DB checking for conficts first // Update adds or updates information about package in DB checking for conficts first
func (collection *PackageCollection) Update(p *Package) error { func (collection *PackageCollection) Update(p *Package) error {
var encodeBuffer bytes.Buffer var encodeBuffer bytes.Buffer