validate_desktop_entry: filter more kde noise
authorZac Medico <zmedico@gentoo.org>
Sun, 26 Aug 2012 21:45:05 +0000 (14:45 -0700)
committerZac Medico <zmedico@gentoo.org>
Sun, 26 Aug 2012 21:45:49 +0000 (14:45 -0700)
This will fix bug #432862.

pym/portage/util/_desktop_entry.py

index 8c760c0435de9791b06c1420de8a915c82a4f4ce..deb0a35e7d46f02852c1feb194c4857628b76142 100644 (file)
@@ -2,6 +2,7 @@
 # Distributed under the terms of the GNU General Public License v2
 
 import io
+import re
 import subprocess
 import sys
 
@@ -11,6 +12,7 @@ except ImportError:
        from ConfigParser import Error as ConfigParserError, RawConfigParser
 
 from portage import _encodings, _unicode_encode, _unicode_decode
+from portage.util import writemsg
 
 def parse_desktop_entry(path):
        """
@@ -39,11 +41,16 @@ def parse_desktop_entry(path):
 
        return parser
 
-_ignored_service_errors = (
-       'error: required key "Name" in group "Desktop Entry" is not present',
-       'error: key "Actions" is present in group "Desktop Entry", but the type is "Service" while this key is only valid for type "Application"',
-       'error: key "MimeType" is present in group "Desktop Entry", but the type is "Service" while this key is only valid for type "Application"',
-)
+_trivial_warnings = re.compile(r' looks redundant with value ')
+_ignore_kde_key_re = re.compile(r'^\s*(configurationType\s*=|Type\s*=\s*Service)')
+_ignore_kde_types = frozenset(
+       ["AkonadiAgent", "AkonadiResource", "Service", "ServiceType"])
+
+# kdebase-data installs files with [Currency Code] sections
+# in /usr/share/locale/currency
+# kdepim-runtime installs files with [Plugin] and [Wizard]
+# sections in /usr/share/apps/akonadi/{plugins,accountwizard}
+_ignore_kde_sections = ("Currency Code", "Plugin", "Wizard")
 
 def validate_desktop_entry(path):
        args = ["desktop-file-validate", path]
@@ -56,10 +63,19 @@ def validate_desktop_entry(path):
        proc.wait()
 
        if output_lines:
+               # Ignore kde extensions for bug #414125 and bug #432862.
                try:
                        desktop_entry = parse_desktop_entry(path)
                except ConfigParserError:
-                       pass
+                       with io.open(_unicode_encode(path,
+                               encoding=_encodings['fs'], errors='strict'),
+                               mode='r', encoding=_encodings['repo.content'],
+                               errors='replace') as f:
+                               for line in f:
+                                       if _ignore_kde_key_re.match(line):
+                                               # Ignore kde extensions for bug #432862.
+                                               del output_lines[:]
+                                               break
                else:
                        if desktop_entry.has_section("Desktop Entry"):
                                try:
@@ -67,13 +83,29 @@ def validate_desktop_entry(path):
                                except ConfigParserError:
                                        pass
                                else:
-                                       if entry_type == "Service":
-                                               # Filter false errors for Type=Service (bug #414125).
-                                               filtered_output = []
-                                               for line in output_lines:
-                                                       if line[len(path)+2:] in _ignored_service_errors:
-                                                               continue
-                                                       filtered_output.append(line)
-                                               output_lines = filtered_output
+                                       if entry_type in _ignore_kde_types:
+                                               del output_lines[:]
+                               try:
+                                       desktop_entry.get("Desktop Entry", "Hidden")
+                               except ConfigParserError:
+                                       pass
+                               else:
+                                       # The "Hidden" key appears to be unique to special kde
+                                       # service files (which don't validate well), installed
+                                       # in /usr/share/kde4/services/ by packages like
+                                       # nepomuk-core and kurifilter-plugins.
+                                       del output_lines[:]
+                       for section in _ignore_kde_sections:
+                               if desktop_entry.has_section(section):
+                                       del output_lines[:]
+
+       if output_lines:
+               output_lines = [line for line in output_lines
+                       if _trivial_warnings.search(line) is None]
 
        return output_lines
+
+if __name__ == "__main__":
+       for arg in sys.argv[1:]:
+               for line in validate_desktop_entry(arg):
+                       writemsg(line + "\n", noiselevel=-1)