Kullanım şekli değişti:

cd pisi
tools/repostats.py /path/to/pspecs [/path/to/binary.pisis]

ikinci parametreyi verirseniz, toplam kurulu boyut ve
her bir dosya tipi için toplam boyutu gösteriyor.

html dışındaki çıktı şeylerini de çıkardım.
This commit is contained in:
Gürer Özen
2005-10-30 20:50:13 +00:00
parent 8a9c811a2f
commit e05e04362f
+82 -89
View File
@@ -13,6 +13,7 @@ import sys
import os import os
import codecs import codecs
import re import re
import getopt
import gettext import gettext
__trans = gettext.translation('pisi', fallback=True) __trans = gettext.translation('pisi', fallback=True)
@@ -23,6 +24,9 @@ from svn import core, client
sys.path.append('.') sys.path.append('.')
import pisi.specfile import pisi.specfile
import pisi.uri import pisi.uri
import pisi.package
import pisi.metadata
import pisi.files
from pisi.cli import printu from pisi.cli import printu
# default html templates # default html templates
@@ -31,6 +35,15 @@ def_table_html = u"""
<tr><td>%s</td><td>%s</td></tr> <tr><td>%s</td><td>%s</td></tr>
""" """
def_repo_sizes_html = u"""
<h3>Boyutlar</h3>
<p>Toplam kurulu boyut %(total)s</p>
<p>Dosya tiplerine göre liste:</p>
<table><tbody>
%(sizes)s
</table></tbody>
"""
def_repo_html = u""" def_repo_html = u"""
<html><head> <html><head>
<title>Depo istatistikleri</title> <title>Depo istatistikleri</title>
@@ -59,6 +72,8 @@ Depoda toplam %(nr_source)d
%(missing)s %(missing)s
</tbody></table></p> </tbody></table></p>
%(sizes)s
<h3>Paketçiler:</h3><p><table><tbody> <h3>Paketçiler:</h3><p><table><tbody>
%(packagers)s %(packagers)s
</tbody></table></p> </tbody></table></p>
@@ -333,6 +348,7 @@ class Package:
self.pakspec = pakspec self.pakspec = pakspec
self.revBuildDeps = [] self.revBuildDeps = []
self.revRuntimeDeps = [] self.revRuntimeDeps = []
self.installedSize = 0
def markDeps(self): def markDeps(self):
# mark reverse build dependencies # mark reverse build dependencies
@@ -354,27 +370,6 @@ class Package:
Missing(p) Missing(p)
missing[p].revRuntimeDeps.append(self.name) missing[p].revRuntimeDeps.append(self.name)
def report(self):
source = self.source.spec.source
printu(_("Binary package: %s\n") % self.name)
printu(_(" Version %s release %s\n") % (source.version, source.release))
printu(_(" Packager: %s <%s>\n") % (
source.packager.name, source.packager.email))
printu(_(" Build dependencies:\n"))
for d in source.buildDeps:
printu(" %s\n" % d.package)
printu(_(" Runtime dependencies:\n"))
for d in self.pakspec.runtimeDeps:
printu(" %s\n" % d.package)
if self.revBuildDeps:
printu(_(" Reverse build dependencies:\n"))
for d in self.revBuildDeps:
printu(" %s\n" % d)
if self.revRuntimeDeps:
printu(_(" Reverse runtime dependencies:\n"))
for d in self.revRuntimeDeps:
printu(" %s\n" % d)
def report_html(self): def report_html(self):
source = self.source.spec.source source = self.source.spec.source
bDeps = map(lambda x: "<a href='package-%s.html'>%s</a>" % (x, x), bDeps = map(lambda x: "<a href='package-%s.html'>%s</a>" % (x, x),
@@ -503,19 +498,6 @@ class Packager:
for update in spec.history: for update in spec.history:
Packager(spec, update) Packager(spec, update)
def report(self):
printu(_("Packager: %s <%s>\n") % (self.name, self.email))
if self.errors:
printu(_(" Errors:\n"))
for e in self.errors:
printu(" %s\n" % e)
printu(_(" Source packages (%d):\n") % len(self.sources))
for s in self.sources:
printu(" %s\n" % s)
printu(_(" Updates (%d):\n") % len(self.updates))
for s in self.updates:
printu(" %s (%s): %s\n" % s)
def report_html(self): def report_html(self):
srcs = map(lambda x: "<a href='./source-%s.html'>%s</a>" % (x, x), self.sources) srcs = map(lambda x: "<a href='./source-%s.html'>%s</a>" % (x, x), self.sources)
srcs.sort() srcs.sort()
@@ -541,6 +523,8 @@ class Repository:
self.mostpatched = Histogram() self.mostpatched = Histogram()
self.longpy = Histogram() self.longpy = Histogram()
self.cscripts = Histogram() self.cscripts = Histogram()
self.total_installed_size = 0
self.installed_sizes = {}
def processPspec(self, path, spec): def processPspec(self, path, spec):
# new classes # new classes
@@ -580,36 +564,30 @@ class Repository:
for p in packages.values(): for p in packages.values():
p.markDeps() p.markDeps()
def report(self): def processPisi(self, path):
printu(_("Repository Statistics:\n")) p = pisi.package.Package(path)
# general stats p.extract_files(["metadata.xml", "files.xml"], ".")
printu(_(" Total of %d source packages, and %d binary packages.\n") % ( md = pisi.metadata.MetaData()
self.nr_sources, self.nr_packages)) md.read("metadata.xml")
printu(_(" There are %d patches applied.\n") % self.nr_patches) self.total_installed_size += md.package.installedSize
# problems if packages.has_key(md.package.name):
if missing: # FIXME: check version/release match too?
printu(_(" Missing packages (%d):\n") % len(missing)) packages[md.package.name].installed_size = md.package.installedSize
for m in missing.values(): else:
printu(" %s\n" % m.name) printu("Binary package '%s' has no source package in repository %s\n" % (path, self.path))
# trivia fd = pisi.files.Files()
printu(_(" Top five most patched source:\n")) fd.read("files.xml")
for p in self.mostpatched.get_list(5): for f in fd.list:
printu(" %4d %s\n" % (p[1], p[0])) if self.installed_sizes.has_key(f.type):
printu(_(" Top five longest action.py scripts:\n")) self.installed_sizes[f.type] += int(f.size)
for p in self.longpy.get_list(5): else:
printu(" %4d %s\n" % (p[1], p[0])) self.installed_sizes[f.type] = int(f.size)
# lists
printu(_(" COMAR scripts:\n")) def scan_bins(self, binpath):
for cs in self.cscripts.get_list(): for root, dirs, files in os.walk(binpath):
printu(" %4d %s\n" % (cs[1], cs[0])) for fn in files:
people = self.people.get_list() if fn.endswith(".pisi"):
printu(_(" Packagers (%d):\n") % len(people)) self.processPisi(os.path.join(root, fn))
for p in people:
printu(" %4d %s\n" % (p[1], p[0]))
licenses = self.licenses.get_list()
printu(_(" Licenses (%d):\n") % len(licenses))
for p in licenses:
printu(" %4d %s\n" % (p[1], p[0]))
def report_html(self): def report_html(self):
miss = map(lambda x: "<tr><td><a href='./package-%s.html'>%s</a></td></tr>" % (x, x), missing.keys()) miss = map(lambda x: "<tr><td><a href='./package-%s.html'>%s</a></td></tr>" % (x, x), missing.keys())
@@ -626,6 +604,13 @@ class Repository:
ulongpy = [] ulongpy = []
for p in self.longpy.get_list(5): for p in self.longpy.get_list(5):
ulongpy.append(("<a href='./source-%s.html'>%s</a>" % (p[0], p[0]), p[1])) ulongpy.append(("<a href='./source-%s.html'>%s</a>" % (p[0], p[0]), p[1]))
if self.total_installed_size:
items = self.installed_sizes.items()
items.sort(valuesort)
elts = "".join(map(lambda x: "<tr><td>%s</td><td>%d</td></tr>" % (x[0], x[1]), items))
sizes = template_get("repo_sizes") % { "total": self.total_installed_size, "sizes": elts }
else:
sizes = ""
dict = { dict = {
"nr_source": self.nr_sources, "nr_source": self.nr_sources,
"nr_packages": self.nr_packages, "nr_packages": self.nr_packages,
@@ -634,6 +619,7 @@ class Repository:
"longpy": template_table("table", ulongpy), "longpy": template_table("table", ulongpy),
"packagers": template_table("table", upeople), "packagers": template_table("table", upeople),
"missing": "\n".join(miss), "missing": "\n".join(miss),
"sizes": sizes,
"errors": e "errors": e
} }
template_write("paksite/index.html", "repo", dict) template_write("paksite/index.html", "repo", dict)
@@ -647,41 +633,51 @@ class Repository:
# command line driver # command line driver
if len(sys.argv) < 2: def usage():
printu(_("Usage: repostats.py source-repo-path [ command [arg] ]\n")) printu(_("Usage: repostats.py [OPTIONS] source-repo-path [binary-repo-path]\n"))
printu(" -t, --test-only: %s" % _("Dont generate the web site.\n"))
sys.exit(0) sys.exit(0)
repo = Repository(sys.argv[1]) if __name__ == "__main__":
try:
opts, args = getopt.gnu_getopt(sys.argv[1:], "ht", ["help", "test-only"])
except:
usage()
if args == []:
usage()
do_web = True
for o, v in opts:
if o in ("-h", "--help"):
usage()
if o in ("-t", "--test-only"):
do_web = False
repo = Repository(args[0])
printu(_("Scanning source repository...\n")) printu(_("Scanning source repository...\n"))
repo.scan() repo.scan()
if len(args) > 1:
printu(_("Scanning binary packages...\n"))
repo.scan_bins(args[1])
if errors: if errors:
printu("***\n") printu("***\n")
printu(_("Encountered %d errors! Fix them immediately!\n") % len(errors)) printu(_("Encountered %d errors! Fix them immediately!\n") % len(errors))
for e in errors: for e in errors:
printu(e) printu(e)
printu("\n") printu("\n")
printu("\n")
printu("***\n") printu("***\n")
if len(sys.argv) > 2: if missing:
if sys.argv[2] == "check": printu(_("These dependencies are not available in repository:\n"))
sys.exit(0) for m in missing.keys():
elif sys.argv[2] == "packager": printu(" %s\n" % m)
if len(sys.argv) > 3:
packagers[unicode(sys.argv[3].decode('utf-8'))].report() if do_web:
sys.exit(0)
else:
for p in packagers.values():
printu(_("%s <%s>, %s source package\n") % (p.name, p.email, len(p.sources)))
sys.exit(0)
elif sys.argv[2] == "package":
if len(sys.argv) > 3:
packages[unicode(sys.argv[3].decode('utf-8'))].report()
sys.exit(0)
else:
printu(_("Which package?\n"))
sys.exit(0)
elif sys.argv[2] == "html":
try: try:
os.mkdir("paksite") os.mkdir("paksite")
except: except:
@@ -695,6 +691,3 @@ if len(sys.argv) > 2:
p.report_html() p.report_html()
for p in sources.values(): for p in sources.values():
p.report_html() p.report_html()
sys.exit(0)
repo.report()