systemctlPath:
''
function isStartable() {
  local service="$1"
  [[ $(${systemctlPath} --user show -p RefuseManualStart "$service") == *=no ]]
}

function isStoppable() {
  if [[ -v oldGenPath ]] ; then
    local service="$1"
    [[ $(${systemctlPath} --user show -p RefuseManualStop "$service") == *=no ]]
  fi
}

function systemdPostReload() {
  local workDir
  workDir="$(mktemp -d)"

  if [[ -v oldGenPath ]] ; then
    local oldUserServicePath="$oldGenPath/home-files/.config/systemd/user"
  fi

  local newUserServicePath="$newGenPath/home-files/.config/systemd/user"
  local oldServiceFiles="$workDir/old-files"
  local newServiceFiles="$workDir/new-files"
  local servicesDiffFile="$workDir/diff-files"

  if [[ ! (-v oldUserServicePath && -d "$oldUserServicePath") \
      && ! -d "$newUserServicePath" ]]; then
    return
  fi

  if [[ ! (-v oldUserServicePath && -d "$oldUserServicePath") ]]; then
    touch "$oldServiceFiles"
  else
    find "$oldUserServicePath" \
      -maxdepth 1 -name '*.service' -exec basename '{}' ';' \
      | sort \
      > "$oldServiceFiles"
  fi

  if [[ ! -d "$newUserServicePath" ]]; then
    touch "$newServiceFiles"
  else
    find "$newUserServicePath" \
      -maxdepth 1 -name '*.service' -exec basename '{}' ';' \
      | sort \
      > "$newServiceFiles"
  fi

  diff \
    --new-line-format='+%L' \
    --old-line-format='-%L' \
    --unchanged-line-format=' %L' \
    "$oldServiceFiles" "$newServiceFiles" \
    > $servicesDiffFile || true

  local -a maybeRestart=( $(grep '^ ' $servicesDiffFile | cut -c2-) )
  local -a maybeStop=( $(grep '^-' $servicesDiffFile | cut -c2-) )
  local -a maybeStart=( $(grep '^+' $servicesDiffFile | cut -c2-) )
  local -a toRestart=( )
  local -a toStop=( )
  local -a toStart=( )

  for f in ''${maybeRestart[@]} ; do
    if isStoppable "$f" \
        && isStartable "$f" \
        && ${systemctlPath} --quiet --user is-active "$f" \
        && ! cmp --quiet \
            "$oldUserServicePath/$f" \
            "$newUserServicePath/$f" ; then
      toRestart+=("$f")
    fi
  done

  for f in ''${maybeStop[@]} ; do
    if isStoppable "$f" ; then
      toStop+=("$f")
    fi
  done

  for f in ''${maybeStart[@]} ; do
    if isStartable "$f" ; then
      toStart+=("$f")
    fi
  done

  rm -r $workDir

  local sugg=""

  if [[ -n "''${toRestart[@]}" ]] ; then
    sugg="''${sugg}systemctl --user restart ''${toRestart[@]}\n"
  fi

  if [[ -n "''${toStop[@]}" ]] ; then
    sugg="''${sugg}systemctl --user stop ''${toStop[@]}\n"
  fi

  if [[ -n "''${toStart[@]}" ]] ; then
    sugg="''${sugg}systemctl --user start ''${toStart[@]}\n"
  fi

  if [[ -n "$sugg" ]] ; then
    echo "Suggested commands:"
    echo -n -e "$sugg"
  fi
}

$DRY_RUN_CMD ${systemctlPath} --user daemon-reload
systemdPostReload
''