Skip to content

Commit c794261

Browse files
committed
fix(release): align compare with publish
1 parent 94e6990 commit c794261

2 files changed

Lines changed: 289 additions & 10 deletions

File tree

action.yml

Lines changed: 67 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -130,19 +130,65 @@ runs:
130130
fi
131131
132132
TMP_DIR="$(mktemp -d)"
133-
trap 'rm -rf "$TMP_DIR"' EXIT
134133
LOCAL_PACK_DIR="${TMP_DIR}/local-pack"
135134
REMOTE_PACK_DIR="${TMP_DIR}/remote-pack"
135+
BACKUP_PKG=""
136+
README_SOURCE=""
137+
README_DEST=""
138+
README_BACKUP=""
139+
README_CREATED="false"
140+
cleanup_compare() {
141+
if [ -f "$BACKUP_PKG" ]; then
142+
cp "$BACKUP_PKG" "$PKG_PATH" || true
143+
rm -f "$BACKUP_PKG" || true
144+
fi
145+
if [ -n "$README_DEST" ]; then
146+
if [ -n "$README_BACKUP" ] && [ -f "$README_BACKUP" ]; then
147+
cp "$README_BACKUP" "$README_DEST" || true
148+
rm -f "$README_BACKUP" || true
149+
elif [ "$README_CREATED" = "true" ] && [ -f "$README_DEST" ]; then
150+
rm -f "$README_DEST" || true
151+
fi
152+
fi
153+
rm -rf "$TMP_DIR"
154+
}
155+
trap cleanup_compare EXIT
136156
mkdir -p "$LOCAL_PACK_DIR" "$REMOTE_PACK_DIR"
137157
138-
if ! REMOTE_TARBALL="$(npm pack "${PKG_NAME}@${LATEST_VERSION}" --silent --pack-destination "$REMOTE_PACK_DIR" 2>/dev/null | tail -n 1)"; then
158+
REMOTE_TARBALL="$(npm pack "${PKG_NAME}@${LATEST_VERSION}" --silent --pack-destination "$REMOTE_PACK_DIR" 2>/dev/null | tail -n 1)"
159+
REMOTE_TAR_PATH="$REMOTE_PACK_DIR/$REMOTE_TARBALL"
160+
if [ ! -f "$REMOTE_TAR_PATH" ]; then
139161
echo "Unable to download ${PKG_NAME}@${LATEST_VERSION}; proceeding with release."
140162
echo "should_release=true" >> "$GITHUB_OUTPUT"
141163
exit 0
142164
fi
143165
144166
DIST_DIR="${PKG_DIR}/dist"
145167
BACKUP_PKG="${PKG_DIR}/.package.json.release.bak"
168+
README_SOURCE=""
169+
README_DEST=""
170+
171+
if [ "${{ inputs.copy_readme }}" = "true" ]; then
172+
README_SOURCE="${{ inputs.readme_source }}"
173+
README_DEST="${{ inputs.readme_dest }}"
174+
if [ -z "$README_SOURCE" ] || [ -z "$README_DEST" ]; then
175+
echo "readme_source/readme_dest are required when copy_readme is true"
176+
exit 1
177+
fi
178+
if [ ! -f "$README_SOURCE" ]; then
179+
echo "README source not found: $README_SOURCE"
180+
exit 1
181+
fi
182+
if [ -f "$README_DEST" ]; then
183+
README_BACKUP="${TMP_DIR}/README.backup"
184+
cp "$README_DEST" "$README_BACKUP"
185+
else
186+
README_CREATED="true"
187+
fi
188+
mkdir -p "$(dirname "$README_DEST")"
189+
cp "$README_SOURCE" "$README_DEST"
190+
fi
191+
146192
cp "$PKG_PATH" "$BACKUP_PKG"
147193
148194
pnpm dlx @prover-coder-ai/dist-deps-prune apply \
@@ -152,7 +198,13 @@ runs:
152198
--write \
153199
--silent
154200
155-
if ! LOCAL_TARBALL="$(cd "$PKG_DIR" && npm pack --silent --pack-destination "$LOCAL_PACK_DIR" | tail -n 1)"; then
201+
LOCAL_PACK_OUT="$(cd "$PKG_DIR" && pnpm pack --pack-destination "$LOCAL_PACK_DIR" 2>/dev/null || true)"
202+
LOCAL_TARBALL="$(printf '%s' "$LOCAL_PACK_OUT" | tail -n 1)"
203+
LOCAL_TAR_PATH="$LOCAL_TARBALL"
204+
if [ ! -f "$LOCAL_TAR_PATH" ]; then
205+
LOCAL_TAR_PATH="$LOCAL_PACK_DIR/$LOCAL_TARBALL"
206+
fi
207+
if [ ! -f "$LOCAL_TAR_PATH" ]; then
156208
cp "$BACKUP_PKG" "$PKG_PATH"
157209
rm -f "$BACKUP_PKG"
158210
echo "Unable to pack local ${PKG_NAME}; proceeding with release."
@@ -162,16 +214,21 @@ runs:
162214
163215
cp "$BACKUP_PKG" "$PKG_PATH"
164216
rm -f "$BACKUP_PKG"
217+
if [ -n "$README_DEST" ]; then
218+
if [ -n "$README_BACKUP" ] && [ -f "$README_BACKUP" ]; then
219+
cp "$README_BACKUP" "$README_DEST"
220+
rm -f "$README_BACKUP"
221+
elif [ "$README_CREATED" = "true" ] && [ -f "$README_DEST" ]; then
222+
rm -f "$README_DEST"
223+
fi
224+
fi
165225
166226
LOCAL_DIR="${TMP_DIR}/local"
167227
REMOTE_DIR="${TMP_DIR}/remote"
168228
mkdir -p "$LOCAL_DIR" "$REMOTE_DIR"
169229
170-
LOCAL_TARBALL="$(basename "$LOCAL_TARBALL")"
171-
REMOTE_TARBALL="$(basename "$REMOTE_TARBALL")"
172-
173-
tar -xzf "${LOCAL_PACK_DIR}/${LOCAL_TARBALL}" -C "$LOCAL_DIR"
174-
tar -xzf "${REMOTE_PACK_DIR}/${REMOTE_TARBALL}" -C "$REMOTE_DIR"
230+
tar -xzf "$LOCAL_TAR_PATH" -C "$LOCAL_DIR"
231+
tar -xzf "$REMOTE_TAR_PATH" -C "$REMOTE_DIR"
175232
176233
LOCAL_PKG="${LOCAL_DIR}/package/package.json"
177234
REMOTE_PKG="${REMOTE_DIR}/package/package.json"
@@ -182,8 +239,8 @@ runs:
182239
exit 0
183240
fi
184241
185-
node -e "const fs=require('fs');const p=process.argv[1];const pkg=JSON.parse(fs.readFileSync(p,'utf8'));delete pkg.gitHead;pkg.version='0.0.0';fs.writeFileSync(p, JSON.stringify(pkg, null, 2)+'\n');" "$LOCAL_PKG"
186-
node -e "const fs=require('fs');const p=process.argv[1];const pkg=JSON.parse(fs.readFileSync(p,'utf8'));delete pkg.gitHead;pkg.version='0.0.0';fs.writeFileSync(p, JSON.stringify(pkg, null, 2)+'\n');" "$REMOTE_PKG"
242+
node -e "const fs=require('fs');const p=process.argv[1];const sort=(v)=>Array.isArray(v)?v.map(sort):v&&typeof v==='object'?Object.keys(v).sort().reduce((acc,k)=>{acc[k]=sort(v[k]);return acc;},{}):v;const pkg=JSON.parse(fs.readFileSync(p,'utf8'));delete pkg.gitHead;pkg.version='0.0.0';const norm=sort(pkg);fs.writeFileSync(p, JSON.stringify(norm, null, 2)+'\n');" "$LOCAL_PKG"
243+
node -e "const fs=require('fs');const p=process.argv[1];const sort=(v)=>Array.isArray(v)?v.map(sort):v&&typeof v==='object'?Object.keys(v).sort().reduce((acc,k)=>{acc[k]=sort(v[k]);return acc;},{}):v;const pkg=JSON.parse(fs.readFileSync(p,'utf8'));delete pkg.gitHead;pkg.version='0.0.0';const norm=sort(pkg);fs.writeFileSync(p, JSON.stringify(norm, null, 2)+'\n');" "$REMOTE_PKG"
187244
188245
if diff -qr "$LOCAL_DIR/package" "$REMOTE_DIR/package" >/dev/null 2>&1; then
189246
echo "::notice::No changes compared to ${PKG_NAME}@${LATEST_VERSION}. Skipping release."

