~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Martin Pool
  • Date: 2005-09-22 07:04:14 UTC
  • Revision ID: mbp@sourcefrog.net-20050922070414-06a503a1d47b5ce4
- avoid converting inventories to/from StringIO 

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
 
18
# TODO: Maybe also keep the full path of the entry, and the children?
 
19
# But those depend on its position within a particular inventory, and
 
20
# it would be nice not to need to hold the backpointer here.
 
21
 
 
22
# TODO: Perhaps split InventoryEntry into subclasses for files,
 
23
# directories, etc etc.
 
24
 
 
25
 
18
26
# This should really be an id randomly assigned when the tree is
19
27
# created, but it's not for now.
20
28
ROOT_ID = "TREE_ROOT"
36
44
    An InventoryEntry has the following fields, which are also
37
45
    present in the XML inventory-entry element:
38
46
 
39
 
    * *file_id*
40
 
    * *name*: (only the basename within the directory, must not
41
 
      contain slashes)
42
 
    * *kind*: "directory" or "file"
43
 
    * *directory_id*: (if absent/null means the branch root directory)
44
 
    * *text_sha1*: only for files
45
 
    * *text_size*: in bytes, only for files 
46
 
    * *text_id*: identifier for the text version, only for files
47
 
 
48
 
    InventoryEntries can also exist inside a WorkingTree
49
 
    inventory, in which case they are not yet bound to a
50
 
    particular revision of the file.  In that case the text_sha1,
51
 
    text_size and text_id are absent.
52
 
 
 
47
    file_id
 
48
 
 
49
    name
 
50
        (within the parent directory)
 
51
 
 
52
    kind
 
53
        'directory' or 'file'
 
54
 
 
55
    parent_id
 
56
        file_id of the parent directory, or ROOT_ID
 
57
 
 
58
    name_version
 
59
        the revision_id in which the name or parent of this file was
 
60
        last changed
 
61
 
 
62
    text_sha1
 
63
        sha-1 of the text of the file
 
64
        
 
65
    text_size
 
66
        size in bytes of the text of the file
 
67
        
 
68
    text_version
 
69
        the revision_id in which the text of this file was introduced
 
70
 
 
71
    (reading a version 4 tree created a text_id field.)
53
72
 
54
73
    >>> i = Inventory()
55
74
    >>> i.path2id('')
90
109
    src/wibble/wibble.c
91
110
    >>> i.id2path('2326')
92
111
    'src/wibble/wibble.c'
93
 
 
94
 
    TODO: Maybe also keep the full path of the entry, and the children?
95
 
           But those depend on its position within a particular inventory, and
96
 
           it would be nice not to need to hold the backpointer here.
97
112
    """
98
 
 
99
 
    # TODO: split InventoryEntry into subclasses for files,
100
 
    # directories, etc etc.
101
 
 
 
113
    
102
114
    __slots__ = ['text_sha1', 'text_size', 'file_id', 'name', 'kind',
103
115
                 'text_id', 'parent_id', 'children',
104
 
                 'text_version', 'entry_version', ]
 
116
                 'text_version', 'name_version', ]
105
117
 
106
118
 
107
119
    def __init__(self, file_id, name, kind, parent_id, text_id=None):
124
136
            raise BzrCheckError('InventoryEntry name %r is invalid' % name)
125
137
        
126
138
        self.text_version = None
127
 
        self.entry_version = None
 
139
        self.name_version = None
128
140
        self.text_sha1 = None
129
141
        self.text_size = None
130
142
        self.file_id = file_id
149
161
 
150
162
    def copy(self):
151
163
        other = InventoryEntry(self.file_id, self.name, self.kind,
152
 
                               self.parent_id, text_id=self.text_id)
 
164
                               self.parent_id)
 
165
        other.text_id = self.text_id
153
166
        other.text_sha1 = self.text_sha1
154
167
        other.text_size = self.text_size
 
168
        other.text_version = self.text_version
 
169
        other.name_version = self.name_version
155
170
        # note that children are *not* copied; they're pulled across when
156
171
        # others are added
157
172
        return other
178
193
               and (self.parent_id == other.parent_id) \
179
194
               and (self.kind == other.kind) \
180
195
               and (self.text_version == other.text_version) \
181
 
               and (self.entry_version == other.entry_version)
 
196
               and (self.name_version == other.name_version)
182
197
 
183
198
 
184
199
    def __ne__(self, other):
262
277
        self._byid = {self.root.file_id: self.root}
263
278
 
264
279
 
 
280
    def copy(self):
 
281
        other = Inventory(self.root.file_id)
 
282
        # copy recursively so we know directories will be added before
 
283
        # their children.  There are more efficient ways than this...
 
284
        for path, entry in self.iter_entries():
 
285
            if entry == self.root:
 
286
                continue
 
287
            other.add(entry.copy())
 
288
        return other
 
289
 
 
290
 
265
291
    def __iter__(self):
266
292
        return iter(self._byid)
267
293
 
471
497
 
472
498
 
473
499
    def __ne__(self, other):
474
 
        return not (self == other)
 
500
        return not self.__eq__(other)
475
501
 
476
502
 
477
503
    def __hash__(self):