I posted this script to the pacman-dev list last time, but thought
maybe it should go here instead. It essentially looks for a number of
problems with Arch PKGBUILDs, repos, etc. Since the previous posting,
it now checks for a number of additional things including if a
PKGBUILD's dependency provisions can be met and if a PKGBUILD's
corresponding packages are in the Arch repo.

The script is attached. And here is the current output:


$ ./check_archlinux.py

WARNING: Please make sure you have a clean and up-to-date $ABSROOT when
         running this script; custom PKGBUILDs, etc. can cause false positives.

Using the following paths:
['/var/abs/core', '/var/abs/extra', '/var/abs/community', '/var/abs/unstable']

=======================
= Duplicate PKGBUILDs =
=======================
/community/devel/junit/PKGBUILD vs. /extra/devel/junit/PKGBUILD
/community/lib/perl-module-pluggable/PKGBUILD vs.
/extra/lib/perl-module-pluggable/PKGBUILD

=====================
= Missing PKGBUILDs =
=====================
/core/base/slocate/PKGBUILD
/extra/x11/emerald/PKGBUILD
/extra/x11/heliodor/PKGBUILD

=======================
= Mismatched Pkgnames =
=======================
oldstand-font vs. /community/x11/oldstand-fonts/PKGBUILD

========================
= Missing Dependencies =
========================
rafkill --> 'dumb'
perl-mail-dkim --> 'perl-mail-address'
icomplete --> 'vim-devel'
perl-mail-box --> 'perl-mail-address'
gensplash --> 'klibc-beyond'

===============================
= Unmet Dependency Provisions =
===============================
perl-datetime-format-mail --> 'perl-datetime>=0.1705'
fglrx-mm --> 'kernel26mm>=2.6.23.rc1.mm1'
perl-datetime-format-strptime --> 'perl-datetime>=0.1402'

=================
= Invalid Archs =
=================
Invalid arch: libofa --> x64_86
Invalid arch: kexec-tools --> 686
Invalid arch: mod_perl --> x64_86
Invalid arch: minicom --> !x86_64

