mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-06-10 06:14:22 +00:00
snapshot: keep a tab of seen packages and only include the latest copy during merge
This commit is contained in:
+21
-4
@@ -226,6 +226,10 @@ func (l *PackageRefList) Diff(r *PackageRefList, packageCollection *PackageColle
|
|||||||
func (l *PackageRefList) Merge(r *PackageRefList, overrideMatching bool,
|
func (l *PackageRefList) Merge(r *PackageRefList, overrideMatching bool,
|
||||||
newestWins bool) (result *PackageRefList) {
|
newestWins bool) (result *PackageRefList) {
|
||||||
|
|
||||||
|
// A running tab of packages observed during a merge. Used when -newest is
|
||||||
|
// passed to make sure only the newest version is carried into the snapshot.
|
||||||
|
var seen []string
|
||||||
|
|
||||||
// pointer to left and right reflists
|
// pointer to left and right reflists
|
||||||
il, ir := 0, 0
|
il, ir := 0, 0
|
||||||
// length of reflists
|
// length of reflists
|
||||||
@@ -234,6 +238,7 @@ func (l *PackageRefList) Merge(r *PackageRefList, overrideMatching bool,
|
|||||||
result = &PackageRefList{}
|
result = &PackageRefList{}
|
||||||
result.Refs = make([][]byte, 0, ll+lr)
|
result.Refs = make([][]byte, 0, ll+lr)
|
||||||
|
|
||||||
|
OUTER:
|
||||||
// until we reached end of both lists
|
// until we reached end of both lists
|
||||||
for il < ll || ir < lr {
|
for il < ll || ir < lr {
|
||||||
// if we've exhausted left list, pull the rest from the right
|
// if we've exhausted left list, pull the rest from the right
|
||||||
@@ -275,12 +280,25 @@ func (l *PackageRefList) Merge(r *PackageRefList, overrideMatching bool,
|
|||||||
}
|
}
|
||||||
if newestWins {
|
if newestWins {
|
||||||
partsL := bytes.Split(rl, []byte(" "))
|
partsL := bytes.Split(rl, []byte(" "))
|
||||||
verL := string(partsL[2])
|
nameL, archL, verL := partsL[0][1:], partsL[1], partsL[2]
|
||||||
|
pkgL := string(nameL) + "." + string(archL)
|
||||||
|
|
||||||
partsR := bytes.Split(rr, []byte(" "))
|
partsR := bytes.Split(rr, []byte(" "))
|
||||||
verR := string(partsR[2])
|
verR := partsR[2]
|
||||||
|
|
||||||
vres := CompareVersions(verL, verR)
|
// If we've already seen this package, regardless of version,
|
||||||
|
// just skip it.
|
||||||
|
for _, s := range seen {
|
||||||
|
if s == pkgL {
|
||||||
|
il++
|
||||||
|
ir++
|
||||||
|
continue OUTER
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
seen = append(seen, pkgL)
|
||||||
|
|
||||||
|
vres := CompareVersions(string(verL), string(verR))
|
||||||
if vres <= 0 {
|
if vres <= 0 {
|
||||||
result.Refs = append(result.Refs, r.Refs[ir])
|
result.Refs = append(result.Refs, r.Refs[ir])
|
||||||
il++
|
il++
|
||||||
@@ -297,7 +315,6 @@ func (l *PackageRefList) Merge(r *PackageRefList, overrideMatching bool,
|
|||||||
result.Refs = append(result.Refs, r.Refs[ir])
|
result.Refs = append(result.Refs, r.Refs[ir])
|
||||||
ir++
|
ir++
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user