Simplify revdep code

Isolate common code into a function and also fix a sublte bug hiding in
that code.

We need to stab a copy of the package inside our PackageMap to avoid
having symlinks pointing at the same values when iterating over
requires. ( e.g. happened in this case:
https://github.com/rancher-sandbox/cOS-toolkit/pull/467#issuecomment-895060115
)
This commit is contained in:
Ettore Di Giacinto 2021-08-09 12:47:27 +02:00
parent 65a55e242e
commit 10ae872a3e
2 changed files with 31 additions and 30 deletions

View File

@ -195,6 +195,16 @@ func (db *InMemoryDatabase) CreatePackage(p Package) (string, error) {
return ID, nil return ID, nil
} }
func (db *InMemoryDatabase) updateRevDep(k, v string, b Package) {
db.Lock()
defer db.Unlock()
_, ok := db.RevDepsDatabase[k]
if !ok {
db.RevDepsDatabase[k] = make(map[string]Package)
}
db.RevDepsDatabase[k][v] = b.Clone()
}
func (db *InMemoryDatabase) populateCaches(p Package) { func (db *InMemoryDatabase) populateCaches(p Package) {
pd, _ := p.(*DefaultPackage) pd, _ := p.(*DefaultPackage)
@ -226,54 +236,33 @@ func (db *InMemoryDatabase) populateCaches(p Package) {
} }
db.CacheNoVersion[p.GetPackageName()][p.GetVersion()] = nil db.CacheNoVersion[p.GetPackageName()][p.GetVersion()] = nil
db.Unlock()
// Updating Revdeps // Updating Revdeps
// Given that when we populate the cache we don't have the full db at hand // Given that when we populate the cache we don't have the full db at hand
// We cycle over reverse dependency of a package to update their entry if they are matching // We cycle over reverse dependency of a package to update their entry if they are matching
// the version selector // the version selector
db.Lock()
toUpdate, ok := db.RevDepsDatabase[pd.GetPackageName()] toUpdate, ok := db.RevDepsDatabase[pd.GetPackageName()]
db.Unlock()
if ok { if ok {
for _, pp := range toUpdate { for _, pp := range toUpdate {
for _, re := range pp.GetRequires() { for _, re := range pp.GetRequires() {
if match, _ := pd.VersionMatchSelector(re.GetVersion(), nil); match { if match, _ := pd.VersionMatchSelector(re.GetVersion(), nil); match {
_, ok = db.RevDepsDatabase[pd.GetFingerPrint()] db.updateRevDep(pd.GetFingerPrint(), pp.GetFingerPrint(), pp)
if !ok {
db.RevDepsDatabase[pd.GetFingerPrint()] = make(map[string]Package)
}
db.RevDepsDatabase[pd.GetFingerPrint()][pp.GetFingerPrint()] = pp
} }
} }
} }
} }
db.Unlock()
for _, re := range pd.GetRequires() { for _, re := range pd.GetRequires() {
packages, _ := db.FindPackages(re) packages, _ := db.FindPackages(re)
db.Lock()
for _, pa := range packages { for _, pa := range packages {
_, ok := db.RevDepsDatabase[pa.GetFingerPrint()] db.updateRevDep(pa.GetFingerPrint(), pd.GetFingerPrint(), pd)
if !ok { db.updateRevDep(pa.GetPackageName(), pd.GetPackageName(), pd)
db.RevDepsDatabase[pa.GetFingerPrint()] = make(map[string]Package)
} }
db.RevDepsDatabase[pa.GetFingerPrint()][pd.GetFingerPrint()] = pd db.updateRevDep(re.GetFingerPrint(), pd.GetFingerPrint(), pd)
_, ok = db.RevDepsDatabase[pa.GetPackageName()] db.updateRevDep(re.GetPackageName(), pd.GetPackageName(), pd)
if !ok {
db.RevDepsDatabase[pa.GetPackageName()] = make(map[string]Package)
}
db.RevDepsDatabase[pa.GetPackageName()][pd.GetPackageName()] = pd
}
_, ok := db.RevDepsDatabase[re.GetFingerPrint()]
if !ok {
db.RevDepsDatabase[re.GetFingerPrint()] = make(map[string]Package)
}
db.RevDepsDatabase[re.GetFingerPrint()][pd.GetFingerPrint()] = pd
_, ok = db.RevDepsDatabase[re.GetPackageName()]
if !ok {
db.RevDepsDatabase[re.GetPackageName()] = make(map[string]Package)
}
db.RevDepsDatabase[re.GetPackageName()][pd.GetPackageName()] = pd
db.Unlock()
} }
} }

View File

@ -136,6 +136,18 @@ type Packages []Package
type DefaultPackages []*DefaultPackage type DefaultPackages []*DefaultPackage
type PackageMap map[string]Package
func (pm PackageMap) String() string {
rr := []string{}
for _, r := range pm {
rr = append(rr, r.HumanReadableString())
}
return fmt.Sprint(rr)
}
func (d DefaultPackages) Hash(salt string) string { func (d DefaultPackages) Hash(salt string) string {
overallFp := "" overallFp := ""