Index: moap/command/cl.py
===================================================================
--- moap/command/cl.py	(revision 306)
+++ moap/command/cl.py	(working copy)
@@ -166,18 +166,25 @@
         return self._releases[release]
         
 
-    def find(self, needle):
+    def find(self, needles):
         """
-        Find and return all entries whose text matches the given text.
+        Find and return all entries whose text matches all of the given strings.
         """
         res = []
         for entry in self._entries:
-            try:
-                if entry.text.find(needle) > -1:
-                    res.append(entry)
-            except AttributeError:
-                # for example, release entries
-                pass
+            found_all_strings = True
+            for needle in needles:
+              try:
+                  if not entry.text.find(needle) > -1:
+                    found_all_strings = False
+              except AttributeError:
+                  # for example, release entries
+                  found_all_strings = False
+                  pass
+              if not found_all_strings:
+                break
+            if found_all_strings:
+              res.append(entry)
 
         return res
 
@@ -320,13 +327,13 @@
 """
     def do(self, args):
         if not args:
-            self.stderr.write('Please give a string to find.\n')
+            self.stderr.write('Please give one or more strings to find.\n')
             return 3
 
-        needle = " ".join(args)
+        needles = args
          
         cl = ChangeLogFile(self.parentCommand.clPath)
-        entries = cl.find(needle)
+        entries = cl.find(needles)
         for entry in entries:
             self.stdout.write("".join(entry.lines))
 
Index: moap/test/test_commands_cl.py
===================================================================
--- moap/test/test_commands_cl.py	(revision 306)
+++ moap/test/test_commands_cl.py	(working copy)
@@ -39,13 +39,43 @@
         ])
 
     def testFind(self):
-        entries = self.cl.find('show')
+        search_terms = ['show']
+        entries = self.cl.find(search_terms)
         self.assertEquals(len(entries), 1)
         e = entries[0]
         self.assertEquals(e.date, "2006-06-12")
         self.assertEquals(e.name, "Thomas Vander Stichele")
         self.assertEquals(e.address, "thomas at apestaart dot org")
 
+    def testFindMultiple(self):
+        search_terms = ['svn.py']
+        entries = self.cl.find(search_terms)
+        self.assertEquals(len(entries), 3)
+        e = entries[0]
+        self.assertEquals(e.date, "2006-06-15")
+        self.assertEquals(e.name, "Thomas Vander Stichele")
+        self.assertEquals(e.address, "thomas at apestaart dot org")
+        e = entries[1]
+        self.assertEquals(e.date, "2006-06-11")
+        self.assertEquals(e.name, "Thomas Vander Stichele")
+        self.assertEquals(e.address, "thomas at apestaart dot org")
+        e = entries[2]
+        self.assertEquals(e.date, "2006-06-11")
+        self.assertEquals(e.name, "Thomas Vander Stichele")
+        self.assertEquals(e.address, "thomas at apestaart dot org")
+
+        search_terms = ['svn.py', '--no-commit']
+        entries = self.cl.find(search_terms)
+        self.assertEquals(len(entries), 1)
+        e = entries[0]
+        self.assertEquals(e.date, "2006-06-11")
+        self.assertEquals(e.name, "Thomas Vander Stichele")
+        self.assertEquals(e.address, "thomas at apestaart dot org")
+
+        search_terms = ['svn.py', 'foobar']
+        entries = self.cl.find(search_terms)
+        self.assertEquals(len(entries), 0)
+
 class TestClGstPluginsGood(common.TestCase):
     def setUp(self):
         file = os.path.join(os.path.dirname(__file__), 'ChangeLog',
@@ -126,7 +156,53 @@
 \trevision 1.91.  Fixes #354590
 """)
 
+    def testFindMultiple(self):
+        stdout = StringIO.StringIO()
+        c = cl.ChangeLog(stdout=stdout)
+        ret = c.parse(['-C', self.file, 'find', 'gst', ])
+        self.assertEquals(ret, 0)
+        self.assertEquals(stdout.getvalue(),
+"""2006-09-07  Thomas Vander Stichele  <thomas at apestaart dot org>
 
+\tpatch by: Michael Smith <msmith at fluendo dot com>
+
+\t* gst/tcp/gstmultifdsink.c: (is_sync_frame),
+\t(gst_multi_fd_sink_client_queue_buffer),
+\t(gst_multi_fd_sink_new_client):
+\t* tests/check/elements/multifdsink.c: (GST_START_TEST),
+\t(multifdsink_suite):
+\t  Fix implementation of sync-method 'next-keyframe'
+\t  Closes #354594
+
+2006-09-07  Thomas Vander Stichele  <thomas at apestaart dot org>
+
+\tpatch by: Wim Taymans <wim at fluendo dot com>
+
+\t* ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_start):
+\tThis patch removes the RANDOM flag that was incorrectly introduced with
+\trevision 1.91.  Fixes #354590
+""")
+
+        stdout = StringIO.StringIO()
+        c = cl.ChangeLog(stdout=stdout)
+        ret = c.parse(['-C', self.file, 'find', 'gst', 'gnomevfs', ])
+        self.assertEquals(ret, 0)
+        self.assertEquals(stdout.getvalue(),
+"""2006-09-07  Thomas Vander Stichele  <thomas at apestaart dot org>
+
+\tpatch by: Wim Taymans <wim at fluendo dot com>
+
+\t* ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_start):
+\tThis patch removes the RANDOM flag that was incorrectly introduced with
+\trevision 1.91.  Fixes #354590
+""")
+
+        stdout = StringIO.StringIO()
+        c = cl.ChangeLog(stdout=stdout)
+        ret = c.parse(['-C', self.file, 'find', 'gst', 'jpegdec', ])
+        self.assertEquals(ret, 0)
+        self.assertEquals(stdout.getvalue(), "")
+
 class TestCheckin(common.SVNTestCase):
     def setUp(self):
         common.SVNTestCase.setUp(self)
