#!/usr/bin/env bash # # Check if we need to copy node_modules (e.g. in case it has been modified after last copy) # # The reasoning for a (mostly) read-only node_modules folder: # ideally we’d symlink the folder directly to the Nix store # so that we’re guaranteed to have a reproducible source. # Unfortunately react-native wants to build some stuff after the fact # and this is incompatible with the concept of a pure Nix package. # Therefore we copy the whole source to the repo directory, # allow writing only on the folders where it is absolutely required, # and therefore we still keep some peace of mind that the rest # of node_modules is unchanged the rest of the time. # set -Eeuo pipefail deps="$1" [ -d $deps ] || exit 1 nodeModulesDir="$STATUS_REACT_HOME/node_modules" needCopyModules=1 # Check if node_modules exists and is valid if [ -d "$nodeModulesDir" ]; then if [ -f "$nodeModulesDir/.copied~" ]; then echo "Checking for modifications in node_modules..." modifiedFiles=( $(find $nodeModulesDir -writable -type f -newer $nodeModulesDir/.copied~ \ -not \( -path "$nodeModulesDir/react-native/third-party/*" -prune \ -o -path "$nodeModulesDir/react-native/ReactAndroid/build/*" -prune \ -o -path "$nodeModulesDir/*/android/build/*" -prune \ -o -path "$nodeModulesDir/realm/src/*" -prune \ -o -path './resources/icons/*' -prune \) -print) ) if [ ${#modifiedFiles[@]} -eq 0 ]; then needCopyModules=0 echo "No modifications detected." else echo "Modifications detected in ${#modifiedFiles[@]} files:\n${modifiedFiles[@]}" fi fi if [ $needCopyModules -eq 1 ]; then chmod u+w -R $nodeModulesDir rm -rf $nodeModulesDir fi fi # Replace node_modules if necessary if [ ! -d "$nodeModulesDir" ]; then if [ -n "${IN_CI_ENVIRONMENT:-''}" ]; then # CI jobs might run multiple tasks in parallel, so it is possible that another process is setting up node_modules. In that case, let's wait up to 10 seconds for the .tmp dir goes away for i in {1..10}; do if [ -d "$nodeModulesDir.tmp" ]; then echo "$nodeModulesDir.tmp exists, another process is probably setting up node_modules, waiting for 1 second..." sleep 1 else break fi done fi if [ -d "$nodeModulesDir.tmp" ]; then echo "$nodeModulesDir.tmp already exists, another shell session is probably currently setting up node_modules. Please try again in a few moments." ls -al $STATUS_REACT_HOME exit 1 elif [ ! -d "$nodeModulesDir" ]; then echo "Copying node_modules from Nix store (${deps}/node_modules)..." trap "[ -d \"$nodeModulesDir.tmp\" ] && chmod -R u+w \"$nodeModulesDir.tmp\" && rm -rf \"$nodeModulesDir.tmp\"" ERR INT HUP time cp -HRf --preserve=all ${deps}/node_modules/. "$nodeModulesDir.tmp" chmod -R u+w "$nodeModulesDir.tmp" mv -f "$nodeModulesDir.tmp" $nodeModulesDir touch $nodeModulesDir/.copied~ trap - ERR INT HUP echo "Done" fi fi