206 lines
5.5 KiB
Bash
Executable File
206 lines
5.5 KiB
Bash
Executable File
#!/bin/zsh
|
|
set -e
|
|
|
|
d=${0:a:h:h}
|
|
source $d/.env
|
|
|
|
function repo-env() {
|
|
REPO_NAME="aios"
|
|
GPG_KEY="$GPG_KEY"
|
|
}
|
|
|
|
function repo-pkg-build() {
|
|
echo "=== Building packages on $HOST ==="
|
|
ssh "$HOST" zsh -s -- "$GPG_KEY" <<'REMOTE'
|
|
set -e
|
|
setopt nonomatch 2>/dev/null || true
|
|
GPG_KEY="$1"
|
|
REPO_NAME="aios"
|
|
REPO_DIR="${HOME}/ai/repo"
|
|
WORK="${HOME}/aios-pkg"
|
|
|
|
if [ ! -d "$REPO_DIR/.git" ]; then
|
|
git clone git@git.syui.ai:ai/repo.git "$REPO_DIR"
|
|
cd "$REPO_DIR"
|
|
git config user.email $USER_EMAIL
|
|
git config user.name $USER_NAME
|
|
fi
|
|
|
|
cd "$REPO_DIR"
|
|
git config user.signingkey "$GPG_KEY"
|
|
git config commit.gpgsign true
|
|
|
|
rm -rf "$WORK"
|
|
mkdir -p "$WORK"
|
|
|
|
cd "$WORK"
|
|
git clone --depth 1 https://git.syui.ai/ai/os.git
|
|
|
|
typeset -A PKG_REPOS
|
|
PKG_REPOS=(ailog log aigpt gpt aishell shell)
|
|
|
|
mkdir -p "$REPO_DIR/x86_64"
|
|
|
|
for pkg in ailog aigpt aishell; do
|
|
repo_name="${PKG_REPOS[$pkg]}"
|
|
remote_hash=$(git ls-remote --heads "https://git.syui.ai/ai/${repo_name}.git" main | cut -c1-7)
|
|
existing=$(ls "$REPO_DIR/x86_64/${pkg}"-*.pkg.tar.zst 2>/dev/null | head -1)
|
|
|
|
if [ -n "$existing" ] && echo "$existing" | grep -q "\.g${remote_hash}-"; then
|
|
echo "=== $pkg unchanged (${remote_hash}), skipping ==="
|
|
continue
|
|
fi
|
|
|
|
echo "=== Building $pkg (${remote_hash}) ==="
|
|
cp -r "$WORK/os/pkg/$pkg" "$WORK/$pkg"
|
|
cd "$WORK/$pkg"
|
|
makepkg -sf --noconfirm --sign --key "$GPG_KEY"
|
|
cd "$WORK"
|
|
|
|
rm -f "$REPO_DIR/x86_64/${pkg}"-*.pkg.tar.zst
|
|
rm -f "$REPO_DIR/x86_64/${pkg}"-*.pkg.tar.zst.sig
|
|
rm -f "$REPO_DIR/x86_64/${pkg}-debug"-*.pkg.tar.zst
|
|
rm -f "$REPO_DIR/x86_64/${pkg}-debug"-*.pkg.tar.zst.sig
|
|
cp "$WORK"/"$pkg"/*.pkg.tar.zst "$REPO_DIR/x86_64/"
|
|
cp "$WORK"/"$pkg"/*.pkg.tar.zst.sig "$REPO_DIR/x86_64/" 2>/dev/null || true
|
|
done
|
|
|
|
rm -rf "$WORK"
|
|
echo "=== Packages built ==="
|
|
REMOTE
|
|
}
|
|
|
|
function repo-kernel-patch() {
|
|
echo "=== Patching linux-aios on $HOST_KERNEL ==="
|
|
ssh "$HOST_KERNEL" zsh -s <<'REMOTE'
|
|
set -e
|
|
REPOS="${HOME}/repos"
|
|
WORK="${HOME}/aios-kernel"
|
|
|
|
mkdir -p "$REPOS"
|
|
if [ -d "$REPOS/archlinux" ]; then
|
|
cd "$REPOS/archlinux"
|
|
git pull
|
|
else
|
|
git clone --depth 1 https://gitlab.archlinux.org/archlinux/packaging/packages/linux.git "$REPOS/archlinux"
|
|
fi
|
|
|
|
rm -rf "$WORK"
|
|
mkdir -p "$WORK/linux-aios"
|
|
cp "$REPOS/archlinux/PKGBUILD" "$WORK/linux-aios/"
|
|
cp "$REPOS/archlinux/config.x86_64" "$WORK/linux-aios/"
|
|
cp "$REPOS/archlinux/PKGBUILD" "$WORK/linux-aios/PKGBUILD.orig"
|
|
|
|
# Generate patch from current upstream
|
|
cd "$WORK/linux-aios"
|
|
cp PKGBUILD PKGBUILD.modified
|
|
sed -i "1s/.*/# Maintainer: syui <syui@syui.ai>\n# Based on: Arch Linux linux package by Jan Alexander Steffens (heftig)/" PKGBUILD.modified
|
|
sed -i "s/^pkgbase=linux$/pkgbase=linux-aios/" PKGBUILD.modified
|
|
sed -i "s/^pkgdesc='Linux'$/pkgdesc='Linux (aios)'/" PKGBUILD.modified
|
|
sed -i '/# htmldocs/,/texlive-latexextra/d' PKGBUILD.modified
|
|
sed -i '/make htmldocs/d' PKGBUILD.modified
|
|
sed -i '/_package-docs()/,/^}/d' PKGBUILD.modified
|
|
sed -i '/"$pkgbase-docs"/d' PKGBUILD.modified
|
|
sed -i '/^ echo "Setting version\.\.\."/d' PKGBUILD.modified
|
|
sed -i '/echo "-$pkgrel" > localversion.10-pkgrel/d' PKGBUILD.modified
|
|
sed -i '/echo "${pkgbase#linux}" > localversion.20-pkgname/d' PKGBUILD.modified
|
|
sed -i '/^ done$/a\\n echo "Setting version..."\n sed -i "s/^EXTRAVERSION = .*/EXTRAVERSION =/" Makefile\n echo "" > localversion.10-pkgrel\n echo "-aios" > localversion.20-pkgname' PKGBUILD.modified
|
|
|
|
# Generate and apply patch
|
|
diff -u PKGBUILD.orig PKGBUILD.modified \
|
|
| sed "1s|--- .*|--- a/PKGBUILD|" \
|
|
| sed "2s|+++ .*|+++ b/PKGBUILD|" \
|
|
> "$WORK/linux-aios/aios.patch"
|
|
cp PKGBUILD.orig PKGBUILD
|
|
patch -p1 < aios.patch
|
|
rm -f PKGBUILD.orig PKGBUILD.modified
|
|
|
|
echo "=== Patch result ==="
|
|
head -5 PKGBUILD
|
|
echo "--- prepare() version setting ---"
|
|
grep -A5 "^ done$" PKGBUILD | head -8
|
|
REMOTE
|
|
}
|
|
|
|
function repo-kernel-build() {
|
|
echo "=== Building linux-aios on $HOST_KERNEL ==="
|
|
ssh "$HOST_KERNEL" zsh -s <<'REMOTE'
|
|
set -e
|
|
cd "${HOME}/aios-kernel/linux-aios"
|
|
makepkg -sf --noconfirm --skippgpcheck
|
|
echo "=== Kernel built ==="
|
|
REMOTE
|
|
}
|
|
|
|
function repo-kernel-transfer() {
|
|
echo "=== Transferring kernel packages ==="
|
|
tmpdir=$(mktemp -d)
|
|
ssh "$HOST_KERNEL" "ls ~/aios-kernel/linux-aios/linux-aios-*.pkg.tar.zst" | while read f; do scp "${HOST_KERNEL}:$f" "$tmpdir/"; done
|
|
scp "$tmpdir"/linux-aios-*.pkg.tar.zst "$HOST":~/ai/repo/x86_64/
|
|
rm -rf "$tmpdir"
|
|
ssh "$HOST_KERNEL" "rm -rf ~/aios-kernel"
|
|
}
|
|
|
|
function repo-db-update() {
|
|
echo "=== Updating repo database ==="
|
|
ssh "$HOST" zsh -s -- "$GPG_KEY" <<'REMOTE'
|
|
set -e
|
|
setopt nonomatch 2>/dev/null || true
|
|
GPG_KEY="$1"
|
|
REPO_NAME="aios"
|
|
REPO_DIR="${HOME}/ai/repo"
|
|
|
|
cd "$REPO_DIR/x86_64"
|
|
|
|
# Sign unsigned packages
|
|
for pkg in *.pkg.tar.zst; do
|
|
[ -f "$pkg" ] || continue
|
|
if [ ! -f "${pkg}.sig" ]; then
|
|
echo "Signing $pkg..."
|
|
gpg --detach-sign --default-key "$GPG_KEY" "$pkg"
|
|
fi
|
|
done
|
|
|
|
rm -f "${REPO_NAME}".{db,files}*
|
|
repo-add --sign --key "$GPG_KEY" "${REPO_NAME}.db.tar.gz" *.pkg.tar.zst
|
|
gpg --export "$GPG_KEY" > "$REPO_DIR/aios.gpg"
|
|
|
|
for f in "${REPO_NAME}.db" "${REPO_NAME}.files" "${REPO_NAME}.db.sig" "${REPO_NAME}.files.sig"; do
|
|
if [ -L "$f" ]; then
|
|
target=$(readlink "$f")
|
|
rm "$f"
|
|
cp "$target" "$f"
|
|
fi
|
|
done
|
|
rm -f *.old *.old.sig
|
|
|
|
cd "$REPO_DIR"
|
|
git add -A
|
|
git commit -m "update $(date +%Y.%m.%d)" || true
|
|
git push
|
|
|
|
echo "=== Done ==="
|
|
REMOTE
|
|
}
|
|
|
|
repo-env
|
|
case "$1" in
|
|
pkg)
|
|
repo-pkg-build
|
|
repo-db-update
|
|
;;
|
|
kernel)
|
|
repo-kernel-patch
|
|
repo-kernel-build
|
|
repo-kernel-transfer
|
|
repo-db-update
|
|
;;
|
|
kernel-test)
|
|
repo-kernel-patch
|
|
;;
|
|
*)
|
|
repo-pkg-build
|
|
repo-db-update
|
|
;;
|
|
esac
|