@@ -28,6 +28,20 @@ echo "Repository structure created successfully"
2828echo " Repository structure:"
2929find " $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
3246if [ -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"
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