--- portage-2.0.51.22/bin/repoman 2005-10-08 00:43:20.000000000 +0900 +++ portage-2.0.53_rc4/bin/repoman 2005-10-06 02:49:00.000000000 +0900 @@ -1,7 +1,7 @@ #!/usr/bin/python -O # Copyright 1999-2005 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-src/portage/bin/repoman,v 1.98.2.22 2005/05/18 15:19:52 jstubbs Exp $ +# $Id: /var/cvsroot/gentoo-src/portage/bin/repoman,v 1.98.2.23 2005/06/18 01:00:43 vapier Exp $ # Next to do: dep syntax checking in mask files # Then, check to make sure deps are satisfiable (to avoid "can't find match for" problems) @@ -13,6 +13,13 @@ sys.path = ["/usr/lib/portage/pym"]+sys.path version="1.2" +allowed_filename_chars="a-zA-Z0-9._-+:" +allowed_filename_chars_set = {} +map(allowed_filename_chars_set.setdefault, map(chr, range(ord('a'), ord('z')+1))) +map(allowed_filename_chars_set.setdefault, map(chr, range(ord('A'), ord('Z')+1))) +map(allowed_filename_chars_set.setdefault, map(chr, range(ord('0'), ord('9')+1))) +map(allowed_filename_chars_set.setdefault, map(chr, map(ord, [".", "-", "_", "+", ":"]))) + import string,signal,re,pickle,tempfile import portage @@ -21,6 +28,8 @@ import portage_dep import cvstree import time +import codecs + from output import * #bold, darkgreen, darkred, green, red, turquoise, yellow @@ -85,6 +94,8 @@ "filedir.missing":"Package lacks a files directory", "file.executable":"Ebuilds, digests, metadata.xml, Manifest, and ChangeLog do note need the executable bit", "file.size":"Files in the files directory must be under 20k", + "file.name":"File/dir name must be composed of only the following chars: %s " % allowed_filename_chars, + "file.UTF8":"File is not UTF8 compliant", "KEYWORDS.missing":"Ebuilds that have a missing KEYWORDS variable", "LICENSE.missing":"Ebuilds that have a missing LICENSE variable", "DESCRIPTION.missing":"Ebuilds that have a missing DESCRIPTION variable", @@ -663,6 +674,29 @@ stats["file.executable"] += 1 fails["file.executable"].append(checkdir+"/"+y) digestlist=[] + + for y in checkdirlist: + for c in y.strip(os.path.sep): + if c not in allowed_filename_chars_set: + stats["file.name"] += 1 + fails["file.name"].append("%s/%s: char '%s'" % (checkdir, y, c)) + break + + if not (y in ("ChangeLog", "metadata.xml") or y.endswith(".ebuild")): + continue + try: + line = 1 + for l in codecs.open(checkdir+"/"+y, "r", "utf8"): + line +=1 + except UnicodeDecodeError, ue: + stats["file.UTF8"] += 1 + s = ue.object[:ue.start] + l2 = s.count("\n") + line += l2 + if l2 != 0: + s = s[s.rfind("\n") + 1:] + fails["file.UTF8"].append("%s/%s: line %i, just after: '%s'" % (checkdir, y, line, s)) + if isCvs: try: mystat=os.stat(checkdir+"/files")[0] @@ -792,6 +826,8 @@ else: raise oe if S_ISDIR(mystat.st_mode): + if y == "CVS": + continue for z in os.listdir(checkdir+"/files/"+y): filesdirlist.append(y+"/"+z) # current policy is no files over 20k, this is the check. @@ -799,6 +835,13 @@ stats["file.size"] += 1 fails["file.size"].append("("+ str(mystat.st_size/1024) + "K) "+x+"/files/"+y) + for c in os.path.basename(y.rstrip(os.path.sep)): + if c not in allowed_filename_chars_set: + stats["file.name"] += 1 + fails["file.name"].append("%s/files/%s: char '%s'" % (checkdir, y, c)) + break + + if "ChangeLog" not in checkdirlist: stats["changelog.missing"]+=1 fails["changelog.missing"].append(x+"/ChangeLog") @@ -1412,6 +1455,8 @@ rValue = os.system(gpgcmd+" "+filename) if rValue == 0: os.rename(filename+".asc", filename) + else: + print "!!! gpg exited with '" + str(rValue) + "' status" return rValue if myheaders or myupdates or myremoved or mynew: