171171 } ;
172172 }
173173 ) ;
174- previouslyPackagedVersions = [
174+ # All versions that were previously packaged (historical list)
175+ allPreviouslyPackagedVersions = [
176+ "0.4.3"
177+ "0.4.2"
178+ "0.4.1"
179+ "0.3.0"
175180 "0.2.0"
176181 "0.1.19"
177182 "0.1.18"
@@ -191,14 +196,19 @@ let
191196 "0.1.1"
192197 "0.1.0"
193198 ] ;
194- numberOfPreviouslyPackagedVersions = builtins . length previouslyPackagedVersions ;
195199 allVersions = ( builtins . fromJSON ( builtins . readFile ../versions.json ) ) . wrappers ;
196200 supportedVersions = lib . filterAttrs (
197201 _ : value : builtins . elem ( lib . versions . major postgresql . version ) value . postgresql
198202 ) allVersions ;
199203 versions = lib . naturalSort ( lib . attrNames supportedVersions ) ;
200204 latestVersion = lib . last versions ;
201205 numberOfVersions = builtins . length versions ;
206+ # Filter out previously packaged versions that are actually built for this PG version
207+ # This prevents double-counting when a version appears in both lists
208+ previouslyPackagedVersions = builtins . filter (
209+ v : ! ( builtins . elem v versions )
210+ ) allPreviouslyPackagedVersions ;
211+ numberOfPreviouslyPackagedVersions = builtins . length previouslyPackagedVersions ;
202212 packages = builtins . attrValues (
203213 lib . mapAttrs ( name : value : build name value . hash value . rust value . pgrx ) supportedVersions
204214 ) ;
@@ -231,26 +241,40 @@ buildEnv {
231241 }
232242
233243 create_migration_sql_files() {
244+
245+
234246 PREVIOUS_VERSION=""
235247 while IFS= read -r i; do
236248 FILENAME=$(basename "$i")
237- DIRNAME=$(dirname "$i")
238249 VERSION="$(grep -oE '[0-9]+\.[0-9]+\.[0-9]+' <<< $FILENAME)"
239250 if [[ "$PREVIOUS_VERSION" != "" ]]; then
240- echo "Processing $i"
241- MIGRATION_FILENAME="$DIRNAME/'' ${FILENAME/$VERSION/$PREVIOUS_VERSION--$VERSION}"
242- cp "$i" "$MIGRATION_FILENAME"
251+ # Always write to $out/share/postgresql/extension, not $DIRNAME
252+ # because $DIRNAME might be a symlinked read-only path from the Nix store
253+ # We use -L with cp to dereference symlinks (copy the actual file content, not the symlink)
254+ MIGRATION_FILENAME="$out/share/postgresql/extension/'' ${FILENAME/$VERSION/$PREVIOUS_VERSION--$VERSION}"
255+ cp -L "$i" "$MIGRATION_FILENAME"
243256 fi
244257 PREVIOUS_VERSION="$VERSION"
245258 done < <(find $out -name '*.sql' | sort -V)
246259
260+ # Create empty SQL files for previously packaged versions that don't exist
261+ # This compensates for versions that failed to produce SQL files in the past
262+ for prev_version in ${ lib . concatStringsSep " " previouslyPackagedVersions } ; do
263+ sql_file="$out/share/postgresql/extension/wrappers--$prev_version.sql"
264+ if [ ! -f "$sql_file" ]; then
265+ echo "-- Empty migration file for previously packaged version $prev_version" > "$sql_file"
266+ fi
267+ done
268+
247269 # Create migration SQL files from previous versions to newer versions
270+ # Skip if the migration file already exists (to avoid conflicts with the first loop)
248271 for prev_version in ${ lib . concatStringsSep " " previouslyPackagedVersions } ; do
249272 for curr_version in ${ lib . concatStringsSep " " versions } ; do
250273 if [[ "$(printf '%s\n%s' "$prev_version" "$curr_version" | sort -V | head -n1)" == "$prev_version" ]] && [[ "$prev_version" != "$curr_version" ]]; then
251274 main_sql_file="$out/share/postgresql/extension/wrappers--$curr_version.sql"
252- if [ -f "$main_sql_file" ]; then
253- new_file="$out/share/postgresql/extension/wrappers--$prev_version--$curr_version.sql"
275+ new_file="$out/share/postgresql/extension/wrappers--$prev_version--$curr_version.sql"
276+ # Only create if it doesn't already exist (first loop may have created it)
277+ if [ -f "$main_sql_file" ] && [ ! -f "$new_file" ]; then
254278 cp "$main_sql_file" "$new_file"
255279 sed -i 's|$libdir/wrappers-[0-9.]*|$libdir/wrappers|g' "$new_file"
256280 fi
@@ -263,6 +287,7 @@ buildEnv {
263287 create_lib_files
264288 create_migration_sql_files
265289
290+ # Verify library count matches expected
266291 (test "$(ls -A $out/lib/${ pname } *${ postgresql . dlSuffix } | wc -l)" = "${
267292 toString ( numberOfVersions + numberOfPreviouslyPackagedVersions + 1 )
268293 } ")
0 commit comments