Compare commits

...
22 Commits
Author SHA1 Message Date
CharOfString 251559cabd bump: 2026.11.11
Signed-off-by: CharOfString <root@charofstring.cc>
2026-11-11 19:56:58 -06:00
CharOfString 3d860518b3 add: GXDE Lock
Signed-off-by: CharOfString <root@charofstring.cc>
2026-11-11 19:55:55 -06:00
gfdgd-xi 8312e04ea3 Revert "添加同步脚本超时时间以避免卡死"
This reverts commit 7262370817.

Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-11-09 22:53:02 +08:00
gfdgd-xi 2fe440700e 新增Github follow信息
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-11-09 22:36:33 +08:00
gfdgd-xi 185393978c 添加Sourceforge下载量
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-11-09 22:28:43 +08:00
gfdgd-xi 7262370817 添加同步脚本超时时间以避免卡死
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-11-09 17:39:24 +08:00
gfdgd-xi 8feea0d874 将脚本从Gitee同步至Github改为Github同步至Gitee
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-11-09 17:18:27 +08:00
gfdgd-xi a86f7295f5 更新README QQ群列表
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-11-09 16:42:15 +08:00
gfdgd-xi 956d02d42d 更新公告
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-11-09 12:51:05 +08:00
gfdgd-xi cb28036eec 移除依赖星火动态壁纸
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-10-26 21:58:50 +08:00
gfdgd-xi e05436265a debian rootfs环境内置包qt6-base-dev,qt6-base-private-dev
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-10-26 19:45:18 +08:00
gfdgd-xi 4d67c0c2f0 Revert "使用解压rootfs替代debootstrap,提升速度"
This reverts commit cec74ff92c.

Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-10-26 19:41:50 +08:00
gfdgd-xi cec74ff92c 使用解压rootfs替代debootstrap,提升速度
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-10-26 19:25:28 +08:00
gfdgd-xi e094939b96 移除交叉编译hetao构建
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-10-16 22:12:09 +08:00
gfdgd-xi 3ae20c5867 移除核桃构建
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-10-15 13:55:16 +08:00
CharOfString ff4666cd2c fix: ACSII art display issue 2026-10-11 22:03:33 -05:00
CharOfStringandClaude Opus 5.5 2fe5b8b9d1 chore: Hide Arch repo update output
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:22:49 -05:00
CharOfString a23074725a exp: Fix arch pkg upload 2026-10-10 21:12:24 -05:00
CharOfStringandClaude Opus 5.5 7e1d43b057 fix: Show Arch repo update output
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:06:11 -05:00
CharOfString bf87ba2f2b fix: AARCH64 Archlinux build 2026-10-10 19:45:04 -05:00
CharOfString c215251f38 fix: Arch building 2026-10-10 19:34:28 -05:00
CharOfString d8c5ea88e0 add: Build Archlinux 2026-10-10 18:40:39 -05:00
15 changed files with 512 additions and 50 deletions
@@ -25,7 +25,3 @@ jobs:
call-zhuangzhuang:
uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang-cross-host.yml@master
secrets: inherit
call-hetao:
uses: GXDE-OS/GXDE/.github/workflows/building-deb-hetao-cross-host.yml@master
secrets: inherit
-4
View File
@@ -25,7 +25,3 @@ jobs:
call-zhuangzhuang:
uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang-cross.yml@master
secrets: inherit
call-hetao:
uses: GXDE-OS/GXDE/.github/workflows/building-deb-hetao-cross.yml@master
secrets: inherit
+2 -2
View File
@@ -26,7 +26,7 @@ jobs:
uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang.yml@master
secrets: inherit
call-hetao:
uses: GXDE-OS/GXDE/.github/workflows/building-deb-hetao.yml@master
call-arch:
uses: GXDE-OS/GXDE/.github/workflows/building-pkg.yml@master
secrets: inherit
+138
View File
@@ -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
sudo debootstrap --no-check-gpg --include=git,deepin-keyring,gcc,make,g++,dpkg-dev,qtbase5-dev,ca-certificates --arch=$1 $2 $bottlePath $5
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
if [[ $2 == "crimson" ]]; then
+3 -4
View File
@@ -1,4 +1,4 @@
name: Synch Gitee To Github
name: Synch Github To Gitee
on:
workflow_call:
workflow_dispatch:
@@ -25,6 +25,5 @@ jobs:
GITEEUSER: ${{ secrets.GITEEUSER }}
GITEETOCKEN: ${{ secrets.GITEETOCKEN }}
run: |
cd sync-gitee-to-github
python3 sync.py $GITEEUSER $GITEETOCKEN $GITHUBUSER $GITHUBTOKEN
cd sync-github-to-gitee
python3 sync.py "$GITHUBUSER" "$GITHUBTOKEN" "$GITEEUSER" "$GITEETOCKEN"
+10 -1
View File
@@ -2,14 +2,20 @@
<div>
<div style="float: left; display: flex; align-items: center" >
<a href='https://github.com/GXDE-OS'><img alt="GitHub Org's stars" src="https://img.shields.io/github/stars/GXDE-OS?style=flat&logo=github"></a>
<a href='https://github.com/orgs/GXDE-OS/followers'><img alt="GitHub followers" src="https://img.shields.io/github/followers/GXDE-OS?style=flat&logo=github"></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>
<a href='https://sourceforge.net/projects/gxde-os/'><img src='https://img.shields.io/sourceforge/dw/gxde-os?style=flat&logo=sourceforge' alt='Sourceforge'></img></a>
</div>
<div style="float: right">
<a href="./README.zh.md">中文版</a>
</div>
</div>
**Note: Following internal discussion, it has been decided that from now on GXDE will be primarily hosted on GitHub, with Gitee used only for mirror synchronisation.**
**Please submit Issues and PRs to the relevant GXDE GitHub repositories.**
**GitHub repository: http://github.com/GXDE-OS/GXDE**
## Welcome to GXDE OS Community
@@ -39,7 +45,10 @@ Please Click the Star in the Upper Right Corner, Your Support is Our Greatest Mo
### User Group
<center><img src=new-logo-long.png width=300/></center>
QQ Group: 881201853
QQ Groups:
Group 1: 881201853
Group 2: 712629637
Beta feedback group: 1129752588
Discord: https://discord.gg/t5Uf2xYpvA
Forum: https://bbs.spark-app.store/
+10 -1
View File
@@ -2,14 +2,20 @@
<div>
<div style="float: left; display: flex; align-items: center" >
<a href='https://github.com/GXDE-OS'><img alt="GitHub Org's stars" src="https://img.shields.io/github/stars/GXDE-OS?style=flat&logo=github"></a>
<a href='https://github.com/orgs/GXDE-OS/followers'><img alt="GitHub followers" src="https://img.shields.io/github/followers/GXDE-OS?style=flat&logo=github"></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>
<a href='https://sourceforge.net/projects/gxde-os/'><img src='https://img.shields.io/sourceforge/dw/gxde-os?style=flat&logo=sourceforge' alt='Sourceforge'></img></a>
</div>
<div style="float: right">
<a href="./README.md">English Version</a>
</div>
</div>
**注:经过组织内部沟通决定,从现在开始 GXDE 将主要托管至 Github,Gitee 只做镜像同步。**
**Issues 和 Pr 请提交至 GXDE Github 相关仓库**
**Github 仓库:http://github.com/GXDE-OS/GXDE**
## 简介
@@ -33,7 +39,10 @@ GXDE OS 内置 [星火应用商店](https://gitee.com/spark-store-project/),
### 沟通渠道
QQ 群:881201853
QQ 群:
1 群:881201853
2 群:712629637
内测反馈群:1129752588
Discord:https://discord.gg/t5Uf2xYpvA
论坛:https://bbs.spark-app.store/
+33
View File
@@ -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
}
+9 -2
View File
@@ -1,4 +1,10 @@
gxde (2026.10.04) UNRELEASED; urgency=medium
gxde (2026.11.11) UNRELEASED; urgency=medium
* 新增 gxde-lock 作为新的锁屏模块
-- CharOfString <root@charofstring.cc> Wed, 11 Nov 2026 19:56:05 -0600
gxde (2026.10.26) UNRELEASED; urgency=medium
* 新增 remmina 以解决远程问题
* 改为安装 dde-printer
@@ -29,8 +35,9 @@ gxde (2026.10.04) UNRELEASED; urgency=medium
* 新增推荐依赖 gxde-dlna-caster
* 新增推荐依赖 gxde-filetransfer
* 新增推荐依赖 gxde-wayland-session, gxdm-emergency-mode, gxde-freewb, fcitx5-theme-deepin
* 移除星火动态壁纸依赖
-- gfdgd_xi <3025613752@qq.com> Sun, 04 Oct 2026 20:40:04 +0800
-- gfdgd_xi <3025613752@qq.com> Mon, 26 Oct 2026 21:57:06 +0800
gxde (2024.10.20) UNRELEASED; urgency=medium
+1 -2
View File
@@ -34,7 +34,6 @@ Recommends: ${misc:Depends},
deepin-system-monitor,
gxde-downloader,
gparted,
fantascene-dynamic-wallpaper,
x11vnc,
gxde-dlna-caster,
com.github.minesweep,
@@ -124,6 +123,7 @@ Depends: ${misc:Depends},
gxde-default-settings,
gxde-shell-tools,
gxde-compressor,
gxde-lock,
Recommends:
gxde-desktop-extra | gxde-desktop-android,
gxde-editor,
@@ -173,7 +173,6 @@ Recommends:
plymouth-theme-gxde-logo,
fcitx5,
fcitx5-table,
fantascene-dynamic-wallpaper,
x11vnc,
apt-is-aptss,
Conflicts:
+4
View File
@@ -0,0 +1,4 @@
# GXDE Arch Linux pacman source
[gxde]
SigLevel = Optional TrustAll
Server = https://repo1.gxde.top/gxde-arch/$arch
@@ -1,15 +1,19 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
将 Gitee 上的 GXDE-OS 组织仓库镜像同步到 GitHub(GXDE-OS 组织)。
将 GitHub 上的 GXDE-OS 组织仓库镜像同步到 Gitee(GXDE-OS 组织)。
用法:
python3 sync.py <gitee用户名> <gitee密码或Token> <github用户名> <githubToken>
python3 sync.py <github用户名> <githubToken> <gitee用户名> <gitee密码或Token>
流程:
1. 通过 Gitee API v5 分页获取 GXDE-OS 组织下的全部仓库列表(带 token 失败时回退匿名)
2. 多线程 clone --bare 拉取 Gitee 仓库
3. 逐个 push --mirror 推送到 GitHub,失败自动重试并在结束时汇总报告
1. 通过 GitHub REST API 分页获取 GXDE-OS 组织下的全部仓库列表(带 token 失败时回退匿名)
2. 多线程 clone --bare 拉取 GitHub 仓库
3. 逐个 push --mirror 推送到 Gitee,失败自动重试并在结束时汇总报告
注意:
- Gitee 侧的同名仓库需要预先存在,push --mirror 会覆盖其分支与标签
- GitHub 只接受 Personal Access Token 作为密码(需具备组织仓库的读取权限)
"""
import json
import os
@@ -28,36 +32,42 @@ threadMax = 8
def usage():
print("用法: python3 sync.py <gitee用户名> <gitee密码或Token> <github用户名> <githubToken>")
print("用法: python3 sync.py <github用户名> <githubToken> <gitee用户名> <gitee密码或Token>")
sys.exit(1)
def apiGet(path, params):
"""调用 Gitee API v5 的单个请求"""
def apiGet(path, params, token):
"""调用 GitHub REST API 的单个请求"""
params["per_page"] = str(perPage)
url = "https://gitee.com/api/v5" + path + "?" + urllib.parse.urlencode(params)
req = urllib.request.Request(url, headers={"User-Agent": "GXDE-Sync/1.0"})
url = "https://api.github.com" + path + "?" + urllib.parse.urlencode(params)
headers = {
"User-Agent": "GXDE-Sync/1.0",
"Accept": "application/vnd.github+json",
"X-GitHub-Api-Version": "2022-11-28",
}
if token:
headers["Authorization"] = "Bearer " + token
req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req, timeout=30) as resp:
return json.loads(resp.read().decode("utf-8"))
def getGiteeRepos(token):
"""分页获取 Gitee 组织下全部仓库的 path(URL 安全路径)
def getGithubRepos(token):
"""分页获取 GitHub 组织下全部仓库的 name(即 URL 路径中的仓库名)
Gitee API 返回的 name 是仓库别名(可能含大写、中文或括号,如
"CTranslate2"),不能直接用作 clone URL 的路径组件;path 才是 URL
安全的仓库路径(如 "ctranslate2"),用它拼接 clone/push URL 才合法。
带 token 时 type=all 可包含私有仓库;匿名请求只返回公开仓库。
GitHub 的 name 可直接拼接 clone/push URL,无需像 Gitee 那样取 path 字段。
"""
repoList = []
page = 1
while True:
params = {"page": str(page)}
if token:
params["access_token"] = token
data = apiGet(f"/orgs/{orgName}/repos", params)
params = {"page": str(page), "type": "all"}
data = apiGet(f"/orgs/{orgName}/repos", params, token)
if not isinstance(data, list) or len(data) == 0:
break
repoList.extend([i["path"] for i in data])
repoList.extend([i["name"] for i in data])
if len(data) < perPage:
break
page += 1
return repoList
@@ -70,7 +80,7 @@ def runGit(args, cwd=None):
def syncRepo(name, pullUrl, pushUrl):
repoDir = os.path.join(cloneDir, name + ".git")
try:
# 1. 从 Gitee clone --bare(重试 3 次)
# 1. 从 GitHub clone --bare(重试 3 次)
ok = False
lastOut = ""
for attempt in range(3):
@@ -84,7 +94,7 @@ def syncRepo(name, pullUrl, pushUrl):
print(f"[FAIL] clone 失败: {name}\n{lastOut}")
return False
# 2. push --mirror 到 GitHub(重试 3 次)
# 2. push --mirror 到 Gitee(重试 3 次)
ok = False
lastOut = ""
for attempt in range(3):
@@ -108,19 +118,21 @@ def syncRepo(name, pullUrl, pushUrl):
def main():
if len(sys.argv) < 5:
usage()
giteeUser, giteeToken = sys.argv[1], sys.argv[2]
githubUser, githubToken = sys.argv[3], sys.argv[4]
githubUser, githubToken = sys.argv[1], sys.argv[2]
giteeUser, giteeToken = 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}/"
githubAuth = urllib.parse.quote(githubUser, safe="") + ":" + urllib.parse.quote(githubToken, safe="")
giteeAuth = urllib.parse.quote(giteeUser, safe="") + ":" + urllib.parse.quote(giteeToken, safe="")
pullUrl = f"https://{githubAuth}@github.com/{orgName}/"
pushUrl = f"https://{giteeAuth}@gitee.com/{orgName}/"
os.makedirs(cloneDir, exist_ok=True)
# 获取仓库列表:优先带 token,失败则回退到匿名(仅公开仓库)
# 获取仓库列表:优先带 token(可含私有仓库),失败则回退到匿名(仅公开仓库)
try:
repoList = getGiteeRepos(giteeToken)
repoList = getGithubRepos(githubToken)
except Exception:
repoList = getGiteeRepos("")
repoList = getGithubRepos("")
print(f"共获取到 {len(repoList)} 个仓库")
if not repoList:
print("未能获取仓库列表,退出")
+112
View File
@@ -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