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

View file

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

View file

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

View file

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

View file

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

View file

@ -22,112 +22,113 @@ from util import *
class pmrule: class pmrule:
"""Rule object """Rule object
""" """
def __init__(self, rule): def __init__(self, rule):
self.rule = rule self.rule = rule
self.false = 0 self.false = 0
self.result = 0 self.result = 0
def __str__(self): def __str__(self):
return "rule = %s" % self.rule 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("=") [test, args] = self.rule.split("=")
if test[0] == "!": if test[0] == "!":
self.false = 1 self.false = 1
test = test.lstrip("!") test = test.lstrip("!")
[kind, case] = test.split("_") [kind, case] = test.split("_")
if "|" in args: if "|" in args:
[key, value] = args.split("|", 1) [key, value] = args.split("|", 1)
else: else:
[key, value] = [args, None] [key, value] = [args, None]
if kind == "PACMAN": if kind == "PACMAN":
if case == "RETCODE": if case == "RETCODE":
if retcode != int(key): if retcode != int(key):
success = 0 success = 0
elif case == "OUTPUT": elif case == "OUTPUT":
if not grep(os.path.join(root, LOGFILE), key): if not grep(os.path.join(root, LOGFILE), key):
success = 0 success = 0
else: else:
success = -1 success = -1
elif kind == "PKG": elif kind == "PKG":
newpkg = localdb.db_read(key) newpkg = localdb.db_read(key)
if not newpkg: if not newpkg:
success = 0 success = 0
else: else:
dbg("newpkg.checksum : %s" % newpkg.checksum) #dbg("newpkg.checksum : %s" % newpkg.checksum)
dbg("newpkg.mtime : %s" % newpkg.mtime) #dbg("newpkg.mtime : %s" % newpkg.mtime)
if case == "EXIST": if case == "EXIST":
success = 1 success = 1
elif case == "MODIFIED": elif case == "MODIFIED":
if not localdb.ispkgmodified(newpkg): if not localdb.ispkgmodified(newpkg):
success = 0 success = 0
elif case == "VERSION": elif case == "VERSION":
if value != newpkg.version: if value != newpkg.version:
success = 0 success = 0
elif case == "GROUPS": elif case == "GROUPS":
if not value in newpkg.groups: if not value in newpkg.groups:
success = 0 success = 0
elif case == "DEPENDS": elif case == "DEPENDS":
if not value in newpkg.depends: if not value in newpkg.depends:
success = 0 success = 0
elif case == "REQUIREDBY": elif case == "REQUIREDBY":
if not value in newpkg.requiredby: if not value in newpkg.requiredby:
success = 0 success = 0
elif case == "REASON": elif case == "REASON":
if not newpkg.reason == int(value): if not newpkg.reason == int(value):
success = 0 success = 0
elif case == "FILES": elif case == "FILES":
if not value in newpkg.files: if not value in newpkg.files:
success = 0 success = 0
elif case == "BACKUP": elif case == "BACKUP":
found = 0 found = 0
for f in newpkg.backup: for f in newpkg.backup:
name, md5sum = f.split("\t") name, md5sum = f.split("\t")
if value == name: if value == name:
found = 1 found = 1
if not found: if not found:
success = 0 success = 0
else: else:
success = -1 success = -1
elif kind == "FILE": elif kind == "FILE":
filename = os.path.join(root, key) filename = os.path.join(root, key)
if case == "EXIST": if case == "EXIST":
if not os.path.isfile(filename): if not os.path.isfile(filename):
success = 0 success = 0
else: else:
if case == "MODIFIED": if case == "MODIFIED":
for f in files: for f in files:
if f.name == key: if f.name == key:
if not f.ismodified(): if not f.ismodified():
success = 0 success = 0
elif case == "PACNEW": elif case == "PACNEW":
if not os.path.isfile("%s%s" % (filename, PM_PACNEW)): if not os.path.isfile("%s%s" % (filename, PM_PACNEW)):
success = 0 success = 0
elif case == "PACORIG": elif case == "PACORIG":
if not os.path.isfile("%s%s" % (filename, PM_PACORIG)): if not os.path.isfile("%s%s" % (filename, PM_PACORIG)):
success = 0 success = 0
elif case == "PACSAVE": elif case == "PACSAVE":
if not os.path.isfile("%s%s" % (filename, PM_PACSAVE)): if not os.path.isfile("%s%s" % (filename, PM_PACSAVE)):
success = 0 success = 0
else: else:
success = -1 success = -1
else: else:
success = -1 success = -1
if self.false and success != -1: if self.false and success != -1:
success = not success success = not success
self.result = success self.result = success
return success return success
if __name__ != "__main__": 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: class pmtest:
"""Test object """Test object
""" """
def __init__(self, name, root): def __init__(self, name, root):
self.name = name self.name = name
self.root = root self.root = root
def __str__(self): def __str__(self):
return "name = %s\n" \ return "name = %s\n" \
"root = %s" % (self.name, self.root) "root = %s" % (self.name, self.root)
def addpkg2db(self, treename, pkg): def addpkg2db(self, treename, pkg):
""" """
""" """
if not treename in self.db: if not treename in self.db:
self.db[treename] = pmdb.pmdb(treename, os.path.join(self.root, PM_DBPATH)) self.db[treename] = pmdb.pmdb(treename, os.path.join(self.root, PM_DBPATH))
self.db[treename].pkgs.append(pkg) self.db[treename].pkgs.append(pkg)
def addpkg(self, pkg): def addpkg(self, pkg):
""" """
""" """
self.localpkgs.append(pkg) self.localpkgs.append(pkg)
def addrule(self, rulename): def addrule(self, rulename):
""" """
""" """
rule = pmrule.pmrule(rulename) rule = pmrule.pmrule(rulename)
self.rules.append(rule) self.rules.append(rule)
def load(self): def load(self):
""" """
""" """
# Reset test parameters # Reset test parameters
self.result = { self.result = {
"ok": 0, "success": 0,
"ko": 0 "fail": 0
} }
self.args = "" self.args = ""
self.retcode = 0 self.retcode = 0
self.db = { self.db = {
"local": pmdb.pmdb("local", os.path.join(self.root, PM_DBPATH)) "local": pmdb.pmdb("local", os.path.join(self.root, PM_DBPATH))
} }
self.localpkgs = [] self.localpkgs = []
self.filesystem = [] self.filesystem = []
self.description = "" self.description = ""
self.option = { self.option = {
"noupgrade": [], "noupgrade": [],
"ignorepkg": [], "ignorepkg": [],
"noextract": [] "noextract": []
} }
# Test rules # Test rules
self.rules = [] self.rules = []
self.files = [] self.files = []
if os.path.isfile(self.name): if os.path.isfile(self.name):
execfile(self.name) execfile(self.name)
else: else:
err("file %s does not exist!" % self.name) 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 # Cleanup leftover files from a previous test session
if os.path.isdir(self.root): if os.path.isdir(self.root):
shutil.rmtree(self.root) shutil.rmtree(self.root)
vprint("\t%s" % self.root) vprint("\t%s" % self.root)
# Create directory structure # Create directory structure
vprint(" Creating directory structure:") vprint(" Creating directory structure:")
dbdir = os.path.join(self.root, PM_DBPATH) dbdir = os.path.join(self.root, PM_DBPATH)
cachedir = os.path.join(self.root, PM_CACHEDIR) cachedir = os.path.join(self.root, PM_CACHEDIR)
syncdir = os.path.join(self.root, SYNCREPO) syncdir = os.path.join(self.root, SYNCREPO)
tmpdir = os.path.join(self.root, TMPDIR) tmpdir = os.path.join(self.root, TMPDIR)
logdir = os.path.join(self.root, os.path.dirname(LOGFILE)) logdir = os.path.join(self.root, os.path.dirname(LOGFILE))
etcdir = os.path.join(self.root, os.path.dirname(PACCONF)) etcdir = os.path.join(self.root, os.path.dirname(PACCONF))
for dir in [dbdir, cachedir, syncdir, tmpdir, logdir, etcdir]: for dir in [dbdir, cachedir, syncdir, tmpdir, logdir, etcdir]:
if not os.path.isdir(dir): if not os.path.isdir(dir):
vprint("\t%s" % dir[len(self.root)+1:]) vprint("\t%s" % dir[len(self.root)+1:])
os.makedirs(dir, 0755) os.makedirs(dir, 0755)
# Configuration file # Configuration file
vprint(" Creating configuration file") vprint(" Creating configuration file")
vprint("\t%s" % PACCONF) vprint("\t%s" % PACCONF)
mkcfgfile(PACCONF, self.root, self.option, self.db) mkcfgfile(PACCONF, self.root, self.option, self.db)
# Creating packages # Creating packages
vprint(" Creating package archives") vprint(" Creating package archives")
for pkg in self.localpkgs: for pkg in self.localpkgs:
vprint("\t%s" % os.path.join(TMPDIR, pkg.filename())) vprint("\t%s" % os.path.join(TMPDIR, pkg.filename()))
pkg.makepkg(tmpdir) pkg.makepkg(tmpdir)
for key, value in self.db.iteritems(): for key, value in self.db.iteritems():
if key == "local": if key == "local":
continue continue
for pkg in value.pkgs: for pkg in value.pkgs:
archive = pkg.filename() archive = pkg.filename()
vprint("\t%s" % os.path.join(PM_CACHEDIR, archive)) vprint("\t%s" % os.path.join(PM_CACHEDIR, archive))
pkg.makepkg(cachedir) pkg.makepkg(cachedir)
pkg.md5sum = getmd5sum(os.path.join(cachedir, archive)) pkg.md5sum = getmd5sum(os.path.join(cachedir, archive))
pkg.csize = os.stat(os.path.join(cachedir, archive))[stat.ST_SIZE] pkg.csize = os.stat(os.path.join(cachedir, archive))[stat.ST_SIZE]
# Populating databases # Populating databases
vprint(" Populating databases") vprint(" Populating databases")
for key, value in self.db.iteritems(): for key, value in self.db.iteritems():
for pkg in value.pkgs: for pkg in value.pkgs:
vprint("\t%s/%s" % (key, pkg.fullname())) vprint("\t%s/%s" % (key, pkg.fullname()))
if key == "local": if key == "local":
pkg.installdate = time.ctime() pkg.installdate = time.ctime()
value.db_write(pkg) value.db_write(pkg)
# Creating sync database archives # Creating sync database archives
vprint(" Creating sync database archives") vprint(" Creating sync database archives")
for key, value in self.db.iteritems(): for key, value in self.db.iteritems():
if key == "local": if key == "local":
continue continue
archive = value.treename + PM_EXT_DB archive = value.treename + PM_EXT_DB
vprint("\t" + os.path.join(SYNCREPO, archive)) vprint("\t" + os.path.join(SYNCREPO, archive))
value.gensync(os.path.join(syncdir, value.treename)) value.gensync(os.path.join(syncdir, value.treename))
# Filesystem # Filesystem
vprint(" Populating file system") vprint(" Populating file system")
for pkg in self.db["local"].pkgs: for pkg in self.db["local"].pkgs:
vprint("\tinstalling %s" % pkg.fullname()) vprint("\tinstalling %s" % pkg.fullname())
pkg.install_files(self.root) pkg.install_files(self.root)
for f in self.filesystem: for f in self.filesystem:
vprint("\t%s" % f) vprint("\t%s" % f)
mkfile(os.path.join(self.root, f), f) mkfile(os.path.join(self.root, f), f)
# Done. # Done.
vprint(" Taking a snapshot of the file system") vprint(" Taking a snapshot of the file system")
for roots, dirs, files in os.walk(self.root): for roots, dirs, files in os.walk(self.root):
for i in files: for i in files:
filename = os.path.join(roots, i) filename = os.path.join(roots, i)
f = pmfile.pmfile(self.root, filename.replace(self.root + "/", "")) f = pmfile.pmfile(self.root, filename.replace(self.root + "/", ""))
self.files.append(f) self.files.append(f)
vprint("\t%s" % f.name) vprint("\t%s" % f.name)
def run(self, pacman): def run(self, pacman):
""" """
""" """
if os.path.isfile(PM_LOCK): if os.path.isfile(PM_LOCK):
print "\tERROR: another pacman session is on-going -- skipping" print "\tERROR: another pacman session is on-going -- skipping"
return return
print "==> Running test" print "==> Running test"
vprint("\tpacman %s" % self.args) vprint("\tpacman %s" % self.args)
cmd = ["fakeroot"] cmd = ["fakeroot"]
if pacman["gdb"]: if pacman["gdb"]:
cmd.append("libtool gdb --args") cmd.append("libtool gdb --args")
if pacman["valgrind"]: if pacman["valgrind"]:
cmd.append("valgrind --tool=memcheck --leak-check=full --show-reachable=yes") cmd.append("valgrind --tool=memcheck --leak-check=full --show-reachable=yes")
cmd.append("%s --noconfirm --config=%s --root=%s" \ cmd.append("%s --noconfirm --config=%s --root=%s" \
% (pacman["bin"], os.path.join(self.root, PACCONF), self.root)) % (pacman["bin"], os.path.join(self.root, PACCONF), self.root))
if pacman["debug"]: if pacman["debug"]:
cmd.append("--debug=%s" % pacman["debug"]) cmd.append("--debug=%s" % pacman["debug"])
cmd.append("%s" % self.args) cmd.append("%s" % self.args)
if not pacman["gdb"] and not pacman["valgrind"] and not pacman["nolog"]: if not pacman["gdb"] and not pacman["valgrind"] and not pacman["nolog"]:
cmd.append(">%s 2>&1" % os.path.join(self.root, LOGFILE)) cmd.append(">%s 2>&1" % os.path.join(self.root, LOGFILE))
dbg(" ".join(cmd)) dbg(" ".join(cmd))
# Change to the tmp dir before running pacman, so that local package # Change to the tmp dir before running pacman, so that local package
# archives are made available more easily. # archives are made available more easily.
curdir = os.getcwd() curdir = os.getcwd()
tmpdir = os.path.join(self.root, TMPDIR) tmpdir = os.path.join(self.root, TMPDIR)
os.chdir(tmpdir) os.chdir(tmpdir)
t0 = time.time() t0 = time.time()
self.retcode = os.system(" ".join(cmd)) self.retcode = os.system(" ".join(cmd))
t1 = time.time() t1 = time.time()
vprint("\ttime elapsed: %ds" % (t1-t0)) vprint("\ttime elapsed: %ds" % (t1-t0))
if self.retcode == None: if self.retcode == None:
self.retcode = 0 self.retcode = 0
else: else:
self.retcode /= 256 self.retcode /= 256
dbg("retcode = %s" % self.retcode) dbg("retcode = %s" % self.retcode)
os.chdir(curdir) os.chdir(curdir)
# Check if pacman failed because of bad permissions # Check if pacman failed because of bad permissions
if self.retcode \ if self.retcode and not pacman["nolog"] \
and grep(os.path.join(self.root, LOGFILE), and grep(os.path.join(self.root, LOGFILE),
"you cannot perform this operation unless you are root"): "you cannot perform this operation unless you are root"):
print "\tERROR: pacman support for fakeroot is not disabled" print "\tERROR: pacman support for fakeroot is not disabled"
# Check if the lock is still there # Check if the lock is still there
if os.path.isfile(PM_LOCK): if os.path.isfile(PM_LOCK):
print "\tERROR: %s not removed" % PM_LOCK print "\tERROR: %s not removed" % PM_LOCK
os.unlink(PM_LOCK) os.unlink(PM_LOCK)
# Look for a core file # Look for a core file
if os.path.isfile(os.path.join(self.root, TMPDIR, "core")): if os.path.isfile(os.path.join(self.root, TMPDIR, "core")):
print "\tERROR: pacman dumped a core file" print "\tERROR: pacman dumped a core file"
def check(self): def check(self):
""" """
""" """
print "==> Checking rules" print "==> Checking rules"
for i in self.rules: for i in self.rules:
success = i.check(self.root, self.retcode, self.db["local"], self.files) success = i.check(self.root, self.retcode, self.db["local"], self.files)
if success == 1: if success == 1:
msg = "OK" msg = " OK "
self.result["ok"] += 1 self.result["success"] += 1
elif success == 0: elif success == 0:
msg = "KO" msg = "FAIL"
self.result["ko"] += 1 self.result["fail"] += 1
else: else:
msg = "SKIP" msg = "SKIP"
print "\t[%s] %s" % (msg, i.rule) print "\t[%s] %s" % (msg, i.rule)
i.result = success i.result = success
if __name__ == "__main__": if __name__ == "__main__":
test = pmtest("test1", "./root") test = pmtest("test1", "./root")
print test 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("PACMAN_RETCODE=0")
self.addrule("PKG_EXIST=pkg1") self.addrule("PKG_EXIST=pkg1")
self.addrule("!PKG_EXIST=pkg2") 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 = pmpkg("pkg1", "1.0-2")
sp1.conflicts = ["pkg2"] sp1.conflicts = ["pkg2"]

View file

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