From b0ce7c65309585d4b9752bb571a0e616036eb162 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Thu, 14 Jan 2016 09:28:47 +0100 Subject: [PATCH] Do not show multiple identical apt-cache showsrc entries Closes: #734922 --- apt-private/private-show.cc | 21 +++++++++++++--- .../test-bug-734922-apt-showsrc-duplicate | 25 +++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) create mode 100755 test/integration/test-bug-734922-apt-showsrc-duplicate diff --git a/apt-private/private-show.cc b/apt-private/private-show.cc index c2517e130..6fb3791f8 100644 --- a/apt-private/private-show.cc +++ b/apt-private/private-show.cc @@ -299,6 +299,14 @@ bool ShowPackage(CommandLine &CmdL) /*{{{*/ return true; } /*}}}*/ +// XXX: move to hashes.h: HashString::FromString() ? /*{{{*/ +std::string Sha1FromString(std::string input) +{ + SHA1Summation sha1; + sha1.Add(input.c_str(), input.length()); + return sha1.Result().Value(); +} + /*}}}*/ bool ShowSrcPackage(CommandLine &CmdL) /*{{{*/ { pkgCacheFile CacheFile; @@ -312,6 +320,8 @@ bool ShowSrcPackage(CommandLine &CmdL) /*{{{*/ return false; bool found = false; + // avoid showing identical records + std::set seen; for (const char **I = CmdL.FileList + 1; *I != 0; I++) { SrcRecs.Restart(); @@ -323,9 +333,14 @@ bool ShowSrcPackage(CommandLine &CmdL) /*{{{*/ if (_config->FindB("APT::Cache::Only-Source", false) == true) if (Parse->Package() != *I) continue; - std::cout << Parse->AsStr() << std::endl;; - found = true; - found_this = true; + std::string sha1str = Sha1FromString(Parse->AsStr()); + if (std::find(seen.begin(), seen.end(), sha1str) == seen.end()) + { + std::cout << Parse->AsStr() << std::endl;; + found = true; + found_this = true; + seen.insert(sha1str); + } } if (found_this == false) { _error->Warning(_("Unable to locate package %s"),*I); diff --git a/test/integration/test-bug-734922-apt-showsrc-duplicate b/test/integration/test-bug-734922-apt-showsrc-duplicate new file mode 100755 index 000000000..d4370e2ba --- /dev/null +++ b/test/integration/test-bug-734922-apt-showsrc-duplicate @@ -0,0 +1,25 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'i386' + +# foo is identical, show it only once in showsrc +insertpackage "unstable" "foo" "i386" "1.0" +insertpackage "testing" "foo" "i386" "1.0" +insertsource "unstable" "foo" "i386" "1.0" +insertsource "testing" "foo" "i386" "1.0" + +# bar is different, show twice +insertsource "unstable" "bar" "i386" "1.0" +insertsource "testing" "bar" "i386" "2.0" + +setupaptarchive + +# ensure "foo" is not shown twice +aptcache showsrc foo bar|grep ^Package: > out.txt +testequal "Package: foo +Package: bar +Package: bar" cat out.txt -- 2.45.2