~ahasenack/landscape-client/landscape-client-1.5.5-0ubuntu0.9.04.0

« back to all changes in this revision

Viewing changes to landscape/package/skeleton.py

  • Committer: Bazaar Package Importer
  • Author(s): Rick Clark
  • Date: 2008-09-08 16:35:57 UTC
  • mto: This revision was merged to the branch mainline in revision 2.
  • Revision ID: james.westby@ubuntu.com-20080908163557-fl0d2oc35hur473w
Tags: upstream-1.0.18
ImportĀ upstreamĀ versionĀ 1.0.18

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import sha
 
2
 
 
3
 
 
4
PACKAGE   = 1 << 0
 
5
PROVIDES  = 1 << 1
 
6
REQUIRES  = 1 << 2
 
7
UPGRADES  = 1 << 3
 
8
CONFLICTS = 1 << 4
 
9
 
 
10
DEB_PACKAGE       = 1 << 16 | PACKAGE
 
11
DEB_PROVIDES      = 2 << 16 | PROVIDES
 
12
DEB_NAME_PROVIDES = 3 << 16 | PROVIDES
 
13
DEB_REQUIRES      = 4 << 16 | REQUIRES
 
14
DEB_OR_REQUIRES   = 5 << 16 | REQUIRES
 
15
DEB_UPGRADES      = 6 << 16 | UPGRADES
 
16
DEB_CONFLICTS     = 7 << 16 | CONFLICTS
 
17
 
 
18
 
 
19
class PackageTypeError(Exception):
 
20
    """Raised when an unsupported package type is passed to build_skeleton."""
 
21
 
 
22
 
 
23
class PackageSkeleton(object):
 
24
 
 
25
    section = None
 
26
    summary = None
 
27
    description = None
 
28
    size = None
 
29
    installed_size = None
 
30
 
 
31
    def __init__(self, type, name, version):
 
32
        self.type = type
 
33
        self.name = name
 
34
        self.version = version
 
35
        self.relations = []
 
36
 
 
37
    def add_relation(self, type, info):
 
38
        self.relations.append((type, info))
 
39
 
 
40
    def get_hash(self):
 
41
        digest = sha.new("[%d %s %s]" % (self.type, self.name, self.version))
 
42
        self.relations.sort()
 
43
        for pair in self.relations:
 
44
            digest.update("[%d %s]" % pair)
 
45
        return digest.digest()
 
46
 
 
47
 
 
48
def build_skeleton(pkg, with_info=False):
 
49
    if not build_skeleton.inited:
 
50
        build_skeleton.inited = True
 
51
        global DebPackage, DebNameProvides, DebOrDepends
 
52
 
 
53
        # Importing from backends depends on smart.init().
 
54
        from smart.backends.deb.base import (
 
55
            DebPackage, DebNameProvides, DebOrDepends)
 
56
 
 
57
    if not isinstance(pkg, DebPackage):
 
58
        raise PackageTypeError()
 
59
 
 
60
    skeleton = PackageSkeleton(DEB_PACKAGE, pkg.name, pkg.version)
 
61
    relations = set()
 
62
    for relation in pkg.provides:
 
63
        if isinstance(relation, DebNameProvides):
 
64
            relations.add((DEB_NAME_PROVIDES, str(relation)))
 
65
        else:
 
66
            relations.add((DEB_PROVIDES, str(relation)))
 
67
    for relation in pkg.requires:
 
68
        if isinstance(relation, DebOrDepends):
 
69
            relations.add((DEB_OR_REQUIRES, str(relation)))
 
70
        else:
 
71
            relations.add((DEB_REQUIRES, str(relation)))
 
72
    for relation in pkg.upgrades:
 
73
        relations.add((DEB_UPGRADES, str(relation)))
 
74
    for relation in pkg.conflicts:
 
75
        relations.add((DEB_CONFLICTS, str(relation)))
 
76
 
 
77
    skeleton.relations = sorted(relations)
 
78
 
 
79
    if with_info:
 
80
        info = pkg.loaders.keys()[0].getInfo(pkg)
 
81
        skeleton.section = info.getGroup()
 
82
        skeleton.summary = info.getSummary()
 
83
        skeleton.description = info.getDescription()
 
84
        skeleton.size = sum(info.getSize(url) for url in info.getURLs())
 
85
        skeleton.installed_size = info.getInstalledSize()
 
86
 
 
87
    return skeleton
 
88
 
 
89
build_skeleton.inited = False