fi
# Smart FileSystem Permissions
if hasq sfperms $FEATURES; then
+ local i
#note not space-safe
for i in $(find "${ED}" -type f -perm -4000); do
- ebegin ">>> SetUID: [chmod go-r] $i "
- chmod go-r "$i"
- eend $?
+ if [ -n "$(find "$i" -perm -2000)" ] ; then
+ ebegin ">>> SetUID and SetGID: [chmod o-r] /${i#${D}}"
+ chmod o-r "$i"
+ eend $?
+ else
+ ebegin ">>> SetUID: [chmod go-r] /${i#${D}}"
+ chmod go-r "$i"
+ eend $?
+ fi
done
#note not space-safe
for i in $(find "${ED}" -type f -perm -2000); do
- ebegin ">>> SetGID: [chmod o-r] $i "
- chmod o-r "$i"
- eend $?
+ if [ -n "$(find "$i" -perm -4000)" ] ; then
+ # This case is already handled
+ # by the SetUID check above.
+ true
+ else
+ ebegin ">>> SetGID: [chmod o-r] /${i#${D}}"
+ chmod o-r "$i"
+ eend $?
+ fi
done
fi
}
# that last one is tricky because multiple profiles need to be checked.
import codecs
+import commands
import errno
import formatter
import logging
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",
"ebuild.nostable",
"ebuild.allmasked",
"ebuild.nesteddie",
+"desktop.invalid",
"digest.assumed",
"digest.missing",
"digestentry.unused",
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]=[]
for y in filesdirlist:
if not y.startswith("digest-"):
continue
- if os.stat(checkdir+"/files/"+y)[0] & 0x0248:
+ relative_path = os.path.join(x, "files", y)
+ full_path = os.path.join(repodir, relative_path)
+ if stat.S_IMODE(os.stat(full_path).st_mode) & 0111:
stats["file.executable"] += 1
- fails["file.executable"].append(x+"/files/"+y)
+ fails["file.executable"].append(relative_path)
mykey = catdir + "/" + y[7:]
if y[7:] not in ebuildlist:
# 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.
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:
allmasked = True
for y in ebuildlist:
- if os.stat(checkdir+"/"+y+".ebuild")[0] & 0x0248:
+ relative_path = os.path.join(x, y + ".ebuild")
+ full_path = os.path.join(repodir, relative_path)
+ if stat.S_IMODE(os.stat(full_path).st_mode) & 0111:
stats["file.executable"] += 1
- fails["file.executable"].append(x+"/"+y+".ebuild")
+ fails["file.executable"].append(relative_path)
if (isCvs or isSvn) and y not in eadded:
#ebuild not added to cvs
stats["ebuild.notadded"]=stats["ebuild.notadded"]+1
for mybad in mybadrestrict:
fails["RESTRICT.invalid"].append(x+"/"+y+".ebuild: %s" % mybad)
# Syntax Checks
- relative_path = os.path.join(x, y + ".ebuild")
- full_path = os.path.join(repodir, relative_path)
f = open(full_path, 'rb')
try:
for check_name, e in run_checks(f, os.stat(full_path).st_mtime):