def rename(from_path,to_path,to_fusefs = self)
from_base,from_rest = split_path(from_path)
case
when !from_base
raise Errno::EACCES.new("Can't move root")
when !from_rest
if @files.has_key?(from_base)
return false unless can_delete?(from_base) && to_fusefs.can_write?(to_path)
to_fusefs.write_to(to_path,@files[from_base])
to_fusefs.xattr(to_path).merge!(@xattr[from_base])
@xattr.delete(from_base)
@files.delete(from_base)
elsif @subdirs.has_key?(from_base)
return false unless mount_user? && to_fusefs.can_mkdir?(to_path)
begin
to_fusefs.mkdir(to_path,@subdirs[from_base])
to_fusefs.xattr(to_path).merge!(@xattr[from_base])
@xattr.delete(from_base)
@subdirs.delete(from_base)
@stats.adjust(0,-1)
return true
rescue ArgumentError
return false
end
else
return false
end
when @subdirs.has_key?(from_base)
begin
if to_fusefs != self
return @subdirs[from_base].rename(from_rest,to_path,to_fusefs)
else
to_base,to_rest = split_path(to_path)
if from_base == to_base
return @subdirs[from_base].rename(from_rest,to_rest)
else
if (file?(to_path))
return false unless can_write?(to_path)
else
return false unless can_mkdir?(to_path)
end
return @subdirs[from_base].rename(from_rest,to_path,self)
end
end
rescue NoMethodError
return false
rescue ArgumentError
return false
end
else
return false
end
end