+ # Move the user *src* to *dst* within the Agendav database. This
+ # should "rename" him in _every_ table where he is referenced.
+ #
+ # This can fail if *dst* already exists before the move. It should
+ # also be an error if the destination domain doesn't exist. But
+ # Agendav doesn't know about domains, so we let that slide.
+ #
+ # If the source user doesn't exist, we do our best. AgenDAV has a
+ # "shares" table that isn't keyed on the username, but rather the
+ # principal URL. And its "prefs" table doesn't contain entries for
+ # users who have default preferences. As a result, we may need to
+ # perform some find/replaces in the "shares" table even if no
+ # corresponding user exists in the "prefs" table (which is how we
+ # tell if a user exists in AgenDAV). Thus it's not a fatal error if
+ # the *src* user doesn't exist.
+ #
+ # @param src [User] the source user to be moved.
+ #
+ # @param dst [User] the destination user being moved to.
+ #
+ def mv_user(src, dst)
+ raise UserAlreadyExistsError.new(dst.to_s()) if user_exists(dst)