From: Zac Medico Date: Thu, 4 Oct 2007 06:35:05 +0000 (-0000) Subject: Make repoman bail out if it is unable to properly X-Git-Tag: v2.2_pre1~731 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=2d0a0f6b0c7cf9ef01518c8596e58daefbb61a87;p=portage.git Make repoman bail out if it is unable to properly access ebuild metadata for some reason. In this case it's impossible to generate a Manifest and therefore the --force option has to be disabled. svn path=/main/trunk/; revision=7914 --- diff --git a/bin/repoman b/bin/repoman index 90c3be973..a5e832405 100755 --- a/bin/repoman +++ b/bin/repoman @@ -8,10 +8,12 @@ # that last one is tricky because multiple profiles need to be checked. import errno +from itertools import izip import os import shutil import sys import signal +import stat import re import tempfile @@ -70,7 +72,10 @@ from portage.manifest import Manifest from portage.exception import ParseError from portage.process import find_binary, spawn -from portage.output import bold, darkgreen, darkred, green, nocolor, red, turquoise, yellow +from portage.output import bold, create_color_func, darkgreen, \ + green, nocolor, red, turquoise, yellow + +bad = create_color_func("BAD") from commands import getstatusoutput from fileinput import input @@ -169,6 +174,7 @@ qahelp={ "KEYWORDS.stupid":"Ebuilds that use KEYWORDS=-* instead of package.mask", "LICENSE.missing":"Ebuilds that have a missing or empty LICENSE variable", "DESCRIPTION.missing":"Ebuilds that have a missing or empty DESCRIPTION variable", + "EAPI.unsupported":"Ebuilds that have an unsupported EAPI version (you must upgrade portage)", "SLOT.missing":"Ebuilds that have a missing or empty SLOT variable", "HOMEPAGE.missing":"Ebuilds that have a missing or empty HOMEPAGE variable", "DEPEND.bad":"User-visible ebuilds with bad DEPEND settings (matched against *visible* ebuilds)", @@ -258,6 +264,9 @@ for x in missingvars: valid_restrict = frozenset(["binchecks", "bindist", "fetch", "mirror", "primaryuri", "strip", "test", "userpriv"]) +# file.executable +no_exec = frozenset(["Manifest","ChangeLog","metadata.xml"]) + verbose=0 quiet=0 @@ -405,6 +414,11 @@ if mymode=="last" or (mymode=="lfull"): if mymode == "commit": myoptions.pop("--ignore-masked", None) +# Set this to False when an extraordinary issue (generally +# something other than a QA issue) makes it impossible to +# commit (like if Manifest generation fails). +can_force = True + from portage import normalize_path isCvs=False myreporoot=None @@ -824,14 +838,40 @@ for x in scanlist: checkdirlist=os.listdir(checkdir) ebuildlist=[] + ebuild_metadata = {} for y in checkdirlist: - if y[-7:]==".ebuild": - ebuildlist.append(y[:-7]) - if y in ["Manifest","ChangeLog","metadata.xml"]: - if os.stat(checkdir+"/"+y)[0] & 0x0248: + if y in no_exec and \ + stat.S_IMODE(os.stat(os.path.join(checkdir, y)).st_mode) & 0111: stats["file.executable"] += 1 - fails["file.executable"].append(checkdir+"/"+y) - digestlist=[] + fails["file.executable"].append(os.path.join(checkdir, y)) + if y.endswith(".ebuild"): + pf = y[:-7] + ebuildlist.append(pf) + cpv = "%s/%s" % (catdir, pf) + try: + myaux = dict(izip(allvars, portdb.aux_get(cpv, allvars))) + except KeyError: + stats["ebuild.syntax"] += 1 + fails["ebuild.syntax"].append(os.path.join(x, y)) + continue + except IOError: + stats["ebuild.output"] += 1 + fails["ebuild.output"].append(os.path.join(x, y)) + continue + if not portage.eapi_is_supported(myaux["EAPI"]): + stats["EAPI.unsupported"] += 1 + fails["EAPI.unsupported"].append(os.path.join(x, y)) + continue + ebuild_metadata[pf] = myaux + + if len(ebuild_metadata) != len(ebuildlist): + # If we can't access all the metadata then it's totally unsafe to + # commit since there's no way to generate a correct Manifest. + # Do not try to do any more QA checks on this package since missing + # metadata leads to false positives for several checks, and false + # positives confuse users. + can_force = False + continue for y in checkdirlist: for c in y.strip(os.path.sep): @@ -1094,17 +1134,8 @@ for x in scanlist: stats["ebuild.namenomatch"]=stats["ebuild.namenomatch"]+1 fails["ebuild.namenomatch"].append(x+"/"+y+".ebuild") continue - try: - myaux = dict( - zip(allvars, portdb.aux_get(os.path.join(catdir, y), allvars))) - except KeyError: - stats["ebuild.syntax"]=stats["ebuild.syntax"]+1 - fails["ebuild.syntax"].append(x+"/"+y+".ebuild") - continue - except IOError: - stats["ebuild.output"]=stats["ebuild.output"]+1 - fails["ebuild.output"].append(x+"/"+y+".ebuild") - continue + + myaux = ebuild_metadata[y] # Test for negative logic and bad words in the RESTRICT var. #for x in myaux[allvars.index("RESTRICT")].split(): @@ -1570,11 +1601,13 @@ if mymode!="commit": if quiet < 1: print else: - if dofail and "--force" in myoptions and "--pretend" not in myoptions: + if dofail and can_force and "--force" in myoptions and "--pretend" not in myoptions: print green("RepoMan sez:") + \ " \"You want to commit even with these QA issues?\n" + \ " I'll take it this time, but I'm not happy.\"\n" elif dofail: + if "--force" in myoptions: + print bad("The --force option has been disabled due to extraordinary issues.") print turquoise("Please fix these important QA issues first.") print green("RepoMan sez:"),"\"Make your QA payment on time and you'll never see the likes of me.\"\n" sys.exit(1) diff --git a/man/repoman.1 b/man/repoman.1 index edbc7afd0..81d9e6a08 100644 --- a/man/repoman.1 +++ b/man/repoman.1 @@ -93,6 +93,9 @@ Syntax error in DEPEND (usually an extra/missing space/parenthesis) .B DESCRIPTION.missing Ebuilds that have a missing or empty DESCRIPTION variable .TP +.B EAPI.unsupported +Ebuilds that have an unsupported EAPI version (you must upgrade portage) +.TP .B HOMEPAGE.missing Ebuilds that have a missing or empty HOMEPAGE variable .TP