ionic
Version:
A tool for creating and developing Ionic Framework mobile apps.
162 lines (131 loc) • 5.56 kB
JavaScript
/*
*
* Copyright 2013 Canonical Ltd.
*
* Licensed 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.
*
*/
/* jshint sub:true */
var fs = require('fs'),
path = require('path'),
util = require('../util'),
shell = require('shelljs'),
Q = require('q'),
Parser = require('./parser'),
os = require('os'),
ConfigParser = require('cordova-common').ConfigParser;
function ubuntu_parser(project) {
// Call the base class constructor
Parser.call(this, 'ubuntu', project);
this.path = project;
this.config = new ConfigParser(this.config_xml());
this.update_manifest();
}
function sanitize(str) {
return str.replace(/\n/g, ' ').replace(/^\s+|\s+$/g, '');
}
require('util').inherits(ubuntu_parser, Parser);
module.exports = ubuntu_parser;
ubuntu_parser.prototype.update_from_config = function(config) {
if (config instanceof ConfigParser) {
} else {
return Q.reject(new Error('update_from_config requires a ConfigParser object'));
}
this.config = new ConfigParser(this.config_xml());
this.config.setName(config.name());
this.config.setVersion(config.version());
this.config.setPackageName(config.packageName());
this.config.setDescription(config.description());
this.config.write();
return this.update_manifest();
};
ubuntu_parser.prototype.cordovajs_path = function(libDir) {
var jsPath = path.join(libDir, 'www', 'cordova.js');
return path.resolve(jsPath);
};
ubuntu_parser.prototype.cordovajs_src_path = function(libDir) {
var jsPath = path.join(libDir, 'cordova-js-src');
return path.resolve(jsPath);
};
ubuntu_parser.prototype.update_manifest = function() {
var nodearch2debarch = { 'arm': 'armhf',
'ia32': 'i386',
'x64': 'amd64'};
var arch;
if (os.arch() in nodearch2debarch)
arch = nodearch2debarch[os.arch()];
else
return Q.reject(new Error('unknown cpu arch'));
if (!this.config.author())
return Q.reject(new Error('config.xml should contain author'));
var manifest = { name: this.config.packageName(),
version: this.config.version(),
title: this.config.name(),
hooks: { cordova: { desktop: 'cordova.desktop',
apparmor: 'apparmor.json' } },
framework: 'ubuntu-sdk-13.10',
maintainer: sanitize(this.config.author()) + ' <' + this.config.doc.find('author').attrib.email + '>',
architecture: arch,
description: sanitize(this.config.description()) };
var name = sanitize(this.config.name()); //FIXME: escaping
var content = '[Desktop Entry]\nName=' + name + '\nExec=./cordova-ubuntu www/\nTerminal=false\nType=Application\nX-Ubuntu-Touch=true';
if (this.config.doc.find('icon') && this.config.doc.find('icon').attrib.src) {
var iconPath = path.join(this.path, '../..', this.config.doc.find('icon').attrib.src);
if (fs.existsSync(iconPath))
content += '\nIcon=' + this.config.doc.find('icon').attrib.src;
else
return Q.reject(new Error('icon does not exist: ' + iconPath));
} else {
content += '\nIcon=qmlscene';
console.warn('missing icon element in config.xml');
}
fs.writeFileSync(path.join(this.path, 'manifest.json'), JSON.stringify(manifest));
fs.writeFileSync(path.join(this.path, 'cordova.desktop'), content);
var policy = { policy_groups: ['networking', 'audio'], policy_version: 1 };
this.config.doc.getroot().findall('./feature/param').forEach(function (element) {
if (element.attrib.policy_group && policy.policy_groups.indexOf(element.attrib.policy_group) === -1)
policy.policy_groups.push(element.attrib.policy_group);
});
fs.writeFileSync(path.join(this.path, 'apparmor.json'), JSON.stringify(policy));
return Q();
};
ubuntu_parser.prototype.config_xml = function(){
return path.join(this.path, 'config.xml');
};
ubuntu_parser.prototype.www_dir = function() {
return path.join(this.path, 'www');
};
ubuntu_parser.prototype.update_www = function() {
var projectRoot = util.isCordova(this.path);
var www = util.projectWww(projectRoot);
shell.rm('-rf', this.www_dir());
shell.cp('-rf', www, this.path);
};
ubuntu_parser.prototype.update_overrides = function() {
var projectRoot = util.isCordova(this.path);
var mergesPath = path.join(util.appDir(projectRoot), 'merges', 'ubuntu');
if(fs.existsSync(mergesPath)) {
var overrides = path.join(mergesPath, '*');
shell.cp('-rf', overrides, this.www_dir());
}
};
// Returns a promise.
ubuntu_parser.prototype.update_project = function(cfg) {
var self = this;
return this.update_from_config(cfg)
.then(function() {
self.update_overrides();
util.deleteSvnFolders(self.www_dir());
});
};