Skip to content

Commit fc20bfb

Browse files
committed
Fix build deb script
1 parent e497246 commit fc20bfb

File tree

1 file changed

+105
-3
lines changed

1 file changed

+105
-3
lines changed

bin/build-deb.sh

Lines changed: 105 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@ echo "Repository structure created successfully"
2828
echo "Repository structure:"
2929
find "$DEB_DIR" -type d | sort
3030

31+
# Check for existing repository to prevent metadata conflicts
32+
if [ -f "$DEB_DIR/dists/stable/main/binary-amd64/Packages" ]; then
33+
echo "Existing repository found, checking for version conflicts..."
34+
EXISTING_VERSION=$(grep "^Version:" "$DEB_DIR/dists/stable/main/binary-amd64/Packages" | head -1 | cut -d' ' -f2-)
35+
if [ -n "$EXISTING_VERSION" ] && [ -n "$RELEASE_TAG" ]; then
36+
# Extract version from release tag (remove 'v' prefix if present)
37+
NEW_VERSION="${RELEASE_TAG#v}-1"
38+
if [ "$EXISTING_VERSION" = "$NEW_VERSION" ]; then
39+
echo "Warning: Version $NEW_VERSION already exists in repository"
40+
echo "This may cause APT upgrade conflicts. Consider incrementing the debian revision."
41+
fi
42+
fi
43+
fi
44+
3145
# Environment variables passed from the Node.js script
3246
if [ -n "$DEB_ASSET_NAME" ] && ([ -n "$DEB_ASSET_URL" ] || [ -n "$DEB_FILE_PATH" ]); then
3347
echo "Found amd64 .deb asset: $DEB_ASSET_NAME"
@@ -65,6 +79,13 @@ if [ -n "$DEB_ASSET_NAME" ] && ([ -n "$DEB_ASSET_URL" ] || [ -n "$DEB_FILE_PATH"
6579
fi
6680
fi
6781

82+
# Clean up old packages with the same version to prevent conflicts
83+
if [ -n "$RELEASE_TAG" ]; then
84+
NEW_VERSION="${RELEASE_TAG#v}-1"
85+
echo "Cleaning up any existing packages with version: $NEW_VERSION"
86+
find "$DEB_DIR/pool/main/e/electerm" -name "*${NEW_VERSION}*.deb" -delete 2>/dev/null || true
87+
fi
88+
6889
# Generate Packages file in the proper location
6990
echo "Generating Packages file..."
7091
PACKAGES_DIR="$DEB_DIR/dists/stable/main/binary-amd64"
@@ -81,10 +102,38 @@ if [ -n "$DEB_ASSET_NAME" ] && ([ -n "$DEB_ASSET_URL" ] || [ -n "$DEB_FILE_PATH"
81102
tmpdir=$(mktemp -d)
82103
dpkg-deb --control "$deb_file" "$tmpdir"
83104

84-
# Read control file and extract needed fields
105+
# Read control file and extract ALL fields to preserve complete metadata
85106
if [ -f "$tmpdir/control" ]; then
86-
# Extract specific fields in the correct order
87-
grep -E "^(Package|Version|Architecture|Maintainer|Description|Depends|Priority|Section):" "$tmpdir/control" >> "$PACKAGES_FILE"
107+
# First, extract fields in the standard order for consistency
108+
for field in Package Version License Vendor Architecture Maintainer Depends Recommends Suggests Conflicts Breaks Replaces Provides Section Priority Homepage; do
109+
grep "^${field}:" "$tmpdir/control" >> "$PACKAGES_FILE" 2>/dev/null || true
110+
done
111+
112+
# Handle Installed-Size field specially - calculate if missing
113+
if grep -q "^Installed-Size:" "$tmpdir/control"; then
114+
grep "^Installed-Size:" "$tmpdir/control" >> "$PACKAGES_FILE"
115+
else
116+
# Calculate installed size from package data if missing
117+
installed_size=$(dpkg-deb --info "$deb_file" | grep "^ size:" | awk '{print int($2/1024)}' 2>/dev/null || echo "unknown")
118+
if [ "$installed_size" != "unknown" ]; then
119+
echo "Installed-Size: $installed_size" >> "$PACKAGES_FILE"
120+
fi
121+
fi
122+
123+
# Then add any remaining fields not already included
124+
grep -v -E "^(Package|Version|License|Vendor|Architecture|Maintainer|Depends|Recommends|Suggests|Conflicts|Breaks|Replaces|Provides|Section|Priority|Homepage|Installed-Size):" "$tmpdir/control" >> "$PACKAGES_FILE" 2>/dev/null || true
125+
126+
# Add consistent build date from release data to ensure metadata consistency
127+
if [ -n "$RELEASE_DATE" ]; then
128+
# Format the release date consistently
129+
BUILD_DATE_FORMATTED=$(date -u -d "$RELEASE_DATE" '+%a, %d %b %Y %H:%M:%S UTC' 2>/dev/null || date -u '+%a, %d %b %Y %H:%M:%S UTC')
130+
echo "Build-Date: $BUILD_DATE_FORMATTED" >> "$PACKAGES_FILE"
131+
echo "Source-Date: $RELEASE_DATE" >> "$PACKAGES_FILE"
132+
133+
# Add build identifier based on release date to ensure uniqueness
134+
BUILD_ID=$(echo "$RELEASE_DATE" | md5sum | cut -c1-8 2>/dev/null || echo "$(date +%s)" | tail -c8)
135+
echo "Build-ID: repo-$BUILD_ID" >> "$PACKAGES_FILE"
136+
fi
88137
fi
89138

90139
# Clean up temp directory
@@ -97,12 +146,59 @@ if [ -n "$DEB_ASSET_NAME" ] && ([ -n "$DEB_ASSET_URL" ] || [ -n "$DEB_FILE_PATH"
97146
echo "SHA1: $(sha1sum "$deb_file" 2>/dev/null | cut -d' ' -f1 || shasum -a 1 "$deb_file" | cut -d' ' -f1)" >> "$PACKAGES_FILE"
98147
echo "SHA256: $(sha256sum "$deb_file" 2>/dev/null | cut -d' ' -f1 || shasum -a 256 "$deb_file" | cut -d' ' -f1)" >> "$PACKAGES_FILE"
99148
echo "" >> "$PACKAGES_FILE"
149+
150+
# Set consistent file timestamps based on release date if available
151+
if [ -n "$RELEASE_DATE" ]; then
152+
# Convert release date to timestamp format for touch command
153+
RELEASE_TIMESTAMP=$(date -d "$RELEASE_DATE" '+%Y%m%d%H%M.%S' 2>/dev/null || echo "")
154+
if [ -n "$RELEASE_TIMESTAMP" ]; then
155+
touch -t "$RELEASE_TIMESTAMP" "$deb_file" 2>/dev/null || true
156+
echo "Set file timestamp to release date: $RELEASE_DATE"
157+
fi
158+
fi
100159
fi
101160
done
102161

162+
# Validate the generated Packages file
163+
echo "Validating Packages file..."
164+
if [ -s "$PACKAGES_FILE" ]; then
165+
PACKAGE_COUNT=$(grep -c "^Package:" "$PACKAGES_FILE" || echo "0")
166+
echo "Generated Packages file contains $PACKAGE_COUNT package(s)"
167+
168+
# Verify required fields are present
169+
if ! grep -q "^Version:" "$PACKAGES_FILE"; then
170+
echo "Error: No Version field found in Packages file"
171+
exit 1
172+
fi
173+
174+
if ! grep -q "^Architecture:" "$PACKAGES_FILE"; then
175+
echo "Error: No Architecture field found in Packages file"
176+
exit 1
177+
fi
178+
179+
echo "Packages file validation successful"
180+
else
181+
echo "Error: Packages file is empty"
182+
exit 1
183+
fi
184+
185+
# Set consistent timestamps on repository files
186+
if [ -n "$RELEASE_DATE" ]; then
187+
RELEASE_TIMESTAMP=$(date -d "$RELEASE_DATE" '+%Y%m%d%H%M.%S' 2>/dev/null || echo "")
188+
if [ -n "$RELEASE_TIMESTAMP" ]; then
189+
touch -t "$RELEASE_TIMESTAMP" "$PACKAGES_FILE" 2>/dev/null || true
190+
echo "Set Packages file timestamp to release date: $RELEASE_DATE"
191+
fi
192+
fi
193+
103194
# Compress Packages file
104195
gzip -k "$PACKAGES_FILE"
105196

197+
# Set timestamp on compressed file too
198+
if [ -n "$RELEASE_DATE" ] && [ -n "$RELEASE_TIMESTAMP" ]; then
199+
touch -t "$RELEASE_TIMESTAMP" "$PACKAGES_FILE.gz" 2>/dev/null || true
200+
fi
201+
106202
# Generate Release file in the proper location
107203
echo "Generating Release file..."
108204
RELEASE_DIR="$DEB_DIR/dists/stable"
@@ -160,6 +256,12 @@ EOF
160256
fi
161257
done
162258

259+
# Set consistent timestamp on Release file
260+
if [ -n "$RELEASE_DATE" ] && [ -n "$RELEASE_TIMESTAMP" ]; then
261+
touch -t "$RELEASE_TIMESTAMP" "$RELEASE_FILE" 2>/dev/null || true
262+
echo "Set Release file timestamp to release date: $RELEASE_DATE"
263+
fi
264+
163265
echo "Repository files generated successfully!"
164266

165267
# Delete the actual .deb file since we use URL rewrite rules in vercel.json

0 commit comments

Comments
 (0)