From 7ea141b376c7b74b72cbcb74193b7528a8c77b71 Mon Sep 17 00:00:00 2001 From: Chen Shen Date: Wed, 16 Sep 2015 23:54:44 -0700 Subject: [PATCH 1/5] add --- .../main.js | 0 .../package.json | 12 ++++++++++++ spec/package-spec.coffee | 5 +++++ src/package.coffee | 13 ++++++++++++- 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/main.js create mode 100644 spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/package.json diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/main.js b/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/main.js new file mode 100644 index 000000000..e69de29bb diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/package.json b/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/package.json new file mode 100644 index 000000000..70de63b9d --- /dev/null +++ b/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/package.json @@ -0,0 +1,12 @@ +{ + "name": "package-with-incompatible-native-module-and-atom-module-cache", + "version": "1.0.0", + "main": "./main.js", + "_atomModuleCache": { + "extensions": { + ".node": [ + "node_modules/compatible-native-module/build/Release/native.node" + ] + } + } +} diff --git a/spec/package-spec.coffee b/spec/package-spec.coffee index ef5f5a4c3..7cdf93030 100644 --- a/spec/package-spec.coffee +++ b/spec/package-spec.coffee @@ -19,6 +19,11 @@ describe "Package", -> expect(pack.incompatibleModules[0].name).toBe 'native-module' expect(pack.incompatibleModules[0].path).toBe path.join(packagePath, 'node_modules', 'native-module') + it "utilizes _atomModuleCache to get native modules and skips traversing through submodules", -> + packagePath = atom.project.getDirectories()[0]?.resolve('packages/package-with-both-incompatible-and-compatible-native-modules') + pack = new Package(packagePath) + expect(pack.isCompatible()).toBe true + it "caches the incompatible native modules in local storage", -> packagePath = atom.project.getDirectories()[0]?.resolve('packages/package-with-incompatible-native-module') diff --git a/src/package.coffee b/src/package.coffee index f3f5cf4a2..25a33e6fc 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -590,10 +590,21 @@ class Package false # Get an array of all the native modules that this package depends on. - # This will recurse through all dependencies. + # + # First try to get this information from + # @metadata._atomModuleCache.extensions. If @metadata._atomModuleCache doesn't + # exist, recurse through all dependencies. getNativeModuleDependencyPaths: -> nativeModulePaths = [] + if @metadata._atomModuleCache? + nativeModuleBindingPaths = @metadata._atomModuleCache.extensions?['.node'] ?[] + for nativeModuleBindingPath in nativeModuleBindingPaths + # The `.node` file lies in nativeModulePath/build/Release/ folder. + nativeModulePath = path.normalize(path.join(path.dirname(nativeModuleBindingPath), '..', '..')) + nativeModulePaths.push(nativeModulePath) if @isNativeModule(nativeModulePath) + return nativeModulePaths + traversePath = (nodeModulesPath) => try for modulePath in fs.listSync(nodeModulesPath) From 02457990f1dc46dab7759acb4e6a7e06b7c4b11a Mon Sep 17 00:00:00 2001 From: Chen Shen Date: Thu, 17 Sep 2015 09:23:09 -0700 Subject: [PATCH 2/5] add ignored files --- .../compatible-native-module/build/Release/native.node | 0 .../node_modules/compatible-native-module/main.js | 0 .../node_modules/compatible-native-module/package.json | 4 ++++ .../node_modules/native-module/build/Release/native.node | 0 .../node_modules/native-module/main.js | 1 + .../node_modules/native-module/package.json | 4 ++++ 6 files changed, 9 insertions(+) create mode 100644 spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/build/Release/native.node create mode 100644 spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/main.js create mode 100644 spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/package.json create mode 100644 spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/build/Release/native.node create mode 100644 spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/main.js create mode 100644 spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/package.json diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/build/Release/native.node b/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/build/Release/native.node new file mode 100644 index 000000000..e69de29bb diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/main.js b/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/main.js new file mode 100644 index 000000000..e69de29bb diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/package.json b/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/package.json new file mode 100644 index 000000000..77068f680 --- /dev/null +++ b/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/package.json @@ -0,0 +1,4 @@ +{ + "name": "compatible-native-module", + "main": "./main.js" +} diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/build/Release/native.node b/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/build/Release/native.node new file mode 100644 index 000000000..e69de29bb diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/main.js b/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/main.js new file mode 100644 index 000000000..97f5c264e --- /dev/null +++ b/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/main.js @@ -0,0 +1 @@ +throw new Error("this simulates a native module's failure to load") diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/package.json b/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/package.json new file mode 100644 index 000000000..cac262cba --- /dev/null +++ b/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/package.json @@ -0,0 +1,4 @@ +{ + "name": "native-module", + "main": "./main.js" +} From 20dcdf77a4c0dd8249179078d7cfd99e77856c96 Mon Sep 17 00:00:00 2001 From: Chen Shen Date: Thu, 17 Sep 2015 09:52:00 -0700 Subject: [PATCH 3/5] update --- .../main.js | 0 .../compatible-native-module/build/Release/native.node | 0 .../node_modules/compatible-native-module/main.js | 0 .../node_modules/compatible-native-module/package.json | 0 .../node_modules/native-module/build/Release/native.node | 0 .../node_modules/native-module/main.js | 0 .../node_modules/native-module/package.json | 0 .../package.json | 0 spec/package-spec.coffee | 4 +++- src/package.coffee | 4 ++-- 10 files changed, 5 insertions(+), 3 deletions(-) rename spec/fixtures/packages/{package-with-both-incompatible-and-compatible-native-modules => package-with-ignored-incompatible-native-module}/main.js (100%) rename spec/fixtures/packages/{package-with-both-incompatible-and-compatible-native-modules => package-with-ignored-incompatible-native-module}/node_modules/compatible-native-module/build/Release/native.node (100%) rename spec/fixtures/packages/{package-with-both-incompatible-and-compatible-native-modules => package-with-ignored-incompatible-native-module}/node_modules/compatible-native-module/main.js (100%) rename spec/fixtures/packages/{package-with-both-incompatible-and-compatible-native-modules => package-with-ignored-incompatible-native-module}/node_modules/compatible-native-module/package.json (100%) rename spec/fixtures/packages/{package-with-both-incompatible-and-compatible-native-modules => package-with-ignored-incompatible-native-module}/node_modules/native-module/build/Release/native.node (100%) rename spec/fixtures/packages/{package-with-both-incompatible-and-compatible-native-modules => package-with-ignored-incompatible-native-module}/node_modules/native-module/main.js (100%) rename spec/fixtures/packages/{package-with-both-incompatible-and-compatible-native-modules => package-with-ignored-incompatible-native-module}/node_modules/native-module/package.json (100%) rename spec/fixtures/packages/{package-with-both-incompatible-and-compatible-native-modules => package-with-ignored-incompatible-native-module}/package.json (100%) diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/main.js b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/main.js similarity index 100% rename from spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/main.js rename to spec/fixtures/packages/package-with-ignored-incompatible-native-module/main.js diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/build/Release/native.node b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/compatible-native-module/build/Release/native.node similarity index 100% rename from spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/build/Release/native.node rename to spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/compatible-native-module/build/Release/native.node diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/main.js b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/compatible-native-module/main.js similarity index 100% rename from spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/main.js rename to spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/compatible-native-module/main.js diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/package.json b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/compatible-native-module/package.json similarity index 100% rename from spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/compatible-native-module/package.json rename to spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/compatible-native-module/package.json diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/build/Release/native.node b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/build/Release/native.node similarity index 100% rename from spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/build/Release/native.node rename to spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/build/Release/native.node diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/main.js b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/main.js similarity index 100% rename from spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/main.js rename to spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/main.js diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/package.json b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/package.json similarity index 100% rename from spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/node_modules/native-module/package.json rename to spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/package.json diff --git a/spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/package.json b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/package.json similarity index 100% rename from spec/fixtures/packages/package-with-both-incompatible-and-compatible-native-modules/package.json rename to spec/fixtures/packages/package-with-ignored-incompatible-native-module/package.json diff --git a/spec/package-spec.coffee b/spec/package-spec.coffee index 7cdf93030..8f7f2c0bf 100644 --- a/spec/package-spec.coffee +++ b/spec/package-spec.coffee @@ -20,8 +20,10 @@ describe "Package", -> expect(pack.incompatibleModules[0].path).toBe path.join(packagePath, 'node_modules', 'native-module') it "utilizes _atomModuleCache to get native modules and skips traversing through submodules", -> - packagePath = atom.project.getDirectories()[0]?.resolve('packages/package-with-both-incompatible-and-compatible-native-modules') + packagePath = atom.project.getDirectories()[0]?.resolve('packages/package-with-ignored-incompatible-native-module') pack = new Package(packagePath) + # Since `_atomModuleCache` exists and it doesn't have the record of the + # incompatible native module, this package is recognized as compatible. expect(pack.isCompatible()).toBe true it "caches the incompatible native modules in local storage", -> diff --git a/src/package.coffee b/src/package.coffee index 25a33e6fc..c38ea08f7 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -598,10 +598,10 @@ class Package nativeModulePaths = [] if @metadata._atomModuleCache? - nativeModuleBindingPaths = @metadata._atomModuleCache.extensions?['.node'] ?[] + nativeModuleBindingPaths = @metadata._atomModuleCache.extensions?['.node'] ? [] for nativeModuleBindingPath in nativeModuleBindingPaths # The `.node` file lies in nativeModulePath/build/Release/ folder. - nativeModulePath = path.normalize(path.join(path.dirname(nativeModuleBindingPath), '..', '..')) + nativeModulePath = path.join(path.dirname(nativeModuleBindingPath), '..', '..') nativeModulePaths.push(nativeModulePath) if @isNativeModule(nativeModulePath) return nativeModulePaths From 6b66bf7b0aadfe22251c01ba145eee811e4e39bb Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 17 Sep 2015 17:21:34 -0600 Subject: [PATCH 4/5] Fix use of _atomModuleCache in getNativeModuleDependencyPaths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, we weren’t converting the relative path from the module cache and the test wasn’t strong enough to detect this fact. --- .../main.js | 0 .../package.json | 12 ++++++++++++ .../package.json | 2 +- spec/package-spec.coffee | 9 ++++++--- src/package.coffee | 9 ++++----- 5 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 spec/fixtures/packages/package-with-cached-incompatible-native-module/main.js create mode 100644 spec/fixtures/packages/package-with-cached-incompatible-native-module/package.json diff --git a/spec/fixtures/packages/package-with-cached-incompatible-native-module/main.js b/spec/fixtures/packages/package-with-cached-incompatible-native-module/main.js new file mode 100644 index 000000000..e69de29bb diff --git a/spec/fixtures/packages/package-with-cached-incompatible-native-module/package.json b/spec/fixtures/packages/package-with-cached-incompatible-native-module/package.json new file mode 100644 index 000000000..1db0a0a9d --- /dev/null +++ b/spec/fixtures/packages/package-with-cached-incompatible-native-module/package.json @@ -0,0 +1,12 @@ +{ + "name": "package-with-cached-incompatible-native-module", + "version": "1.0.0", + "main": "./main.js", + "_atomModuleCache": { + "extensions": { + ".node": [ + "node_modules/native-module/build/Release/native.node" + ] + } + } +} diff --git a/spec/fixtures/packages/package-with-ignored-incompatible-native-module/package.json b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/package.json index 70de63b9d..4f6206828 100644 --- a/spec/fixtures/packages/package-with-ignored-incompatible-native-module/package.json +++ b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/package.json @@ -1,5 +1,5 @@ { - "name": "package-with-incompatible-native-module-and-atom-module-cache", + "name": "package-with-ignored-incompatible-native-module", "version": "1.0.0", "main": "./main.js", "_atomModuleCache": { diff --git a/spec/package-spec.coffee b/spec/package-spec.coffee index 8f7f2c0bf..e73782219 100644 --- a/spec/package-spec.coffee +++ b/spec/package-spec.coffee @@ -19,13 +19,16 @@ describe "Package", -> expect(pack.incompatibleModules[0].name).toBe 'native-module' expect(pack.incompatibleModules[0].path).toBe path.join(packagePath, 'node_modules', 'native-module') - it "utilizes _atomModuleCache to get native modules and skips traversing through submodules", -> + it "utilizes _atomModuleCache if present to determine the package's native dependencies", -> packagePath = atom.project.getDirectories()[0]?.resolve('packages/package-with-ignored-incompatible-native-module') pack = new Package(packagePath) - # Since `_atomModuleCache` exists and it doesn't have the record of the - # incompatible native module, this package is recognized as compatible. + expect(pack.getNativeModuleDependencyPaths().length).toBe(1) # doesn't see the incompatible module expect(pack.isCompatible()).toBe true + packagePath = atom.project.getDirectories()[0]?.resolve('packages/package-with-cached-incompatible-native-module') + pack = new Package(packagePath) + expect(pack.isCompatible()).toBe false + it "caches the incompatible native modules in local storage", -> packagePath = atom.project.getDirectories()[0]?.resolve('packages/package-with-incompatible-native-module') diff --git a/src/package.coffee b/src/package.coffee index c38ea08f7..6170a645e 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -598,11 +598,10 @@ class Package nativeModulePaths = [] if @metadata._atomModuleCache? - nativeModuleBindingPaths = @metadata._atomModuleCache.extensions?['.node'] ? [] - for nativeModuleBindingPath in nativeModuleBindingPaths - # The `.node` file lies in nativeModulePath/build/Release/ folder. - nativeModulePath = path.join(path.dirname(nativeModuleBindingPath), '..', '..') - nativeModulePaths.push(nativeModulePath) if @isNativeModule(nativeModulePath) + relativeNativeModuleBindingPaths = @metadata._atomModuleCache.extensions?['.node'] ? [] + for relativeNativeModuleBindingPath in relativeNativeModuleBindingPaths + nativeModulePath = path.join(@path, relativeNativeModuleBindingPath, '..', '..', '..') + nativeModulePaths.push(nativeModulePath) return nativeModulePaths traversePath = (nodeModulesPath) => From e69c20f3b04a9c63151f8d7c60ea074b1c6c7a04 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 17 Sep 2015 16:29:53 -0600 Subject: [PATCH 5/5] 1.0.13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 59c8e1c3b..a74a5ccfa 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "1.0.12", + "version": "1.0.13", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": {