29
28
from elementtree.ElementTree import Element, ElementTree, SubElement
31
30
from xml import XMLMixin
32
from errors import bailout, BzrError
31
from errors import bailout, BzrError, BzrCheckError
35
34
from bzrlib.osutils import uuid, quotefn, splitpath, joinpath, appendpath
116
115
>>> e = InventoryEntry('123', 'src/hello.c', 'file', ROOT_ID)
117
116
Traceback (most recent call last):
118
BzrError: ("InventoryEntry name is not a simple filename: 'src/hello.c'", [])
117
BzrCheckError: InventoryEntry name 'src/hello.c' is invalid
120
119
if '/' in name or '\\' in name:
121
120
raise BzrCheckError('InventoryEntry name %r is invalid' % name)
145
144
self.parent_id, text_id=self.text_id)
146
145
other.text_sha1 = self.text_sha1
147
146
other.text_size = self.text_size
147
# note that children are *not* copied; they're pulled across when
210
211
from_element = classmethod(from_element)
212
def __cmp__(self, other):
213
def __eq__(self, other):
215
214
if not isinstance(other, InventoryEntry):
216
215
return NotImplemented
218
return cmp(self.file_id, other.file_id) \
219
or cmp(self.name, other.name) \
220
or cmp(self.text_sha1, other.text_sha1) \
221
or cmp(self.text_size, other.text_size) \
222
or cmp(self.text_id, other.text_id) \
223
or cmp(self.parent_id, other.parent_id) \
224
or cmp(self.kind, other.kind)
217
return (self.file_id == other.file_id) \
218
and (self.name == other.name) \
219
and (self.text_sha1 == other.text_sha1) \
220
and (self.text_size == other.text_size) \
221
and (self.text_id == other.text_id) \
222
and (self.parent_id == other.parent_id) \
223
and (self.kind == other.kind)
226
def __ne__(self, other):
227
return not (self == other)
230
raise ValueError('not hashable')
233
239
self.parent_id = None
236
def __cmp__(self, other):
242
def __eq__(self, other):
239
243
if not isinstance(other, RootEntry):
240
244
return NotImplemented
241
return cmp(self.file_id, other.file_id) \
242
or cmp(self.children, other.children)
246
return (self.file_id == other.file_id) \
247
and (self.children == other.children)
324
329
if ie.kind == 'directory':
325
330
for cn, cie in self.iter_entries(from_dir=ie.file_id):
326
331
yield os.path.join(name, cn), cie
335
"""Return list of (path, ie) for all entries except the root.
337
This may be faster than iter_entries.
340
def descend(dir_ie, dir_path):
341
kids = dir_ie.children.items()
343
for name, ie in kids:
344
child_path = os.path.join(dir_path, name)
345
accum.append((child_path, ie))
346
if ie.kind == 'directory':
347
descend(ie, child_path)
349
descend(self.root, '')
330
353
def directories(self):
331
"""Return (path, entry) pairs for all directories.
354
"""Return (path, entry) pairs for all directories, including the root.
333
def descend(parent_ie):
334
parent_name = parent_ie.name
335
yield parent_name, parent_ie
337
# directory children in sorted order
339
for ie in parent_ie.children.itervalues():
340
if ie.kind == 'directory':
341
dn.append((ie.name, ie))
357
def descend(parent_ie, parent_path):
358
accum.append((parent_path, parent_ie))
344
for name, child_ie in dn:
345
for sub_name, sub_ie in descend(child_ie):
346
yield appendpath(parent_name, sub_name), sub_ie
360
kids = [(ie.name, ie) for ie in parent_ie.children.itervalues() if ie.kind == 'directory']
348
for name, ie in descend(self.root):
363
for name, child_ie in kids:
364
child_path = os.path.join(parent_path, name)
365
descend(child_ie, child_path)
366
descend(self.root, '')
371
389
>>> inv['123123'].name
375
raise BzrError("can't look up file_id None")
378
393
return self._byid[file_id]
380
raise BzrError("file_id {%s} not in inventory" % file_id)
396
raise BzrError("can't look up file_id None")
398
raise BzrError("file_id {%s} not in inventory" % file_id)
401
def get_file_kind(self, file_id):
402
return self._byid[file_id].kind
383
404
def get_child(self, parent_id, filename):
384
405
return self[parent_id].children.get(filename)
501
515
if not isinstance(other, Inventory):
502
516
return NotImplemented
504
if self.id_set() ^ other.id_set():
507
for file_id in self._byid:
508
c = cmp(self[file_id], other[file_id])
518
if len(self._byid) != len(other._byid):
519
# shortcut: obviously not the same
522
return self._byid == other._byid
525
def __ne__(self, other):
526
return not (self == other)
530
raise ValueError('not hashable')
514
534
def get_idpath(self, file_id):