* Indentation changes - 4 spaces for python, we standardized this before (and

it's a PEP)
* Modified some sync tests
This commit is contained in:
Aaron Griffin 2007-02-21 06:33:13 +00:00
parent a8dd8d5770
commit 786cd38c0a
10 changed files with 1014 additions and 1005 deletions

View file

@ -32,42 +32,43 @@ __version__ = "0.3"
def usage(retcode):
"""
"""
print "Usage: %s [options] [[--test=<path/to/testfile.py>] ...]\n\n" % __file__
sys.exit(retcode)
"""
"""
print "Usage: %s [options] [[--test=<path/to/testfile.py>] ...]\n\n" % __file__
sys.exit(retcode)
if __name__ == "__main__":
env = pmenv.pmenv()
testcases = []
env = pmenv.pmenv()
testcases = []
try:
opts, args = getopt.getopt(sys.argv[1:],
"d:hp:t:v",
["debug=", "gdb", "help", "pacman=", "test=", "valgrind", "verbose", "nolog"])
except getopt.GetoptError:
usage(1)
try:
opts, args = getopt.getopt(sys.argv[1:],
"d:hp:t:v",
["debug=", "gdb", "help", "pacman=", "test=", "valgrind", "verbose", "nolog"])
except getopt.GetoptError:
usage(1)
for (cmd, param) in opts:
if cmd == "-v" or cmd == "--verbose":
util.verbose += 1
elif cmd == "-d" or cmd == "--debug":
env.pacman["debug"] = int(param)
elif cmd == "-t" or cmd == "--test":
testcases.extend(glob.glob(param))
elif cmd == "-p" or cmd == "--pacman":
env.pacman["bin"] = os.path.abspath(param)
elif cmd == "-h" or cmd == "--help":
usage(0)
elif cmd == "--nolog":
env.pacman["nolog"] = 1
elif cmd == "--gdb":
env.pacman["gdb"] = 1
elif cmd == "--valgrind":
env.pacman["valgrind"] = 1
for (cmd, param) in opts:
if cmd == "-v" or cmd == "--verbose":
util.verbose += 1
elif cmd == "-d" or cmd == "--debug":
env.pacman["debug"] = int(param)
elif cmd == "-t" or cmd == "--test":
testcases.extend(glob.glob(param))
elif cmd == "-p" or cmd == "--pacman":
env.pacman["bin"] = os.path.abspath(param)
elif cmd == "-h" or cmd == "--help":
usage(0)
elif cmd == "--nolog":
env.pacman["nolog"] = 1
elif cmd == "--gdb":
env.pacman["gdb"] = 1
elif cmd == "--valgrind":
env.pacman["valgrind"] = 1
for i in testcases:
env.addtest(i)
for i in testcases:
env.addtest(i)
env.run()
env.results()
env.run()
env.results()
# vim: set ts=4 sw=4 et:

View file

@ -27,337 +27,338 @@ from util import *
def _mkfilelist(files):
"""Generate a list of files from the list supplied as an argument.
"""Generate a list of files from the list supplied as an argument.
Each path is decomposed to generate the list of all directories leading
to the file.
Each path is decomposed to generate the list of all directories leading
to the file.
Example with 'usr/local/bin/dummy':
The resulting list will be
usr/
usr/local/
usr/local/bin/
usr/local/bin/dummy
"""
i = []
for f in files:
dir = getfilename(f)
i.append(dir)
while "/" in dir:
[dir, tmp] = dir.rsplit("/", 1)
if not dir + "/" in files:
i.append(dir + "/")
i.sort()
return i
Example with 'usr/local/bin/dummy':
The resulting list will be
usr/
usr/local/
usr/local/bin/
usr/local/bin/dummy
"""
i = []
for f in files:
dir = getfilename(f)
i.append(dir)
while "/" in dir:
[dir, tmp] = dir.rsplit("/", 1)
if not dir + "/" in files:
i.append(dir + "/")
i.sort()
return i
def _mkbackuplist(backup):
"""
"""
return ["%s\t%s" % (getfilename(i), mkmd5sum(i)) for i in backup]
"""
"""
return ["%s\t%s" % (getfilename(i), mkmd5sum(i)) for i in backup]
def _getsection(fd):
"""
"""
i = []
while 1:
line = fd.readline().strip("\n")
if not line:
break
i.append(line)
return i
"""
"""
i = []
while 1:
line = fd.readline().strip("\n")
if not line:
break
i.append(line)
return i
def _mksection(title, data):
"""
"""
s = ""
if isinstance(data, list):
s = "\n".join(data)
else:
s = data
return "%%%s%%\n" \
"%s\n" % (title, s)
"""
"""
s = ""
if isinstance(data, list):
s = "\n".join(data)
else:
s = data
return "%%%s%%\n" \
"%s\n" % (title, s)
class pmdb:
"""Database object
"""
"""Database object
"""
def __init__(self, treename, dbdir):
self.treename = treename
self.dbdir = dbdir
self.pkgs = []
def __init__(self, treename, dbdir):
self.treename = treename
self.dbdir = dbdir
self.pkgs = []
def __str__(self):
return "%s" % self.treename
def __str__(self):
return "%s" % self.treename
def getpkg(self, name):
"""
"""
for pkg in self.pkgs:
if name == pkg.name:
return pkg
def getpkg(self, name):
"""
"""
for pkg in self.pkgs:
if name == pkg.name:
return pkg
def db_read(self, name):
"""
"""
def db_read(self, name):
"""
"""
path = os.path.join(self.dbdir, self.treename)
if not os.path.isdir(path):
return None
path = os.path.join(self.dbdir, self.treename)
if not os.path.isdir(path):
return None
dbentry = ""
for roots, dirs, files in os.walk(path):
for i in dirs:
[pkgname, pkgver, pkgrel] = i.rsplit("-", 2)
if pkgname == name:
dbentry = i
break
if not dbentry:
return None
path = os.path.join(path, dbentry)
dbentry = ""
for roots, dirs, files in os.walk(path):
for i in dirs:
[pkgname, pkgver, pkgrel] = i.rsplit("-", 2)
if pkgname == name:
dbentry = i
break
if not dbentry:
return None
path = os.path.join(path, dbentry)
[pkgname, pkgver, pkgrel] = dbentry.rsplit("-", 2)
pkg = pmpkg.pmpkg(pkgname, pkgver + "-" + pkgrel)
[pkgname, pkgver, pkgrel] = dbentry.rsplit("-", 2)
pkg = pmpkg.pmpkg(pkgname, pkgver + "-" + pkgrel)
# desc
filename = os.path.join(path, "desc")
fd = file(filename, "r")
while 1:
line = fd.readline()
if not line:
break
line = line.strip("\n")
if line == "%DESC%":
pkg.desc = fd.readline().strip("\n")
elif line == "%GROUPS%":
pkg.groups = _getsection(fd)
elif line == "%URL%":
pkg.url = fd.readline().strip("\n")
elif line == "%LICENSE%":
pkg.license = _getsection(fd)
elif line == "%ARCH%":
pkg.arch = fd.readline().strip("\n")
elif line == "%BUILDDATE%":
pkg.builddate = fd.readline().strip("\n")
elif line == "%INSTALLDATE%":
pkg.installdate = fd.readline().strip("\n")
elif line == "%PACKAGER%":
pkg.packager = fd.readline().strip("\n")
elif line == "%REASON%":
pkg.reason = int(fd.readline().strip("\n"))
elif line == "%SIZE%" or line == "%CSIZE%":
pkg.size = int(fd.readline().strip("\n"))
elif line == "%MD5SUM%":
pkg.md5sum = fd.readline().strip("\n")
elif line == "%REPLACES%":
pkg.replaces = _getsection(fd)
elif line == "%FORCE%":
fd.readline()
pkg.force = 1
fd.close()
pkg.checksum["desc"] = getmd5sum(filename)
pkg.mtime["desc"] = getmtime(filename)
# desc
filename = os.path.join(path, "desc")
fd = file(filename, "r")
while 1:
line = fd.readline()
if not line:
break
line = line.strip("\n")
if line == "%DESC%":
pkg.desc = fd.readline().strip("\n")
elif line == "%GROUPS%":
pkg.groups = _getsection(fd)
elif line == "%URL%":
pkg.url = fd.readline().strip("\n")
elif line == "%LICENSE%":
pkg.license = _getsection(fd)
elif line == "%ARCH%":
pkg.arch = fd.readline().strip("\n")
elif line == "%BUILDDATE%":
pkg.builddate = fd.readline().strip("\n")
elif line == "%INSTALLDATE%":
pkg.installdate = fd.readline().strip("\n")
elif line == "%PACKAGER%":
pkg.packager = fd.readline().strip("\n")
elif line == "%REASON%":
pkg.reason = int(fd.readline().strip("\n"))
elif line == "%SIZE%" or line == "%CSIZE%":
pkg.size = int(fd.readline().strip("\n"))
elif line == "%MD5SUM%":
pkg.md5sum = fd.readline().strip("\n")
elif line == "%REPLACES%":
pkg.replaces = _getsection(fd)
elif line == "%FORCE%":
fd.readline()
pkg.force = 1
fd.close()
pkg.checksum["desc"] = getmd5sum(filename)
pkg.mtime["desc"] = getmtime(filename)
# files
filename = os.path.join(path, "files")
fd = file(filename, "r")
while 1:
line = fd.readline()
if not line:
break
line = line.strip("\n")
if line == "%FILES%":
while line:
line = fd.readline().strip("\n")
if line and line[-1] != "/":
pkg.files.append(line)
if line == "%BACKUP%":
pkg.backup = _getsection(fd)
fd.close()
pkg.checksum["files"] = getmd5sum(filename)
pkg.mtime["files"] = getmtime(filename)
# files
filename = os.path.join(path, "files")
fd = file(filename, "r")
while 1:
line = fd.readline()
if not line:
break
line = line.strip("\n")
if line == "%FILES%":
while line:
line = fd.readline().strip("\n")
if line and line[-1] != "/":
pkg.files.append(line)
if line == "%BACKUP%":
pkg.backup = _getsection(fd)
fd.close()
pkg.checksum["files"] = getmd5sum(filename)
pkg.mtime["files"] = getmtime(filename)
# depends
filename = os.path.join(path, "depends")
fd = file(filename, "r")
while 1:
line = fd.readline()
if not line:
break
line = line.strip("\n")
if line == "%DEPENDS%":
pkg.depends = _getsection(fd)
elif line == "%REQUIREDBY%":
pkg.requiredby = _getsection(fd)
elif line == "%CONFLICTS%":
pkg.conflicts = _getsection(fd)
elif line == "%PROVIDES%":
pkg.provides = _getsection(fd)
elif line == "%REPLACES%":
pkg.replaces = _getsection(fd)
elif line == "%FORCE%":
fd.readline()
pkg.force = 1
fd.close()
pkg.checksum["depends"] = getmd5sum(filename)
pkg.mtime["depends"] = getmtime(filename)
# depends
filename = os.path.join(path, "depends")
fd = file(filename, "r")
while 1:
line = fd.readline()
if not line:
break
line = line.strip("\n")
if line == "%DEPENDS%":
pkg.depends = _getsection(fd)
elif line == "%REQUIREDBY%":
pkg.requiredby = _getsection(fd)
elif line == "%CONFLICTS%":
pkg.conflicts = _getsection(fd)
elif line == "%PROVIDES%":
pkg.provides = _getsection(fd)
elif line == "%REPLACES%":
pkg.replaces = _getsection(fd)
elif line == "%FORCE%":
fd.readline()
pkg.force = 1
fd.close()
pkg.checksum["depends"] = getmd5sum(filename)
pkg.mtime["depends"] = getmtime(filename)
# install
filename = os.path.join(path, "install")
if os.path.isfile(filename):
pkg.checksum["install"] = getmd5sum(filename)
pkg.mtime["install"] = getmtime(filename)
# install
filename = os.path.join(path, "install")
if os.path.isfile(filename):
pkg.checksum["install"] = getmd5sum(filename)
pkg.mtime["install"] = getmtime(filename)
return pkg
return pkg
#
# db_write is used to add both 'local' and 'sync' db entries
#
def db_write(self, pkg):
"""
"""
#
# db_write is used to add both 'local' and 'sync' db entries
#
def db_write(self, pkg):
"""
"""
path = os.path.join(self.dbdir, self.treename, pkg.fullname())
if not os.path.isdir(path):
os.makedirs(path);
path = os.path.join(self.dbdir, self.treename, pkg.fullname())
if not os.path.isdir(path):
os.makedirs(path);
# desc
# for local db entries: name, version, desc, groups, url, license,
# arch, builddate, installdate, packager,
# size, reason
# for sync entries: name, version, desc, groups, csize, md5sum,
# replaces, force
data = [_mksection("NAME", pkg.name)]
data.append(_mksection("VERSION", pkg.version))
if pkg.desc:
data.append(_mksection("DESC", pkg.desc))
if pkg.groups:
data.append(_mksection("GROUPS", pkg.groups))
if self.treename == "local":
if pkg.url:
data.append(_mksection("URL", pkg.url))
if pkg.license:
data.append(_mksection("LICENSE", pkg.license))
if pkg.arch:
data.append(_mksection("ARCH", pkg.arch))
if pkg.builddate:
data.append(_mksection("BUILDDATE", pkg.builddate))
if pkg.installdate:
data.append(_mksection("INSTALLDATE", pkg.installdate))
if pkg.packager:
data.append(_mksection("PACKAGER", pkg.packager))
if pkg.size:
data.append(_mksection("SIZE", pkg.size))
if pkg.reason:
data.append(_mksection("REASON", pkg.reason))
else:
if pkg.csize:
data.append(_mksection("CSIZE", pkg.csize))
if pkg.md5sum:
data.append(_mksection("MD5SUM", pkg.md5sum))
if data:
data.append("")
filename = os.path.join(path, "desc")
mkfile(filename, "\n".join(data))
pkg.checksum["desc"] = getmd5sum(filename)
pkg.mtime["desc"] = getmtime(filename)
# desc
# for local db entries: name, version, desc, groups, url, license,
# arch, builddate, installdate, packager,
# size, reason
# for sync entries: name, version, desc, groups, csize, md5sum,
# replaces, force
data = [_mksection("NAME", pkg.name)]
data.append(_mksection("VERSION", pkg.version))
if pkg.desc:
data.append(_mksection("DESC", pkg.desc))
if pkg.groups:
data.append(_mksection("GROUPS", pkg.groups))
if self.treename == "local":
if pkg.url:
data.append(_mksection("URL", pkg.url))
if pkg.license:
data.append(_mksection("LICENSE", pkg.license))
if pkg.arch:
data.append(_mksection("ARCH", pkg.arch))
if pkg.builddate:
data.append(_mksection("BUILDDATE", pkg.builddate))
if pkg.installdate:
data.append(_mksection("INSTALLDATE", pkg.installdate))
if pkg.packager:
data.append(_mksection("PACKAGER", pkg.packager))
if pkg.size:
data.append(_mksection("SIZE", pkg.size))
if pkg.reason:
data.append(_mksection("REASON", pkg.reason))
else:
if pkg.csize:
data.append(_mksection("CSIZE", pkg.csize))
if pkg.md5sum:
data.append(_mksection("MD5SUM", pkg.md5sum))
if data:
data.append("")
filename = os.path.join(path, "desc")
mkfile(filename, "\n".join(data))
pkg.checksum["desc"] = getmd5sum(filename)
pkg.mtime["desc"] = getmtime(filename)
# files
# for local entries, fields are: files, backup
# for sync ones: none
if self.treename == "local":
data = []
if pkg.files:
data.append(_mksection("FILES", _mkfilelist(pkg.files)))
if pkg.backup:
data.append(_mksection("BACKUP", _mkbackuplist(pkg.backup)))
if data:
data.append("")
filename = os.path.join(path, "files")
mkfile(filename, "\n".join(data))
pkg.checksum["files"] = getmd5sum(filename)
pkg.mtime["files"] = getmtime(filename)
# files
# for local entries, fields are: files, backup
# for sync ones: none
if self.treename == "local":
data = []
if pkg.files:
data.append(_mksection("FILES", _mkfilelist(pkg.files)))
if pkg.backup:
data.append(_mksection("BACKUP", _mkbackuplist(pkg.backup)))
if data:
data.append("")
filename = os.path.join(path, "files")
mkfile(filename, "\n".join(data))
pkg.checksum["files"] = getmd5sum(filename)
pkg.mtime["files"] = getmtime(filename)
# depends
# for local db entries: depends, requiredby, conflicts, provides
# for sync ones: depends, conflicts, provides
data = []
if pkg.depends:
data.append(_mksection("DEPENDS", pkg.depends))
if self.treename == "local":
if pkg.requiredby:
data.append(_mksection("REQUIREDBY", pkg.requiredby))
if pkg.conflicts:
data.append(_mksection("CONFLICTS", pkg.conflicts))
if pkg.provides:
data.append(_mksection("PROVIDES", pkg.provides))
if not self.treename == "local":
if pkg.replaces:
data.append(_mksection("REPLACES", pkg.replaces))
if pkg.force:
data.append(_mksection("FORCE", ""))
if data:
data.append("")
filename = os.path.join(path, "depends")
mkfile(filename, "\n".join(data))
pkg.checksum["depends"] = getmd5sum(filename)
pkg.mtime["depends"] = getmtime(filename)
# depends
# for local db entries: depends, requiredby, conflicts, provides
# for sync ones: depends, conflicts, provides
data = []
if pkg.depends:
data.append(_mksection("DEPENDS", pkg.depends))
if self.treename == "local":
if pkg.requiredby:
data.append(_mksection("REQUIREDBY", pkg.requiredby))
if pkg.conflicts:
data.append(_mksection("CONFLICTS", pkg.conflicts))
if pkg.provides:
data.append(_mksection("PROVIDES", pkg.provides))
if not self.treename == "local":
if pkg.replaces:
data.append(_mksection("REPLACES", pkg.replaces))
if pkg.force:
data.append(_mksection("FORCE", ""))
if data:
data.append("")
filename = os.path.join(path, "depends")
mkfile(filename, "\n".join(data))
pkg.checksum["depends"] = getmd5sum(filename)
pkg.mtime["depends"] = getmtime(filename)
# install
if self.treename == "local":
empty = 1
for value in pkg.install.values():
if value:
empty = 0
if not empty:
filename = os.path.join(path, "install")
mkinstallfile(filename, pkg.install)
pkg.checksum["install"] = getmd5sum(filename)
pkg.mtime["install"] = getmtime(filename)
# install
if self.treename == "local":
empty = 1
for value in pkg.install.values():
if value:
empty = 0
if not empty:
filename = os.path.join(path, "install")
mkinstallfile(filename, pkg.install)
pkg.checksum["install"] = getmd5sum(filename)
pkg.mtime["install"] = getmtime(filename)
def gensync(self, path):
"""
"""
def gensync(self, path):
"""
"""
curdir = os.getcwd()
tmpdir = tempfile.mkdtemp()
os.chdir(tmpdir)
curdir = os.getcwd()
tmpdir = tempfile.mkdtemp()
os.chdir(tmpdir)
for pkg in self.pkgs:
mkdescfile(pkg.fullname(), pkg)
for pkg in self.pkgs:
mkdescfile(pkg.fullname(), pkg)
# Generate database archive
os.makedirs(path, 0755)
archive = os.path.join(path, "%s%s" % (self.treename, PM_EXT_DB))
os.system("tar zcf %s *" % archive)
# Generate database archive
os.makedirs(path, 0755)
archive = os.path.join(path, "%s%s" % (self.treename, PM_EXT_DB))
os.system("tar zcf %s *" % archive)
os.chdir(curdir)
shutil.rmtree(tmpdir)
os.chdir(curdir)
shutil.rmtree(tmpdir)
def ispkgmodified(self, pkg):
"""
"""
def ispkgmodified(self, pkg):
"""
"""
modified = 0
modified = 0
oldpkg = self.getpkg(pkg.name)
if not oldpkg:
return 0
oldpkg = self.getpkg(pkg.name)
if not oldpkg:
return 0
dbg("oldpkg.checksum : %s" % oldpkg.checksum)
dbg("oldpkg.mtime : %s" % oldpkg.mtime)
#dbg("oldpkg.checksum : %s" % oldpkg.checksum)
#dbg("oldpkg.mtime : %s" % oldpkg.mtime)
for key in pkg.mtime.keys():
if key == "install" \
and oldpkg.mtime[key] == (0, 0, 0) \
and pkg.mtime[key] == (0, 0, 0):
continue
if not oldpkg.mtime[key][1:3] == pkg.mtime[key][1:3]:
modified += 1
for key in pkg.mtime.keys():
if key == "install" \
and oldpkg.mtime[key] == (0, 0, 0) \
and pkg.mtime[key] == (0, 0, 0):
continue
if not oldpkg.mtime[key][1:3] == pkg.mtime[key][1:3]:
modified += 1
return modified
return modified
if __name__ == "__main__":
db = pmdb("local")
print db
db = pmdb("local")
print db
# vim: set ts=4 sw=4 et:

View file

@ -25,94 +25,95 @@ import pmtest
class pmenv:
"""Environment object
"""
"""Environment object
"""
def __init__(self, root = "root"):
self.root = os.path.abspath(root)
self.pacman = {
"bin": "pacman",
"debug": 0,
"gdb": 0,
"valgrind": 0,
"nolog": 0
}
self.testcases = []
def __init__(self, root = "root"):
self.root = os.path.abspath(root)
self.pacman = {
"bin": "pacman",
"debug": 0,
"gdb": 0,
"valgrind": 0,
"nolog": 0
}
self.testcases = []
def __str__(self):
return "root = %s\n" \
"pacman = %s" \
% (self.root, self.pacman)
def __str__(self):
return "root = %s\n" \
"pacman = %s" \
% (self.root, self.pacman)
def addtest(self, testcase):
"""
"""
if not os.path.isfile(testcase):
err("file %s not found" % testcase)
return
test = pmtest.pmtest(testcase, self.root)
self.testcases.append(test)
def addtest(self, testcase):
"""
"""
if not os.path.isfile(testcase):
err("file %s not found" % testcase)
return
test = pmtest.pmtest(testcase, self.root)
self.testcases.append(test)
def run(self):
"""
"""
def run(self):
"""
"""
for t in self.testcases:
print "=========="*8
print "Running '%s'" % t.name.strip(".py")
for t in self.testcases:
print "=========="*8
print "Running '%s'" % t.name.strip(".py")
t.load()
print t.description
print "----------"*8
t.load()
print t.description
print "----------"*8
t.generate()
# Hack for mtimes consistency
modified = 0
for i in t.rules:
if i.rule.find("MODIFIED") != -1:
modified = 1
if modified:
time.sleep(3)
t.generate()
# Hack for mtimes consistency
modified = 0
for i in t.rules:
if i.rule.find("MODIFIED") != -1:
modified = 1
if modified:
time.sleep(3)
t.run(self.pacman)
t.run(self.pacman)
t.check()
print "==> Test result"
if t.result["ko"] == 0:
print "\tPASSED"
else:
print "\tFAILED"
print
t.check()
print "==> Test result"
if t.result["fail"] == 0:
print "\tPASSED"
else:
print "\tFAILED"
print
def results(self):
"""
"""
passed = 0
print "=========="*8
print "Results"
print "----------"*8
for test in self.testcases:
ok = test.result["ok"]
ko = test.result["ko"]
rules = len(test.rules)
if ko == 0:
print "[PASSED]",
passed += 1
else:
print "[FAILED]",
print test.name.strip(".py").ljust(38),
print "Rules:",
print "OK = %2u KO = %2u SKIP = %2u" % (ok, ko, rules-(ok+ko))
print "----------"*8
total = len(self.testcases)
failed = total - passed
print "TOTAL = %3u" % total
if total:
print "PASSED = %3u (%6.2f%%)" % (passed, float(passed)*100/total)
print "FAILED = %3u (%6.2f%%)" % (failed, float(failed)*100/total)
print
def results(self):
"""
"""
passed = 0
print "=========="*8
print "Results"
print "----------"*8
for test in self.testcases:
success = test.result["success"]
fail = test.result["fail"]
rules = len(test.rules)
if fail == 0:
print "[PASSED]",
passed += 1
else:
print "[FAILED]",
print test.name.strip(".py").ljust(38),
print "Rules:",
print " OK = %2u FAIL = %2u SKIP = %2u" % (success, fail, rules-(success+fail))
print "----------"*8
total = len(self.testcases)
failed = total - passed
print "TOTAL = %3u" % total
if total:
print "PASSED = %3u (%6.2f%%)" % (passed, float(passed)*100/total)
print "FAILED = %3u (%6.2f%%)" % (failed, float(failed)*100/total)
print
if __name__ == "__main__":
env = pmenv("/tmp")
print env
env = pmenv("/tmp")
print env
# vim: set ts=4 sw=4 et:

View file

@ -24,42 +24,43 @@ from util import *
class pmfile:
"""File object
"""
"""File object
"""
def __init__(self, root, name):
self.name = name
self.root = root
def __init__(self, root, name):
self.name = name
self.root = root
filename = os.path.join(self.root, self.name)
self.checksum = getmd5sum(filename)
self.mtime = getmtime(filename)
filename = os.path.join(self.root, self.name)
self.checksum = getmd5sum(filename)
self.mtime = getmtime(filename)
def __str__(self):
return "%s (%s / %lu)" % (self.name, self.checksum, self.mtime)
def __str__(self):
return "%s (%s / %lu)" % (self.name, self.checksum, self.mtime)
def ismodified(self):
"""
"""
def ismodified(self):
"""
"""
retval = 0
retval = 0
filename = os.path.join(self.root, self.name)
checksum = getmd5sum(filename)
mtime = getmtime(filename)
filename = os.path.join(self.root, self.name)
checksum = getmd5sum(filename)
mtime = getmtime(filename)
if debug:
print "ismodified(%s)" % self.name
print "old: %s / %s" % (self.checksum, self.mtime)
print "new: %s / %s" % (checksum, mtime)
if debug:
print "ismodified(%s)" % self.name
print "old: %s / %s" % (self.checksum, self.mtime)
print "new: %s / %s" % (checksum, mtime)
if not self.checksum == checksum \
or not (self.mtime[1], self.mtime[2]) == (mtime[1], mtime[2]):
retval = 1
if not self.checksum == checksum \
or not (self.mtime[1], self.mtime[2]) == (mtime[1], mtime[2]):
retval = 1
return retval
return retval
if __name__ == "__main__":
f = pmfile("/tmp", "foobar")
print f
f = pmfile("/tmp", "foobar")
print f
# vim: set ts=4 sw=4 et:

View file

@ -27,154 +27,155 @@ from util import *
class pmpkg:
"""Package object.
"""Package object.
Object holding data from an ArchLinux package.
"""
Object holding data from an ArchLinux package.
"""
def __init__(self, name, version = "1.0-1"):
# desc
self.name = name
self.version = version
self.desc = ""
self.groups = []
self.url = ""
self.license = []
self.arch = ""
self.builddate = ""
self.installdate = ""
self.packager = ""
self.size = 0
self.csize = 0
self.reason = 0
self.md5sum = "" # sync only
self.replaces = [] # sync only (will be moved to depends)
self.force = 0 # sync only (will be moved to depends)
# depends
self.depends = []
self.requiredby = [] # local only
self.conflicts = []
self.provides = []
# files
self.files = []
self.backup = []
# install
self.install = {
"pre_install": "",
"post_install": "",
"pre_remove": "",
"post_remove": "",
"pre_upgrade": "",
"post_upgrade": ""
}
self.checksum = {
"desc": "",
"depends": "",
"files": "",
"install": ""
}
self.mtime = {
"desc": (0, 0, 0),
"depends": (0, 0, 0),
"files": (0, 0, 0),
"install": (0, 0, 0)
}
def __init__(self, name, version = "1.0-1"):
# desc
self.name = name
self.version = version
self.desc = ""
self.groups = []
self.url = ""
self.license = []
self.arch = ""
self.builddate = ""
self.installdate = ""
self.packager = ""
self.size = 0
self.csize = 0
self.reason = 0
self.md5sum = "" # sync only
self.replaces = [] # sync only (will be moved to depends)
self.force = 0 # sync only (will be moved to depends)
# depends
self.depends = []
self.requiredby = [] # local only
self.conflicts = []
self.provides = []
# files
self.files = []
self.backup = []
# install
self.install = {
"pre_install": "",
"post_install": "",
"pre_remove": "",
"post_remove": "",
"pre_upgrade": "",
"post_upgrade": ""
}
self.checksum = {
"desc": "",
"depends": "",
"files": "",
"install": ""
}
self.mtime = {
"desc": (0, 0, 0),
"depends": (0, 0, 0),
"files": (0, 0, 0),
"install": (0, 0, 0)
}
def __str__(self):
s = ["%s" % self.fullname()]
s.append("description: %s" % self.desc)
s.append("url: %s" % self.url)
s.append("depends: %s" % " ".join(self.depends))
s.append("files: %s" % " ".join(self.files))
s.append("reason: %d" % self.reason)
return "\n".join(s)
def __str__(self):
s = ["%s" % self.fullname()]
s.append("description: %s" % self.desc)
s.append("url: %s" % self.url)
s.append("depends: %s" % " ".join(self.depends))
s.append("files: %s" % " ".join(self.files))
s.append("reason: %d" % self.reason)
return "\n".join(s)
def fullname(self):
"""Long name of a package.
def fullname(self):
"""Long name of a package.
Returns a string formatted as follows: "pkgname-pkgver".
"""
return "%s-%s" % (self.name, self.version)
Returns a string formatted as follows: "pkgname-pkgver".
"""
return "%s-%s" % (self.name, self.version)
def filename(self):
"""File name of a package, including its extension.
def filename(self):
"""File name of a package, including its extension.
Returns a string formatted as follows: "pkgname-pkgver.PKG_EXT_PKG".
"""
return "%s%s" % (self.fullname(), PM_EXT_PKG)
Returns a string formatted as follows: "pkgname-pkgver.PKG_EXT_PKG".
"""
return "%s%s" % (self.fullname(), PM_EXT_PKG)
def install_files(self, root):
"""Install files in the filesystem located under "root".
def install_files(self, root):
"""Install files in the filesystem located under "root".
Files are created with content generated automatically.
"""
[mkfile(os.path.join(root, f), f) for f in self.files]
Files are created with content generated automatically.
"""
[mkfile(os.path.join(root, f), f) for f in self.files]
def makepkg(self, path):
"""Creates an ArchLinux package archive.
def makepkg(self, path):
"""Creates an ArchLinux package archive.
A package archive is generated in the location 'path', based on the data
from the object.
"""
archive = os.path.join(path, self.filename())
A package archive is generated in the location 'path', based on the data
from the object.
"""
archive = os.path.join(path, self.filename())
curdir = os.getcwd()
tmpdir = tempfile.mkdtemp()
os.chdir(tmpdir)
curdir = os.getcwd()
tmpdir = tempfile.mkdtemp()
os.chdir(tmpdir)
# Generate package file system
for f in self.files:
mkfile(f, f)
self.size += os.stat(getfilename(f))[stat.ST_SIZE]
# Generate package file system
for f in self.files:
mkfile(f, f)
self.size += os.stat(getfilename(f))[stat.ST_SIZE]
# .PKGINFO
data = ["pkgname = %s" % self.name]
data.append("pkgver = %s" % self.version)
data.append("pkgdesc = %s" % self.desc)
data.append("url = %s" % self.url)
data.append("builddate = %s" % self.builddate)
data.append("packager = %s" % self.packager)
data.append("size = %s" % self.size)
if self.arch:
data.append("arch = %s" % self.arch)
for i in self.license:
data.append("license = %s" % i)
for i in self.replaces:
data.append("replaces = %s" % i)
for i in self.groups:
data.append("group = %s" % i)
for i in self.depends:
data.append("depend = %s" % i)
for i in self.conflicts:
data.append("conflict = %s" % i)
for i in self.provides:
data.append("provides = %s" % i)
for i in self.backup:
data.append("backup = %s" % i)
mkfile(".PKGINFO", "\n".join(data))
targets = ".PKGINFO"
# .PKGINFO
data = ["pkgname = %s" % self.name]
data.append("pkgver = %s" % self.version)
data.append("pkgdesc = %s" % self.desc)
data.append("url = %s" % self.url)
data.append("builddate = %s" % self.builddate)
data.append("packager = %s" % self.packager)
data.append("size = %s" % self.size)
if self.arch:
data.append("arch = %s" % self.arch)
for i in self.license:
data.append("license = %s" % i)
for i in self.replaces:
data.append("replaces = %s" % i)
for i in self.groups:
data.append("group = %s" % i)
for i in self.depends:
data.append("depend = %s" % i)
for i in self.conflicts:
data.append("conflict = %s" % i)
for i in self.provides:
data.append("provides = %s" % i)
for i in self.backup:
data.append("backup = %s" % i)
mkfile(".PKGINFO", "\n".join(data))
targets = ".PKGINFO"
# .INSTALL
empty = 1
for value in self.install.values():
if value:
empty = 0
if not empty:
mkinstallfile(".INSTALL", self.install)
targets += " .INSTALL"
# .INSTALL
empty = 1
for value in self.install.values():
if value:
empty = 0
if not empty:
mkinstallfile(".INSTALL", self.install)
targets += " .INSTALL"
# .FILELIST
if self.files:
os.system("tar cvf /dev/null * | sort >.FILELIST")
targets += " .FILELIST *"
# .FILELIST
if self.files:
os.system("tar cvf /dev/null * | sort >.FILELIST")
targets += " .FILELIST *"
# Generate package archive
os.system("tar zcf %s %s" % (archive, targets))
# Generate package archive
os.system("tar zcf %s %s" % (archive, targets))
os.chdir(curdir)
shutil.rmtree(tmpdir)
os.chdir(curdir)
shutil.rmtree(tmpdir)
if __name__ == "__main__":
pkg = pmpkg("dummy")
print pkg
pkg = pmpkg("dummy")
print pkg
# vim: set ts=4 sw=4 et:

View file

@ -22,112 +22,113 @@ from util import *
class pmrule:
"""Rule object
"""
"""Rule object
"""
def __init__(self, rule):
self.rule = rule
self.false = 0
self.result = 0
def __init__(self, rule):
self.rule = rule
self.false = 0
self.result = 0
def __str__(self):
return "rule = %s" % self.rule
def __str__(self):
return "rule = %s" % self.rule
def check(self, root, retcode, localdb, files):
"""
"""
def check(self, root, retcode, localdb, files):
"""
"""
success = 1
success = 1
[test, args] = self.rule.split("=")
if test[0] == "!":
self.false = 1
test = test.lstrip("!")
[kind, case] = test.split("_")
if "|" in args:
[key, value] = args.split("|", 1)
else:
[key, value] = [args, None]
[test, args] = self.rule.split("=")
if test[0] == "!":
self.false = 1
test = test.lstrip("!")
[kind, case] = test.split("_")
if "|" in args:
[key, value] = args.split("|", 1)
else:
[key, value] = [args, None]
if kind == "PACMAN":
if case == "RETCODE":
if retcode != int(key):
success = 0
elif case == "OUTPUT":
if not grep(os.path.join(root, LOGFILE), key):
success = 0
else:
success = -1
elif kind == "PKG":
newpkg = localdb.db_read(key)
if not newpkg:
success = 0
else:
dbg("newpkg.checksum : %s" % newpkg.checksum)
dbg("newpkg.mtime : %s" % newpkg.mtime)
if case == "EXIST":
success = 1
elif case == "MODIFIED":
if not localdb.ispkgmodified(newpkg):
success = 0
elif case == "VERSION":
if value != newpkg.version:
success = 0
elif case == "GROUPS":
if not value in newpkg.groups:
success = 0
elif case == "DEPENDS":
if not value in newpkg.depends:
success = 0
elif case == "REQUIREDBY":
if not value in newpkg.requiredby:
success = 0
elif case == "REASON":
if not newpkg.reason == int(value):
success = 0
elif case == "FILES":
if not value in newpkg.files:
success = 0
elif case == "BACKUP":
found = 0
for f in newpkg.backup:
name, md5sum = f.split("\t")
if value == name:
found = 1
if not found:
success = 0
else:
success = -1
elif kind == "FILE":
filename = os.path.join(root, key)
if case == "EXIST":
if not os.path.isfile(filename):
success = 0
else:
if case == "MODIFIED":
for f in files:
if f.name == key:
if not f.ismodified():
success = 0
elif case == "PACNEW":
if not os.path.isfile("%s%s" % (filename, PM_PACNEW)):
success = 0
elif case == "PACORIG":
if not os.path.isfile("%s%s" % (filename, PM_PACORIG)):
success = 0
elif case == "PACSAVE":
if not os.path.isfile("%s%s" % (filename, PM_PACSAVE)):
success = 0
else:
success = -1
else:
success = -1
if kind == "PACMAN":
if case == "RETCODE":
if retcode != int(key):
success = 0
elif case == "OUTPUT":
if not grep(os.path.join(root, LOGFILE), key):
success = 0
else:
success = -1
elif kind == "PKG":
newpkg = localdb.db_read(key)
if not newpkg:
success = 0
else:
#dbg("newpkg.checksum : %s" % newpkg.checksum)
#dbg("newpkg.mtime : %s" % newpkg.mtime)
if case == "EXIST":
success = 1
elif case == "MODIFIED":
if not localdb.ispkgmodified(newpkg):
success = 0
elif case == "VERSION":
if value != newpkg.version:
success = 0
elif case == "GROUPS":
if not value in newpkg.groups:
success = 0
elif case == "DEPENDS":
if not value in newpkg.depends:
success = 0
elif case == "REQUIREDBY":
if not value in newpkg.requiredby:
success = 0
elif case == "REASON":
if not newpkg.reason == int(value):
success = 0
elif case == "FILES":
if not value in newpkg.files:
success = 0
elif case == "BACKUP":
found = 0
for f in newpkg.backup:
name, md5sum = f.split("\t")
if value == name:
found = 1
if not found:
success = 0
else:
success = -1
elif kind == "FILE":
filename = os.path.join(root, key)
if case == "EXIST":
if not os.path.isfile(filename):
success = 0
else:
if case == "MODIFIED":
for f in files:
if f.name == key:
if not f.ismodified():
success = 0
elif case == "PACNEW":
if not os.path.isfile("%s%s" % (filename, PM_PACNEW)):
success = 0
elif case == "PACORIG":
if not os.path.isfile("%s%s" % (filename, PM_PACORIG)):
success = 0
elif case == "PACSAVE":
if not os.path.isfile("%s%s" % (filename, PM_PACSAVE)):
success = 0
else:
success = -1
else:
success = -1
if self.false and success != -1:
success = not success
self.result = success
return success
if self.false and success != -1:
success = not success
self.result = success
return success
if __name__ != "__main__":
rule = pmrule("PKG_EXIST=dummy")
rule = pmrule("PKG_EXIST=dummy")
# vim: set ts=4 sw=4 et:

View file

@ -30,224 +30,225 @@ from util import *
class pmtest:
"""Test object
"""
"""Test object
"""
def __init__(self, name, root):
self.name = name
self.root = root
def __init__(self, name, root):
self.name = name
self.root = root
def __str__(self):
return "name = %s\n" \
"root = %s" % (self.name, self.root)
def __str__(self):
return "name = %s\n" \
"root = %s" % (self.name, self.root)
def addpkg2db(self, treename, pkg):
"""
"""
if not treename in self.db:
self.db[treename] = pmdb.pmdb(treename, os.path.join(self.root, PM_DBPATH))
self.db[treename].pkgs.append(pkg)
def addpkg2db(self, treename, pkg):
"""
"""
if not treename in self.db:
self.db[treename] = pmdb.pmdb(treename, os.path.join(self.root, PM_DBPATH))
self.db[treename].pkgs.append(pkg)
def addpkg(self, pkg):
"""
"""
self.localpkgs.append(pkg)
def addpkg(self, pkg):
"""
"""
self.localpkgs.append(pkg)
def addrule(self, rulename):
"""
"""
rule = pmrule.pmrule(rulename)
self.rules.append(rule)
def addrule(self, rulename):
"""
"""
rule = pmrule.pmrule(rulename)
self.rules.append(rule)
def load(self):
"""
"""
def load(self):
"""
"""
# Reset test parameters
self.result = {
"ok": 0,
"ko": 0
}
self.args = ""
self.retcode = 0
self.db = {
"local": pmdb.pmdb("local", os.path.join(self.root, PM_DBPATH))
}
self.localpkgs = []
self.filesystem = []
# Reset test parameters
self.result = {
"success": 0,
"fail": 0
}
self.args = ""
self.retcode = 0
self.db = {
"local": pmdb.pmdb("local", os.path.join(self.root, PM_DBPATH))
}
self.localpkgs = []
self.filesystem = []
self.description = ""
self.option = {
"noupgrade": [],
"ignorepkg": [],
"noextract": []
}
self.description = ""
self.option = {
"noupgrade": [],
"ignorepkg": [],
"noextract": []
}
# Test rules
self.rules = []
self.files = []
# Test rules
self.rules = []
self.files = []
if os.path.isfile(self.name):
execfile(self.name)
else:
err("file %s does not exist!" % self.name)
if os.path.isfile(self.name):
execfile(self.name)
else:
err("file %s does not exist!" % self.name)
def generate(self):
"""
"""
def generate(self):
"""
"""
print "==> Generating test environment"
print "==> Generating test environment"
# Cleanup leftover files from a previous test session
if os.path.isdir(self.root):
shutil.rmtree(self.root)
vprint("\t%s" % self.root)
# Cleanup leftover files from a previous test session
if os.path.isdir(self.root):
shutil.rmtree(self.root)
vprint("\t%s" % self.root)
# Create directory structure
vprint(" Creating directory structure:")
dbdir = os.path.join(self.root, PM_DBPATH)
cachedir = os.path.join(self.root, PM_CACHEDIR)
syncdir = os.path.join(self.root, SYNCREPO)
tmpdir = os.path.join(self.root, TMPDIR)
logdir = os.path.join(self.root, os.path.dirname(LOGFILE))
etcdir = os.path.join(self.root, os.path.dirname(PACCONF))
for dir in [dbdir, cachedir, syncdir, tmpdir, logdir, etcdir]:
if not os.path.isdir(dir):
vprint("\t%s" % dir[len(self.root)+1:])
os.makedirs(dir, 0755)
# Create directory structure
vprint(" Creating directory structure:")
dbdir = os.path.join(self.root, PM_DBPATH)
cachedir = os.path.join(self.root, PM_CACHEDIR)
syncdir = os.path.join(self.root, SYNCREPO)
tmpdir = os.path.join(self.root, TMPDIR)
logdir = os.path.join(self.root, os.path.dirname(LOGFILE))
etcdir = os.path.join(self.root, os.path.dirname(PACCONF))
for dir in [dbdir, cachedir, syncdir, tmpdir, logdir, etcdir]:
if not os.path.isdir(dir):
vprint("\t%s" % dir[len(self.root)+1:])
os.makedirs(dir, 0755)
# Configuration file
vprint(" Creating configuration file")
vprint("\t%s" % PACCONF)
mkcfgfile(PACCONF, self.root, self.option, self.db)
# Configuration file
vprint(" Creating configuration file")
vprint("\t%s" % PACCONF)
mkcfgfile(PACCONF, self.root, self.option, self.db)
# Creating packages
vprint(" Creating package archives")
for pkg in self.localpkgs:
vprint("\t%s" % os.path.join(TMPDIR, pkg.filename()))
pkg.makepkg(tmpdir)
for key, value in self.db.iteritems():
if key == "local":
continue
for pkg in value.pkgs:
archive = pkg.filename()
vprint("\t%s" % os.path.join(PM_CACHEDIR, archive))
pkg.makepkg(cachedir)
pkg.md5sum = getmd5sum(os.path.join(cachedir, archive))
pkg.csize = os.stat(os.path.join(cachedir, archive))[stat.ST_SIZE]
# Creating packages
vprint(" Creating package archives")
for pkg in self.localpkgs:
vprint("\t%s" % os.path.join(TMPDIR, pkg.filename()))
pkg.makepkg(tmpdir)
for key, value in self.db.iteritems():
if key == "local":
continue
for pkg in value.pkgs:
archive = pkg.filename()
vprint("\t%s" % os.path.join(PM_CACHEDIR, archive))
pkg.makepkg(cachedir)
pkg.md5sum = getmd5sum(os.path.join(cachedir, archive))
pkg.csize = os.stat(os.path.join(cachedir, archive))[stat.ST_SIZE]
# Populating databases
vprint(" Populating databases")
for key, value in self.db.iteritems():
for pkg in value.pkgs:
vprint("\t%s/%s" % (key, pkg.fullname()))
if key == "local":
pkg.installdate = time.ctime()
value.db_write(pkg)
# Populating databases
vprint(" Populating databases")
for key, value in self.db.iteritems():
for pkg in value.pkgs:
vprint("\t%s/%s" % (key, pkg.fullname()))
if key == "local":
pkg.installdate = time.ctime()
value.db_write(pkg)
# Creating sync database archives
vprint(" Creating sync database archives")
for key, value in self.db.iteritems():
if key == "local":
continue
archive = value.treename + PM_EXT_DB
vprint("\t" + os.path.join(SYNCREPO, archive))
value.gensync(os.path.join(syncdir, value.treename))
# Creating sync database archives
vprint(" Creating sync database archives")
for key, value in self.db.iteritems():
if key == "local":
continue
archive = value.treename + PM_EXT_DB
vprint("\t" + os.path.join(SYNCREPO, archive))
value.gensync(os.path.join(syncdir, value.treename))
# Filesystem
vprint(" Populating file system")
for pkg in self.db["local"].pkgs:
vprint("\tinstalling %s" % pkg.fullname())
pkg.install_files(self.root)
for f in self.filesystem:
vprint("\t%s" % f)
mkfile(os.path.join(self.root, f), f)
# Filesystem
vprint(" Populating file system")
for pkg in self.db["local"].pkgs:
vprint("\tinstalling %s" % pkg.fullname())
pkg.install_files(self.root)
for f in self.filesystem:
vprint("\t%s" % f)
mkfile(os.path.join(self.root, f), f)
# Done.
vprint(" Taking a snapshot of the file system")
for roots, dirs, files in os.walk(self.root):
for i in files:
filename = os.path.join(roots, i)
f = pmfile.pmfile(self.root, filename.replace(self.root + "/", ""))
self.files.append(f)
vprint("\t%s" % f.name)
# Done.
vprint(" Taking a snapshot of the file system")
for roots, dirs, files in os.walk(self.root):
for i in files:
filename = os.path.join(roots, i)
f = pmfile.pmfile(self.root, filename.replace(self.root + "/", ""))
self.files.append(f)
vprint("\t%s" % f.name)
def run(self, pacman):
"""
"""
def run(self, pacman):
"""
"""
if os.path.isfile(PM_LOCK):
print "\tERROR: another pacman session is on-going -- skipping"
return
if os.path.isfile(PM_LOCK):
print "\tERROR: another pacman session is on-going -- skipping"
return
print "==> Running test"
vprint("\tpacman %s" % self.args)
print "==> Running test"
vprint("\tpacman %s" % self.args)
cmd = ["fakeroot"]
if pacman["gdb"]:
cmd.append("libtool gdb --args")
if pacman["valgrind"]:
cmd.append("valgrind --tool=memcheck --leak-check=full --show-reachable=yes")
cmd.append("%s --noconfirm --config=%s --root=%s" \
% (pacman["bin"], os.path.join(self.root, PACCONF), self.root))
if pacman["debug"]:
cmd.append("--debug=%s" % pacman["debug"])
cmd.append("%s" % self.args)
if not pacman["gdb"] and not pacman["valgrind"] and not pacman["nolog"]:
cmd.append(">%s 2>&1" % os.path.join(self.root, LOGFILE))
dbg(" ".join(cmd))
cmd = ["fakeroot"]
if pacman["gdb"]:
cmd.append("libtool gdb --args")
if pacman["valgrind"]:
cmd.append("valgrind --tool=memcheck --leak-check=full --show-reachable=yes")
cmd.append("%s --noconfirm --config=%s --root=%s" \
% (pacman["bin"], os.path.join(self.root, PACCONF), self.root))
if pacman["debug"]:
cmd.append("--debug=%s" % pacman["debug"])
cmd.append("%s" % self.args)
if not pacman["gdb"] and not pacman["valgrind"] and not pacman["nolog"]:
cmd.append(">%s 2>&1" % os.path.join(self.root, LOGFILE))
dbg(" ".join(cmd))
# Change to the tmp dir before running pacman, so that local package
# archives are made available more easily.
curdir = os.getcwd()
tmpdir = os.path.join(self.root, TMPDIR)
os.chdir(tmpdir)
# Change to the tmp dir before running pacman, so that local package
# archives are made available more easily.
curdir = os.getcwd()
tmpdir = os.path.join(self.root, TMPDIR)
os.chdir(tmpdir)
t0 = time.time()
self.retcode = os.system(" ".join(cmd))
t1 = time.time()
vprint("\ttime elapsed: %ds" % (t1-t0))
t0 = time.time()
self.retcode = os.system(" ".join(cmd))
t1 = time.time()
vprint("\ttime elapsed: %ds" % (t1-t0))
if self.retcode == None:
self.retcode = 0
else:
self.retcode /= 256
dbg("retcode = %s" % self.retcode)
os.chdir(curdir)
if self.retcode == None:
self.retcode = 0
else:
self.retcode /= 256
dbg("retcode = %s" % self.retcode)
os.chdir(curdir)
# Check if pacman failed because of bad permissions
if self.retcode \
and grep(os.path.join(self.root, LOGFILE),
"you cannot perform this operation unless you are root"):
print "\tERROR: pacman support for fakeroot is not disabled"
# Check if the lock is still there
if os.path.isfile(PM_LOCK):
print "\tERROR: %s not removed" % PM_LOCK
os.unlink(PM_LOCK)
# Look for a core file
if os.path.isfile(os.path.join(self.root, TMPDIR, "core")):
print "\tERROR: pacman dumped a core file"
# Check if pacman failed because of bad permissions
if self.retcode and not pacman["nolog"] \
and grep(os.path.join(self.root, LOGFILE),
"you cannot perform this operation unless you are root"):
print "\tERROR: pacman support for fakeroot is not disabled"
# Check if the lock is still there
if os.path.isfile(PM_LOCK):
print "\tERROR: %s not removed" % PM_LOCK
os.unlink(PM_LOCK)
# Look for a core file
if os.path.isfile(os.path.join(self.root, TMPDIR, "core")):
print "\tERROR: pacman dumped a core file"
def check(self):
"""
"""
def check(self):
"""
"""
print "==> Checking rules"
print "==> Checking rules"
for i in self.rules:
success = i.check(self.root, self.retcode, self.db["local"], self.files)
if success == 1:
msg = "OK"
self.result["ok"] += 1
elif success == 0:
msg = "KO"
self.result["ko"] += 1
else:
msg = "SKIP"
print "\t[%s] %s" % (msg, i.rule)
i.result = success
for i in self.rules:
success = i.check(self.root, self.retcode, self.db["local"], self.files)
if success == 1:
msg = " OK "
self.result["success"] += 1
elif success == 0:
msg = "FAIL"
self.result["fail"] += 1
else:
msg = "SKIP"
print "\t[%s] %s" % (msg, i.rule)
i.result = success
if __name__ == "__main__":
test = pmtest("test1", "./root")
print test
test = pmtest("test1", "./root")
print test
# vim: set ts=4 sw=4 et:

View file

@ -24,3 +24,4 @@ self.args = "-Su"
self.addrule("PACMAN_RETCODE=0")
self.addrule("PKG_EXIST=pkg1")
self.addrule("!PKG_EXIST=pkg2")
self.addrule("!PKG_EXIST=pkg3")

View file

@ -1,4 +1,4 @@
self.description = "System upgrade"
self.description = "System upgrade - conflict/provide with an installed package"
sp1 = pmpkg("pkg1", "1.0-2")
sp1.conflicts = ["pkg2"]

View file

@ -49,16 +49,16 @@ debug = 1
def err(msg):
print "error: " + msg
sys.exit(1)
print "error: " + msg
sys.exit(1)
def vprint(msg):
if verbose:
print msg
if verbose:
print msg
def dbg(msg):
if debug:
print msg
if debug:
print msg
#
@ -66,133 +66,133 @@ def dbg(msg):
#
def getfilename(name):
"""
"""
filename = ""
link = ""
if not name.find(" -> ") == -1:
filename, link = name.split(" -> ")
elif name[-1] == "*":
filename = name.rstrip("*")
else:
filename = name
return filename
"""
"""
filename = ""
link = ""
if not name.find(" -> ") == -1:
filename, link = name.split(" -> ")
elif name[-1] == "*":
filename = name.rstrip("*")
else:
filename = name
return filename
def mkfile(name, data = ""):
"""
"""
"""
"""
isaltered = 0
isdir = 0
islink = 0
link = ""
filename = ""
isaltered = 0
isdir = 0
islink = 0
link = ""
filename = ""
if not name.find(" -> ") == -1:
islink = 1
filename, link = name.split(" -> ")
elif name[-1] == "*":
isaltered = 1
filename = name.rstrip("*")
else:
filename = name
if name[-1] == "/":
isdir = 1
if not name.find(" -> ") == -1:
islink = 1
filename, link = name.split(" -> ")
elif name[-1] == "*":
isaltered = 1
filename = name.rstrip("*")
else:
filename = name
if name[-1] == "/":
isdir = 1
if isdir:
path = filename
else:
path = os.path.dirname(filename)
try:
if path and not os.path.isdir(path):
os.makedirs(path, 0755)
except:
error("mkfile: could not create directory hierarchy '%s'" % path)
if isdir:
path = filename
else:
path = os.path.dirname(filename)
try:
if path and not os.path.isdir(path):
os.makedirs(path, 0755)
except:
error("mkfile: could not create directory hierarchy '%s'" % path)
if isdir:
return
if islink:
curdir = os.getcwd()
os.chdir(path)
os.symlink(link, os.path.basename(filename))
os.chdir(curdir)
else:
fd = file(filename, "w")
if data:
fd.write(data)
if data[-1] != "\n":
fd.write("\n")
fd.close()
if isdir:
return
if islink:
curdir = os.getcwd()
os.chdir(path)
os.symlink(link, os.path.basename(filename))
os.chdir(curdir)
else:
fd = file(filename, "w")
if data:
fd.write(data)
if data[-1] != "\n":
fd.write("\n")
fd.close()
def mkdescfile(filename, pkg):
"""
"""
"""
"""
data = []
data = []
# desc
#data.append("pkgname = %s" % pkg.name)
#data.append("pkgver = %s" % pkg.version)
if pkg.desc:
data.append("pkgdesc = %s" % pkg.desc)
if pkg.url:
data.append("url = %s" % pkg.url)
if pkg.builddate:
data.append("builddate = %s" % pkg.builddate)
if pkg.packager:
data.append("packager = %s" % pkg.packager)
if pkg.size:
data.append("size = %s" % pkg.size)
if pkg.arch:
data.append("arch = %s" % pkg.arch)
for i in pkg.groups:
data.append("group = %s" % i)
for i in pkg.license:
data.append("license = %s" % i)
if pkg.md5sum:
data.append("md5sum = %s" % pkg.md5sum)
# desc
#data.append("pkgname = %s" % pkg.name)
#data.append("pkgver = %s" % pkg.version)
if pkg.desc:
data.append("pkgdesc = %s" % pkg.desc)
if pkg.url:
data.append("url = %s" % pkg.url)
if pkg.builddate:
data.append("builddate = %s" % pkg.builddate)
if pkg.packager:
data.append("packager = %s" % pkg.packager)
if pkg.size:
data.append("size = %s" % pkg.size)
if pkg.arch:
data.append("arch = %s" % pkg.arch)
for i in pkg.groups:
data.append("group = %s" % i)
for i in pkg.license:
data.append("license = %s" % i)
if pkg.md5sum:
data.append("md5sum = %s" % pkg.md5sum)
# depends
for i in pkg.replaces:
data.append("replaces = %s" % i)
for i in pkg.depends:
data.append("depend = %s" % i)
for i in pkg.conflicts:
data.append("conflict = %s" % i)
for i in pkg.provides:
data.append("provides = %s" % i)
for i in pkg.backup:
data.append("backup = %s" % i)
if pkg.force:
data.append("force = 1")
# depends
for i in pkg.replaces:
data.append("replaces = %s" % i)
for i in pkg.depends:
data.append("depend = %s" % i)
for i in pkg.conflicts:
data.append("conflict = %s" % i)
for i in pkg.provides:
data.append("provides = %s" % i)
for i in pkg.backup:
data.append("backup = %s" % i)
if pkg.force:
data.append("force = 1")
mkfile(filename, "\n".join(data))
mkfile(filename, "\n".join(data))
def mkinstallfile(filename, install):
"""
"""
data = []
for key, value in install.iteritems():
if value:
data.append("%s() {\n%s\n}" % (key, value))
"""
"""
data = []
for key, value in install.iteritems():
if value:
data.append("%s() {\n%s\n}" % (key, value))
mkfile(filename, "\n".join(data))
mkfile(filename, "\n".join(data))
def mkcfgfile(filename, root, option, db):
"""
"""
# Options
data = ["[options]"]
for key, value in option.iteritems():
data.extend(["%s = %s" % (key, j) for j in value])
"""
"""
# Options
data = ["[options]"]
for key, value in option.iteritems():
data.extend(["%s = %s" % (key, j) for j in value])
# Repositories
data.extend(["[%s]\n" \
"server = file://%s\n" \
% (value.treename, os.path.join(root, SYNCREPO, value.treename)) \
for key, value in db.iteritems() if not key == "local"])
# Repositories
data.extend(["[%s]\n" \
"server = file://%s\n" \
% (value.treename, os.path.join(root, SYNCREPO, value.treename)) \
for key, value in db.iteritems() if not key == "local"])
mkfile(os.path.join(root, filename), "\n".join(data))
mkfile(os.path.join(root, filename), "\n".join(data))
#
@ -200,26 +200,26 @@ def mkcfgfile(filename, root, option, db):
#
def getmd5sum(filename):
"""
"""
fd = open(filename, "rb")
checksum = md5.new()
while 1:
block = fd.read(1048576)
if not block:
break
checksum.update(block)
fd.close()
digest = checksum.digest()
return "%02x"*len(digest) % tuple(map(ord, digest))
"""
"""
fd = open(filename, "rb")
checksum = md5.new()
while 1:
block = fd.read(1048576)
if not block:
break
checksum.update(block)
fd.close()
digest = checksum.digest()
return "%02x"*len(digest) % tuple(map(ord, digest))
def mkmd5sum(data):
"""
"""
checksum = md5.new()
checksum.update("%s\n" % data)
digest = checksum.digest()
return "%02x"*len(digest) % tuple(map(ord, digest))
"""
"""
checksum = md5.new()
checksum.update("%s\n" % data)
digest = checksum.digest()
return "%02x"*len(digest) % tuple(map(ord, digest))
#
@ -227,15 +227,15 @@ def mkmd5sum(data):
#
def getmtime(filename):
"""
"""
st = os.stat(filename)
return st[stat.ST_ATIME], st[stat.ST_MTIME], st[stat.ST_CTIME]
"""
"""
st = os.stat(filename)
return st[stat.ST_ATIME], st[stat.ST_MTIME], st[stat.ST_CTIME]
def diffmtime(mt1, mt2):
"""ORE: TBD
"""
return not mt1 == mt2
"""ORE: TBD
"""
return not mt1 == mt2
#
@ -243,17 +243,18 @@ def diffmtime(mt1, mt2):
#
def grep(filename, pattern):
found = 0
fd = file(filename, "r")
while 1 and not found:
line = fd.readline()
if not line:
break
if line.find(pattern) != -1:
found = 1
fd.close()
return found
found = 0
fd = file(filename, "r")
while 1 and not found:
line = fd.readline()
if not line:
break
if line.find(pattern) != -1:
found = 1
fd.close()
return found
if __name__ == "__main__":
pass
pass
# vim: set ts=4 sw=4 et: