diff --git a/deb/package.go b/deb/package.go index b3a2bf3c..379d5f59 100644 --- a/deb/package.go +++ b/deb/package.go @@ -32,9 +32,10 @@ type Package struct { // Is this >= 0.6 package? V06Plus bool // Offload fields - deps *PackageDependencies - extra *Stanza - files *PackageFiles + deps *PackageDependencies + extra *Stanza + files *PackageFiles + contents []string // Mother collection collection *PackageCollection } @@ -345,6 +346,16 @@ func (p *Package) GetDependencies(options int) (dependencies []string) { 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) func (p *Package) Extra() Stanza { if p.extra == nil { @@ -383,6 +394,43 @@ func (p *Package) Files() PackageFiles { 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 func (p *Package) UpdateFiles(files PackageFiles) { p.files = &files diff --git a/deb/package_collection.go b/deb/package_collection.go index db8ce8f0..56a5e5a2 100644 --- a/deb/package_collection.go +++ b/deb/package_collection.go @@ -3,6 +3,7 @@ package deb import ( "bytes" "fmt" + "github.com/smira/aptly/aptly" "github.com/smira/aptly/database" "github.com/ugorji/go/codec" "path/filepath" @@ -160,6 +161,41 @@ func (collection *PackageCollection) loadFiles(p *Package) *PackageFiles { 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 func (collection *PackageCollection) Update(p *Package) error { var encodeBuffer bytes.Buffer