ntpsec-ntpdate
 # generally used in my scripts, so necessary
 calc
+# generally useful for debugging, so necessary
+vim
+ack
 #
 
+++ /dev/null
-. lib/constants_user  # USERNAME
-
-chown_to_user() {
-    if [ ! -z "$@" ]; then
-        for _PATH in $@; do
-            chown -R "${USERNAME}:${USERNAME}" "${_PATH}"
-        done
-    fi
-}
 
 . lib/expect_n_args
+. lib/mkdir_p_for_user
 
 copy_dirtree() {
-    expect_n_args 3 99 'SOURCE_ROOT TARGET_ROOT TAG...' $@
-    _SOURCE_ROOT="$1"
-    _TARGET_ROOT="$2"
-    shift 2
+    expect_n_args 4 99 'OWNER_TO_ENFORCE (to ignore, pass empty string) SOURCE_ROOT TARGET_ROOT TAG...' $@
+    _OWNER="$1"
+    _SOURCE_ROOT="$2"
+    _TARGET_ROOT="$3"
+    shift 3
     _TAGS="$@"
     for _TAG in ${_TAGS}; do
         _PATH_TAG="${_SOURCE_ROOT}/${_TAG}"
             _PATH_TARGET="${_TARGET_ROOT}"$(echo "${_PATH_REL}" | cut -c2-)
             _PATH_SOURCE=$(realpath "${_PATH_REL}")
             _DIRECTORY=$(dirname "${_PATH_TARGET}")
-            mkdir -p "${_DIRECTORY}"
+            if [ ! -z "${_OWNER}" ]; then
+                mkdir_p_for_user "${_OWNER}" "${_DIRECTORY}"
+            fi
             cp -av "${_PATH_SOURCE}" "${_PATH_TARGET}"
+            if [ ! -z "${_OWNER}" ]; then
+                chown "${_OWNER}:${_OWNER}" "${_PATH_TARGET}"
+            fi
         done
         cd - > /dev/null
     done
 
 . lib/copy_dirtree
-. lib/constants_etc  # PATH_ETC, PATH_REL_ETC 
+. lib/constants_etc  # PATH_ETC, PATH_REL_ETC
 . lib/constants_repopaths  # PATH_CONF
 
 ensure_etc_of_tags() {
     _PATH_CONF_ETC="${PATH_CONF}/${PATH_REL_ETC}"
-    copy_dirtree "${_PATH_CONF_ETC}" "${PATH_ETC}" $@ 
+    copy_dirtree '' "${_PATH_CONF_ETC}" "${PATH_ETC}" $@
 }
 
-. lib/chown_to_user
-. lib/constants_user  # PATH_USER_HOME
+. lib/constants_user  # PATH_USER_HOME, USERNAME
 . lib/constants_repopaths  # PATH_CONF_HOME
 
 ensure_homefiles_of_tags() {
-    _TO_CHOWN=$(copy_dirtree "${PATH_CONF_HOME}" "${PATH_USER_HOME}" $@ | sed "s/.*' -> '//g" | sed -E "s/'$//g")
-    echo ${_TO_CHOWN} | while read _LINE; do
-        chown_to_user "${_LINE}"
-    done
+    copy_dirtree "${USERNAME}" "${PATH_CONF_HOME}" "${PATH_USER_HOME}" $@
 }
 
--- /dev/null
+mkdir_p_for_user() {
+    _USER="$1"
+    _TO_SHORTEN=$(mkdir -pv "$1" | sed "s/mkdir: created directory '//g" | head -1)
+    if [ -z "${_TO_SHORTEN}" ]; then
+        _LENGTH=$(echo -n "${_TO_SHORTEN}" | wc -c)
+        _TARGET_LENGTH=$(calc "${_LENGTH} - 1" | cut -f2)
+        _TARGET_DIR=$(echo "${_TO_SHORTEN}" | cut -c "-${_TARGET_LENGTH}")
+        chown -R "${_USER}:${_USER}" "${_TARGET_DIR}"
+    fi
+}
 
+++ /dev/null
-mkdir_p_print_top() {
-    _TO_SHORTEN=$(mkdir -pv "$1" | sed "s/mkdir: created directory '//g" | head -1)
-    if [ -z "${_TO_SHORTEN}" ]; then
-        echo ''
-    else
-        _LENGTH=$(echo -n "${_TO_SHORTEN}" | wc -c)
-        _TARGET_LENGTH=$(calc "${_LENGTH} - 1" | cut -f2)
-        echo "${_TO_SHORTEN}" | cut -c "-${_TARGET_LENGTH}"
-    fi
-}
 
-. lib/chown_to_user
 . lib/copy_dirtree
 . lib/constants_repopaths  # PATH_CONF_HOME
 . lib/constants_user  # PATH_USER_HOME, USERNAME
 . lib/ensure_homefiles_of_tags
-. lib/mkdir_p_print_top
+. lib/mkdir_p_for_user
 
 setup_users() {
     _MIN_TAGS="$1"
     _PATH_USER_BIN="${PATH_USER_HOME}/.local/bin"
 
     echo "\nSetting up root user's home directory."
-    copy_dirtree "${PATH_CONF_HOME}" '/root' ${_MIN_TAGS} root
+    copy_dirtree 'root' "${PATH_CONF_HOME}" '/root' ${_MIN_TAGS} root
 
     echo "\nSetting up user ${USERNAME}."
     adduser --disabled-password --gecos "" "${USERNAME}"
     usermod -a -G sudo "${USERNAME}"
     ensure_homefiles_of_tags ${_MIN_TAGS} ${_TAGS_USER}
-    copy_dirtree "${PATH_CONF_HOME}" "${PATH_USER_HOME}" ${_MIN_TAGS} ${_TAGS_USER}
-    _TO_CHOWN=$(mkdir_p_print_top "${_PATH_USER_BIN}")
+    mkdir_p_for_user "${USERNAME}" "${_PATH_USER_BIN}"
     cd "${_PATH_USER_BIN}"
     ln -s ../../.plomlib lib
-    chown_to_user "${_TO_CHOWN}"
+    chown "${USERNAME}:${USERNAME}" lib
     cd - > /dev/null
 }
 
 set -e
 cd $(dirname "$0")
 . lib/check_finished_marker
-. lib/chown_to_user
 . lib/constants_catgirl  # PATH_USER_SHARE_CATGIRL
-. lib/constants_user  # PATH_USER_HOME
+. lib/constants_user  # PATH_USER_HOME, USERNAME
 . lib/ensure_etc_of_tags
 . lib/ensure_homefiles_of_tags
 . lib/ensure_packages_of_tags
 . lib/expect_n_args
-. lib/mkdir_p_print_top
+. lib/mkdir_p_for_user
 
 check_finished_marker 'setup_server'
 expect_n_args 1 1 'IRC_PASSWORD' $@
 ensure_homefiles_of_tags catgirl
 
 echo "\nSetting up ${PATH_USER_SHARE_CATGIRL} so logs can go there."
-TO_CHOWN=$(mkdir_p_print_top "${PATH_USER_SHARE_CATGIRL}")
-chown_to_user "${TO_CHOWN}"
+mkdir_p_for_user "${USERNAME}" "${PATH_USER_SHARE_CATGIRL}"
 
 echo "\nWriting provided password into ${PATH_USER_CONF_CATGIRL}."
 sed -i "s/REPLACE_WITH_IRC_PASSWORD/${IRC_PASSWORD}/g" "${PATH_USER_CONF_CATGIRL}"
-chown_to_user "${PATH_USER_SHARE_CATGIRL}"
-chown -R plom:plom "${PATH_USER_SHARE_CATGIRL}"
+chown -R "${USERNAME}:${USERNAME}" "${PATH_USER_SHARE_CATGIRL}"
 
 echo "\nActivating catgirl tmux session service."
 systemctl enable --now catgirl
 
 echo '\nMoving SSH data from root to user.'
 mkdir -p "${PATH_USER_SSH}"
 mv "/root/${PATH_REL_SSH}/authorized_keys" "${PATH_USER_SSH}/"
-chown_to_user "${PATH_USER_SSH}"
+chown -R "${USERNAME}:${USERNAME}" "${PATH_USER_SSH}"
 
 echo '\nSetting up minimal borg user.'
 adduser --system --home "${PATH_BORG_HOME}" --shell /bin/sh borg
 
+++ /dev/null
-../../../bookworm/scripts/lib/chown_to_user
\ No newline at end of file
 
--- /dev/null
+../../../bookworm/scripts/lib/mkdir_p_for_user
\ No newline at end of file
 
+++ /dev/null
-../../../bookworm/scripts/lib/mkdir_p_print_top
\ No newline at end of file
 
 cd $(dirname "$0")
 . lib/abort_if_not_user
 . lib/check_finished_marker
-. lib/chown_to_user
 . lib/constants_repopaths  # PATH_CONF, PATH_SCRIPTS
 . lib/constants_user  # USERNAME
 . lib/path_tmp_timestamped
 
 echo "Setting up config repo copy for user at ${PATH_TMP_REPO} …"
 cp -a "${PATH_REPO}" "${PATH_TMP_REPO}"
-chown_to_user "${PATH_TMP_REPO}"
+chown -R "${USERNAME}:${USERNAME}" "${PATH_TMP_REPO}"
 su -l "${USERNAME}" -c "/bin/sh ${PATH_TMP_REPO}/${PATH_REL_SETUP_SECRETS_USER} $1"
 rm -rf "${PATH_TMP_REPO}"