diff --git a/Jenkinsfile b/Jenkinsfile index bcdd7f0893..6ac40bd892 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -24,6 +24,10 @@ node ('macos1') { sh 'cp .env.jenkins .env' sh 'lein deps && npm install && ./node_modules/re-natal/index.js deps' sh '[ -f node_modules/react-native/packager/src/JSTransformer/index.js ] && sed -i "" "s/301000/1201000/g" node_modules/react-native/packager/src/JSTransformer/index.js || echo "New packager"' + + // Fix silly RN upgrade weird env issue + cp 'findSymlinkedModules.js.patch' 'node_modules/react-native/local-cli/util/findSymlinkedModules.js' + sh 'mvn -f modules/react-native-status/ios/RCTStatus dependency:unpack' sh 'cd ios && pod install && cd ..' } diff --git a/Jenkinsfile.nightly b/Jenkinsfile.nightly index a68f9834f1..ceee20478f 100644 --- a/Jenkinsfile.nightly +++ b/Jenkinsfile.nightly @@ -25,9 +25,13 @@ node ('macos1'){ sh 'cp .env.jenkins .env' sh 'lein deps && npm install && ./node_modules/re-natal/index.js deps' sh '[ -f node_modules/react-native/packager/src/JSTransformer/index.js ] && sed -i "" "s/301000/1201000/g" node_modules/react-native/packager/src/JSTransformer/index.js || echo "New packager"' + + // Fix silly RN upgrade weird env issue + cp 'findSymlinkedModules.js.patch' 'node_modules/react-native/local-cli/util/findSymlinkedModules.js' + sh 'mvn -f modules/react-native-status/ios/RCTStatus dependency:unpack' - sh 'cd ios && pod install && cd ..' - } + sh 'cd ios && pod install && cd ..' + } stage('Tests') { sh 'lein test-cljs' diff --git a/Jenkinsfile.parameters b/Jenkinsfile.parameters index 4f3d3fa808..fae216406e 100644 --- a/Jenkinsfile.parameters +++ b/Jenkinsfile.parameters @@ -43,6 +43,10 @@ node ('macos1') { // Uncomment with RN merge sh '[ -f node_modules/react-native/packager/src/JSTransformer/index.js ] && sed -i "" "s/301000/1201000/g" node_modules/react-native/packager/src/JSTransformer/index.js || echo "New packager"' // sh 'sed -i "" "s/301000/1201000/g" node_modules/react-native/packager/src/JSTransformer/index.js' + + // Fix silly RN upgrade weird env issue + cp 'findSymlinkedModules.js.patch' 'node_modules/react-native/local-cli/util/findSymlinkedModules.js' + sh 'mvn -f modules/react-native-status/ios/RCTStatus dependency:unpack' sh 'cd ios && pod install && cd ..' } diff --git a/findSymlinkedModules.js.patch b/findSymlinkedModules.js.patch new file mode 100644 index 0000000000..5bd9e6dfdf --- /dev/null +++ b/findSymlinkedModules.js.patch @@ -0,0 +1,110 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @format + * @flow + */ + +const path = require('path'); +const fs = require('fs'); + +/** + * Find symlinked modules inside "node_modules." + * + * Naively, we could just perform a depth-first search of all folders in + * node_modules, recursing when we find a symlink. + * + * We can be smarter than this due to our knowledge of how npm/Yarn lays out + * "node_modules" / how tools that build on top of npm/Yarn (such as Lerna) + * install dependencies. + * + * Starting from a given root node_modules folder, this algorithm will look at + * both the top level descendants of the node_modules folder or second level + * descendants of folders that start with "@" (which indicates a scoped + * package). If any of those folders is a symlink, it will recurse into the + * link, and perform the same search in the linked folder. + * + * The end result should be a list of all resolved module symlinks for a given + * root. + */ +module.exports = function findSymlinkedModules( + projectRoot: string, + ignoredRoots: Array = [], +) { + const timeStart = Date.now(); + const nodeModuleRoot = path.join(projectRoot, 'node_modules'); + const resolvedSymlinks = findModuleSymlinks(nodeModuleRoot, [ + ...ignoredRoots, + projectRoot, + ]); + const timeEnd = Date.now(); + + console.log( + `Scanning folders for symlinks in ${nodeModuleRoot} (${timeEnd - + timeStart}ms)`, + ); + + return resolvedSymlinks; +}; + +function findModuleSymlinks( + modulesPath: string, + ignoredPaths: Array = [], +): Array { + if (!fs.existsSync(modulesPath)) { + return []; + } + + // Find module symlinks + const moduleFolders = fs.readdirSync(modulesPath); + const symlinks = moduleFolders.reduce((links, folderName) => { + const folderPath = path.join(modulesPath, folderName); + const maybeSymlinkPaths = []; + if (folderName.startsWith('@')) { + const scopedModuleFolders = fs.readdirSync(folderPath); + maybeSymlinkPaths.push( + ...scopedModuleFolders.map(name => path.join(folderPath, name)), + ); + } else { + maybeSymlinkPaths.push(folderPath); + } + return links.concat(resolveSymlinkPaths(maybeSymlinkPaths, ignoredPaths)); + }, []); + + // For any symlinks found, look in _that_ modules node_modules directory + // and find any symlinked modules + const nestedSymlinks = symlinks.reduce( + (links, symlinkPath) => + links.concat( + // We ignore any found symlinks or anything from the ignored list, + // to prevent infinite recursion + findModuleSymlinks(path.join(symlinkPath, 'node_modules'), [ + ...ignoredPaths, + ...symlinks, + ]), + ), + [], + ); + + return [...new Set([...symlinks, ...nestedSymlinks])]; +} + +function resolveSymlinkPaths(maybeSymlinkPaths, ignoredPaths) { + return maybeSymlinkPaths.reduce((links, maybeSymlinkPath) => { + if (fs.lstatSync(maybeSymlinkPath).isSymbolicLink()) { + const resolved = path.resolve( + path.dirname(maybeSymlinkPath), + fs.readlinkSync(maybeSymlinkPath), + ); + if (ignoredPaths.indexOf(resolved) === -1 && fs.existsSync(resolved)) { + links.push(resolved); + } + } + return links; + }, []); +}