Add appends package to package list, additionally checking for uniqueness
(p *Package)
| 135 | |
| 136 | // Add appends package to package list, additionally checking for uniqueness |
| 137 | func (l *PackageList) Add(p *Package) error { |
| 138 | key := l.keyFunc(p) |
| 139 | existing, ok := l.packages[key] |
| 140 | if ok { |
| 141 | if !existing.Equals(p) { |
| 142 | return &PackageConflictError{fmt.Errorf("package already exists and is different: %s", p)} |
| 143 | } |
| 144 | return nil |
| 145 | } |
| 146 | l.packages[key] = p |
| 147 | |
| 148 | if l.indexed { |
| 149 | for _, provides := range p.ProvidedPackages() { |
| 150 | l.providesIndex[provides] = append(l.providesIndex[provides], p) |
| 151 | } |
| 152 | |
| 153 | i := sort.Search(len(l.packagesIndex), func(j int) bool { return l.lessPackages(p, l.packagesIndex[j]) }) |
| 154 | |
| 155 | // insert p into l.packagesIndex in position i |
| 156 | l.packagesIndex = append(l.packagesIndex, nil) |
| 157 | copy(l.packagesIndex[i+1:], l.packagesIndex[i:]) |
| 158 | l.packagesIndex[i] = p |
| 159 | } |
| 160 | return nil |
| 161 | } |
| 162 | |
| 163 | // ForEach calls handler for each package in list |
| 164 | func (l *PackageList) ForEach(handler func(*Package) error) error { |