mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-06-13 06:40:41 +00:00
Cached calculation of package contents. #142
This commit is contained in:
+51
-3
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user