mirror of
https://github.com/GXDE-OS/GXDE.git
synced 2026-11-07 06:52:01 +08:00
Compare commits
25
Commits
2026.07.11
...
2026.10.26
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cb28036eec | ||
|
|
e05436265a | ||
|
|
4d67c0c2f0 | ||
|
|
cec74ff92c | ||
|
|
e094939b96 | ||
|
|
3ae20c5867 | ||
|
|
ff4666cd2c | ||
|
|
2fe5b8b9d1 | ||
|
|
a23074725a | ||
|
|
7e1d43b057 | ||
|
|
bf87ba2f2b | ||
|
|
c215251f38 | ||
|
|
d8c5ea88e0 | ||
|
|
09945e156a | ||
|
|
64f4c6b4b3 | ||
|
|
e4d7046327 | ||
|
|
4130492385 | ||
|
|
87ee719ea4 | ||
|
|
23aba101a6 | ||
|
|
8ee15d5725 | ||
|
|
a6f6c26fb9 | ||
|
|
eebd5d7817 | ||
|
|
dd3d0e1a34 | ||
|
|
73a77bb9ca | ||
|
|
96feeb840f |
@@ -140,10 +140,8 @@ jobs:
|
|||||||
mkdir -p ~/.ssh/
|
mkdir -p ~/.ssh/
|
||||||
ssh-keyscan -p $UPORT -H $UHOST >> ~/.ssh/known_hosts
|
ssh-keyscan -p $UPORT -H $UHOST >> ~/.ssh/known_hosts
|
||||||
tarName=$(ls | grep .tar | head -n 1)
|
tarName=$(ls | grep .tar | head -n 1)
|
||||||
sudo sysctl -w net.ipv4.tcp_mtu_probing=1
|
sshpass -p "$UPASSWD" rsync -e "ssh -p $UPORT" $tarName $UUSERS@$UHOST:$UPATH
|
||||||
sshpass -p "$UPASSWD" scp -o HostKeyAlgorithms=ecdsa-sha2-nistp256 -o KexAlgorithms=ecdh-sha2-nistp256 -c aes128-ctr -O $tarName $UUSERS@$UHOST:$UPATH
|
sshpass -p "$UPASSWD" ssh $UUSERS@$UHOST -p $UPORT $UPROGRAM ${{ inputs.gxde-codename-upload }} $UPATH/$tarName > /dev/null
|
||||||
sshpass -p "$UPASSWD" ssh $UUSERS@$UHOST -o HostKeyAlgorithms=ecdsa-sha2-nistp256 -o KexAlgorithms=ecdh-sha2-nistp256 -c aes128-ctr -p $UPORT $UPROGRAM ${{ inputs.gxde-codename-upload }} $UPATH/$tarName > /dev/null
|
|
||||||
sudo sysctl -w net.ipv4.tcp_mtu_probing=0
|
|
||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
|
|||||||
@@ -141,10 +141,8 @@ jobs:
|
|||||||
mkdir -p ~/.ssh/
|
mkdir -p ~/.ssh/
|
||||||
ssh-keyscan -p $UPORT -H $UHOST >> ~/.ssh/known_hosts
|
ssh-keyscan -p $UPORT -H $UHOST >> ~/.ssh/known_hosts
|
||||||
tarName=$(ls | grep .tar | head -n 1)
|
tarName=$(ls | grep .tar | head -n 1)
|
||||||
sudo sysctl -w net.ipv4.tcp_mtu_probing=1
|
sshpass -p "$UPASSWD" rsync -e "ssh -p $UPORT" $tarName $UUSERS@$UHOST:$UPATH
|
||||||
sshpass -p "$UPASSWD" scp -o HostKeyAlgorithms=ecdsa-sha2-nistp256 -o KexAlgorithms=ecdh-sha2-nistp256 -c aes128-ctr -O $tarName $UUSERS@$UHOST:$UPATH
|
sshpass -p "$UPASSWD" ssh $UUSERS@$UHOST -p $UPORT $UPROGRAM ${{ inputs.gxde-codename-upload }} $UPATH/$tarName > /dev/null
|
||||||
sshpass -p "$UPASSWD" ssh $UUSERS@$UHOST -o HostKeyAlgorithms=ecdsa-sha2-nistp256 -o KexAlgorithms=ecdh-sha2-nistp256 -c aes128-ctr -p $UPORT $UPROGRAM ${{ inputs.gxde-codename-upload }} $UPATH/$tarName > /dev/null
|
|
||||||
sudo sysctl -w net.ipv4.tcp_mtu_probing=0
|
|
||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
|
|||||||
@@ -25,7 +25,3 @@ jobs:
|
|||||||
call-zhuangzhuang:
|
call-zhuangzhuang:
|
||||||
uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang-cross-host.yml@master
|
uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang-cross-host.yml@master
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
call-hetao:
|
|
||||||
uses: GXDE-OS/GXDE/.github/workflows/building-deb-hetao-cross-host.yml@master
|
|
||||||
secrets: inherit
|
|
||||||
|
|||||||
@@ -25,7 +25,3 @@ jobs:
|
|||||||
call-zhuangzhuang:
|
call-zhuangzhuang:
|
||||||
uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang-cross.yml@master
|
uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang-cross.yml@master
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
call-hetao:
|
|
||||||
uses: GXDE-OS/GXDE/.github/workflows/building-deb-hetao-cross.yml@master
|
|
||||||
secrets: inherit
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ jobs:
|
|||||||
uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang.yml@master
|
uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang.yml@master
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
call-hetao:
|
call-arch:
|
||||||
uses: GXDE-OS/GXDE/.github/workflows/building-deb-hetao.yml@master
|
uses: GXDE-OS/GXDE/.github/workflows/building-pkg.yml@master
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,138 @@
|
|||||||
|
# Copyright (C) 2026 CharOfString <root@charofstring.cc>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify it under
|
||||||
|
# the terms of the GNU General Public License as published by the Free Software
|
||||||
|
# Foundation, either version 3 of the License, or (at your option) any later
|
||||||
|
# version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
# details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along with
|
||||||
|
# this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# 本工作流用于构建Archlinux软件包,仅接受根目录的PKGBUILD或arch/PKGBUILD,没有时跳过。
|
||||||
|
# This workflow is used to build Arch Linux packages, it only accepts PKGBUILD
|
||||||
|
# in the root directory of the repo or arch/PKGBUILD, otherwise this will be
|
||||||
|
# skipped.
|
||||||
|
|
||||||
|
name: Building GXDE Arch Package
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
secrets:
|
||||||
|
PASSWD:
|
||||||
|
required: true
|
||||||
|
USERS:
|
||||||
|
required: true
|
||||||
|
HOST:
|
||||||
|
required: true
|
||||||
|
UPATH:
|
||||||
|
required: true
|
||||||
|
UPORT:
|
||||||
|
required: true
|
||||||
|
UPROGRAM_ARCH:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
env:
|
||||||
|
REPOSITORY: https://github.com/GXDE-OS/GXDE
|
||||||
|
BOTTLEPATH: system-bottle
|
||||||
|
GXDE_ARCH_REPO: https://repo1.gxde.top/gxde-arch
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
detect:
|
||||||
|
if: github.repository_owner == 'GXDE-OS'
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
outputs:
|
||||||
|
pkgbuild-dir: ${{ steps.find.outputs.dir }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Find PKGBUILD
|
||||||
|
id: find
|
||||||
|
run: |
|
||||||
|
if [[ -f arch/PKGBUILD ]]; then
|
||||||
|
echo "dir=arch" >> $GITHUB_OUTPUT
|
||||||
|
elif [[ -f PKGBUILD ]]; then
|
||||||
|
echo "dir=." >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "No PKGBUILD found, skip Arch build"
|
||||||
|
fi
|
||||||
|
|
||||||
|
build:
|
||||||
|
needs: detect
|
||||||
|
if: needs.detect.outputs.pkgbuild-dir != ''
|
||||||
|
name: ${{ matrix.arch }}-arch
|
||||||
|
runs-on: ${{ matrix.runner }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- arch: x86_64
|
||||||
|
runner: ubuntu-24.04
|
||||||
|
- arch: aarch64
|
||||||
|
runner: ubuntu-24.04-arm
|
||||||
|
steps:
|
||||||
|
- name: Clone Repository To Get Script
|
||||||
|
run: |
|
||||||
|
git clone $REPOSITORY --depth=1
|
||||||
|
mv $(basename $REPOSITORY)/* . -v
|
||||||
|
mv $(basename $REPOSITORY)/.* . -v | true
|
||||||
|
|
||||||
|
- name: Configure Base System
|
||||||
|
run: |
|
||||||
|
bash .github/workflows/configure-building-enviroment-arch.sh ${{ matrix.arch }} \
|
||||||
|
$REPOSITORY \
|
||||||
|
https://github.com/$GITHUB_REPOSITORY \
|
||||||
|
${{ github.ref_name }} \
|
||||||
|
$GXDE_ARCH_REPO
|
||||||
|
|
||||||
|
- name: Building ${{ GITHUB.repository }}
|
||||||
|
run: |
|
||||||
|
gitPath=/home/builder/$(basename $GITHUB_REPOSITORY)/${{ needs.detect.outputs.pkgbuild-dir }}
|
||||||
|
sudo chroot $BOTTLEPATH sudo -H -u builder bash -c \
|
||||||
|
"cd $gitPath && makepkg -s --noconfirm --needed"
|
||||||
|
mkdir -p packages
|
||||||
|
sudo find $BOTTLEPATH$gitPath -maxdepth 1 -name '*.pkg.tar.*' ! -name '*.sig' -exec cp -v {} packages/ \;
|
||||||
|
sudo chown -R $(id -u):$(id -g) packages
|
||||||
|
ls -l packages
|
||||||
|
|
||||||
|
- name: Remove Debug Package
|
||||||
|
run: |
|
||||||
|
rm -fv packages/*-debug-*.pkg.tar.*
|
||||||
|
|
||||||
|
- name: Pack tar
|
||||||
|
run: |
|
||||||
|
cd packages
|
||||||
|
tar -cvf ../arch-${{ matrix.arch }}-$(date +%s).tar *.pkg.tar.*
|
||||||
|
|
||||||
|
- name: Push
|
||||||
|
env:
|
||||||
|
UPASSWD: ${{ secrets.PASSWD }}
|
||||||
|
UUSERS: ${{ secrets.USERS }}
|
||||||
|
UHOST: ${{ secrets.HOST }}
|
||||||
|
UPATH: ${{ secrets.UPATH }}
|
||||||
|
UPROGRAM_ARCH: ${{ secrets.UPROGRAM_ARCH }}
|
||||||
|
UPORT: ${{ secrets.UPORT }}
|
||||||
|
run: |
|
||||||
|
if [[ -z "$UPROGRAM_ARCH" ]]; then
|
||||||
|
echo "::warning::UPROGRAM_ARCH is not set, skip uploading Arch packages"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install sshpass -y
|
||||||
|
mkdir -p ~/.ssh/
|
||||||
|
ssh-keyscan -p $UPORT -H $UHOST >> ~/.ssh/known_hosts
|
||||||
|
tarName=$(ls | grep '^arch-.*\.tar$' | head -n 1)
|
||||||
|
sshpass -p "$UPASSWD" rsync -e "ssh -p $UPORT" $tarName $UUSERS@$UHOST:$UPATH
|
||||||
|
sshpass -p "$UPASSWD" ssh $UUSERS@$UHOST -p $UPORT $UPROGRAM_ARCH ${{ matrix.arch }} $UPATH/$tarName > /dev/null
|
||||||
|
|
||||||
|
- name: Create Release
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.RELEASE_TOCKEN_GITHUB }}
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
packages/*.pkg.tar.*
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright (C) 2026 CharOfString <root@charofstring.cc>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify it under
|
||||||
|
# the terms of the GNU General Public License as published by the Free Software
|
||||||
|
# Foundation, either version 3 of the License, or (at your option) any later
|
||||||
|
# version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
# details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along with
|
||||||
|
# this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# 本脚本用于构建GXDE Arch打包环境
|
||||||
|
# 参数$1 = 架构,可选x86_64/aarch64
|
||||||
|
# 参数$2 = GXDE仓库地址
|
||||||
|
# 参数$3 = 源码包仓库地址
|
||||||
|
# 参数$4 = 当前欲构建的分支
|
||||||
|
# 参数$5 = GXDE Arch源地址,用于获取GXDE依赖
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# This script is used to configure the packaging environment of GXDE on Arch.
|
||||||
|
# $1 = Archtecture required, either x86_64 or aarch64.
|
||||||
|
# $2 = GXDE repository address.
|
||||||
|
# $3 = Repository path of the software to be built.
|
||||||
|
# $4 = The branch that you want to build.
|
||||||
|
# $5 = The Arch PACMAN source of GXDE, we'll use it to install dependencies.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
build_arch=$1
|
||||||
|
bottle_path=./system-bottle
|
||||||
|
gxde_arch_repo=${5:-https://repo1.gxde.top/gxde-arch}
|
||||||
|
|
||||||
|
# 引用/Works Cited: https://patorjk.com/software/taag/#p=display&f=Linguaholic+Shadow+3D
|
||||||
|
echo ' ██████╗██╗ ██╗██████╗ ████████╗ ████╗ ' &&
|
||||||
|
echo '██╔═════╝╚═██╗ ██╔═╝██╔═══██╗██╔═════╝ ██╔═══╝ ████╗ ██╗ ████╗ ' &&
|
||||||
|
echo '██║ ████╗ ╚═██╔═╝ ██║ ██║██████╗ ██████╗ ██╔═══██╗████╔═══╝ ' &&
|
||||||
|
echo '██║ ╚═██║ ██╔═██╗ ██║ ██║██╔═══╝ ╚═██╔═╝ ██║ ██║██╔═╝ ' &&
|
||||||
|
echo '╚═██████║██╔═╝ ╚═██╗██████╔═╝████████╗ ██║ ╚═████╔═╝██║ ' &&
|
||||||
|
echo ' ╚═════╝╚═╝ ╚═╝╚═════╝ ╚═══════╝ ╚═╝ ╚═══╝ ╚═╝ ' &&
|
||||||
|
echo ' ' &&
|
||||||
|
echo ' ' &&
|
||||||
|
echo ' ████╗ ██╗ ██╗ ██╗ ' &&
|
||||||
|
echo '██╔═══██╗██╗ ████╗ ██████╗██████╗ ██║ ╚═╝██████╗ ██╗ ██╗██╗ ██╗' &&
|
||||||
|
echo '████████║████╔═══╝██╔═════╝██╔═══██╗██║ ██╗██╔═══██╗██║ ██║╚═████╔═╝' &&
|
||||||
|
echo '██╔═══██║██╔═╝ ██║ ██║ ██║██║ ██║██║ ██║██║ ██║ ████║ ' &&
|
||||||
|
echo '██║ ██║██║ ╚═██████╗██║ ██║████████╗██║██║ ██║╚═██████║██╔═══██╗' &&
|
||||||
|
echo '╚═╝ ╚═╝╚═╝ ╚═════╝╚═╝ ╚═╝╚═══════╝╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝'
|
||||||
|
|
||||||
|
# 先安装解压chroot用的依赖 ・ Install the dependencies for extracting chroot first.
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install wget zstd git -y
|
||||||
|
|
||||||
|
# 根据架构下载解压对应chroot ・ Download & extract corresponding chroot by archtecture needed.
|
||||||
|
echo '[I] (Chroot) Init: Starting to download chroot for Archlinux...'
|
||||||
|
if [[ $build_arch == "x86_64" ]]; then
|
||||||
|
echo '[I] (Chroot) Init: Archtecture hit >> AMD64.'
|
||||||
|
wget -q https://geo.mirror.pkgbuild.com/iso/latest/archlinux-bootstrap-x86_64.tar.zst
|
||||||
|
sudo tar --zstd -xpf archlinux-bootstrap-x86_64.tar.zst --numeric-owner
|
||||||
|
sudo mv root.x86_64 $bottle_path
|
||||||
|
echo 'Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch' | sudo tee $bottle_path/etc/pacman.d/mirrorlist
|
||||||
|
keyring=archlinux
|
||||||
|
elif [[ $build_arch == "aarch64" ]]; then
|
||||||
|
echo '[I] (Chroot) Init: Archtecture hit >> AARCH64.'
|
||||||
|
wget -q http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
|
||||||
|
sudo mkdir -p $bottle_path
|
||||||
|
sudo tar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C $bottle_path --numeric-owner
|
||||||
|
keyring=archlinuxarm
|
||||||
|
else
|
||||||
|
echo "[E] (Chroot) Init: Unsupportted archtecture $build_arch, HALTED!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo '[I] (Chroot) Init: Done downloading chroot for Archlinux.'
|
||||||
|
|
||||||
|
# 挂载chroot ・ Mount chroot.
|
||||||
|
echo '[I] (Chroot) Mount: Starting to mount target chroot...'
|
||||||
|
sudo mount --bind $bottle_path $bottle_path
|
||||||
|
for i in proc sys dev dev/pts; do
|
||||||
|
sudo mount --bind /$i $bottle_path/$i
|
||||||
|
done
|
||||||
|
# ALARM的resolv.conf是指向/run/systemd/resolve的绝对软链接,需先删除,否则cp会写穿到宿主机且chroot内仍无法解析
|
||||||
|
# ALARM ships resolv.conf as an absolute symlink into /run/systemd/resolve, remove it first,
|
||||||
|
# otherwise cp writes through to the host's file and DNS stays broken inside chroot.
|
||||||
|
sudo rm -f $bottle_path/etc/resolv.conf
|
||||||
|
sudo cp -L /etc/resolv.conf $bottle_path/etc/resolv.conf
|
||||||
|
echo '[I] (Chroot) Mount: Done mounting the chroot!'
|
||||||
|
|
||||||
|
# Pacman在chroot里无法做沙箱/空间检查
|
||||||
|
# Pacman is not able to do space check or sandbox in chroot.
|
||||||
|
echo '[I] (Chroot) PostInit: Disabling sanbox and space check since we are in chroot...'
|
||||||
|
sudo sed -i 's/^CheckSpace/#CheckSpace/' $bottle_path/etc/pacman.conf
|
||||||
|
sudo sed -i 's/^#DisableSandbox/DisableSandbox/' $bottle_path/etc/pacman.conf
|
||||||
|
echo '[I] (Chroot) PostInit: Done disabling unavailable components!'
|
||||||
|
|
||||||
|
# 一个小wrapper,在chroot中运行某指令 ・ A wrapper to run certain commands under chroot.
|
||||||
|
run() {
|
||||||
|
sudo chroot $bottle_path bash -c "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 写入GXDE Arch源,以便安装dtk等自身提供的依赖
|
||||||
|
# 新源刚建立时可能还不存在,因此只做可选信任
|
||||||
|
# --------------------------------------------
|
||||||
|
# Add GXDE Archlinux PACMAN source to install dependencies such as DTK.
|
||||||
|
# It may not exist when as we're just getting started, so we will do a Optional TrustAll.
|
||||||
|
echo '[I] (Chroot) PACMAN: Configuring GXDE pacman source...'
|
||||||
|
cat << EOF | sudo tee -a $bottle_path/etc/pacman.conf
|
||||||
|
|
||||||
|
[gxde]
|
||||||
|
SigLevel = Optional TrustAll
|
||||||
|
Server = $gxde_arch_repo/\$arch
|
||||||
|
EOF
|
||||||
|
echo '[I] (Chroot) PACMAN: GXDE pacman source has been added to chroot!'
|
||||||
|
echo '[I] (Chroot) PACMAN: Doing upgrade...'
|
||||||
|
run pacman-key --init
|
||||||
|
run pacman-key --populate $keyring
|
||||||
|
for i in {1..5}; do
|
||||||
|
# GXDE 源尚不存在时 -Syu 会失败,此时去掉 GXDE 源再试一次
|
||||||
|
if run pacman -Syu --noconfirm --needed base-devel git sudo; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [[ $i == 3 ]]; then
|
||||||
|
echo "GXDE Arch repo unreachable, building without it"
|
||||||
|
sudo sed -i '/^\[gxde\]/,/^Server/d' $bottle_path/etc/pacman.conf
|
||||||
|
fi
|
||||||
|
if [[ $i == 5 ]]; then
|
||||||
|
echo '[E] (Chroot) PACMAN: Failed to upgrade chroot, HALTED!'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
echo '[I] (Chroot) PACMAN: Shall be okay...'
|
||||||
|
|
||||||
|
# makepkg不允许以root运行 ・ makepkg require another account other than root.
|
||||||
|
echo '[I] (Building) AccountCtl: Setting up builder account...'
|
||||||
|
run useradd -m builder
|
||||||
|
echo "builder ALL=(ALL) NOPASSWD: ALL" | sudo tee $bottle_path/etc/sudoers.d/builder
|
||||||
|
echo '[I] (Building) AccountCtl: Builder account is up!'
|
||||||
|
|
||||||
|
# 以builder身份克隆仓库 ・ Clone the repo as builder.
|
||||||
|
echo '[I] (Building) Builder: Cloning target repository...'
|
||||||
|
run sudo -H -u builder git clone $3 -b $4 /home/builder/$(basename $3)
|
||||||
|
echo '[I] (Building) Builder: Done cloning target repository.'
|
||||||
|
|
||||||
|
echo '[I] (Env) Setup: Setup finished, bye~'
|
||||||
|
exit 0
|
||||||
@@ -39,7 +39,7 @@ if [[ $2 == "crimson" ]]; then
|
|||||||
useDeepin25
|
useDeepin25
|
||||||
sudo debootstrap --no-check-gpg --include=git,deepin-keyring,gcc,make,g++,dpkg-dev,qtbase5-dev,ca-certificates --arch=$1 $2 $bottlePath $5
|
sudo debootstrap --no-check-gpg --include=git,deepin-keyring,gcc,make,g++,dpkg-dev,qtbase5-dev,ca-certificates --arch=$1 $2 $bottlePath $5
|
||||||
else
|
else
|
||||||
sudo debootstrap --no-check-gpg --include=git,gcc,make,debian-ports-archive-keyring,debian-archive-keyring,g++,dpkg-dev,qtbase5-dev,ca-certificates --arch=$1 $2 $bottlePath $5
|
sudo debootstrap --no-check-gpg --include=git,gcc,make,debian-ports-archive-keyring,debian-archive-keyring,g++,dpkg-dev,qtbase5-dev,ca-certificates,qt6-base-private-dev,qt6-base-dev --arch=$1 $2 $bottlePath $5
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $2 == "crimson" ]]; then
|
if [[ $2 == "crimson" ]]; then
|
||||||
|
|||||||
@@ -16,17 +16,15 @@ jobs:
|
|||||||
- name: Config
|
- name: Config
|
||||||
run: |
|
run: |
|
||||||
sudo apt update
|
sudo apt update
|
||||||
sudo apt install git python3-requests -y
|
sudo apt install git -y
|
||||||
|
|
||||||
- name: Push
|
- name: Push
|
||||||
env:
|
env:
|
||||||
GITHUBTOKEN: ${{ secrets.GITHUBTOKEN }}
|
GITHUBTOKEN: ${{ secrets.GITHUBTOKEN }}
|
||||||
GITHUBUSER: ${{ secrets.GITHUBUSER }}
|
GITHUBUSER: ${{ secrets.GITHUBUSER }}
|
||||||
GITCODETOKEN: ${{ secrets.GITCODETOKEN }}
|
GITEEUSER: ${{ secrets.GITEEUSER }}
|
||||||
GITCODEUSER: ${{ secrets.GITCODEUSER }}
|
GITEETOCKEN: ${{ secrets.GITEETOCKEN }}
|
||||||
ATOMGITTOKEN: ${{ secrets.ATOMGITTOKEN }}
|
|
||||||
ATOMGITUSER: ${{ secrets.ATOMGITUSER }}
|
|
||||||
run: |
|
run: |
|
||||||
cd sync-gitee-to-github
|
cd sync-gitee-to-github
|
||||||
python3 sync.py $GITHUBUSER $GITHUBTOKEN $GITCODEUSER $GITCODETOKEN $ATOMGITUSER $ATOMGITTOKEN
|
python3 sync.py $GITEEUSER $GITEETOCKEN $GITHUBUSER $GITHUBTOKEN
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
This file contains honored contributers of GXDE and GXDE OS. The list is in alphabetical order.
|
This file contains honored contributers of GXDE and GXDE OS. The list is in alphabetical order.
|
||||||
|
|
||||||
CharOfString <markus_verify@126.com>
|
CharOfString <root@charofstring.cc>
|
||||||
dependon <liuminghang0821@gmail.com>
|
dependon <liuminghang0821@gmail.com>
|
||||||
elysia <c.elysia@foxmail.com>
|
elysia <c.elysia@foxmail.com>
|
||||||
gfdgd xi <3025613752@qq.com>
|
gfdgd xi <3025613752@qq.com>
|
||||||
|
|||||||
@@ -1,9 +1,18 @@
|
|||||||
|

|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div style="float: left; display: flex; align-items: center" >
|
||||||
|
<a href='https://gitee.com/GXDE-OS/GXDE/stargazers'><img src='https://gitee.com/GXDE-OS/GXDE/badge/star.svg?theme=dark' alt='star'></img></a>
|
||||||
|
<img src='https://gitcode.com/GXDE-OS/GXDE/star/badge.svg' alt='G-Star'></img>
|
||||||
|
</div>
|
||||||
|
<div style="float: right">
|
||||||
|
<a href="./README.zh.md">中文版</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
## Welcome to GXDE OS Community
|
## Welcome to GXDE OS Community
|
||||||
|
|
||||||
**[中文](/README.zh.md)**
|
|
||||||
|
|
||||||
GXDE OS is an Debian based Linux distro featuring GXDE Desktop Environment. It offers an elegant, beautifu, light weight and out-of-the-box experience.
|
GXDE OS is an Debian based Linux distro featuring GXDE Desktop Environment. It offers an elegant, beautifu, light weight and out-of-the-box experience.
|
||||||
|
|
||||||
### Classic and Extended Deepin DE Experience
|
### Classic and Extended Deepin DE Experience
|
||||||
@@ -88,4 +97,7 @@ The author is online and hungry for support (nom nom~). Feeding might even get u
|
|||||||
|
|
||||||
<p><img src="https://www.gxde.top/install/gf.jpg" style="border-radius: 4px;" ></p>
|
<p><img src="https://www.gxde.top/install/gf.jpg" style="border-radius: 4px;" ></p>
|
||||||
|
|
||||||
# ©2023~Now gfdgd xi
|
|
||||||
|
<span style="color: #E6004C; font-size: 20px"><b>©2023~Now gfdgd xi</b></span>
|
||||||
|
|
||||||
|
<div style="background: #E6004C; width: 100%; height: 3px;"></div>
|
||||||
+12
-8
@@ -1,11 +1,14 @@
|
|||||||
<center><img src=new-logo-long.png width=300/></center>
|

|
||||||
<hr>
|
|
||||||
|
<div>
|
||||||
|
<div style="float: left; display: flex; align-items: center" >
|
||||||
<a href='https://gitee.com/GXDE-OS/GXDE/stargazers'><img src='https://gitee.com/GXDE-OS/GXDE/badge/star.svg?theme=dark' alt='star'></img></a>
|
<a href='https://gitee.com/GXDE-OS/GXDE/stargazers'><img src='https://gitee.com/GXDE-OS/GXDE/badge/star.svg?theme=dark' alt='star'></img></a>
|
||||||
|
<img src='https://gitcode.com/GXDE-OS/GXDE/star/badge.svg' alt='G-Star'></img>
|
||||||

|
</div>
|
||||||
|
<div style="float: right">
|
||||||
|
<a href="./README.md">English Version</a>
|
||||||
**[English](/README.md)**
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
## 简介
|
## 简介
|
||||||
@@ -87,5 +90,6 @@ Gitcode:https://gitcode.com/GXDE-OS
|
|||||||
|
|
||||||
<p><img src="https://www.gxde.top/install/gf.jpg" style="border-radius: 4px;" ></p>
|
<p><img src="https://www.gxde.top/install/gf.jpg" style="border-radius: 4px;" ></p>
|
||||||
|
|
||||||
|
<span style="color: #E6004C; font-size: 20px"><b>©2023~Now gfdgd xi</b></span>
|
||||||
|
|
||||||
# ©2023~Now gfdgd xi
|
<div style="background: #E6004C; width: 100%; height: 3px;"></div>
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# PKGBUILD for testing purpose.
|
||||||
|
|
||||||
|
pkgname=gxde-example
|
||||||
|
pkgver=0
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="GXDE example component"
|
||||||
|
arch=('x86_64' 'aarch64')
|
||||||
|
url="https://github.com/GXDE-OS/${pkgname}"
|
||||||
|
license=('GPL-3.0-or-later')
|
||||||
|
|
||||||
|
depends=('qt5-base')
|
||||||
|
makedepends=('git' 'cmake' 'qt5-tools')
|
||||||
|
source=()
|
||||||
|
sha256sums=()
|
||||||
|
|
||||||
|
_srcdir() {
|
||||||
|
git -C "$startdir" rev-parse --show-toplevel
|
||||||
|
}
|
||||||
|
|
||||||
|
pkgver() {
|
||||||
|
head -n 1 "$(_srcdir)/debian/changelog" | sed -E 's/.*\(([^)]*)\).*/\1/; s/^[0-9]+://; s/-/./g'
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
cmake -B build -S "$(_srcdir)" \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=/usr
|
||||||
|
cmake --build build
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
DESTDIR="$pkgdir" cmake --install build
|
||||||
|
}
|
||||||
Vendored
+7
-2
@@ -1,4 +1,4 @@
|
|||||||
gxde (2026.07.11) UNRELEASED; urgency=medium
|
gxde (2026.10.26) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
* 新增 remmina 以解决远程问题
|
* 新增 remmina 以解决远程问题
|
||||||
* 改为安装 dde-printer
|
* 改为安装 dde-printer
|
||||||
@@ -25,8 +25,13 @@ gxde (2026.07.11) UNRELEASED; urgency=medium
|
|||||||
* 更改 gxde-desktop-extra 推荐依赖
|
* 更改 gxde-desktop-extra 推荐依赖
|
||||||
* 推荐安装 firmware-atheros | firmware-ath9k-htc
|
* 推荐安装 firmware-atheros | firmware-ath9k-htc
|
||||||
* gxde-desktop-android 指定安装 spark-store 而不是可选安装 aptss
|
* gxde-desktop-android 指定安装 spark-store 而不是可选安装 aptss
|
||||||
|
* 添加推荐依赖 deepin-liferaft
|
||||||
|
* 新增推荐依赖 gxde-dlna-caster
|
||||||
|
* 新增推荐依赖 gxde-filetransfer
|
||||||
|
* 新增推荐依赖 gxde-wayland-session, gxdm-emergency-mode, gxde-freewb, fcitx5-theme-deepin
|
||||||
|
* 移除星火动态壁纸依赖
|
||||||
|
|
||||||
-- gfdgd_xi <3025613752@qq.com> Sat, 11 Jul 2026 14:12:50 +0800
|
-- gfdgd_xi <3025613752@qq.com> Mon, 26 Oct 2026 21:57:06 +0800
|
||||||
|
|
||||||
gxde (2024.10.20) UNRELEASED; urgency=medium
|
gxde (2024.10.20) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
|||||||
Vendored
+7
-2
@@ -34,8 +34,8 @@ Recommends: ${misc:Depends},
|
|||||||
deepin-system-monitor,
|
deepin-system-monitor,
|
||||||
gxde-downloader,
|
gxde-downloader,
|
||||||
gparted,
|
gparted,
|
||||||
fantascene-dynamic-wallpaper,
|
|
||||||
x11vnc,
|
x11vnc,
|
||||||
|
gxde-dlna-caster,
|
||||||
com.github.minesweep,
|
com.github.minesweep,
|
||||||
2048-qt,
|
2048-qt,
|
||||||
papirus-icon-theme | gxde-desktop-android,
|
papirus-icon-theme | gxde-desktop-android,
|
||||||
@@ -48,8 +48,14 @@ Recommends: ${misc:Depends},
|
|||||||
deepin-log-viewer,
|
deepin-log-viewer,
|
||||||
fcitx5-table-wubi98,
|
fcitx5-table-wubi98,
|
||||||
fcitx5-pinyin-zhwiki,
|
fcitx5-pinyin-zhwiki,
|
||||||
|
gxde-freewb,
|
||||||
|
fcitx5-theme-deepin,
|
||||||
dde-cooperation,
|
dde-cooperation,
|
||||||
firmware-atheros,
|
firmware-atheros,
|
||||||
|
deepin-liferaft,
|
||||||
|
gxde-wayland-session,
|
||||||
|
gxde-filetransfer,
|
||||||
|
gxdm-emergency-mode,
|
||||||
Description: GXDE New Desktop Environment Extra - Next
|
Description: GXDE New Desktop Environment Extra - Next
|
||||||
This is a meta package depends GXDE New Desktop Envrionment Extra.
|
This is a meta package depends GXDE New Desktop Envrionment Extra.
|
||||||
.
|
.
|
||||||
@@ -166,7 +172,6 @@ Recommends:
|
|||||||
plymouth-theme-gxde-logo,
|
plymouth-theme-gxde-logo,
|
||||||
fcitx5,
|
fcitx5,
|
||||||
fcitx5-table,
|
fcitx5-table,
|
||||||
fantascene-dynamic-wallpaper,
|
|
||||||
x11vnc,
|
x11vnc,
|
||||||
apt-is-aptss,
|
apt-is-aptss,
|
||||||
Conflicts:
|
Conflicts:
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# GXDE Arch Linux pacman source
|
||||||
|
[gxde]
|
||||||
|
SigLevel = Optional TrustAll
|
||||||
|
Server = https://repo1.gxde.top/gxde-arch/$arch
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
+135
-57
@@ -1,68 +1,146 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
将 Gitee 上的 GXDE-OS 组织仓库镜像同步到 GitHub(GXDE-OS 组织)。
|
||||||
|
|
||||||
|
用法:
|
||||||
|
python3 sync.py <gitee用户名> <gitee密码或Token> <github用户名> <githubToken>
|
||||||
|
|
||||||
|
流程:
|
||||||
|
1. 通过 Gitee API v5 分页获取 GXDE-OS 组织下的全部仓库列表(带 token 失败时回退匿名)
|
||||||
|
2. 多线程 clone --bare 拉取 Gitee 仓库
|
||||||
|
3. 逐个 push --mirror 推送到 GitHub,失败自动重试并在结束时汇总报告
|
||||||
|
"""
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import requests
|
import urllib.parse
|
||||||
import threading
|
import urllib.request
|
||||||
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||||
|
|
||||||
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
|
programPath = os.path.split(os.path.realpath(__file__))[0]
|
||||||
dataHeaders = {
|
cloneDir = os.path.join(programPath, "git-clone")
|
||||||
"accept": "application/json"
|
orgName = "GXDE-OS"
|
||||||
}
|
perPage = 100
|
||||||
pullUrl = "https://gitee.com/GXDE-OS/"
|
threadMax = 8
|
||||||
pushUrl = [
|
|
||||||
"https://@USER@:@PASS@@github.com/GXDE-OS/",
|
|
||||||
"https://@USER@:@PASS@@gitcode.com/GXDE-OS/",
|
|
||||||
"https://@USER@:@PASS@@atomgit.com/GXDE-OS/"
|
|
||||||
]
|
|
||||||
|
|
||||||
if (len(sys.argv) < 1 + len(pushUrl) * 2):
|
|
||||||
print(f"请输入用于推送的账户和密码(需要 {len(pushUrl)} 组以推送不同的平台,提供顺序如下)")
|
|
||||||
for i in pushUrl:
|
|
||||||
print(f" {i}")
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
# 读取参数
|
def usage():
|
||||||
userName = []
|
print("用法: python3 sync.py <gitee用户名> <gitee密码或Token> <github用户名> <githubToken>")
|
||||||
password = []
|
sys.exit(1)
|
||||||
for i in range(1, len(sys.argv)):
|
|
||||||
# 输入账户
|
|
||||||
if (i % 2 == 1):
|
|
||||||
userName.append(sys.argv[i])
|
|
||||||
# 输入密码
|
|
||||||
if (i % 2 == 0):
|
|
||||||
password.append(sys.argv[i])
|
|
||||||
|
|
||||||
def sync(i):
|
|
||||||
global thread
|
|
||||||
# 拉取代码进行同步
|
|
||||||
if (not os.path.exists(f"{programPath}/git-clone")):
|
|
||||||
os.makedirs(f"{programPath}/git-clone")
|
|
||||||
print(f"======================> {pullUrl}/{i}")
|
|
||||||
os.system(f"cd '{programPath}/git-clone' ; git clone --bare '{pullUrl}/{i}'")
|
|
||||||
# 推送
|
|
||||||
for j in range(len(pushUrl)):
|
|
||||||
# git remote set-url origin
|
|
||||||
gitUrl = pushUrl[j].replace("@USER@", userName[j]).replace("@PASS@", password[j]) + "/" + i
|
|
||||||
os.system(f"cd '{programPath}/git-clone/{i}.git' ; git remote set-url origin '{gitUrl}'")
|
|
||||||
os.system(f"cd '{programPath}/git-clone/{i}.git' ; git push --mirror")
|
|
||||||
# 移除临时文件
|
|
||||||
os.system(f"rm -rf '{programPath}/git-clone/{i}.git'")
|
|
||||||
thread -= 1
|
|
||||||
|
|
||||||
data = requests.get("https://api.github.com/users/GXDE-OS/repos", headers=dataHeaders).json()
|
def apiGet(path, params):
|
||||||
repoList = []
|
"""调用 Gitee API v5 的单个请求"""
|
||||||
# 获取仓库列表
|
params["per_page"] = str(perPage)
|
||||||
for i in data:
|
url = "https://gitee.com/api/v5" + path + "?" + urllib.parse.urlencode(params)
|
||||||
repoList.append(i["name"])
|
req = urllib.request.Request(url, headers={"User-Agent": "GXDE-Sync/1.0"})
|
||||||
# 多线程处理以提升速度
|
with urllib.request.urlopen(req, timeout=30) as resp:
|
||||||
thread = 0
|
return json.loads(resp.read().decode("utf-8"))
|
||||||
threadMax = 32
|
|
||||||
for i in repoList:
|
|
||||||
|
def getGiteeRepos(token):
|
||||||
|
"""分页获取 Gitee 组织下全部仓库的 path(URL 安全路径)
|
||||||
|
|
||||||
|
Gitee API 返回的 name 是仓库别名(可能含大写、中文或括号,如
|
||||||
|
"CTranslate2"),不能直接用作 clone URL 的路径组件;path 才是 URL
|
||||||
|
安全的仓库路径(如 "ctranslate2"),用它拼接 clone/push URL 才合法。
|
||||||
|
"""
|
||||||
|
repoList = []
|
||||||
|
page = 1
|
||||||
while True:
|
while True:
|
||||||
time.sleep(0.1)
|
params = {"page": str(page)}
|
||||||
if (thread < threadMax):
|
if token:
|
||||||
threading.Thread(target=sync, args=[i]).start()
|
params["access_token"] = token
|
||||||
thread += 1
|
data = apiGet(f"/orgs/{orgName}/repos", params)
|
||||||
|
if not isinstance(data, list) or len(data) == 0:
|
||||||
break
|
break
|
||||||
|
repoList.extend([i["path"] for i in data])
|
||||||
|
page += 1
|
||||||
|
return repoList
|
||||||
|
|
||||||
|
|
||||||
|
def runGit(args, cwd=None):
|
||||||
|
return subprocess.run(args, cwd=cwd, stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.STDOUT, text=True)
|
||||||
|
|
||||||
|
|
||||||
|
def syncRepo(name, pullUrl, pushUrl):
|
||||||
|
repoDir = os.path.join(cloneDir, name + ".git")
|
||||||
|
try:
|
||||||
|
# 1. 从 Gitee clone --bare(重试 3 次)
|
||||||
|
ok = False
|
||||||
|
lastOut = ""
|
||||||
|
for attempt in range(3):
|
||||||
|
result = runGit(["git", "clone", "--bare", pullUrl + name, repoDir])
|
||||||
|
if result.returncode == 0:
|
||||||
|
ok = True
|
||||||
|
break
|
||||||
|
lastOut = result.stdout
|
||||||
|
time.sleep(5)
|
||||||
|
if not ok:
|
||||||
|
print(f"[FAIL] clone 失败: {name}\n{lastOut}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# 2. push --mirror 到 GitHub(重试 3 次)
|
||||||
|
ok = False
|
||||||
|
lastOut = ""
|
||||||
|
for attempt in range(3):
|
||||||
|
result = runGit(["git", "-C", repoDir, "push", "--mirror", pushUrl + name])
|
||||||
|
if result.returncode == 0:
|
||||||
|
ok = True
|
||||||
|
break
|
||||||
|
lastOut = result.stdout
|
||||||
|
time.sleep(5)
|
||||||
|
if not ok:
|
||||||
|
print(f"[FAIL] push 失败: {name}\n{lastOut}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
print(f"[ OK ] 同步完成: {name}")
|
||||||
|
return True
|
||||||
|
finally:
|
||||||
|
# 清理临时目录
|
||||||
|
runGit(["rm", "-rf", repoDir])
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) < 5:
|
||||||
|
usage()
|
||||||
|
giteeUser, giteeToken = sys.argv[1], sys.argv[2]
|
||||||
|
githubUser, githubToken = sys.argv[3], sys.argv[4]
|
||||||
|
|
||||||
|
pullUrl = f"https://{urllib.parse.quote(giteeUser)}:{urllib.parse.quote(giteeToken)}@gitee.com/{orgName}/"
|
||||||
|
pushUrl = f"https://{urllib.parse.quote(githubUser)}:{urllib.parse.quote(githubToken)}@github.com/{orgName}/"
|
||||||
|
|
||||||
|
os.makedirs(cloneDir, exist_ok=True)
|
||||||
|
|
||||||
|
# 获取仓库列表:优先带 token,失败则回退到匿名(仅公开仓库)
|
||||||
|
try:
|
||||||
|
repoList = getGiteeRepos(giteeToken)
|
||||||
|
except Exception:
|
||||||
|
repoList = getGiteeRepos("")
|
||||||
|
print(f"共获取到 {len(repoList)} 个仓库")
|
||||||
|
if not repoList:
|
||||||
|
print("未能获取仓库列表,退出")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
failed = []
|
||||||
|
with ThreadPoolExecutor(max_workers=threadMax) as pool:
|
||||||
|
futures = {pool.submit(syncRepo, n, pullUrl, pushUrl): n for n in repoList}
|
||||||
|
for future in as_completed(futures):
|
||||||
|
if not future.result():
|
||||||
|
failed.append(futures[future])
|
||||||
|
|
||||||
|
print("=" * 50)
|
||||||
|
print(f"同步完成: 成功 {len(repoList) - len(failed)} / {len(repoList)}")
|
||||||
|
if failed:
|
||||||
|
print("以下仓库同步失败:")
|
||||||
|
for name in failed:
|
||||||
|
print(" -", name)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|||||||
@@ -0,0 +1,112 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright (C) 2026 CharOfString <root@charofstring.cc>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify it under
|
||||||
|
# the terms of the GNU General Public License as published by the Free Software
|
||||||
|
# Foundation, either version 3 of the License, or (at your option) any later
|
||||||
|
# version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
# details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along with
|
||||||
|
# this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# 本脚本用于向GXDE Arch源上传包并更新数据库,由building-pkg.yml自动调用
|
||||||
|
# 用法:
|
||||||
|
# arch-repo-update.sh <x86_64|aarch64> <arch-xxx.tar>
|
||||||
|
# 依赖:
|
||||||
|
# repo-add、bsdtar、flock (Archlinux自带;Debian上需要安装pacman-package-manager、libarchive-tools)
|
||||||
|
# 环境变量:
|
||||||
|
# GXDE_ARCH_REPO_ROOT 源根目录,对外地址为 https://repo1.gxde.top/gxde-arch/$arch
|
||||||
|
# GXDE_ARCH_GPG_KEY 可选,设置后对包和数据库进行签名
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# This script updates the artifacts in GXDE pacman source and is invoked by
|
||||||
|
# building-pkg.yml automatically.
|
||||||
|
# Usage:
|
||||||
|
# arch-repo-update.sh <x86_64|aarch64> <arch-xxx.tar>
|
||||||
|
# Dependencies:
|
||||||
|
# repo-add, bsdtar, flock (Archlinux built-in; on Debian, install pacman-package-manager
|
||||||
|
# and libarchive-tools)
|
||||||
|
# Environment variables:
|
||||||
|
# GXDE_ARCH_REPO_ROOT The root directory of the source, externally accessible at
|
||||||
|
# https://repo1.gxde.top/gxde-arch/$arch
|
||||||
|
# GXDE_ARCH_GPG_KEY Optional, if set, will sign the packages and database.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
arch=$1
|
||||||
|
tar_path=$2
|
||||||
|
repo_root=${GXDE_ARCH_REPO_ROOT:-/var/www/repo/gxde-arch}
|
||||||
|
repo_name=gxde
|
||||||
|
|
||||||
|
# 引用/Works Cited: https://patorjk.com/software/taag/#p=display&f=Linguaholic+Shadow+3D
|
||||||
|
echo ' ██████╗██╗ ██╗██████╗ ████████╗ ████╗ ' &&
|
||||||
|
echo '██╔═════╝╚═██╗ ██╔═╝██╔═══██╗██╔═════╝ ██╔═══╝ ████╗ ██╗ ████╗ ' &&
|
||||||
|
echo '██║ ████╗ ╚═██╔═╝ ██║ ██║██████╗ ██████╗ ██╔═══██╗████╔═══╝ ' &&
|
||||||
|
echo '██║ ╚═██║ ██╔═██╗ ██║ ██║██╔═══╝ ╚═██╔═╝ ██║ ██║██╔═╝ ' &&
|
||||||
|
echo '╚═██████║██╔═╝ ╚═██╗██████╔═╝████████╗ ██║ ╚═████╔═╝██║ ' &&
|
||||||
|
echo ' ╚═════╝╚═╝ ╚═╝╚═════╝ ╚═══════╝ ╚═╝ ╚═══╝ ╚═╝ ' &&
|
||||||
|
echo ' ' &&
|
||||||
|
echo ' ' &&
|
||||||
|
echo ' ████╗ ██╗ ██╗ ██╗ ' &&
|
||||||
|
echo '██╔═══██╗██╗ ████╗ ██████╗██████╗ ██║ ╚═╝██████╗ ██╗ ██╗██╗ ██╗' &&
|
||||||
|
echo '████████║████╔═══╝██╔═════╝██╔═══██╗██║ ██╗██╔═══██╗██║ ██║╚═████╔═╝' &&
|
||||||
|
echo '██╔═══██║██╔═╝ ██║ ██║ ██║██║ ██║██║ ██║██║ ██║ ████║ ' &&
|
||||||
|
echo '██║ ██║██║ ╚═██████╗██║ ██║████████╗██║██║ ██║╚═██████║██╔═══██╗' &&
|
||||||
|
echo '╚═╝ ╚═╝╚═╝ ╚═════╝╚═╝ ╚═╝╚═══════╝╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝'
|
||||||
|
|
||||||
|
# repo-add依赖bsdtar读取包,缺失时只会报"is not a package file"
|
||||||
|
# repo-add needs bsdtar to read packages, without it it only says "is not a package file".
|
||||||
|
for cmd in repo-add bsdtar flock; do
|
||||||
|
if ! command -v $cmd > /dev/null; then
|
||||||
|
echo "$cmd not found, install pacman-package-manager and libarchive-tools" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
case $arch in
|
||||||
|
x86_64|aarch64) ;;
|
||||||
|
*) echo "Unsupported arch: $arch" >&2; exit 1 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ ! -f $tar_path ]]; then
|
||||||
|
echo "$tar_path not found" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
repoDir=$repo_root/$arch
|
||||||
|
mkdir -p $repoDir
|
||||||
|
exec 9> $repoDir/.lock
|
||||||
|
flock 9
|
||||||
|
|
||||||
|
tmpDir=$(mktemp -d)
|
||||||
|
trap "rm -rf $tmpDir" EXIT
|
||||||
|
tar -xf $tar_path -C $tmpDir
|
||||||
|
|
||||||
|
newPackages=()
|
||||||
|
for pkg in $tmpDir/*.pkg.tar.*; do
|
||||||
|
[[ $pkg == *.sig ]] && continue
|
||||||
|
name=$(basename $pkg)
|
||||||
|
mv -f $pkg $repoDir/$name
|
||||||
|
if [[ -n $GXDE_ARCH_GPG_KEY ]]; then
|
||||||
|
rm -f $repoDir/$name.sig
|
||||||
|
gpg --batch --yes -u $GXDE_ARCH_GPG_KEY --detach-sign --no-armor $repoDir/$name
|
||||||
|
fi
|
||||||
|
newPackages+=($repoDir/$name)
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ ${#newPackages[@]} == 0 ]]; then
|
||||||
|
echo "No package in $tar_path" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
signArgs=()
|
||||||
|
if [[ -n $GXDE_ARCH_GPG_KEY ]]; then
|
||||||
|
signArgs=(--sign --key $GXDE_ARCH_GPG_KEY)
|
||||||
|
fi
|
||||||
|
|
||||||
|
repo-add -R "${signArgs[@]}" $repoDir/$repo_name.db.tar.gz "${newPackages[@]}"
|
||||||
|
rm -f $tar_path
|
||||||
Reference in New Issue
Block a user