#!/usr/bin/env bash # Общие функции workspace-bootstrap set -Eeuo pipefail BOOTSTRAP_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" die() { echo "workspace-bootstrap: error: $*" >&2; exit 1; } log() { echo "[bootstrap] $*"; } load_workspace_env() { local env_file="${WORKSPACE_ENV:-$BOOTSTRAP_ROOT/config/workspace.local.env}" [[ -f $env_file ]] || die "нет $env_file — скопируйте config/workspace.local.env.example и заполните" # shellcheck source=/dev/null set -a source "$env_file" set +a } detect_os() { case "$(uname -s)" in Darwin) echo mac ;; MINGW* | MSYS* | CYGWIN*) echo win ;; *) echo linux ;; esac } ssh_home() { if [[ $(detect_os) == win ]]; then if [[ -n ${HOME:-} ]]; then printf '%s/.ssh' "$HOME" else printf '%s/.ssh' "$USERPROFILE" fi else printf '%s/.ssh' "$HOME" fi } projects_dir() { local os os=$(detect_os) if [[ $os == mac ]]; then # shellcheck disable=SC2086 eval echo "${PROJECTS_DIR_MAC:-$HOME/Documents/Cursor/Projects}" elif [[ $os == win ]]; then echo "${PROJECTS_DIR_WIN:-$HOME/Projects}" else eval echo "${PROJECTS_DIR_MAC:-$HOME/projects}" fi } ssh_key_path() { printf '%s/%s' "$(ssh_home)" "${SSH_KEY_BASENAME:-id_ed25519_kalinamall}" } expand_path() { local p=$1 if [[ $p == ~* ]]; then p="${p/#\~/$HOME}" fi printf '%s' "$p" } render_template() { local template=$1 dest=$2 local key_path key_path=$(ssh_key_path) [[ -f $key_path ]] || key_path="${key_path}.example" sed \ -e "s|__SSH_KEY_PATH__|$key_path|g" \ -e "s|__GITEA_KALINAMALL_HOST__|${GITEA_KALINAMALL_HOST}|g" \ -e "s|__GITEA_KALINAMALL_HOST_PUBLIC__|${GITEA_KALINAMALL_HOST_PUBLIC}|g" \ -e "s|__GITEA_KALINAMALL_SSH_PORT__|${GITEA_KALINAMALL_SSH_PORT}|g" \ -e "s|__GITEA_HOME_HOST__|${GITEA_HOME_HOST}|g" \ -e "s|__GITEA_HOME_HOST_PUBLIC__|${GITEA_HOME_HOST_PUBLIC}|g" \ -e "s|__GITEA_HOME_SSH_PORT__|${GITEA_HOME_SSH_PORT}|g" \ -e "s|__SSH_HAPROXY_IP__|${SSH_HAPROXY_IP}|g" \ -e "s|__SSH_HAPROXY_USER__|${SSH_HAPROXY_USER}|g" \ "$template" >"$dest" } merge_ssh_config() { local block_file=$1 local ssh_config ssh_config="$(ssh_home)/config" mkdir -p "$(ssh_home)" touch "$ssh_config" if grep -q 'BEGIN WORKSPACE-BOOTSTRAP' "$ssh_config" 2>/dev/null; then local tmp tmp=$(mktemp) awk '/# BEGIN WORKSPACE-BOOTSTRAP/{skip=1} !skip{print} /# END WORKSPACE-BOOTSTRAP/{skip=0}' "$ssh_config" >"$tmp" mv "$tmp" "$ssh_config" fi { echo "" echo "# BEGIN WORKSPACE-BOOTSTRAP" cat "$block_file" echo "# END WORKSPACE-BOOTSTRAP" } >>"$ssh_config" chmod 600 "$ssh_config" 2>/dev/null || true } each_repo() { local repos_file="$BOOTSTRAP_ROOT/config/repos.yaml" [[ -f $repos_file ]] || die "missing $repos_file" awk ' /^ - name:/ { if (n != "") print n, gh; n = $3; gh = 0 } /github: true/ { gh = 1 } /github: false/ { gh = 0 } END { if (n != "") print n, gh } ' "$repos_file" } github_repo_name() { local name=$1 local repos_file="$BOOTSTRAP_ROOT/config/repos.yaml" local custom custom=$(awk -v repo="$name" ' $0 ~ "- name: " repo { found=1; next } found && /github_name:/ { print $2; exit } ' "$repos_file") if [[ -n $custom ]]; then echo "$custom" else echo "$name" fi } kalinamall_remote_url() { local repo=$1 printf 'ssh://git@%s:%s/%s/%s.git' \ "$GITEA_KALINAMALL_HOST" "$GITEA_KALINAMALL_SSH_PORT" "$GITEA_KALINAMALL_ORG" "$repo" } home_remote_url() { local repo=$1 printf 'ssh://git@%s:%s/%s/%s.git' \ "$GITEA_HOME_HOST" "$GITEA_HOME_SSH_PORT" "$GITEA_HOME_ORG" "$repo" } github_remote_url() { local repo=$1 local gh_name gh_name=$(github_repo_name "$repo") printf 'git@%s:%s/%s.git' 'github.com' "$GITHUB_USER" "$gh_name" }