--- /dev/null
+/**
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+*/
+
+var shell = require('shelljs'),
+ path = require('path'),
+ CordovaCheck = require('../src/CordovaCheck');
+
+var cwd = process.cwd();
+var home = process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'];
+var origPWD = process.env.PWD;
+
+describe('findProjectRoot method', function() {
+ afterEach(function() {
+ process.env.PWD = origPWD;
+ process.chdir(cwd);
+ });
+ it('should return false if it hits the home directory', function() {
+ var somedir = path.join(home, 'somedir');
+ this.after(function() {
+ shell.rm('-rf', somedir);
+ });
+ shell.mkdir(somedir);
+ expect(CordovaCheck.findProjectRoot(somedir)).toEqual(false);
+ });
+ it('should return false if it cannot find a .cordova directory up the directory tree', function() {
+ var somedir = path.join(home, '..');
+ expect(CordovaCheck.findProjectRoot(somedir)).toEqual(false);
+ });
+ it('should return the first directory it finds with a .cordova folder in it', function() {
+ var somedir = path.join(home,'somedir');
+ var anotherdir = path.join(somedir, 'anotherdir');
+ this.after(function() {
+ shell.rm('-rf', somedir);
+ });
+ shell.mkdir('-p', anotherdir);
+ shell.mkdir('-p', path.join(somedir, 'www', 'config.xml'));
+ expect(CordovaCheck.findProjectRoot(somedir)).toEqual(somedir);
+ });
+ it('should ignore PWD when its undefined', function() {
+ delete process.env.PWD;
+ var somedir = path.join(home,'somedir');
+ var anotherdir = path.join(somedir, 'anotherdir');
+ this.after(function() {
+ shell.rm('-rf', somedir);
+ });
+ shell.mkdir('-p', anotherdir);
+ shell.mkdir('-p', path.join(somedir, 'www'));
+ shell.mkdir('-p', path.join(somedir, 'config.xml'));
+ process.chdir(anotherdir);
+ expect(CordovaCheck.findProjectRoot()).toEqual(somedir);
+ });
+ it('should use PWD when available', function() {
+ var somedir = path.join(home,'somedir');
+ var anotherdir = path.join(somedir, 'anotherdir');
+ this.after(function() {
+ shell.rm('-rf', somedir);
+ });
+ shell.mkdir('-p', anotherdir);
+ shell.mkdir('-p', path.join(somedir, 'www', 'config.xml'));
+ process.env.PWD = anotherdir;
+ process.chdir(path.sep);
+ expect(CordovaCheck.findProjectRoot()).toEqual(somedir);
+ });
+ it('should use cwd as a fallback when PWD is not a cordova dir', function() {
+ var somedir = path.join(home,'somedir');
+ var anotherdir = path.join(somedir, 'anotherdir');
+ this.after(function() {
+ shell.rm('-rf', somedir);
+ });
+ shell.mkdir('-p', anotherdir);
+ shell.mkdir('-p', path.join(somedir, 'www', 'config.xml'));
+ process.env.PWD = path.sep;
+ process.chdir(anotherdir);
+ expect(CordovaCheck.findProjectRoot()).toEqual(somedir);
+ });
+ it('should ignore platform www/config.xml', function() {
+ var somedir = path.join(home,'somedir');
+ var anotherdir = path.join(somedir, 'anotherdir');
+ this.after(function() {
+ shell.rm('-rf', somedir);
+ });
+ shell.mkdir('-p', anotherdir);
+ shell.mkdir('-p', path.join(anotherdir, 'www', 'config.xml'));
+ shell.mkdir('-p', path.join(somedir, 'www'));
+ shell.mkdir('-p', path.join(somedir, 'config.xml'));
+ expect(CordovaCheck.findProjectRoot(anotherdir)).toEqual(somedir);
+ });
+});
\ No newline at end of file
--- /dev/null
+/**
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+*/
+
+var fs = require('fs'),
+ path = require('path');
+
+function isRootDir(dir) {
+ if (fs.existsSync(path.join(dir, 'www'))) {
+ if (fs.existsSync(path.join(dir, 'config.xml'))) {
+ // For sure is.
+ if (fs.existsSync(path.join(dir, 'platforms'))) {
+ return 2;
+ } else {
+ return 1;
+ }
+ }
+ // Might be (or may be under platforms/).
+ if (fs.existsSync(path.join(dir, 'www', 'config.xml'))) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+// Runs up the directory chain looking for a .cordova directory.
+// IF it is found we are in a Cordova project.
+// Omit argument to use CWD.
+function isCordova(dir) {
+ if (!dir) {
+ // Prefer PWD over cwd so that symlinked dirs within your PWD work correctly (CB-5687).
+ var pwd = process.env.PWD;
+ var cwd = process.cwd();
+ if (pwd && pwd != cwd && pwd != 'undefined') {
+ return isCordova(pwd) || isCordova(cwd);
+ }
+ return isCordova(cwd);
+ }
+ var bestReturnValueSoFar = false;
+ for (var i = 0; i < 1000; ++i) {
+ var result = isRootDir(dir);
+ if (result === 2) {
+ return dir;
+ }
+ if (result === 1) {
+ bestReturnValueSoFar = dir;
+ }
+ var parentDir = path.normalize(path.join(dir, '..'));
+ // Detect fs root.
+ if (parentDir == dir) {
+ return bestReturnValueSoFar;
+ }
+ dir = parentDir;
+ }
+ console.error('Hit an unhandled case in CordovaCheck.isCordova');
+ return false;
+}
+
+module.exports = {
+ findProjectRoot : isCordova
+};