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