mirror of
https://github.com/mudler/luet.git
synced 2025-07-20 02:09:12 +00:00
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:
parent
65a55e242e
commit
10ae872a3e
@ -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()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 := ""
|
||||||
|
Loading…
Reference in New Issue
Block a user