=========================
= Missing Repo Packages =
=========================
kdenlive-svn-1727-1 in community/os/i686
xfce4-verve-plugin-svn-3591-2 in community/os/x86_64
parrot-0.4.16-1 in community/os/x86_64
virtualbox-modules-1.5.2-1 in community/os/x86_64
gnump3d-3.0-1 in community/os/x86_64
perl-gnome2-wnck-0.14-1 in community/os/x86_64
xmms2-0.2DrJekyll-3 in community/os/x86_64
xfwm4-svn-26296-3 in community/os/x86_64
xfce4-mailwatch-plugin-svn-3591-2 in community/os/x86_64
xfce4-taskmanager-svn-3591-1 in community/os/x86_64
hamlib-1.2.6.2-3 in community/os/x86_64
rtorrent-0.7.7-1 in community/os/x86_64
xfce4-battery-plugin-svn-3591-2 in community/os/x86_64
xfce4-screenshooter-plugin-svn-3591-2 in community/os/x86_64
xgl-0.0.1.20071007-1 in community/os/x86_64
libxfce4util-svn-26296-2 in community/os/x86_64
virtualbox-ose-additions-1.5.2-1 in community/os/x86_64
xfce4-rss-plugin-svn-3591-2 in community/os/x86_64
thunar-svn-26296-1 in community/os/x86_64
orage-svn-26296-2 in community/os/x86_64
xfce-mcs-manager-svn-26296-1 in community/os/x86_64
gambas-1.0.19-1 in community/os/x86_64
libgalago-0.5.2-2 in community/os/x86_64
biew-5.6.4-2 in community/os/x86_64
libgmail-0.1.8-1 in community/os/x86_64
xfce4-mixer-svn-26296-2 in community/os/x86_64
kdenlive-svn-1727-1 in community/os/x86_64
xfce-utils-svn-26296-1 in community/os/x86_64
xfce-notification-daemon-svn-3591-2 in community/os/x86_64
xfce4-session-svn-26296-1 in community/os/x86_64
xfce4-panel-svn-26319-2 in community/os/x86_64
assaultcube-0.93-2 in community/os/x86_64
xfce4-icon-theme-svn-26296-1 in community/os/x86_64
miscsplashutils-0.1.8-1 in community/os/x86_64
mlt-svn-1036-1 in community/os/x86_64
synce-libsynce-0.10.0-1 in community/os/x86_64
xfce4-sensors-plugin-svn-3591-2 in community/os/x86_64
opendx-4.4.4-1 in community/os/x86_64
fdlog-1.146-1 in community/os/x86_64
xfprint-svn-26296-1 in community/os/x86_64
gmailfs-0.8.0-1 in community/os/x86_64
xfce4-mpc-plugin-svn-3591-2 in community/os/x86_64
fusion-icon-20071111-1 in community/os/x86_64
xfdesktop-svn-26302-1 in community/os/x86_64
xfdesktop-svn-26302-1 in community/os/x86_64
opera-static-9.24-1 in community/os/x86_64
cross-arm-elf-gcc-base-4.2.2-1 in community/os/x86_64
mlt++-0.2.2-5 in community/os/x86_64
xfce4-weather-plugin-svn-3591-2 in community/os/x86_64
selinux-kernel26-2.6.22-2 in community/os/x86_64
xfce-mcs-plugins-svn-26320-2 in community/os/x86_64
xfce4-trigger-launcher-svn-26296-2 in community/os/x86_64
python-fuse-20071117-1 in community/os/x86_64
python-ctypes-1.0.1-2 in community/os/x86_64
cairo-java-1.0.8-1 in community/os/x86_64
grub-gfx-0.97-7 in community/os/x86_64
selinux-usr-policycoreutils-svn-2651-3 in community/os/x86_64
arch-firefox-search-0.3-1ff2.0.0.9 in community/os/x86_64
libxfce4menu-svn-26296-1 in community/os/x86_64
pygtk-docs-20070330-3 in community/os/x86_64
xfce4-netload-plugin-svn-3591-2 in community/os/x86_64
perl-list-moreutils-0.21-1 in community/os/x86_64
virtualbox-additions-1.5.2-1 in community/os/x86_64
thunar-volman-svn-3591-1 in community/os/x86_64
xfce4-notes-plugin-svn-3591-2 in community/os/x86_64
perl-poe-component-client-http-0.82-2.1 in community/os/x86_64
xfce4-xkb-plugin-svn-3591-2 in community/os/x86_64
xfce4-xfapplet-plugin-svn-3591-2 in community/os/x86_64
cross-arm-wince-cegcc-gdb-0.50-1 in community/os/x86_64
squeeze-svn-26296-1 in community/os/x86_64
ttf-linux-libertine-2.6-1 in community/os/x86_64
alsa-plugins-1.0.15-1 in community/os/x86_64
selinux-coreutils-6.9-3 in community/os/x86_64
libgtksourceviewmm2-1.9.3-1 in community/os/x86_64
beecrypt-4.1.2-3 in community/os/x86_64
perl6-pugs-6.2.13-1 in community/os/x86_64
xfce4-systemload-plugin-svn-3591-2 in community/os/x86_64
xfce4-websearch-plugin-svn-3591-1 in community/os/x86_64
xfce4-appfinder-svn-26296-1 in community/os/x86_64
xfburn-svn-26296-1 in community/os/x86_64
xarchiver-svn-26296-1 in community/os/x86_64
libxfcegui4-svn-26296-1 in community/os/x86_64
cross-arm-wince-cegcc-gdbstub-0.50-1 in community/os/x86_64
kio-sysinfo-1.8.2-2 in community/os/x86_64
scilab-4.1.1-2 in community/os/x86_64
xfce4-mount-plugin-svn-3591-2 in community/os/x86_64
virtualbox-ose-xorg-drivers-1.5.2-1 in community/os/x86_64
xfmedia-svn-26296-1 in community/os/x86_64
mingw32-gcc-4.2.1-2 in community/os/x86_64
exo-svn-26296-1 in community/os/x86_64
thunar-archive-plugin-svn-3591-2 in community/os/x86_64
ristretto-svn-3591-1 in community/os/x86_64
terminal-svn-26309-1 in community/os/x86_64
kernel26-xen-2.6.22-11 in community/os/x86_64
glib-java-0.4.2-1 in community/os/x86_64
abyssws-2.5-2 in community/os/x86_64
xfce-devtools-svn-26312-1 in community/os/x86_64
cube-2005_08_29-8 in community/os/x86_64
gensplash-1.4.2.1-1 in community/os/x86_64
pyxfce-svn-24810-1 in community/os/x86_64
virtualbox-ose-additions-modules-1.5.2-1 in community/os/x86_64
mousepad-svn-26296-1 in community/os/x86_64
thunar-media-tags-plugin-svn-3591-1 in community/os/x86_64
xfce4-clipman-plugin-svn-3591-2 in community/os/x86_64
capi4hylafax-010300-1  in extra/os/i686
ettercap-gtk-NG_0.7.3-2 in extra/os/i686
ion-3rc_20071109-1 in extra/os/i686
capi4hylafax-010300-1  in extra/os/x86_64
erlang-R11B.5-3 in extra/os/x86_64
ngrep-1.45-3.1 in extra/os/x86_64
libdatrie-0.1.2-1 in extra/os/x86_64
evilwm-1.0.0-1.1 in extra/os/x86_64
ssldump-0.9b3-6.1 in extra/os/x86_64
memprof-0.6-2 in extra/os/x86_64
ettercap-gtk-NG_0.7.3-2 in extra/os/x86_64
zsnes-1.51-2 in extra/os/x86_64
facile-1.1-6 in extra/os/x86_64
gcin-1.3.4-1 in extra/os/x86_64
ntop-3.3-3.1 in extra/os/x86_64
ttf-junicode-0.6.12-1 in extra/os/x86_64
slmodem-utils-2.9.11-14 in extra/os/x86_64
bigloo-3.0a-1 in extra/os/x86_64
centericq-4.21.0-5 in extra/os/x86_64
python-2.5.1-3 in extra/os/x86_64
valgrind-3.2.3-2 in extra/os/x86_64
intel-537-2.60.80.0-49 in extra/os/x86_64
tcptraceroute-1.5beta7-4.1 in extra/os/x86_64
ion-3rc_20071109-1 in extra/os/x86_64
madwifi-mm-0.9.3.1.99-1 in unstable/os/x86_64
tiacx-20071003-1 in unstable/os/x86_64
fglrx-mm-8.40.4-1 in unstable/os/x86_64
reiser4progs-1.0.6-1 in unstable/os/x86_64
tiacx-mm-20070101-1 in unstable/os/x86_64
nvidia-96xx-mm-1.0.9631-1 in unstable/os/x86_64
kernel26mm-2.6.23.mm1-1 in unstable/os/x86_64
wlan-ng26-mm-0.2.8-3 in unstable/os/x86_64
lirc-mm-0.8.1-2 in unstable/os/x86_64
nvidia-mm-100.14.11-1 in unstable/os/x86_64
ipw3945-mm-1.2.1-2 in unstable/os/x86_64

