Bug #201498 - Use desktop-file-validate to validate *.desktop
authorZac Medico <zmedico@gentoo.org>
Fri, 28 Dec 2007 16:07:40 +0000 (16:07 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 28 Dec 2007 16:07:40 +0000 (16:07 -0000)
files inside ${FILESDIR} and generate a "desktop.invalid"
qa warning if an error is detected. Thanks to Betelgeuse for
the initial patch. (trunk r9059)

svn path=/main/branches/2.1.2/; revision=9073

bin/repoman

index aa7ae56b43f6d22c3720d8dde777fec98e04770f..9935649fa8f6ced8f2e4ab4733f614bd20d84fb2 100755 (executable)
@@ -7,6 +7,7 @@
 # Then, check to make sure deps are satisfiable (to avoid "can't find match for" problems)
 # that last one is tricky because multiple profiles need to be checked.
 
+import commands
 import errno
 import formatter
 from itertools import izip
@@ -142,6 +143,7 @@ options=repoman_options.keys()
 
 qahelp={
        "CVS/Entries.IO_error":"Attempting to commit, and an IO error was encountered access the Entries file",
+       "desktop.invalid":"desktop-file-validate reports errors in a *.desktop file",
        "digest.partial":"Digest files do not contain all corresponding URI elements",
        "digest.assumed":"Existing digest must be assumed correct (Package level only)",
        "digestentry.unused":"Digest/Manifest entry has no matching SRC_URI entry",
@@ -219,6 +221,7 @@ qawarnings=[
 "ebuild.nostable",
 "ebuild.allmasked",
 "ebuild.nesteddie",
+"desktop.invalid",
 "digest.assumed",
 "digest.missing",
 "digestentry.unused",
@@ -842,6 +845,10 @@ else:
 stats={}
 fails={}
 
+# provided by the desktop-file-utils package
+desktop_file_validate = find_binary("desktop-file-validate")
+desktop_pattern = re.compile(r'.*\.desktop$')
+
 for x in qacats:
        stats[x]=0
        fails[x]=[]
@@ -1314,8 +1321,10 @@ for x in scanlist:
                # use filesdirlist as a stack, appending directories as needed so people can't hide > 20k files in a subdirectory.
                while filesdirlist:
                        y = filesdirlist.pop(0)
+                       relative_path = os.path.join(x, "files", y)
+                       full_path = os.path.join(repodir, relative_path)
                        try:
-                               mystat = os.stat(checkdir+"/files/"+y)
+                               mystat = os.stat(full_path)
                        except OSError, oe:
                                if oe.errno == 2:
                                        # don't worry about it.  it likely was removed via fix above.
@@ -1340,6 +1349,23 @@ for x in scanlist:
                                        fails["file.name"].append("%s/files/%s: char '%s'" % (checkdir, y, c))
                                        break
 
+                       if desktop_file_validate and desktop_pattern.match(y):
+                               status, cmd_output = commands.getstatusoutput(
+                                       "'%s' '%s'" % (desktop_file_validate, full_path))
+                               if os.WIFEXITED(status) and os.WEXITSTATUS(status) != os.EX_OK:
+                                       # Note: in the future we may want to grab the
+                                       # warnings in addition to the errors. We're
+                                       # just doing errors now since we don't want
+                                       # to generate too much noise at first.
+                                       error_re = re.compile(r'.*\s*error:\s*(.*)')
+                                       for line in cmd_output.splitlines():
+                                               error_match = error_re.match(line)
+                                               if error_match is None:
+                                                       continue
+                                               stats["desktop.invalid"] += 1
+                                               fails["desktop.invalid"].append(
+                                                       relative_path + ': %s' % error_match.group(1))
+
        del mydigests
 
        if "ChangeLog" not in checkdirlist: