Files
lsky-pro-docker/tools/diff-vs-upstream.sh
T
mole404 7c3188e25a refactor(源码): 应用源码 vendored 进 src/ + 上游 pin 升级到 38d52c46(2025-11-24)
上一版是「钉死上游 commit、构建时拉 archive、再用 overlay/ 叠加补丁」。但上游已明示停止维护
(README 里 2024-12-28 起挂着警告:「开源版本已停止维护,不再进行新特性更新和 bug 修复」),
所以把源码放进本仓库:构建不再依赖 github.com/lsky-org 长期可用,之后要改 PHP 代码直接改
src/ 提交即可,不必再维护叠加机制。

1) 上游 pin:911275c(2023-05-16)→ 38d52c4609eb85236b45ac75acac2ced55174953(2025-11-24)。
   中间 32 个提交只动了 9 个文件,**数据库迁移 0 处**,所以升级不碰站点数据(SQLite 结构不变)。
   吃进三个真实修复:图片格式转换时不同图片共用同一个临时文件(并发上传会变成同一张图,
   默认配置即触发)、加水印后丢质量参数、SVG 支持;另有 laravel 9.52.4→9.52.17、
   phpseclib 3.0.19→3.0.43、commonmark 2.3.9→2.6.0、aws-sdk-php 等一串依赖安全升级。

2) vendored 源码:src/ = 上游 38d52c46 的完整树(304 个文件、8.1MB,按 commit 精确复制,
   文件数与上游 git 树一致)。我们的三个补丁文件就地打上补丁,取消 overlay/。

3) Dockerfile:去掉 curl 下载 archive 那一层,改成 COPY src/;自证拆成两组 ——
   「自证 1 上游纯净性」ImageService.php / convention.php / public/index.php / routes/web.php /
   composer.lock 必须等于上游 md5;「自证 2 补丁产物」三个补丁文件 md5 + 关键标记 grep。
   快照被误改、补丁丢了,构建期就拦下。

4) 新增维护脚本:tools/diff-vs-upstream.sh(拉上游快照做全树对比 + 白名单校验:除三个补丁文件
   外不许有别的改动,同时可重生成 patches/ios-longpress.patch)、tools/vendor-upstream.sh
   (换 pin 时重新 vendor,自动保留补丁文件并打印上游侧差异)。

5) 测试与文档:jsdom 测试默认路径改指 src/public/js/context-js/context-js.js,新增两条结构自检
   (两份 context-js.js 必须一致、blade 必须带 ?v= 版本串)→ 70/70 通过;README 重写
   「代码在仓库哪里、怎么改、怎么升 pin」,并修正许可证说明(应用 GPL-3.0 / 打包 AGPL-3.0)。

数据安全逻辑一字未动:entrypoint.sh 仍是「版本标记不一致才同步」,排除
.env / storage / database / bootstrap/cache / public/i。换镜像后容器自动把新代码同步进卷。
2026-09-28 22:36:48 +08:00

70 lines
3.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# ---------------------------------------------------------------------------
# 用途:把本仓库 src/ 与上游官方快照做**全树对比**,回答两个问题:
# 1) 我们相对上游到底改了哪几个文件、改了什么(默认就打印这个)
# 2) src/ 里有没有"手滑改动" —— 除了白名单里那三个补丁文件之外还动了别处就报警
#
# 依赖:git(需要能访问 github.com;上游已停更,平时不需要跑这个脚本)
# 用法:bash tools/diff-vs-upstream.sh [commit] # 默认用 Dockerfile 里的 LSKY_COMMIT
# ---------------------------------------------------------------------------
set -euo pipefail
cd "$(dirname "$0")/.."
COMMIT="${1:-$(grep -oE '^ARG LSKY_COMMIT=[0-9a-f]+' Dockerfile | cut -d= -f2)}"
if [ -z "$COMMIT" ]; then
echo "用法:bash tools/diff-vs-upstream.sh <上游 commit>" >&2
exit 2
fi
# 白名单:这三个文件是我们有意修改的补丁产物(见 README / patches/ios-longpress.patch)
PATCHED="resources/js/context-js.js
public/js/context-js/context-js.js
resources/views/user/images.blade.php"
TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT
echo "[1/3] 拉取上游快照 ${COMMIT:0:9} …"
git init -q "$TMP/up"
git -C "$TMP/up" remote add origin https://github.com/lsky-org/lsky-pro.git
git -C "$TMP/up" fetch -q --depth 1 origin "$COMMIT"
git -C "$TMP/up" checkout -q FETCH_HEAD
echo "[2/3] 全树对比(只列有差异的文件)…"
diff -rq --exclude=.git "$TMP/up" src > "$TMP/raw.txt" 2>&1 || true
# 分类:内容不同 / 只在 src(我们新增)/ 只在上游(我们删了)
DIFFERS=$(grep -oE '^Files .* and src/.* differ$' "$TMP/raw.txt" | sed -E 's#^Files .* and (src/.*) differ$#\1#' | sort || true)
ONLY_SRC=$(grep -oE "^Only in src.*: .*$" "$TMP/raw.txt" | sed -E 's#^Only in (src[^:]*): (.*)$#\1/\2#' | sed 's#^\./##' | sort || true)
ONLY_UP=$(grep -oE "^Only in .*lsky-pro.*: .*$" "$TMP/raw.txt" | grep -v 'Only in src' | sed -E 's#^Only in [^:]*: (.*)$#\1#' | sort || true)
echo
echo "=== 内容不同的文件(预期只有白名单那三项)==="
if [ -n "$DIFFERS" ]; then echo "$DIFFERS"; else echo "(无)"; fi
if [ -n "$ONLY_SRC" ] || [ -n "$ONLY_UP" ]; then
echo
echo "=== 只在一边存在的文件 ==="
[ -n "$ONLY_SRC" ] && echo "$ONLY_SRC" | sed 's/^/ 只在 src\/:/'
[ -n "$ONLY_UP" ] && echo "$ONLY_UP" | sed 's/^/ 只在上游:/'
fi
echo
echo "=== 每个文件的详细 diff ==="
for f in $DIFFERS; do
echo "---- $f"
diff -u "$TMP/up/${f#src/}" "$f" || true
done
echo
echo "[3/3] 白名单校验:"
UNEXPECTED="$(comm -23 <(printf '%s\n' "$DIFFERS") <(printf '%s\n' "$PATCHED" | sed 's#^#src/#' | sort) || true)"
if [ -n "$UNEXPECTED" ]; then
echo " ❌ 除了预期补丁,还动了别的文件(要么是有意的、请更新白名单,要么是手滑):"
printf '%s\n' "$UNEXPECTED" | sed 's/^/ /'
exit 1
fi
echo " ✅ src/ 相对上游的改动 = 预期补丁三项,没有额外改动"
echo
echo "提示:把上面的 diff 存进 patches/ios-longpress.patch 即可(patch 文件只是「给人看」的存档,不参与构建)。"