=========================
= Circular Dependencies =
=========================
gcc-libs>gcc>gcc-libs
libxcb>libxslt>python>tk>libx11>libxcb
gutenprint>gimp>gutenprint
libxslt>python>tk>libx11>libxcb>libxslt
shadow>pam>db>coreutils>shadow
flightgear-data>flightgear>flightgear-data
happy>ghc>happy
flightgear>flightgear-data>flightgear
eclipse-ecj>gcc-gcj>eclipse-ecj
libx11>libxcb>libxslt>python>tk>libx11
gcc-gcj>eclipse-ecj>gcc-gcj
texinfo>ncurses>glibc>gcc>binutils>texinfo
pam>db>coreutils>pam
tk>libx11>libxcb>libxslt>python>tk
tzdata>glibc>tzdata
bash>readline>glibc>bash
binutils>glibc>gcc>binutils
ncurses>glibc>bash>readline>ncurses
gimp>gutenprint>gimp
coreutils>pam>db>coreutils
glibc>tzdata>glibc
gcc>gcc-libs>gcc
db>coreutils>pam>db
python>tk>libx11>libxcb>libxslt>python
libxml2>python>tk>libx11>libxcb>libxslt>libxml2
readline>glibc>bash>readline

=====================
= Archlinux Summary =
=====================
Dirs with missing PKGBUILDs:     3
Duplicate PKGBUILDs:             2
Missing dependencies:            5
Unmet provisioned dependencies:  3
Circular dependencies:           26
Invalid archs:                   4
Missing packages in repos:       139
Mismatching PKGBUILD names:      1


