summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2007-10-04 06:35:05 +0000
committerZac Medico <zmedico@gentoo.org>2007-10-04 06:35:05 +0000
commit2d0a0f6b0c7cf9ef01518c8596e58daefbb61a87 (patch)
treea9aee0d3eee0b0362655aa25a4d11e655ff7bb9f
parent168a5e7c2bd613242615e864d4e5f9dbcc409e32 (diff)
downloadportage-2d0a0f6b0c7cf9ef01518c8596e58daefbb61a87.tar.gz
portage-2d0a0f6b0c7cf9ef01518c8596e58daefbb61a87.tar.bz2
portage-2d0a0f6b0c7cf9ef01518c8596e58daefbb61a87.zip
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
-rwxr-xr-xbin/repoman71
-rw-r--r--man/repoman.13
2 files changed, 55 insertions, 19 deletions
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