| #!/usr/bin/env node |
| |
| /* |
| 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'), |
| fs = require('fs'), |
| check_reqs = require('./check_reqs'), |
| ROOT = path.join(__dirname, '..', '..'); |
| |
| function exec(command) { |
| var result; |
| try { |
| result = shell.exec(command, {silent:false, async:false}); |
| } catch(e) { |
| console.error('Command error on execuation : ' + command); |
| console.error(e); |
| process.exit(2); |
| } |
| if(result && result.code > 0) { |
| console.error('Command failed to execute : ' + command); |
| console.error(result.output); |
| process.exit(2); |
| } else { |
| return result; |
| } |
| } |
| |
| function setShellFatal(value, func) { |
| var oldVal = shell.config.fatal; |
| shell.config.fatal = value; |
| func(); |
| shell.config.fatal = oldVal; |
| } |
| |
| function ensureJarIsBuilt(version, target_api) { |
| var isDevVersion = /-dev$/.test(version); |
| if (isDevVersion || !fs.existsSync(path.join(ROOT, 'framework', 'cordova-' + version + '.jar')) && fs.existsSync(path.join(ROOT, 'framework'))) { |
| var valid_target = check_reqs.get_target(); |
| console.log('Building cordova-' + version + '.jar'); |
| // update the cordova-android framework for the desired target |
| exec('android --silent update lib-project --target "' + target_api + '" --path "' + path.join(ROOT, 'framework') + '"'); |
| // compile cordova.js and cordova.jar |
| var cwd = process.cwd(); |
| process.chdir(path.join(ROOT, 'framework')); |
| exec('ant jar'); |
| process.chdir(cwd); |
| } |
| } |
| |
| function copyJsAndJar(projectPath, version) { |
| shell.cp('-f', path.join(ROOT, 'framework', 'assets', 'www', 'cordova.js'), path.join(projectPath, 'assets', 'www', 'cordova.js')); |
| // Don't fail if there are no old jars. |
| setShellFatal(false, function() { |
| shell.ls(path.join(projectPath, 'libs', 'cordova-*.jar')).forEach(function(oldJar) { |
| console.log("Deleting " + oldJar); |
| shell.rm('-f', path.join(oldJar)); |
| }); |
| }); |
| shell.cp('-f', path.join(ROOT, 'framework', 'cordova-' + version + '.jar'), path.join(projectPath, 'libs', 'cordova-' + version + '.jar')); |
| shell.cp('-f', path.join(ROOT, 'framework', 'libs','awv_interface.jar'), path.join(projectPath, 'libs', 'awv_interface.jar')); |
| } |
| |
| function copyScripts(projectPath) { |
| var srcScriptsDir = path.join(ROOT, 'bin', 'templates', 'cordova'); |
| var destScriptsDir = path.join(projectPath, 'cordova'); |
| // Delete old scripts directory if this is an update. |
| shell.rm('-rf', destScriptsDir); |
| // Copy in the new ones. |
| shell.cp('-r', srcScriptsDir, projectPath); |
| shell.cp('-r', path.join(ROOT, 'bin', 'node_modules'), destScriptsDir); |
| shell.cp(path.join(ROOT, 'bin', 'check_reqs'), path.join(destScriptsDir, 'check_reqs')); |
| shell.cp(path.join(ROOT, 'bin', 'lib', 'check_reqs.js'), path.join(projectPath, 'cordova', 'lib', 'check_reqs.js')); |
| |
| } |
| |
| /** |
| * $ create [options] |
| * |
| * Creates an android application with the given options. |
| * |
| * Options: |
| * |
| * - `project_path` {String} Path to the new Cordova android project. |
| * - `package_name`{String} Package name, following reverse-domain style convention. |
| * - `project_name` {String} Project name. |
| * - 'project_template_dir' {String} Path to project template (override). |
| */ |
| |
| exports.createProject = function(project_path, package_name, project_name, project_template_dir) { |
| var VERSION = fs.readFileSync(path.join(ROOT, 'VERSION'), 'utf-8').trim(); |
| |
| // Set default values for path, package and name |
| project_path = typeof project_path !== 'undefined' ? project_path : "CordovaExample"; |
| project_path = path.relative(process.cwd(), project_path); |
| package_name = typeof package_name !== 'undefined' ? package_name : 'my.cordova.project'; |
| project_name = typeof project_name !== 'undefined' ? project_name : 'CordovaExample'; |
| project_template_dir = typeof project_template_dir !== 'undefined' ? |
| project_template_dir : |
| path.join(ROOT, 'bin', 'templates', 'project'); |
| |
| var safe_activity_name = project_name.replace(/\W/g, ''); |
| var package_as_path = package_name.replace(/\./g, path.sep); |
| var activity_dir = path.join(project_path, 'src', package_as_path); |
| var activity_path = path.join(activity_dir, safe_activity_name + '.java'); |
| var target_api = check_reqs.get_target(); |
| var manifest_path = path.join(project_path, 'AndroidManifest.xml'); |
| |
| // Check if project already exists |
| if(fs.existsSync(project_path)) { |
| console.error('Project already exists! Delete and recreate'); |
| process.exit(2); |
| } |
| |
| if (!/[a-zA-Z0-9_]+\.[a-zA-Z0-9_](.[a-zA-Z0-9_])*/.test(package_name)) { |
| console.error('Package name must look like: com.company.Name'); |
| process.exit(2); |
| } |
| |
| // Check that requirements are met and proper targets are installed |
| if(!check_reqs.run()) { |
| process.exit(2); |
| } |
| |
| // Log the given values for the project |
| console.log('Creating Cordova project for the Android platform:'); |
| console.log('\tPath: ' + project_path); |
| console.log('\tPackage: ' + package_name); |
| console.log('\tName: ' + project_name); |
| console.log('\tAndroid target: ' + target_api); |
| |
| // build from source. distro should have these files |
| ensureJarIsBuilt(VERSION, target_api); |
| |
| console.log('Copying template files...'); |
| |
| setShellFatal(true, function() { |
| // copy project template |
| shell.cp('-r', path.join(project_template_dir, 'assets'), project_path); |
| shell.cp('-r', path.join(project_template_dir, 'res'), project_path); |
| // Manually create directories that would be empty within the template (since git doesn't track directories). |
| shell.mkdir(path.join(project_path, 'libs')); |
| |
| // copy cordova.js, cordova.jar and res/xml |
| shell.cp('-r', path.join(ROOT, 'framework', 'res', 'xml'), path.join(project_path, 'res')); |
| copyJsAndJar(project_path, VERSION); |
| |
| // interpolate the activity name and package |
| shell.mkdir('-p', activity_dir); |
| shell.cp('-f', path.join(project_template_dir, 'Activity.java'), activity_path); |
| shell.sed('-i', /__ACTIVITY__/, safe_activity_name, activity_path); |
| shell.sed('-i', /__NAME__/, project_name, path.join(project_path, 'res', 'values', 'strings.xml')); |
| shell.sed('-i', /__ID__/, package_name, activity_path); |
| |
| shell.cp('-f', path.join(project_template_dir, 'AndroidManifest.xml'), manifest_path); |
| shell.sed('-i', /__ACTIVITY__/, safe_activity_name, manifest_path); |
| shell.sed('-i', /__PACKAGE__/, package_name, manifest_path); |
| shell.sed('-i', /__APILEVEL__/, target_api.split('-')[1], manifest_path); |
| copyScripts(project_path); |
| }); |
| // Link it to local android install. |
| console.log('Running "android update project"'); |
| exec('android --silent update project --target "'+target_api+'" --path "'+ project_path+'"'); |
| console.log('Project successfully created.'); |
| } |
| |
| exports.updateProject = function(projectPath) { |
| // Check that requirements are met and proper targets are installed |
| if (!check_reqs.run()) { |
| process.exit(2); |
| } |
| var version = fs.readFileSync(path.join(ROOT, 'VERSION'), 'utf-8').trim(); |
| var target_api = check_reqs.get_target(); |
| ensureJarIsBuilt(version, target_api); |
| copyJsAndJar(projectPath, version); |
| copyScripts(projectPath); |
| console.log('Android project is now at version ' + version); |
| }; |
| |