aptly/deb/contents.go

76 lines
1.6 KiB
Go

package deb
import (
"fmt"
"github.com/smira/aptly/aptly"
"github.com/smira/aptly/utils"
"io"
"sort"
"strings"
)
// ContentsIndex calculates mapping from files to packages, with sorting and aggregation
type ContentsIndex struct {
index map[string][]*Package
}
// NewContentsIndex creates empty ContentsIndex
func NewContentsIndex() *ContentsIndex {
return &ContentsIndex{
index: make(map[string][]*Package),
}
}
// Push adds package to contents index, calculating package contents as required
func (index *ContentsIndex) Push(p *Package, packagePool aptly.PackagePool) {
contents := p.Contents(packagePool)
for _, path := range contents {
index.index[path] = append(index.index[path], p)
}
}
// Empty checks whether index contains no packages
func (index *ContentsIndex) Empty() bool {
return len(index.index) == 0
}
// WriteTo dumps sorted mapping of files to qualified package names
func (index *ContentsIndex) WriteTo(w io.Writer) (int64, error) {
var n int64
paths := make([]string, len(index.index))
i := 0
for path := range index.index {
paths[i] = path
i++
}
sort.Strings(paths)
nn, err := fmt.Fprintf(w, "%s %s\n", "FILE", "LOCATION")
n += int64(nn)
if err != nil {
return n, err
}
for _, path := range paths {
packages := index.index[path]
parts := make([]string, 0, len(packages))
for i := range packages {
name := packages[i].QualifiedName()
if !utils.StrSliceHasItem(parts, name) {
parts = append(parts, name)
}
}
nn, err = fmt.Fprintf(w, "%s %s\n", path, strings.Join(parts, ","))
n += int64(nn)
if err != nil {
return n, err
}
}
return n, nil
}