#!/bin/bash # ============================================================================= # officer-setup — the repository # ============================================================================= # # Definitions only. # # ── Cloned as the owner, never as root ── # # A repository cloned by root is one the owner cannot pull, cannot commit in, and # whose node_modules they cannot write. Every git operation here runs as the # account, from a directory that account can stat. [[ -n "${OFFICER_SETUP_REPO_LOADED:-}" ]] && return 0 OFFICER_SETUP_REPO_LOADED=1 OFFICER_REPO="${OFFICER_REPO:-https://gitea.officer.dev/officerdev/platform.git}" platform_dir() { echo "${OFFICER_ROOT}/platform"; } repo_exists() { [[ -d "$(platform_dir)/.git" ]]; } repo_remote() { (cd "$(platform_dir)" 2>/dev/null && git remote get-url origin 2>/dev/null) || true; } repo_branch() { (cd "$(platform_dir)" 2>/dev/null && git branch --show-current 2>/dev/null) || true; } repo_is_dirty() { [[ -n "$(cd "$(platform_dir)" 2>/dev/null && git status --porcelain 2>/dev/null)" ]]; } # Split an ssh:// URL into host and port, for the reachability check below. repo_ssh_host() { sed -E 's|^ssh://[^@]*@([^:/]+).*|\1|' <<<"$1"; } repo_ssh_port() { sed -nE 's|^ssh://[^@]*@[^:]+:([0-9]+)/.*|\1|p' <<<"$1"; } # Can this account actually clone it? # # `git ls-remote` is the real question — not "does the host answer" but "can this # account read this repository". Both prompts are disabled, because neither fails # cleanly on its own: over https git asks for a username nobody is there to type, # and over ssh it asks for a password or stops on host-key verification. With # both off, an unreachable or unreadable repository is an immediate non-zero # instead of a hang. repo_reachable() { as_owner "GIT_TERMINAL_PROMPT=0 \ GIT_SSH_COMMAND='ssh -o BatchMode=yes -o StrictHostKeyChecking=accept-new -o ConnectTimeout=8' \ timeout 20 git ls-remote '$1' >/dev/null 2>&1" / } # The https form of the same repository, for a machine with no key. repo_https_url() { sed -E 's|^ssh://[^@]*@([^:/]+)(:[0-9]+)?/|https://\1/|' <<<"$1" } clone_repo() { local url="$1" dest dest="$(platform_dir)" install -d -m 0755 -o "$USERNAME" -g "$(user_group)" "$OFFICER_ROOT" as_owner "GIT_TERMINAL_PROMPT=0 git clone '${url}' '${dest}'" / } pull_repo() { as_owner "git -C '$(platform_dir)' pull --ff-only" /; }