Scott
#!/usr/bin/env python
#
# Written by Scott Horowitz <[EMAIL PROTECTED]>
#
# This script currently checks for a number of issues in your ABS tree:
#   1. Directories with missing PKGBUILDS
#   2. Duplicate PKGBUILDs
#   3. Missing (make-)dependencies, taking into account 'provides'
#   4. Provisioned dependencies
#   5. Circular dependencies
#   6. Valid arch's in PKGBUILDS
#   7. Missing packages in repo
#   8. PKGBUILD names that don't match their directory
#
# Todo:
#   1. Accommodate testing repo?


import os, sys, getopt
from ftplib import FTP

absroot = "/var/abs"
include_paths = ["core", "extra", "community", "unstable"]
valid_archs = ['i686', 'x86_64', 'ppc']
base_server = "ftp.archlinux.org" # Must be ftp site

pkgname_str = "pkgname="
dep_str = "depends=("
makedep_str = "makedepends=("
provides_str = "provides=("
arch_str = "arch=("
pkgver_str = "pkgver="
pkgrel_str = "pkgrel="
build_str = "build()"
source_str = "source="
url_str = "url="
math_symbols = (">=", "<=", "=", ">", "<")

def print_heading(heading):
	print ""
	print "=" * (len(heading) + 4)
	print "= " + heading + " ="
	print "=" * (len(heading) + 4)

def update_var(line, user_vars, pkgpath):
	if line.count("$") > 0:
		export_line = ""
		for var in user_vars:
			if line.count(var[0]) > 0:
				export_line = export_line + var[0] + "=" + var[1] + " && "
		if line.startswith("(") and line.endswith(")"):
			line = line[1:-1]
		export_line = export_line + "echo \"" + line + "\""
		line = os.popen(export_line).read().replace("\n", "")
	return line

def split_dep_prov_symbol(dep):
	# Splits 'foo>=1.2.3' into ('foo', '1.2.3', '>=')
	prov = ""
	symbol = ""
	for char in math_symbols:
		pos = dep.find(char)
		if pos > -1:
			prov = dep[pos:].replace(char, "")
			dep = dep[:pos]
			symbol = char
			break
	return (dep, prov, symbol)

