~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree_4.py

(working), fix dirstate to use utf8 file ids.
Also fix a bug in _generate_inventory for non-ascii paths. It was
combining the decoded path with the utf8 prefix and assuming the
whole thing was utf8.

Show diffs side-by-side

added added

removed removed

Lines of Context:
232
232
        state = self.current_dirstate()
233
233
        state._read_dirblocks_if_needed()
234
234
        root_key, current_entry = self._get_entry(path='')
235
 
        current_id = root_key[2].decode('utf8')
 
235
        current_id = root_key[2]
236
236
        assert current_entry[0][0] == 'directory'
237
237
        inv = Inventory(root_id=current_id)
238
238
        # we could do this straight out of the dirstate; it might be fast
249
249
                if entry[0][0] in ('absent', 'relocated'):
250
250
                    # a parent tree only entry
251
251
                    continue
252
 
                name = key[1].decode('utf8')
253
 
                file_id = key[2].decode('utf8')
 
252
                name = key[1]
 
253
                name_unicode = name.decode('utf8')
 
254
                file_id = key[2]
254
255
                kind, link_or_sha1, size, executable, stat = entry[0]
255
 
                inv_entry = entry_factory[kind](file_id, name, parent_id)
 
256
                inv_entry = entry_factory[kind](file_id, name_unicode, parent_id)
256
257
                if kind == 'file':
257
258
                    # not strictly needed: working tree
258
259
                    #entry.executable = executable
279
280
        if file_id is None and path is None:
280
281
            raise errors.BzrError('must supply file_id or path')
281
282
        state = self.current_dirstate()
282
 
        if file_id is not None:
283
 
            file_id = file_id.encode('utf8')
284
283
        if path is not None:
285
284
            path = path.encode('utf8')
286
285
        return state._get_entry(0, fileid_utf8=file_id, path_utf8=path)
316
315
    @needs_read_lock
317
316
    def get_root_id(self):
318
317
        """Return the id of this trees root"""
319
 
        return self._get_entry(path='')[0][2].decode('utf8')
 
318
        return self._get_entry(path='')[0][2]
320
319
 
321
320
    def has_id(self, file_id):
322
321
        state = self.current_dirstate()
323
 
        fileid_utf8 = file_id.encode('utf8')
 
322
        file_id = osutils.safe_file_id(file_id)
324
323
        row, parents = self._get_entry(file_id=file_id)
325
324
        if row is None:
326
325
            return False
330
329
    @needs_read_lock
331
330
    def id2path(self, fileid):
332
331
        state = self.current_dirstate()
333
 
        fileid_utf8 = fileid.encode('utf8')
334
 
        key, tree_details = state._get_entry(0, fileid_utf8=fileid_utf8)
 
332
        fileid = osutils.safe_file_id(fileid)
 
333
        key, tree_details = state._get_entry(0, fileid_utf8=fileid)
335
334
        return os.path.join(*key[0:2]).decode('utf8')
336
335
 
337
336
    @needs_read_lock
348
347
                continue
349
348
            path = pathjoin(self.basedir, key[0].decode('utf8'), key[1].decode('utf8'))
350
349
            if osutils.lexists(path):
351
 
                result.append(key[2].decode('utf8'))
 
350
                result.append(key[2])
352
351
        return iter(result)
353
352
 
354
353
    @needs_read_lock
406
405
            update_inventory = True
407
406
            inv = self.inventory
408
407
            to_dir_ie = inv[to_dir_id]
409
 
            to_dir_id = to_entry[0][2].decode('utf8')
 
408
            to_dir_id = to_entry[0][2]
410
409
        else:
411
410
            update_inventory = False
412
411
 
420
419
                raise errors.BzrMoveFailedError(from_rel,to_dir,
421
420
                    errors.NotVersionedError(path=str(from_rel)))
422
421
 
423
 
            from_id = from_entry[0][2].decode('utf8')
 
422
            from_id = from_entry[0][2]
424
423
            to_rel = pathjoin(to_dir, from_tail)
425
424
            item_to_entry = self._get_entry(path=to_rel)
426
425
            if item_to_entry != (None, None):
548
547
        entry = self._get_entry(path=path)
549
548
        if entry == (None, None):
550
549
            return None
551
 
        return entry[0][2].decode('utf8')
 
550
        return entry[0][2]
552
551
 
553
552
    def paths2ids(self, paths, trees=[], require_versioned=True):
554
553
        """See Tree.paths2ids().
793
792
        state = self.current_dirstate()
794
793
        state._read_dirblocks_if_needed()
795
794
        ids_to_unversion = set()
796
 
        for fileid in file_ids:
797
 
            ids_to_unversion.add(fileid.encode('utf8'))
 
795
        for file_id in file_ids:
 
796
            ids_to_unversion.add(osutils.safe_file_id(file_id))
798
797
        paths_to_unversion = set()
799
798
        # sketch:
800
799
        # check if the root is to be unversioned, if so, assert for now.
988
987
        """
989
988
        if file_id is None and path is None:
990
989
            raise errors.BzrError('must supply file_id or path')
991
 
        if file_id is not None:
992
 
            file_id = file_id.encode('utf8')
 
990
        file_id = osutils.safe_file_id(file_id)
993
991
        if path is not None:
994
992
            path = path.encode('utf8')
995
993
        parent_index = self._dirstate.get_parent_ids().index(self._revision_id) + 1
1011
1009
        # This is identical now to the WorkingTree _generate_inventory except
1012
1010
        # for the tree index use.
1013
1011
        root_key, current_entry = self._dirstate._get_entry(parent_index, path_utf8='')
1014
 
        current_id = root_key[2].decode('utf8')
 
1012
        current_id = root_key[2]
1015
1013
        assert current_entry[parent_index][0] == 'directory'
1016
1014
        inv = Inventory(root_id=current_id, revision_id=self._revision_id)
1017
1015
        inv.root.revision = current_entry[parent_index][4]
1021
1019
        for block in self._dirstate._dirblocks[1:]: #skip root
1022
1020
            dirname = block[0]
1023
1021
            try:
1024
 
                parent_id = parent_ids[block[0]]
 
1022
                parent_id = parent_ids[dirname]
1025
1023
            except KeyError:
1026
1024
                # all the paths in this block are not versioned in this tree
1027
1025
                continue
1029
1027
                if entry[parent_index][0] in ('absent', 'relocated'):
1030
1028
                    # not this tree
1031
1029
                    continue
1032
 
                name = key[1].decode('utf8')
1033
 
                file_id = key[2].decode('utf8')
 
1030
                name = key[1]
 
1031
                name_unicode = name.decode('utf8')
 
1032
                file_id = key[2]
1034
1033
                kind, link_or_sha1, size, executable, revid = entry[parent_index]
1035
 
                inv_entry = entry_factory[kind](file_id, name, parent_id)
 
1034
                inv_entry = entry_factory[kind](file_id, name_unicode, parent_id)
1036
1035
                inv_entry.revision = revid
1037
1036
                if kind == 'file':
1038
1037
                    inv_entry.executable = executable
1123
1122
        entry = self._get_entry(path=path)
1124
1123
        if entry == (None, None):
1125
1124
            return None
1126
 
        return entry[0][2].decode('utf8')
 
1125
        return entry[0][2]
1127
1126
 
1128
1127
    def unlock(self):
1129
1128
        """Unlock, freeing any cache memory used during the lock."""