소스 검색

Do not show multiple identical apt-cache showsrc entries

Closes: #734922
Michael Vogt 10 년 전
부모
커밋
b0ce7c6530
2개의 변경된 파일43개의 추가작업 그리고 3개의 파일을 삭제
  1. 18 3
      apt-private/private-show.cc
  2. 25 0
      test/integration/test-bug-734922-apt-showsrc-duplicate

+ 18 - 3
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<std::string> 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);

+ 25 - 0
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