781
781
self._index_add_entry(new_path, ie.kind)
783
783
self._set_merges_from_parent_ids([])
785
def move(self, from_paths, to_dir=None, after=None):
787
with self.lock_tree_write():
788
to_abs = self.abspath(to_dir)
789
if not os.path.isdir(to_abs):
790
raise errors.BzrMoveFailedError('', to_dir,
791
errors.NotADirectory(to_abs))
793
for from_rel in from_paths:
794
from_tail = os.path.split(from_rel)[-1]
795
to_rel = os.path.join(to_dir, from_tail)
796
self.rename_one(from_rel, to_rel, after=after)
797
rename_tuples.append((from_rel, to_rel))
801
def rename_one(self, from_rel, to_rel, after=None):
802
from_path = from_rel.encode("utf-8")
803
to_rel, can_access = osutils.normalized_filename(to_rel)
805
raise errors.InvalidNormalization(to_rel)
806
to_path = to_rel.encode("utf-8")
807
with self.lock_tree_write():
809
# Perhaps it's already moved?
811
not self.has_filename(from_rel) and
812
self.has_filename(to_rel) and
813
not self.is_versioned(to_rel))
815
if not self.has_filename(to_rel):
816
raise errors.BzrMoveFailedError(from_rel, to_rel,
817
errors.NoSuchFile(to_rel))
818
if self.basis_tree().is_versioned(to_rel):
819
raise errors.BzrMoveFailedError(from_rel, to_rel,
820
errors.AlreadyVersionedError(to_rel))
822
kind = self.kind(to_rel)
825
to_kind = self.kind(to_rel)
826
except errors.NoSuchFile:
827
exc_type = errors.BzrRenameFailedError
830
exc_type = errors.BzrMoveFailedError
831
if self.is_versioned(to_rel):
832
raise exc_type(from_rel, to_rel,
833
errors.AlreadyVersionedError(to_rel))
834
if not self.has_filename(from_rel):
835
raise errors.BzrMoveFailedError(from_rel, to_rel,
836
errors.NoSuchFile(from_rel))
837
if not self.is_versioned(from_rel):
838
raise exc_type(from_rel, to_rel,
839
errors.NotVersionedError(from_rel))
840
if self.has_filename(to_rel):
841
raise errors.RenameFailedFilesExist(
842
from_rel, to_rel, errors.FileExists(to_rel))
844
kind = self.kind(from_rel)
846
if not after and not from_path in self.index and kind != 'directory':
848
raise errors.BzrMoveFailedError(from_rel, to_rel,
849
errors.NotVersionedError(path=from_rel))
853
self._rename_one(from_rel, to_rel)
855
if e.errno == errno.ENOENT:
856
raise errors.BzrMoveFailedError(from_rel, to_rel,
857
errors.NoSuchFile(to_rel))
859
if kind != 'directory':
861
del self.index[from_path]
864
self._index_add_entry(to_rel, kind)
866
todo = [p for p in self.index if p.startswith(from_path+'/')]
868
self.index[posixpath.join(to_path, posixpath.relpath(p, from_path))] = self.index[p]
871
self._versioned_dirs = None