scripts/compare-npm-tarballs.sh

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
usage() {
5+
cat <<'USAGE'
6+
Usage: compare-npm-tarballs.sh [options]
7+
8+
Compares the local npm tarball (after optional dist-deps-prune) with the latest
9+
published tarball for the package.
10+
11+
Options:
12+
--package <path> Path to package.json (default: packages/app/package.json)
13+
--dist <path> Path to dist directory (default: <package-dir>/dist)
14+
--build <cmd> Build command to run before compare (optional)
15+
--readme-source <p> Source README to copy before compare (optional)
16+
--readme-dest <p> Destination README path to copy to (optional)
17+
--prune-dev <bool> Whether to prune devDependencies (default: true)
18+
--npm-token <tok> npm token for private packages (optional)
19+
--show-diff Show unified diff for differing files
20+
-h, --help Show this help
21+
USAGE
22+
}
23+
24+
PKG_PATH="packages/app/package.json"
25+
DIST_PATH=""
26+
BUILD_CMD=""
27+
README_SOURCE=""
28+
README_DEST=""
29+
PRUNE_DEV="true"
30+
NPM_TOKEN=""
31+
SHOW_DIFF="false"
32+
33+
while [ $# -gt 0 ]; do
34+
case "$1" in
35+
--package)
36+
PKG_PATH="$2"
37+
shift 2
38+
;;
39+
--dist)
40+
DIST_PATH="$2"
41+
shift 2
42+
;;
43+
--build)
44+
BUILD_CMD="$2"
45+
shift 2
46+
;;
47+
--readme-source)
48+
README_SOURCE="$2"
49+
shift 2
50+
;;
51+
--readme-dest)
52+
README_DEST="$2"
53+
shift 2
54+
;;
55+
--prune-dev)
56+
PRUNE_DEV="$2"
57+
shift 2
58+
;;
59+
--npm-token)
60+
NPM_TOKEN="$2"
61+
shift 2
62+
;;
63+
--show-diff)
64+
SHOW_DIFF="true"
65+
shift
66+
;;
67+
-h|--help)
68+
usage
69+
exit 0
70+
;;
71+
*)
72+
echo "Unknown аргумент: $1" >&2
73+
usage >&2
74+
exit 1
75+
;;
76+
esac
77+
done
78+
79+
for bin in node npm pnpm; do
80+
if ! command -v "$bin" >/dev/null 2>&1; then
81+
echo "Required command not found: $bin" >&2
82+
exit 1
83+
fi
84+
done
85+
86+
if [ ! -f "$PKG_PATH" ]; then
87+
echo "package.json not found: $PKG_PATH" >&2
88+
exit 1
89+
fi
90+
91+
PKG_DIR="$(dirname "$PKG_PATH")"
92+
if [ -z "$DIST_PATH" ]; then
93+
DIST_PATH="${PKG_DIR}/dist"
94+
fi
95+
96+
if [ -n "$BUILD_CMD" ]; then
97+
echo "> Running build: $BUILD_CMD"
98+
bash -lc "$BUILD_CMD"
99+
fi
100+
101+
if [ ! -d "$DIST_PATH" ]; then
102+
echo "dist directory not found: $DIST_PATH" >&2
103+
exit 1
104+
fi
105+
106+
PKG_NAME="$(node -p "require('./${PKG_PATH}').name")"
107+
108+
if [ -n "$NPM_TOKEN" ]; then
109+
printf '%s\n' "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > "$HOME/.npmrc"
110+
fi
111+
112+
LATEST_VERSION="$(npm view "${PKG_NAME}" version 2>/dev/null || true)"
113+
if [ -z "$LATEST_VERSION" ]; then
114+
echo "Unable to resolve latest version for ${PKG_NAME}" >&2
115+
exit 1
116+
fi
117+
118+
echo "> Package: ${PKG_NAME}@${LATEST_VERSION}"
119+
120+
TMP_DIR="$(mktemp -d)"
121+
LOCAL_PACK_DIR="${TMP_DIR}/local-pack"
122+
REMOTE_PACK_DIR="${TMP_DIR}/remote-pack"
123+
LOCAL_DIR="${TMP_DIR}/local"
124+
REMOTE_DIR="${TMP_DIR}/remote"
125+
BACKUP_PKG="${PKG_DIR}/.package.json.release.bak"
126+
README_BACKUP=""
127+
README_CREATED="false"
128+
129+
cleanup() {
130+
if [ -f "$BACKUP_PKG" ]; then
131+
cp "$BACKUP_PKG" "$PKG_PATH" || true
132+
rm -f "$BACKUP_PKG" || true
133+
fi
134+
if [ -n "$README_DEST" ]; then
135+
if [ -n "$README_BACKUP" ] && [ -f "$README_BACKUP" ]; then
136+
cp "$README_BACKUP" "$README_DEST" || true
137+
rm -f "$README_BACKUP" || true
138+
elif [ "$README_CREATED" = "true" ] && [ -f "$README_DEST" ]; then
139+
rm -f "$README_DEST" || true
140+
fi
141+
fi
142+
rm -rf "$TMP_DIR"
143+
}
144+
trap cleanup EXIT
145+
146+
mkdir -p "$LOCAL_PACK_DIR" "$REMOTE_PACK_DIR" "$LOCAL_DIR" "$REMOTE_DIR"
147+
148+
REMOTE_TARBALL="$(npm pack "${PKG_NAME}@${LATEST_VERSION}" --silent --pack-destination "$REMOTE_PACK_DIR" 2>/dev/null | tail -n 1)"
149+
REMOTE_TAR_PATH="$REMOTE_PACK_DIR/$REMOTE_TARBALL"
150+
if [ ! -f "$REMOTE_TAR_PATH" ]; then
151+
echo "Unable to download ${PKG_NAME}@${LATEST_VERSION}" >&2
152+
exit 1
153+
fi
154+
155+
if [ -n "$README_SOURCE" ] || [ -n "$README_DEST" ]; then
156+
if [ -z "$README_SOURCE" ] || [ -z "$README_DEST" ]; then
157+
echo "Both --readme-source and --readme-dest are required together" >&2
158+
exit 1
159+
fi
160+
if [ ! -f "$README_SOURCE" ]; then
161+
echo "README source not found: $README_SOURCE" >&2
162+
exit 1
163+
fi
164+
if [ -f "$README_DEST" ]; then
165+
README_BACKUP="${TMP_DIR}/README.backup"
166+
cp "$README_DEST" "$README_BACKUP"
167+
else
168+
README_CREATED="true"
169+
fi
170+
mkdir -p "$(dirname "$README_DEST")"
171+
cp "$README_SOURCE" "$README_DEST"
172+
fi
173+
174+
cp "$PKG_PATH" "$BACKUP_PKG"
175+
176+
pnpm dlx @prover-coder-ai/dist-deps-prune apply \
177+
--dist "$DIST_PATH" \
178+
--package "$PKG_PATH" \
179+
--prune-dev "$PRUNE_DEV" \
180+
--write \
181+
--silent
182+
183+
LOCAL_PACK_OUT="$(cd "$PKG_DIR" && pnpm pack --pack-destination "$LOCAL_PACK_DIR" 2>/dev/null || true)"
184+
LOCAL_TARBALL="$(printf '%s' "$LOCAL_PACK_OUT" | tail -n 1)"
185+
LOCAL_TAR_PATH="$LOCAL_TARBALL"
186+
if [ ! -f "$LOCAL_TAR_PATH" ]; then
187+
LOCAL_TAR_PATH="$LOCAL_PACK_DIR/$LOCAL_TARBALL"
188+
fi
189+
if [ ! -f "$LOCAL_TAR_PATH" ]; then
190+
echo "Unable to pack local ${PKG_NAME}" >&2
191+
exit 1
192+
fi
193+
194+
cp "$BACKUP_PKG" "$PKG_PATH"
195+
rm -f "$BACKUP_PKG"
196+
197+
tar -xzf "$LOCAL_TAR_PATH" -C "$LOCAL_DIR"
198+
tar -xzf "$REMOTE_TAR_PATH" -C "$REMOTE_DIR"
199+
200+
LOCAL_PKG="${LOCAL_DIR}/package/package.json"
201+
REMOTE_PKG="${REMOTE_DIR}/package/package.json"
202+
203+
if [ ! -f "$LOCAL_PKG" ] || [ ! -f "$REMOTE_PKG" ]; then
204+
echo "package.json missing in tarball" >&2
205+
exit 1
206+
fi
207+
208+
node -e "const fs=require('fs');const p=process.argv[1];const sort=(v)=>Array.isArray(v)?v.map(sort):v&&typeof v==='object'?Object.keys(v).sort().reduce((acc,k)=>{acc[k]=sort(v[k]);return acc;},{}):v;const pkg=JSON.parse(fs.readFileSync(p,'utf8'));delete pkg.gitHead;pkg.version='0.0.0';const norm=sort(pkg);fs.writeFileSync(p, JSON.stringify(norm, null, 2)+'\\n');" "$LOCAL_PKG"
209+
node -e "const fs=require('fs');const p=process.argv[1];const sort=(v)=>Array.isArray(v)?v.map(sort):v&&typeof v==='object'?Object.keys(v).sort().reduce((acc,k)=>{acc[k]=sort(v[k]);return acc;},{}):v;const pkg=JSON.parse(fs.readFileSync(p,'utf8'));delete pkg.gitHead;pkg.version='0.0.0';const norm=sort(pkg);fs.writeFileSync(p, JSON.stringify(norm, null, 2)+'\\n');" "$REMOTE_PKG"
210+
211+
if diff -qr "$LOCAL_DIR/package" "$REMOTE_DIR/package" >/dev/null 2>&1; then
212+
echo "RESULT: identical"
213+
exit 0
214+
fi
215+
216+
echo "RESULT: different"
217+
if [ "$SHOW_DIFF" = "true" ]; then
218+
diff -ru "$LOCAL_DIR/package" "$REMOTE_DIR/package" || true
219+
else
220+
diff -qr "$LOCAL_DIR/package" "$REMOTE_DIR/package" || true
221+
fi
222+
exit 1

0 commit comments

Comments
 (0)