Point package managers at China mirrors on cn installs
npm, PyPI and uv, Go, rustup and crates.io, RubyGems and Bundler, and Maven reach their registries slowly or not at all from China. On a cn install, link the profile's environment, cargo and gem drop-ins into place. A regular file the admin wrote is never replaced; the install fails instead.
This commit is contained in:
9 files changed
+116
-1
No files matched your search
@@ -96,6 +96,11 @@ Exceptions are allowed for migration and package-helper scripts where the helper
|
|||||||
- Do not add `aliases` to new menu entries. Aliases are reserved for
|
- Do not add `aliases` to new menu entries. Aliases are reserved for
|
||||||
established alternate names users already type, kept for compatibility.
|
established alternate names users already type, kept for compatibility.
|
||||||
|
|
||||||
|
# Region
|
||||||
|
|
||||||
|
- `/etc/omarchy/region` holds the region the installer derived from the timezone (`cn`); no file means Global. The profile lives in `default/regions/cn/`, its contract in `docs/regions.md`.
|
||||||
|
- `install/config/region.sh` links the `cn` developer mirrors into `/etc` and `/.cargo` and refuses to replace a regular file it did not create.
|
||||||
|
|
||||||
# Config Structure
|
# Config Structure
|
||||||
|
|
||||||
- `config/` - default configs copied to `~/.config/`
|
- `config/` - default configs copied to `~/.config/`
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
[source.crates-io]
|
||||||
|
replace-with = "aliyun"
|
||||||
|
|
||||||
|
[source.aliyun]
|
||||||
|
registry = "sparse+https://mirrors.aliyun.com/crates.io-index/"
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
NPM_CONFIG_REGISTRY=https://registry.npmmirror.com
|
||||||
|
PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/
|
||||||
|
UV_DEFAULT_INDEX=https://mirrors.aliyun.com/pypi/simple/
|
||||||
|
GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
|
||||||
|
RUSTUP_DIST_SERVER=https://mirrors.aliyun.com/rustup
|
||||||
|
RUSTUP_UPDATE_ROOT=https://mirrors.aliyun.com/rustup/rustup
|
||||||
|
BUNDLE_MIRROR__ALL=https://mirrors.aliyun.com/rubygems/
|
||||||
|
MAVEN_ARGS=--global-settings /usr/share/omarchy/default/regions/cn/maven-settings.xml
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
:sources:
|
||||||
|
- https://mirrors.aliyun.com/rubygems/
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<settings>
|
||||||
|
<mirrors>
|
||||||
|
<mirror>
|
||||||
|
<id>aliyun</id>
|
||||||
|
<mirrorOf>central</mirrorOf>
|
||||||
|
<url>https://maven.aliyun.com/repository/public</url>
|
||||||
|
</mirror>
|
||||||
|
</mirrors>
|
||||||
|
</settings>
|
||||||
+5
-1
@@ -34,7 +34,11 @@ For China, the builder installs `archlinuxcn-keyring` using the existing Arch tr
|
|||||||
|
|
||||||
## Scope of the China profile
|
## Scope of the China profile
|
||||||
|
|
||||||
The China profile provides repository defaults only. Language is a separate installer choice, not part of a region: a Chinese speaker outside China keeps global mirrors, and a China install in English still gets the regional ones.
|
The China profile provides repository defaults and developer mirrors. Language is a separate installer choice, not part of a region: a Chinese speaker outside China keeps global mirrors, and a China install in English still gets the regional ones.
|
||||||
|
|
||||||
|
## Developer mirrors
|
||||||
|
|
||||||
|
The `cn` profile also points the common package managers at mirrors inside China: `environment.conf` (npm, PyPI and uv, Go, rustup, Bundler, and Maven through `MAVEN_ARGS`), `cargo.toml` for crates.io, `gemrc` for RubyGems, and `maven-settings.xml`, which Maven reads in place. During installation `install/config/region.sh` links the first three to `/etc/environment.d/90-omarchy-china.conf`, `/.cargo/config.toml` and `/etc/gemrc` when the marker says `cn`. It refuses to replace a regular file it did not create. The environment reaches sessions started after login.
|
||||||
|
|
||||||
## Remaining release validation
|
## Remaining release validation
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
run_logged "$OMARCHY_INSTALL/config/region.sh"
|
||||||
run_logged "$OMARCHY_INSTALL/config/theme-system.sh"
|
run_logged "$OMARCHY_INSTALL/config/theme-system.sh"
|
||||||
run_logged "$OMARCHY_INSTALL/config/browser-policy.sh"
|
run_logged "$OMARCHY_INSTALL/config/browser-policy.sh"
|
||||||
run_logged "$OMARCHY_INSTALL/config/increase-lockout-limit.sh"
|
run_logged "$OMARCHY_INSTALL/config/increase-lockout-limit.sh"
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
cn_links=(
|
||||||
|
"environment.conf /etc/environment.d/90-omarchy-china.conf"
|
||||||
|
"cargo.toml /.cargo/config.toml"
|
||||||
|
"gemrc /etc/gemrc"
|
||||||
|
)
|
||||||
|
|
||||||
|
# The installer writes the marker from the timezone.
|
||||||
|
region=global
|
||||||
|
if [[ -e /etc/omarchy/region ]]; then
|
||||||
|
region=$(</etc/omarchy/region)
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $region in
|
||||||
|
global) ;;
|
||||||
|
cn)
|
||||||
|
for link in "${cn_links[@]}"; do
|
||||||
|
read -r _ target <<<"$link"
|
||||||
|
if [[ -e $target && ! -L $target ]]; then
|
||||||
|
echo "Refusing to replace $target, which Omarchy did not create" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
for link in "${cn_links[@]}"; do
|
||||||
|
read -r source target <<<"$link"
|
||||||
|
mkdir -p "${target%/*}"
|
||||||
|
ln -sfn "$OMARCHY_PATH/default/regions/cn/$source" "$target"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown region: $region" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
|
||||||
|
|
||||||
|
test_tmp=$(mktemp -d)
|
||||||
|
trap 'rm -rf "$test_tmp"' EXIT
|
||||||
|
|
||||||
|
region_setup="$test_tmp/region.sh"
|
||||||
|
root="$test_tmp/root"
|
||||||
|
sed -e "s|/etc/|$root/etc/|g" -e "s| /\.cargo/| $root/.cargo/|g" "$ROOT/install/config/region.sh" >"$region_setup"
|
||||||
|
export OMARCHY_PATH="$ROOT"
|
||||||
|
mkdir -p "$root/etc/omarchy"
|
||||||
|
|
||||||
|
bash -e "$region_setup"
|
||||||
|
[[ -z $(find "$root" -type l) ]] || fail "no marker links nothing"
|
||||||
|
pass "no marker installs Global"
|
||||||
|
|
||||||
|
echo cn >"$root/etc/omarchy/region"
|
||||||
|
bash -e "$region_setup"
|
||||||
|
for link in "environment.conf etc/environment.d/90-omarchy-china.conf" "cargo.toml .cargo/config.toml" "gemrc etc/gemrc"; do
|
||||||
|
read -r source target <<<"$link"
|
||||||
|
[[ $(readlink "$root/$target") == "$ROOT/default/regions/cn/$source" ]] || fail "China links /$target to the shipped $source"
|
||||||
|
done
|
||||||
|
bash -e "$region_setup"
|
||||||
|
pass "the cn marker links the developer mirror drop-ins, again without error"
|
||||||
|
|
||||||
|
rm "$root/etc/gemrc"
|
||||||
|
echo ":sources: []" >"$root/etc/gemrc"
|
||||||
|
if output=$(bash -e "$region_setup" 2>&1); then
|
||||||
|
fail "China refuses to replace an admin's /etc/gemrc" "$output"
|
||||||
|
fi
|
||||||
|
[[ $output == "Refusing to replace $root/etc/gemrc, which Omarchy did not create" && $(<"$root/etc/gemrc") == ":sources: []" ]] ||
|
||||||
|
fail "China names the file it refuses to replace and leaves it" "$output"
|
||||||
|
rm "$root/etc/gemrc"
|
||||||
|
pass "region setup never replaces mirror config Omarchy did not create"
|
||||||
|
|
||||||
|
echo mars >"$root/etc/omarchy/region"
|
||||||
|
if output=$(bash -e "$region_setup" 2>&1); then
|
||||||
|
fail "an unknown region fails" "$output"
|
||||||
|
fi
|
||||||
|
[[ $output == "Unknown region: mars" ]] || fail "region setup names the unknown region" "$output"
|
||||||
|
pass "region setup rejects an unknown region"
|
||||||
|
|
||||||
|
grep -qx 'run_logged "$OMARCHY_INSTALL/config/region.sh"' "$ROOT/install/config/all.sh" || fail "the install runs region setup"
|
||||||
|
pass "the install runs region setup"
|
||||||
Reference in new issue
Block a user