--- /dev/null
+#!/bin/sh
+set -e
+cd $(dirname "$0")
+. lib/abort_if_not_user
+. lib/constants_user
+. lib/expect_n_args
+. lib/prefixed_msg
+. lib/tagdir_parsing
+
+prefixed_msg_init
+abort_if_not_user root
+expect_n_args 1 99 "TAG.." $@
+
+compare_tagdir() {
+ _compare_stat() {
+ _ATTRIBUTE=$1
+ _FORMAT_STR=$2
+ _SHOULD_BE=$3
+ _ACTUAL_VALUE=$(stat --format="${_FORMAT_STR}" ${_PATH_ABS})
+ if [ "${_ACTUAL_VALUE}" != "${_SHOULD_BE}" ]; then
+ prefixed_msg "Bad ${_ATTRIBUTE}: ${_PATH_ABS} is ${_ACTUAL_VALUE}, should be ${_SHOULD_BE}"
+ false
+ fi
+ }
+ prefixed_msg_init "tag [${_TAG}]"
+ for _PATH_REL in $(tagdir_parsing__relpaths); do
+ _FILENAME="$(basename ${_PATH_REL})"
+ _PATH_REL_PARENT=$(dirname "${_PATH_REL}")
+
+ if tagdir_parsing__is_killme "${_FILENAME}"; then
+ _TYPE='directory'
+ _PATH_ABS="/${_PATH_REL_PARENT}"
+ elif tagdir_parsing__is_linkme "${_FILENAME}"; then
+ _TYPE='symbolic link'
+ _PARSED=$(tagdir_parsing__parse_linkme "${_PATH_REL}")
+ _PATH_ABS=$(echo "${_PARSED}" | head -1)
+ _LINK_TARGET=$(echo "${_PARSED}" | tail -1)
+ else
+ _TYPE='regular file'
+ _PATH_ABS="/${_PATH_REL}"
+ fi
+ if [ -h "${_PATH_ABS}" ]; then
+ if [ 'symbolic link' = "${_TYPE}" ]; then
+ _LOCAL_TARGET=$(stat "${_PATH_ABS}" | head -1 | sed -E 's/^ File: [[:print:]]+ -> //g')
+ if [ "/" != "$(echo ${_LOCAL_TARGET} | cut -c1)" ]; then
+ _LOCAL_TARGET=$(realpath --canonicalize-missing "/${_PATH_REL_PARENT}/${_LOCAL_TARGET}")
+ fi
+ if [ "$(echo ${_LINK_TARGET} | cut -c1)" != "/" ]; then
+ _LINK_TARGET=$(realpath --canonicalize-missing "/${_PATH_REL_PARENT}/${_LINK_TARGET}")
+ fi
+ if [ "${_LOCAL_TARGET}" != "${_LINK_TARGET}" ]; then
+ prefixed_msg "${_TYPE} targeting ${_LOCAL_TARGET} != ${_LINK_TARGET}"
+ fi
+ else
+ prefixed_msg "Not a ${_TYPE}: ${_PATH_ABS}"
+ fi
+ elif [ ! -e "${_PATH_ABS}" ]; then
+ prefixed_msg "Missing ${_TYPE}: ${_PATH_ABS}"
+ continue
+ elif _compare_stat 'file type' '%F' "${_TYPE}" && [ 'regular file' = "${_TYPE}" ]; then
+ ! diff "${_PATH_ABS}" "${_PATH_REL}" > /dev/null && prefixed_msg "Regular file differs: ${_PATH_ABS}"
+ fi
+ if echo "${_PATH_ABS}" | grep "^${PATH_USER_HOME}/" > /dev/null; then
+ _EXPECTED_OWNERSHIP="${USERNAME}:${USERNAME}"
+ else
+ _EXPECTED_OWNERSHIP='root:root'
+ fi
+ _EXPECTED_PERMISSIONS=$(stat --format='%a' --dereference ${_PATH_REL})
+ set +e
+ _compare_stat 'ownership' '%U:%G' "${_EXPECTED_OWNERSHIP}";
+ _compare_stat 'permissions' '%a' "${_EXPECTED_PERMISSIONS}";
+ set -e
+ done
+ prefixed_msg_exit
+}
+
+tagdir_parsing__for_tagdir 'compare_tagdir' $@
--- /dev/null
+tagdir_parsing__is_killme() {
+ test "$1" = 'KILL_ME'
+}
+
+tagdir_parsing__for_tagdir() {
+ _COMMAND=$1
+ shift 1
+ _TAGS=$@
+ for _TAG in ${_TAGS}; do
+ _PATH_TAG="../copy/${_TAG}"
+ if [ ! -d "${_PATH_TAG}" ]; then
+ continue
+ fi
+ cd "${_PATH_TAG}"
+ ${_COMMAND}
+ cd - > /dev/null
+ done
+}
+
+tagdir_parsing__relpaths() {
+ find -L . -type f | cut -c 3-
+}
+
+tagdir_parsing__is_linkme() {
+ echo "$1" | grep '^LINK_ME' > /dev/null
+}
+
+tagdir_parsing__parse_linkme() {
+ _PATH_REL_LINKME=$1
+ _PATH_REL_LINKME_PARENT=$(dirname "${_PATH_REL_LINKME}")
+ _LINK_TARGET=$(cat "${_PATH_REL_LINKME}" | head -1)
+ _LINK_NAME=$(cat "${_PATH_REL_LINKME}" | tail -1)
+ if [ -z "${_LINK_NAME}" ]; then
+ _LINK_NAME=$(basename "${_LINK_TARGET}")
+ fi
+ _PATH_ABS="/${_PATH_REL_LINKME_PARENT}/${_LINK_NAME}"
+ printf '%s\n%s' "${_PATH_ABS}" "${_LINK_TARGET}"
+}
+++ /dev/null
-#!/bin/sh
-set -e
-cd $(dirname "$0")
-. lib/abort_if_not_user
-. lib/constants_user
-. lib/expect_n_args
-. lib/prefixed_msg
-. lib/tagdir_parsing
-
-prefixed_msg_init
-abort_if_not_user root
-expect_n_args 1 99 "TAG.." $@
-
-compare_tagdir() {
- _compare_stat() {
- _ATTRIBUTE=$1
- _FORMAT_STR=$2
- _SHOULD_BE=$3
- _ACTUAL_VALUE=$(stat --format="${_FORMAT_STR}" ${_PATH_ABS})
- if [ "${_ACTUAL_VALUE}" != "${_SHOULD_BE}" ]; then
- prefixed_msg "Bad ${_ATTRIBUTE}: ${_PATH_ABS} is ${_ACTUAL_VALUE}, should be ${_SHOULD_BE}"
- false
- fi
- }
- prefixed_msg_init "tag [${_TAG}]"
- for _PATH_REL in $(tagdir_parsing__relpaths); do
- _FILENAME="$(basename ${_PATH_REL})"
- _PATH_REL_PARENT=$(dirname "${_PATH_REL}")
-
- if tagdir_parsing__is_killme "${_FILENAME}"; then
- _TYPE='directory'
- _PATH_ABS="/${_PATH_REL_PARENT}"
- elif tagdir_parsing__is_linkme "${_FILENAME}"; then
- _TYPE='symbolic link'
- _PARSED=$(tagdir_parsing__parse_linkme "${_PATH_REL}")
- _PATH_ABS=$(echo "${_PARSED}" | head -1)
- _LINK_TARGET=$(echo "${_PARSED}" | tail -1)
- else
- _TYPE='regular file'
- _PATH_ABS="/${_PATH_REL}"
- fi
- if [ -h "${_PATH_ABS}" ]; then
- if [ 'symbolic link' = "${_TYPE}" ]; then
- _LOCAL_TARGET=$(stat "${_PATH_ABS}" | head -1 | sed -E 's/^ File: [[:print:]]+ -> //g')
- if [ "/" != "$(echo ${_LOCAL_TARGET} | cut -c1)" ]; then
- _LOCAL_TARGET=$(realpath --canonicalize-missing "/${_PATH_REL_PARENT}/${_LOCAL_TARGET}")
- fi
- if [ "$(echo ${_LINK_TARGET} | cut -c1)" != "/" ]; then
- _LINK_TARGET=$(realpath --canonicalize-missing "/${_PATH_REL_PARENT}/${_LINK_TARGET}")
- fi
- if [ "${_LOCAL_TARGET}" != "${_LINK_TARGET}" ]; then
- prefixed_msg "${_TYPE} targeting ${_LOCAL_TARGET} != ${_LINK_TARGET}"
- fi
- else
- prefixed_msg "Not a ${_TYPE}: ${_PATH_ABS}"
- fi
- elif [ ! -e "${_PATH_ABS}" ]; then
- prefixed_msg "Missing ${_TYPE}: ${_PATH_ABS}"
- continue
- elif _compare_stat 'file type' '%F' "${_TYPE}" && [ 'regular file' = "${_TYPE}" ]; then
- ! diff "${_PATH_ABS}" "${_PATH_REL}" > /dev/null && prefixed_msg "Regular file differs: ${_PATH_ABS}"
- fi
- if echo "${_PATH_ABS}" | grep "^${PATH_USER_HOME}/" > /dev/null; then
- _EXPECTED_OWNERSHIP="${USERNAME}:${USERNAME}"
- else
- _EXPECTED_OWNERSHIP='root:root'
- fi
- _EXPECTED_PERMISSIONS=$(stat --format='%a' --dereference ${_PATH_REL})
- set +e
- _compare_stat 'ownership' '%U:%G' "${_EXPECTED_OWNERSHIP}";
- _compare_stat 'permissions' '%a' "${_EXPECTED_PERMISSIONS}";
- set -e
- done
- prefixed_msg_exit
-}
-
-tagdir_parsing__for_tagdir 'compare_tagdir' $@
--- /dev/null
+../../trixie/scripts/diff_tagged_files.sh
\ No newline at end of file
--- /dev/null
+../../../trixie/scripts/lib/tagdir_parsing
\ No newline at end of file
--- /dev/null
+../../bookworm/scripts/diff_tagged_files.sh
\ No newline at end of file
--- /dev/null
+../../../bookworm/scripts/lib/tagdir_parsing
\ No newline at end of file