From dbcfd6f58bd735c7e18a62dbc9b60257968139ed Mon Sep 17 00:00:00 2001 From: Ryan Uber Date: Tue, 22 Apr 2014 00:29:12 -0700 Subject: [PATCH] snapshot: keep a tab of seen packages and only include the latest copy during merge --- deb/reflist.go | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/deb/reflist.go b/deb/reflist.go index 3e810fd5..ba5731ce 100644 --- a/deb/reflist.go +++ b/deb/reflist.go @@ -226,6 +226,10 @@ func (l *PackageRefList) Diff(r *PackageRefList, packageCollection *PackageColle func (l *PackageRefList) Merge(r *PackageRefList, overrideMatching bool, 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 il, ir := 0, 0 // length of reflists @@ -234,6 +238,7 @@ func (l *PackageRefList) Merge(r *PackageRefList, overrideMatching bool, result = &PackageRefList{} result.Refs = make([][]byte, 0, ll+lr) +OUTER: // until we reached end of both lists for il < ll || ir < lr { // 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 { 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(" ")) - 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 { result.Refs = append(result.Refs, r.Refs[ir]) il++ @@ -297,7 +315,6 @@ func (l *PackageRefList) Merge(r *PackageRefList, overrideMatching bool, result.Refs = append(result.Refs, r.Refs[ir]) ir++ } - } }