From dc248c56036e1b238bfe1abc4c3293cc160f9f47 Mon Sep 17 00:00:00 2001 From: Andrey Smirnov Date: Thu, 29 May 2014 17:58:59 +0400 Subject: [PATCH] Fix diff algorithm for reflists with duplicate entries. #57 --- deb/reflist.go | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/deb/reflist.go b/deb/reflist.go index 7c9f5f0d..008316ea 100644 --- a/deb/reflist.go +++ b/deb/reflist.go @@ -194,25 +194,28 @@ func (l *PackageRefList) Diff(r *PackageRefList, packageCollection *PackageColle } } - // is pl & pr the same package, but different version? - if pl.Name == pr.Name && pl.Architecture == pr.Architecture { - result = append(result, PackageDiff{Left: pl, Right: pr}) - il++ - ir++ - pl, pr = nil, nil - } else { - // otherwise pl or pr is missing on one of the sides - if rel < 0 { + // otherwise pl or pr is missing on one of the sides + if rel < 0 { + // compaction: +(,A) -(B,) --> !(A,B) + if len(result) > 0 && result[len(result)-1].Left == nil && result[len(result)-1].Right.Name == pl.Name && + result[len(result)-1].Right.Architecture == pl.Architecture { + result[len(result)-1] = PackageDiff{Left: pl, Right: result[len(result)-1].Right} + } else { result = append(result, PackageDiff{Left: pl, Right: nil}) - il++ - pl = nil + } + il++ + pl = nil + } else { + // compaction: -(A,) +(,B) --> !(A,B) + if len(result) > 0 && result[len(result)-1].Right == nil && result[len(result)-1].Left.Name == pr.Name && + result[len(result)-1].Left.Architecture == pr.Architecture { + result[len(result)-1] = PackageDiff{Left: result[len(result)-1].Left, Right: pr} } else { result = append(result, PackageDiff{Left: nil, Right: pr}) - ir++ - pr = nil } + ir++ + pr = nil } - } }