def get_deps_provides_etc(pkgpath):
	# Parse PKGBUILD for name, depends, makedepends, provides, arch's, and version
	o = open(pkgpath, 'r')
	info = o.read()
	o.close()
	lines = info.split("\n")

	deps = []
	provides = []
	archs = []
	array = []
	user_vars = []
	continue_line = False
	for line in lines:
		line = line.strip()
		if line.find("#") > -1:
			line = line[:line.find("#")]
		if not continue_line:
			deps_line = False
			provides_line = False
			arch_line = False
		if line[:len(dep_str)] == dep_str:
			line = line.replace(dep_str,"")
			deps_line = True
		elif line[:len(makedep_str)] == makedep_str:
			line = line.replace(makedep_str,"")
			deps_line = True
		elif line[:len(provides_str)] == provides_str:
			line = line.replace(provides_str,"")
			provides_line = True
		elif line[:len(arch_str)] == arch_str:
			line = line.replace(arch_str, "")
			arch_line = True
		elif line[:len(pkgname_str)] == pkgname_str:
			pkgname = line.replace(pkgname_str, "")
			if pkgname.startswith("\"") and pkgname.endswith("\""):
				pkgname = pkgname[1:-1]
			pkgname = update_var(pkgname, user_vars, pkgpath)
			user_vars.append([pkgname_str, pkgname])
			line = ""
		elif line[:len(pkgver_str)] == pkgver_str:
			pkgver = line.replace(pkgver_str, "")
			if pkgver.startswith("\"") and pkgver.endswith("\""):
				pkgver = pkgver[1:-1]
			pkgver = update_var(pkgver, user_vars, pkgpath)
			user_vars.append([pkgver_str[:-1], pkgver])
			line = ""
		elif line[:len(pkgrel_str)] == pkgrel_str:
			pkgrel = line.replace(pkgrel_str, "")
			if pkgrel.startswith("\"") and pkgrel.endswith("\""):
				pkgrel = pkgrel[1:-1]
			pkgrel = update_var(pkgrel, user_vars, pkgpath)
			user_vars.append([pkgrel_str[:-1], pkgrel])
			line = ""
		elif line[:len(build_str)] == build_str:
			break
		elif not continue_line:
			if line.count("=") == 1 and line.count(" ") == 0 and line[:1] != "#" and \
			line[:len(source_str)] != source_str and line[:len(url_str)] != url_str:
				split = line.split("=")
				for item in range(len(split)):
					split[item] = update_var(split[item], user_vars, pkgpath)
				user_vars.append(split)
			line = ""
		if len(line) > 0:
			pos = line.find(")")
			if pos > -1:
				# strip everything from closing paranthesis on
				# since some PKGBUILDS have comments after the
				# depends array
				line = line[:pos]
			line = line.split(' ')
			for i in range(len(line)):
				line[i] = line[i].replace("'","").replace('"','')
				line[i] = update_var(line[i], user_vars, pkgpath)
				if len(line[i]) > 0:
					if deps_line:
						deps.append(line[i])
						array=deps
					elif provides_line:
						provides.append(line[i])
						array=provides
					elif arch_line:
						archs.append(line[i])
						array=archs
			if array and (array[-1] == "\\" or array[-1][-1] == "\\"):
				# continue reading deps/provides on next line
				if array[-1] == "\\":
					array.pop(-1)
				else:
					array[-1] = array[-1].replace("\\", "")
				continue_line = True
			else:
				continue_line = False
	version = pkgver + "-" + pkgrel
	return (pkgname, deps, provides, archs, version)

