From 154023c766a842e07b26136040aacb8644c9f6af Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Fri, 28 Dec 2007 16:07:40 +0000 Subject: [PATCH] Bug #201498 - Use desktop-file-validate to validate *.desktop 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 | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/bin/repoman b/bin/repoman index aa7ae56b4..9935649fa 100755 --- a/bin/repoman +++ b/bin/repoman @@ -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: -- 2.26.2