officer-setup: the repository URL is https
https://gitea.officer.dev/officerdev/platform.git, not the ssh form. The reachability check is now one test for either scheme: `git ls-remote` with both prompts disabled. That is the real question — not whether the host answers but whether this account can read the repository — and neither prompt fails cleanly on its own. Over https git asks for a username nobody is there to type; over ssh it asks for a password or stops on host-key verification. With GIT_TERMINAL_PROMPT=0 and BatchMode both off, an unreadable repository is an immediate non-zero rather than a hang. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -14,7 +14,7 @@
|
||||
[[ -n "${OFFICER_SETUP_REPO_LOADED:-}" ]] && return 0
|
||||
OFFICER_SETUP_REPO_LOADED=1
|
||||
|
||||
OFFICER_REPO="${OFFICER_REPO:-ssh://git@gitea.officer.dev:2222/officerdev/platform.git}"
|
||||
OFFICER_REPO="${OFFICER_REPO:-https://gitea.officer.dev/officerdev/platform.git}"
|
||||
|
||||
platform_dir() { echo "${OFFICER_ROOT}/platform"; }
|
||||
|
||||
@@ -30,21 +30,16 @@ repo_ssh_port() { sed -nE 's|^ssh://[^@]*@[^:]+:([0-9]+)/.*|\1|p' <<<"$1"; }
|
||||
|
||||
# Can this account actually clone it?
|
||||
#
|
||||
# Checked before the clone rather than after, because an ssh URL with no usable
|
||||
# key does not fail cleanly — git either prompts for a password nobody is there
|
||||
# to type, or hangs on host-key verification. BatchMode turns both into an
|
||||
# immediate non-zero.
|
||||
#
|
||||
# Gitea answers a successful auth with a message and exit 1, so the test is
|
||||
# whether the SERVER recognised us, not the exit code.
|
||||
repo_ssh_ok() {
|
||||
local url="$1" host port out
|
||||
host="$(repo_ssh_host "$url")"
|
||||
port="$(repo_ssh_port "$url")"
|
||||
[[ -n "$host" ]] || return 1
|
||||
|
||||
out="$(as_owner "ssh -T -o BatchMode=yes -o StrictHostKeyChecking=accept-new -o ConnectTimeout=8 ${port:+-p $port} git@${host} 2>&1" || true)"
|
||||
grep -qiE "authenticated|successfully|welcome|does not provide shell access" <<<"$out"
|
||||
# `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.
|
||||
@@ -56,7 +51,7 @@ clone_repo() {
|
||||
local url="$1" dest
|
||||
dest="$(platform_dir)"
|
||||
install -d -m 0755 -o "$USERNAME" -g "$(user_group)" "$OFFICER_ROOT"
|
||||
as_owner "git clone '${url}' '${dest}'" /
|
||||
as_owner "GIT_TERMINAL_PROMPT=0 git clone '${url}' '${dest}'" /
|
||||
}
|
||||
|
||||
pull_repo() { as_owner "git -C '$(platform_dir)' pull --ff-only" /; }
|
||||
|
||||
Reference in New Issue
Block a user