def get_pkgbuilds_in_dir(rootdir):
	# Recursively populates pkgbuild_deps and pkgbuild_paths 
	# dicts with info from each PKGBUILD found in absroot:
	if rootdir != absroot:
		if rootdir.count("/") == (absroot.count("/")+1) and rootdir not in include_paths:
			return
	else:
		print_heading("Duplicate PKGBUILDs")
	pkgfound = False
	for f in os.listdir(rootdir):
		fpath = rootdir + "/" + f
		if os.path.isdir(fpath):
			get_pkgbuilds_in_dir(fpath)
		elif f == 'PKGBUILD':
			pkgfound = True
			name = rootdir.split("/")[-1]
			if name in pkgbuild_deps:
				print fpath.replace(absroot, ""), "vs.", pkgbuild_paths[name].replace(absroot, "")
				problems[1] += 1
			else:
				(pkgname, deps, provides, archs, version) = get_deps_provides_etc(fpath)
				pkgbuild_deps[pkgname] = deps
				pkgbuild_paths[pkgname] = fpath
				pkgbuild_archs[pkgname] = archs
				pkgbuild_versions[pkgname] = version
				# We'll store the provides "backwards" compared to
				# the other dicts. This will make searching for
				# provides easier by being able to look up the
				# provide name itself and find what provides it
				for provide in provides:
					pkgbuild_provides[provide] = pkgname
				if pkgname != name:
					mismatches.append(pkgname + " vs. " + fpath.replace(absroot, ""))
					problems[7] += 1
	if not pkgfound and rootdir.replace(absroot, "").count("/") == 3:
		misses.append(rootdir.replace(absroot, "") + "/PKGBUILD")
		problems[0] += 1
	if rootdir == absroot:
		print_heading("Missing PKGBUILDs")
		for miss in misses:
			print miss
		print_heading("Mismatched Pkgnames")
		for mismatch in mismatches:
			print mismatch
	
def verify_depends():
	# Make sure all the deps we parsed are actually packages; also
	# ensure we meet dep provisions.
	print_heading("Missing Dependencies")
	unmet_provs = []
	for pkgname in pkgbuild_deps:
		deps = pkgbuild_deps[pkgname]
		deps_to_pop = []
		for i in range(len(deps)):
			dep = deps[i]
			(dep,prov, char) = split_dep_prov_symbol(dep)
			try:
				x = pkgbuild_deps[dep]
				# Check that prov is met too:
				if len(prov) > 0:
					compare_str = "vercmp " + pkgbuild_versions[dep] + " " + prov
					error = False
					if char == "<=":
						if int(os.popen(compare_str).read().replace("\n", "")) > 0:
							error = True
					elif char == ">=":
						if int(os.popen(compare_str).read().replace("\n", "")) < 0:
							error = True
					elif char == "=":
						if int(os.popen(compare_str).read().replace("\n", "")) != 0:
							error = True
					elif char == ">":
						if int(os.popen(compare_str).read().replace("\n", "")) <= 0:
							error = True
					elif char == "<":
						if int(os.popen(compare_str).read().replace("\n", "")) >= 0:
							error = True						
					if error:
						unmet_provs.append(pkgname + " --> '" + dep + char + prov + "'")
						problems[3] += 1
			except:
				# Check if a package provides this dep:
				try:
					x = pkgbuild_provides[dep]
				except:
					print pkgname + " --> '" + dep + "'"
					problems[2] += 1
				deps_to_pop.append(i)
		# Pop deps not found from end to beginning:
		while len(deps_to_pop) > 0:
			deps.pop(deps_to_pop[-1])
			deps_to_pop.pop(-1)
	print_heading("Unmet Dependency Provisions")
	for unmet_prov in unmet_provs:
		print unmet_prov

def verify_archs():
	print_heading("Invalid Archs")
	for pkgname in pkgbuild_archs:
		newarch = []
		archs = pkgbuild_archs[pkgname]
		for arch in archs:
			if arch not in valid_archs:
				print "Invalid arch:", pkgname, "-->", arch
				problems[5] += 1
			else:
				newarch.append(arch)
		if len(newarch) > 0:
			pkgbuild_archs[pkgname] = newarch
	
