I accidentally used a unicode "punctuation space" in my package.accept_keywords file. When I ran eix-test-obsolete, it repeated the same warning message 18 times. Only one warning is needed. The warning message was: -- invalid line 245 in /etc/portage/package.accept_keywords: "=dev-libs/libclc-0.2.0_pre20160209 ~amd64 ..." garbage ( ~amd64) at end of version "0.2.0_pre20160209 ~amd64" accepting version anyway (The character before the ~ is a unicode punctuation space, not a normal space.)
eix-test-obsolete is just a wrapper for eix which, roughly speaking, calls first eix -te and then eix -Te several times with successively various REDUNDANT_IF_* tests disabled. Of course, eix does not know that it was called previously, and just will spit the warning every time. If you use "eix-test-obsolete quick" (or simply eix -tTe), then eix is called only twice (or once), and you see the warning also only twice (once), but of course the output has correspondingly less information. There is not much which can be changed in this structure (unless one would code a completely independent "obsolete" test).
I added the option --nowarn which suppresses certain warnings and added it to all calls of eix in eix-test-obsolte (except for the first call eix -t). There can still be some duplicate output from eix -t, because files are read twice: Once to get the portage config and once to check for -t redundancy. It would be unnatural to suppress warnings, because they can be disjoint, depending on your configuration.
The fix is in the git master branch on github (>=eix-0.31.10). A live ebuild for eix is in the mv overlay.
I slept it over and decided to even avoid duplicate output: Warnings are now cached and printed only once.