]>
Commit | Line | Data |
---|---|---|
47a4cb89 MT |
1 | #!/usr/bin/python |
2 | ||
4f91860e MT |
3 | import os |
4 | ||
47a4cb89 | 5 | from base import Package |
4f91860e MT |
6 | from binary import BinaryPackage |
7 | ||
8 | from pakfire.constants import * | |
47a4cb89 | 9 | |
fa6d335b MT |
10 | class DatabasePackage(Package): |
11 | type = "db" | |
47a4cb89 | 12 | |
4f91860e MT |
13 | def __init__(self, pakfire, repo, db, data): |
14 | Package.__init__(self, pakfire, repo) | |
3723913b | 15 | |
47a4cb89 MT |
16 | self.db = db |
17 | ||
18 | self._data = {} | |
19 | ||
20 | for key in data.keys(): | |
21 | self._data[key] = data[key] | |
22 | ||
23 | def __repr__(self): | |
24 | return "<%s %s>" % (self.__class__.__name__, self.friendly_name) | |
25 | ||
26 | @property | |
27 | def metadata(self): | |
28 | return self._data | |
29 | ||
30 | @property | |
31 | def id(self): | |
32 | id = self.metadata.get("id") | |
33 | if not id: | |
34 | id = 0 | |
35 | ||
36 | return id | |
37 | ||
38 | @property | |
39 | def name(self): | |
40 | return self.metadata.get("name") | |
41 | ||
42 | @property | |
43 | def version(self): | |
44 | return self.metadata.get("version") | |
45 | ||
46 | @property | |
47 | def release(self): | |
48 | return self.metadata.get("release") | |
49 | ||
50 | @property | |
51 | def epoch(self): | |
52 | epoch = self.metadata.get("epoch", 0) | |
53 | ||
54 | return int(epoch) | |
55 | ||
56 | @property | |
57 | def arch(self): | |
58 | return self.metadata.get("arch") | |
59 | ||
60 | @property | |
61 | def maintainer(self): | |
62 | return self.metadata.get("maintainer") | |
63 | ||
64 | @property | |
65 | def license(self): | |
66 | return self.metadata.get("license") | |
67 | ||
68 | @property | |
69 | def summary(self): | |
70 | return self.metadata.get("summary") | |
71 | ||
72 | @property | |
73 | def description(self): | |
74 | return self.metadata.get("description") | |
75 | ||
76 | @property | |
77 | def group(self): | |
78 | return self.metadata.get("group") | |
79 | ||
80 | @property | |
81 | def build_data(self): | |
82 | return self.metadata.get("build_data") | |
83 | ||
84 | @property | |
85 | def build_host(self): | |
86 | return self.metadata.get("build_host") | |
87 | ||
88 | @property | |
89 | def build_id(self): | |
90 | return self.metadata.get("build_id") | |
91 | ||
92 | @property | |
93 | def provides(self): | |
da77e6fa | 94 | provides = self.metadata.get("provides", "").split() |
47a4cb89 | 95 | |
da77e6fa MT |
96 | # Add autoprovides |
97 | for prov in self._provides: | |
98 | if not prov in provides: | |
99 | provides.append(prov) | |
100 | ||
101 | return provides | |
47a4cb89 MT |
102 | |
103 | @property | |
104 | def requires(self): | |
105 | requires = self.metadata.get("requires") | |
106 | ||
107 | if requires: | |
108 | return requires.split() | |
109 | ||
110 | return [] | |
111 | ||
112 | @property | |
113 | def conflicts(self): | |
114 | conflicts = self.metadata.get("conflicts") | |
115 | ||
116 | if conflicts: | |
117 | return conflicts.split() | |
118 | ||
119 | return [] | |
120 | ||
4f91860e MT |
121 | @property |
122 | def hash1(self): | |
123 | return self.metadata.get("hash1") | |
124 | ||
125 | @property | |
126 | def filename(self): | |
127 | return self.metadata.get("filename") # XXX basename? | |
128 | ||
47a4cb89 MT |
129 | @property |
130 | def filelist(self): | |
131 | c = self.db.cursor() | |
132 | c.execute("SELECT name FROM files WHERE pkg = '%s'" % self.id) # XXX? | |
133 | ||
134 | for f in c: | |
18ae128e MT |
135 | filename = f["name"] |
136 | if not filename.startswith("/"): | |
137 | filename = "/%s" % filename | |
138 | ||
139 | yield filename | |
47a4cb89 MT |
140 | |
141 | c.close() | |
142 | ||
4f91860e MT |
143 | def download(self): |
144 | """ | |
145 | Downloads the package from repository and returns a new instance | |
146 | of BinaryPackage. | |
147 | """ | |
148 | # Marker, if we need to download the package. | |
149 | download = True | |
150 | ||
151 | # Add shortcut for cache. | |
152 | cache = self.repo.cache | |
153 | ||
154 | cache_filename = "packages/%s" % os.path.basename(self.filename) | |
155 | ||
156 | # Check if file already exists in cache. | |
157 | if cache.exists(cache_filename): | |
158 | # If the file does already exist, we check if the hash1 matches. | |
159 | if cache.verify(cache_filename, self.hash1): | |
160 | # We already got the right file. Skip download. | |
161 | download = False | |
162 | else: | |
163 | # The file in cache has a wrong hash. Remove it and repeat download. | |
164 | cache.remove(cache_filename) | |
165 | ||
166 | if download: | |
167 | # Open input and output files and download the file. | |
168 | o = cache.open(cache_filename, "w") | |
169 | # Make sure filename is of type string (and not unicode) | |
170 | filename = str(self.filename) | |
171 | ||
172 | # XXX to be removed very soon | |
173 | if filename.startswith("686"): | |
174 | filename = "i%s" % filename | |
175 | ||
176 | i = self.repo.grabber.urlopen(filename) | |
177 | ||
178 | buf = i.read(BUFFER_SIZE) | |
179 | while buf: | |
180 | o.write(buf) | |
181 | buf = i.read(BUFFER_SIZE) | |
182 | ||
183 | i.close() | |
184 | o.close() | |
185 | ||
186 | # Verify if the download was okay. | |
187 | if not cache.verify(cache_filename, self.hash1): | |
188 | raise Exception, "XXX this should never happen..." | |
189 | ||
190 | filename = os.path.join(cache.path, cache_filename) | |
191 | return BinaryPackage(self.pakfire, self.repo, filename) | |
fa6d335b MT |
192 | |
193 | # XXX maybe we can remove this later? | |
194 | class InstalledPackage(DatabasePackage): | |
195 | type = "installed" | |
196 |