import time
import platform
-from itertools import izip
+from itertools import chain, izip
from stat import S_ISDIR, ST_CTIME
try:
"desktop.invalid":"desktop-file-validate reports errors in a *.desktop file",
"ebuild.invalidname":"Ebuild files with a non-parseable or syntactically incorrect name (or using 2.1 versioning extensions)",
"ebuild.namenomatch":"Ebuild files that do not have the same name as their parent directory",
+ "changelog.ebuildadded":"An ebuild was added but the ChangeLog was not modified",
"changelog.missing":"Missing ChangeLog files",
"ebuild.notadded":"Ebuilds that exist but have not been added to cvs",
"ebuild.patches":"PATCHES variable should be a bash array to ensure white space safety",
print green("\nRepoMan scours the neighborhood...")
new_ebuilds = set()
+modified_changelogs = set()
if vcs == "cvs":
mycvstree = cvstree.getentries("./", recursive=1)
+ mychanged = cvstree.findchanged(mycvstree, recursive=1, basedir="./")
mynew = cvstree.findnew(mycvstree, recursive=1, basedir="./")
+
+if vcs == "svn":
+ svnstatus = os.popen("svn status").readlines()
+ mychanged = [ "./" + elem.split()[-1:][0] for elem in svnstatus if elem and elem[:1] in "MR" ]
+ mynew = [ "./" + elem.split()[-1:][0] for elem in svnstatus if elem.startswith("A") ]
+
+if vcs:
new_ebuilds.update(x for x in mynew if x.endswith(".ebuild"))
- del mycvstree, mynew
+ modified_changelogs.update(x for x in chain(mychanged, mynew) \
+ if os.path.basename(x) == "ChangeLog")
have_masked = False
dofail = 0
del metadata_bad
+ changelog_path = "ChangeLog"
+ if repolevel < 3:
+ changelog_path = os.path.join(pkgdir, changelog_path)
+ if repolevel < 2:
+ changelog_path = os.path.join(catdir, changelog_path)
+ changelog_path = os.path.join(".", changelog_path)
+ changelog_modified = changelog_path in modified_changelogs
+
allmasked = True
for y in ebuildlist:
relative_path = os.path.join(x, y + ".ebuild")
full_path = os.path.join(repodir, relative_path)
+ ebuild_path = y + ".ebuild"
+ if repolevel < 3:
+ ebuild_path = os.path.join(pkgdir, ebuild_path)
+ if repolevel < 2:
+ ebuild_path = os.path.join(catdir, ebuild_path)
+ ebuild_path = os.path.join(".", ebuild_path)
+ if not changelog_modified and ebuild_path in new_ebuilds:
+ stats['changelog.ebuildadded'] += 1
+ fails['changelog.ebuildadded'].append(relative_path)
+
if stat.S_IMODE(os.stat(full_path).st_mode) & 0111:
stats["file.executable"] += 1
fails["file.executable"].append(x+"/"+y+".ebuild")
not keyword.startswith("-"):
stable_keywords.append(keyword)
if stable_keywords:
- ebuild_path = y + ".ebuild"
- if repolevel < 3:
- ebuild_path = os.path.join(pkgdir, ebuild_path)
- if repolevel < 2:
- ebuild_path = os.path.join(catdir, ebuild_path)
- ebuild_path = os.path.join(".", ebuild_path)
if ebuild_path in new_ebuilds:
stable_keywords.sort()
stats["KEYWORDS.stable"] += 1
sys.exit(1)
if vcs == "cvs":
- mycvstree=portage.cvstree.getentries("./",recursive=1)
- mychanged=portage.cvstree.findchanged(mycvstree,recursive=1,basedir="./")
- mynew=portage.cvstree.findnew(mycvstree,recursive=1,basedir="./")
+ if myautoadd:
+ mycvstree = cvstree.getentries("./", recursive=1)
+ mychanged = cvstree.findchanged(mycvstree, recursive=1, basedir="./")
+ mynew = cvstree.findnew(mycvstree, recursive=1, basedir="./")
myremoved=portage.cvstree.findremoved(mycvstree,recursive=1,basedir="./")
bin_blob_pattern = re.compile("^-kb$")
no_expansion = set(portage.cvstree.findoption(mycvstree, bin_blob_pattern,
if vcs == "svn":
- svnstatus = os.popen("svn status").readlines()
- mychanged = [ elem.rstrip()[7:] for elem in svnstatus if elem and elem[:1] in "MR" ]
- mynew = [ elem.rstrip()[7:] for elem in svnstatus if elem.startswith("A") ]
- myremoved = [ elem.rstrip()[7:] for elem in svnstatus if elem.startswith("D") ]
+ if myautoadd:
+ svnstatus = os.popen("svn status").readlines()
+ mychanged = [ "./" + elem.split()[-1:][0] for elem in svnstatus if elem and elem[:1] in "MR" ]
+ mynew = [ "./" + elem.split()[-1:][0] for elem in svnstatus if elem.startswith("A") ]
+ myremoved = [ "./" + elem.split()[-1:][0] for elem in svnstatus if elem.startswith("D") ]
# in contrast to CVS, SVN expands nothing by default.
# bin_blobs historically
# were just there to see what files need to be checked for
# For files with multiple props set, props are delimited by newlines,
# so exclude lines that don't contain " - " since each of those lines
# only a contain props for a file listed on a previous line.
- expansion = set(prop.split(" - ")[0] \
+ expansion = set("./" + prop.split(" - ")[0] \
for prop in props if " - " in prop)
if vcs:
if self._default_exit(packager) == os.EX_OK and \
self.opts.buildpkgonly:
# Need to call "clean" phase for buildpkgonly mode
+ portage.elog.elog_process(self.pkg.cpv, self.settings)
phase = "clean"
clean_phase = EbuildPhase(background=self.background,
pkg=self.pkg, phase=phase,
blocker_cache[cpv] = \
blocker_cache.BlockerData(counter, blocker_atoms)
if blocker_atoms:
- for myatom in blocker_atoms:
- blocker = Blocker(atom=portage.dep.Atom(myatom),
- eapi=pkg.metadata["EAPI"], root=myroot)
- self._blocker_parents.add(blocker, pkg)
+ try:
+ for atom in blocker_atoms:
+ blocker = Blocker(atom=portage.dep.Atom(atom),
+ eapi=pkg.metadata["EAPI"], root=myroot)
+ self._blocker_parents.add(blocker, pkg)
+ except portage.exception.InvalidAtom, e:
+ depstr = " ".join(vardb.aux_get(pkg.cpv, dep_keys))
+ show_invalid_depstring_notice(
+ pkg, depstr, "Invalid Atom: %s" % (e,))
+ return False
for cpv in stale_cache:
del blocker_cache[cpv]
blocker_cache.flush()
out = self.out
if not self._isatty:
out.write(self._format_msg(msg) + self._term_codes['newline'])
+ self._displayed = True
return
if self._displayed:
while True:
self._schedule()
- if not self._jobs or merge_queue:
+ if not (self._jobs or merge_queue):
break
if self._poll_event_handlers:
self._poll_loop()
print colorize("WARN", "!!!") + " existing preserved libs:"
plibdata = vardbapi.plib_registry.getPreservedLibs()
linkmap = vardbapi.linkmap
+
+ consumer_map = {}
+ search_for_owners = set()
for cpv in plibdata:
- print colorize("WARN", ">>>") + " package: %s" % cpv
for f in plibdata[cpv]:
- print colorize("WARN", " * ") + " - %s" % f
+ if f in consumer_map:
+ continue
consumers = list(linkmap.findConsumers(f))
consumers.sort()
- owners = vardbapi._owners.getFileOwnerMap(consumers[:MAX_DISPLAY+2])
+ consumer_map[f] = consumers
+ search_for_owners.update(consumers[:MAX_DISPLAY+1])
+
+ owners = vardbapi._owners.getFileOwnerMap(search_for_owners)
+
+ for cpv in plibdata:
+ print colorize("WARN", ">>>") + " package: %s" % cpv
+ for f in plibdata[cpv]:
+ print colorize("WARN", " * ") + " - %s" % f
+ consumers = consumer_map[f]
for c in consumers[:MAX_DISPLAY]:
print colorize("WARN", " * ") + " used by %s (%s)" % (c, ", ".join([x.mycpv for x in owners[c]]))
if len(consumers) == MAX_DISPLAY + 1:
all_logentries[key], _preserve_logentries[key] = phasefilter(all_logentries[key])
my_elog_classes = set(mysettings.get("PORTAGE_ELOG_CLASSES", "").split())
+ logsystems = {}
+ for token in mysettings.get("PORTAGE_ELOG_SYSTEM", "").split():
+ if ":" in token:
+ s, levels = token.split(":", 1)
+ levels = levels.split(",")
+ else:
+ s = token
+ levels = ()
+ levels_set = logsystems.get(s)
+ if levels_set is None:
+ levels_set = set()
+ logsystems[s] = levels_set
+ levels_set.update(levels)
for key in all_logentries:
default_logentries = filter_loglevels(all_logentries[key], my_elog_classes)
default_logentries, default_fulllog)
# pass the processing to the individual modules
- logsystems = mysettings["PORTAGE_ELOG_SYSTEM"].split()
- for s in logsystems:
+ for s, levels in logsystems.iteritems():
# allow per module overrides of PORTAGE_ELOG_CLASSES
- if ":" in s:
- s, levels = s.split(":", 1)
- levels = levels.split(",")
+ if levels:
mod_logentries = filter_loglevels(all_logentries[key], levels)
mod_fulllog = _combine_logentries(mod_logentries)
else: