292 lines · 15.2 KB
/**
 * Bash helpers shared by every generated job script: step outputs/env files, hashFiles() and the R2-backed cache.
 * Forge calls (`__gitfor_api_curl`) run the curl binary resolved at script start under a scrubbed environment with
 * proxies and `.curlrc` disabled, so nothing a step writes to GITHUB_ENV/GITHUB_PATH can redirect the job token.
 */
const SOURCE = String.raw`__gitfor_path="$PATH"; __gitfor_home="$HOME"
__gitfor_curl=$(command -v curl); __gitfor_tar=$(command -v tar); __gitfor_node=$(command -v node)
__gitfor_timeout=$(command -v timeout); __gitfor_env=$(command -v env)
__gitfor_docker=$(command -v docker); __gitfor_dockerd=$(command -v dockerd)
readonly __gitfor_path __gitfor_home __gitfor_curl __gitfor_tar __gitfor_node __gitfor_timeout __gitfor_env __gitfor_docker __gitfor_dockerd
__gitfor_api_curl() {
  env -i PATH="$__gitfor_path" HOME="$__gitfor_home" "$__gitfor_curl" -q --noproxy '*' "$@"
}
__gitfor_re_heredoc='^([A-Za-z_][A-Za-z0-9_-]*)<<(.+)$'
__gitfor_re_kv='^([A-Za-z_][A-Za-z0-9_-]*)=(.*)$'
__gitfor_read_kv() {
  [ -s "$1" ] || return 0
  local __line __key __value __delim __more
  while IFS= read -r __line || [ -n "$__line" ]; do
    if [[ $__line =~ $__gitfor_re_heredoc ]]; then
      __key="#{BASH_REMATCH[1]}"; __delim="#{BASH_REMATCH[2]}"; __value=""; __more=0
      while IFS= read -r __line || [ -n "$__line" ]; do
        [ "$__line" = "$__delim" ] && break
        if [ $__more = 1 ]; then __value="$__value"$'\n'"$__line"; else __value="$__line"; __more=1; fi
      done
    elif [[ $__line =~ $__gitfor_re_kv ]]; then
      __key="#{BASH_REMATCH[1]}"; __value="#{BASH_REMATCH[2]}"
    else
      continue
    fi
    "$2" "$__key" "$__value" "#{3:-}"
  done < "$1"
}
__gitfor_set_output() { [ -n "$3" ] || return 0; export "GITFOR_STEPOUT_#{3}__#{1//-/_}=$2"; }
__gitfor_set_env() {
  case "$1" in
    *-*|__gitfor*|BASH_ENV|ENV|BASH_FUNC_*|SHELLOPTS|BASHOPTS|PS4|IFS|LD_*|DYLD_*|NODE_OPTIONS|PYTHONSTARTUP|PYTHONPATH|PYTHONHOME|PERL5OPT|PERL5LIB|PERLLIB|RUBYOPT|RUBYLIB|GIT_*|GITFOR_*|GITHUB_*|ACTIONS_*|RUNNER_*|CI|HOME|PATH|SHELL|PROMPT_COMMAND|CDPATH|GLOBIGNORE|BASHPID|UID|EUID|TMPDIR|TMP|TEMP)
      echo "Ignoring reserved environment variable $1 written to GITHUB_ENV"; return 0 ;;
    *_proxy|*_PROXY|*_Proxy|CURL_*|SSL_CERT_*|REQUESTS_CA_BUNDLE|NODE_EXTRA_CA_CERTS|XDG_*|GOFLAGS|GOPROXY|GOTOOLCHAIN|GOPRIVATE|GONOSUMDB|GONOSUMCHECK|GOINSECURE|GOENV|NODE_PATH|NPM_CONFIG_*|npm_config_*|PIP_*|CARGO_*|RUSTC_WRAPPER|RUSTFLAGS|GEM_*|BUNDLE_*|JAVA_TOOL_OPTIONS|_JAVA_OPTIONS|JDK_JAVA_OPTIONS|MAVEN_OPTS|GRADLE_OPTS|DOCKER_HOST|DOCKER_CONFIG|KUBECONFIG)
      echo "Ignoring environment variable $1 written to GITHUB_ENV: it could redirect network or toolchain behaviour"; return 0 ;;