mirror of https://github.com/aptly-dev/aptly
76 lines
1.6 KiB
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
|
|
}
|