def verify_packages():
	print_heading("Missing Repo Packages")
	# Make sure packages exist in Arch repo(s):
	ftp = FTP(base_server)
	ftp.login()
	prev_wd = ""
	# Find all repos/archs; marching through them in order will greatly speed
	# up searching for ftp files:
	repos = []
	for pkgname in pkgbuild_paths:
		pkgrepo = pkgbuild_paths[pkgname].split("/")[-4]
		if not pkgrepo in repos:
			repos.append(pkgrepo)
	archs = []
	for pkgname in pkgbuild_archs:
		pkgarchs = pkgbuild_archs[pkgname]
		for arch in pkgarchs:
			if not arch in archs:
				archs.append(arch)
	for r in repos:
		for a in archs:
			for pkgname in pkgbuild_archs:
				repo = pkgbuild_paths[pkgname].split("/")[-4]
				if repo == r:
					archs = pkgbuild_archs[pkgname]
					pkgver_rel = pkgbuild_versions[pkgname]
					for arch in archs:
						if arch == a:
							# Check for file:
							wd = repo + "/os/" + arch
							if wd != prev_wd:
								ftpfiles = ftp.nlst(wd)
								prev_wd = wd
							fname_new = wd + "/" + pkgname + "-" + pkgver_rel + "-" + arch + ".pkg.tar.gz"
							fname_old = wd + "/" + pkgname + "-" + pkgver_rel + ".pkg.tar.gz"
							if fname_old not in ftpfiles and fname_new not in ftpfiles:
								print pkgname + "-" + pkgver_rel + " in " + wd
								problems[6] += 1
	ftp.quit()
	
def update_paths(paths, dep, dep2):
	# Update paths by appending new paths with dep2
	# based on all the different ways we could get
	# to dep2:
	for i in range(len(paths)):
		array = paths[i].split(">")
		if array[-1] == dep:
			paths.append(paths[i] + ">" + dep2)

def check_name_in_recursive_deps(pkgname):
	# Retrieve all recursive dependencies from a package and
	# determines if pkgname is found in one of its deps.
	recursive_deps = []
	for dep in pkgbuild_deps[pkgname]:
		dep = split_dep_prov_symbol(dep)[0] # Strip any provision
		recursive_deps.append(dep)
	paths = []
	for dep in recursive_deps:
		dep = split_dep_prov_symbol(dep)[0] # Strip any provision
		paths.append(dep)
	dep_added = True
	while dep_added:
		dep_added = False
		for dep in recursive_deps:
			for dep2 in pkgbuild_deps[dep]:
				dep2 = split_dep_prov_symbol(dep2)[0] # Strip any provision
				if not dep2 in recursive_deps:
					if dep2 == pkgname:
						update_paths(paths, dep, dep2)
						print pkgname + ">" + paths[-1]
						problems[4] += 1
						return
					recursive_deps.append(dep2)
					update_paths(paths, dep, dep2)
					dep_added = True

def circular_deps_check():
	print_heading("Circular Dependencies")
	# Check for circular dependencies:
	for pkgname in pkgbuild_deps:
		check_name_in_recursive_deps(pkgname)
	
def print_results():
	print_heading("Archlinux Summary")
	print "Dirs with missing PKGBUILDs:    ", problems[0]
	print "Duplicate PKGBUILDs:            ", problems[1]
	print "Missing dependencies:           ", problems[2]
	print "Unmet provisioned dependencies: ", problems[3]
	print "Circular dependencies:          ", problems[4]
	print "Invalid archs:                  ", problems[5]
	print "Missing packages in repos:      ", problems[6]
	print "Mismatching PKGBUILD names:     ", problems[7]
	print ""

mismatches = []
misses = []
pkgbuild_deps = {}
pkgbuild_provides = {}
pkgbuild_paths = {}
pkgbuild_archs = {}
pkgbuild_versions = {}
problems = [0,0,0,0,0,0,0,0]

print """\nWARNING: Please make sure you have a clean and up-to-date $ABSROOT when
         running this script; custom PKGBUILDs, etc. can cause false positives.\n"""

for i in range(len(include_paths)):
	include_paths[i] = absroot + "/" + include_paths[i]
print "Using the following paths:"
print include_paths

# Let's do it:
get_pkgbuilds_in_dir(absroot)
verify_depends()
verify_archs()
verify_packages()
circular_deps_check()
print_results()
_______________________________________________
arch mailing list
[email protected]
http://archlinux.org/mailman/listinfo/arch

Reply via email to