added a csproj file parses module, incorporated into action stack, and first pass at wp7 platform handler
Project: http://git-wip-us.apache.org/repos/asf/cordova-plugman/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugman/commit/b356f593 Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugman/tree/b356f593 Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugman/diff/b356f593 Branch: refs/heads/master Commit: b356f593b01745870af37c056723eb06fc3b9d75 Parents: d4d9c24 Author: Fil Maj <[email protected]> Authored: Fri May 17 15:10:05 2013 -0700 Committer: Fil Maj <[email protected]> Committed: Fri May 17 16:46:01 2013 -0700 ---------------------------------------------------------------------- src/platforms/wp7.js | 120 +++++++---------------------------------- src/util/action-stack.js | 16 ++++-- src/util/csproj.js | 41 ++++++++++++++ 3 files changed, 73 insertions(+), 104 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/b356f593/src/platforms/wp7.js ---------------------------------------------------------------------- diff --git a/src/platforms/wp7.js b/src/platforms/wp7.js index ce38882..01645f0 100644 --- a/src/platforms/wp7.js +++ b/src/platforms/wp7.js @@ -17,15 +17,13 @@ * */ -var fs = require('fs'), +var common = require('./common'), path = require('path'), glob = require('glob'), - shell = require('shelljs'), - et = require('elementtree'), - xml_helpers = require('../util/xml-helpers'), - getConfigChanges = require('../util/config-changes'), - assetsDir = 'www'; // relative path to project's web assets + csproj = require('../util/csproj'); + xml_helpers = require('../util/xml-helpers'); +/* var unix_projPath, // for use with glob projectFilename,// first csproj returned by glob unix_projPath projPath, // full path to the project file, including file name @@ -48,27 +46,6 @@ function initPaths(project_dir, plugin_dir, plugin_et, variables) { projectChanges = platformTag.findall('./config-file[@target=".csproj"]'); hosts = plugin_et.findall('./access'); } - -function install(project_dir, plugin_dir, plugin_et, variables) { - - // move asset files - assets && assets.forEach(function (asset) { - var srcPath = path.resolve(plugin_dir, asset.attrib['src']); - var targetPath = path.resolve(project_dir, assetsDir, asset.attrib['target']); - copyFileSync(srcPath, targetPath); - }); - - // move source files - sourceFiles && sourceFiles.forEach(function (sourceFile) { - var srcFilePath = path.resolve(plugin_dir, sourceFile.attrib['src']); - var destDir = path.resolve(project_dir, sourceFile.attrib['target-dir']); - var destFilePath = path.resolve(destDir, path.basename(sourceFile.attrib['src'])); - copyFileSync(srcFilePath, destFilePath); - }); - - updateConfigXml("install", configFilePath, plugin_et); - - et.register_namespace("csproj", "http://schemas.microsoft.com/developer/msbuild/2003"); projectChanges && projectChanges.forEach(function (configNode) { var docStr = fs.readFileSync(projPath,"utf8"); @@ -90,71 +67,6 @@ function install(project_dir, plugin_dir, plugin_et, variables) { // save it, and get out fs.writeFileSync(projPath, newDocStr); }); -} - -function updateConfigXml(action, config_path, plugin_et) { - - var hosts = plugin_et.findall('./access'); - var platformTag = plugin_et.find('./platform[@name="wp7"]'); - var configChanges = getConfigChanges(platformTag); - var base_config_path = path.basename(config_path); - // add whitelist hosts - var root = et.Element("config-file"); - root.attrib['parent'] = '.'; - - hosts && hosts.forEach( function (tag) { - root.append(tag); - }); - - if (root.len()) { - var changeList = configChanges[path.basename(config_path)]; - // if changeList then add to it, otherwise create it. - if(changeList) { - changeList.push(root); - } - else { - configChanges[path.basename(config_path)] = [root] - } - } - - if (configChanges[path.basename(config_path)]) { - - // edit configuration files - var xmlDoc = xml_helpers.parseElementtreeSync(config_path) - configChanges[base_config_path].forEach( function (configNode) { - var selector = configNode.attrib["parent"], - children = configNode.findall('*'); - if( action == 'install') { - if (!xml_helpers.graftXML(xmlDoc, children, selector)) { - throw new Error('failed to add children to ' + selector + ' in ' + config_path); - } - } else { - if (!xml_helpers.pruneXML(xmlDoc, children, selector)) { - throw new Error('failed to remove children from ' + selector + ' in ' + config_path); - } - } - }); - } - - fs.writeFileSync(config_path, xmlDoc.write({indent: 4})); -} - -function uninstall(project_dir, plugin_dir, plugin_et, variables) { - - assets && assets.forEach(function (asset) { - var targetPath = path.resolve(project_dir, assetsDir, asset.attrib['target']); - shell.rm('-rf', targetPath); - }); - - sourceFiles && sourceFiles.forEach(function (sourceFile) { - var destDir = path.resolve(project_dir, sourceFile.attrib['target-dir']); - var destFilePath = path.resolve(destDir, path.basename(sourceFile.attrib['src'])); - shell.rm('-rf', destFilePath); - }); - - updateConfigXml("uninstall", configFilePath, plugin_et); - - et.register_namespace("csproj", "http://schemas.microsoft.com/developer/msbuild/2003"); projectChanges && projectChanges.forEach(function (configNode) { @@ -180,8 +92,7 @@ function uninstall(project_dir, plugin_dir, plugin_et, variables) { fs.writeFileSync(projPath, docStr); } }); -} - +*/ module.exports = { www_dir:function(project_dir) { return path.join(project_dir, 'www'); @@ -189,16 +100,25 @@ module.exports = { package_name:function(project_dir) { return xml_helpers.parseElementtreeSync(path.join(project_dir, 'Properties', 'WMAppManifest.xml')).find('App').attrib.ProductID; }, + parseWP7ProjectFile:function(project_dir) { + var project_files = glob.sync(path.join(project_dir, '*.csproj')); + if (project_files.length === 0) { + throw new Error('does not appear to be a Windows Phone project (no .csproj file)'); + } + return new csproj(project_files[0]); + }, "source-file":{ - install:function(source_el, plugin_dir, project_dir, plugin_id) { - var dest = path.join(source_el.attrib['target-dir'], path.basename(source_el.attrib['src'])); + install:function(source_el, plugin_dir, project_dir, plugin_id, project_file) { + var dest = path.join('Plugins', plugin_id, source_el.attrib['target-dir'], path.basename(source_el.attrib['src'])); common.copyFile(plugin_dir, source_el.attrib['src'], project_dir, dest); + // add reference to this file to csproj. + project_file.addSourceFile(dest); }, - uninstall:function(source_el, project_dir, plugin_id) { - var dest = path.join(source_el.attrib['target-dir'], path.basename(source_el.attrib['src'])); + uninstall:function(source_el, project_dir, plugin_id, project_file) { + var dest = path.join('Plugins', plugin_id, source_el.attrib['target-dir'], path.basename(source_el.attrib['src'])); common.removeFile(project_dir, dest); + // remove reference to this file from csproj. + project_file.removeSourceFile(dest); } - }, - "lib-file":{ } }; http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/b356f593/src/util/action-stack.js ---------------------------------------------------------------------- diff --git a/src/util/action-stack.js b/src/util/action-stack.js index 886ff21..e3b63d8 100644 --- a/src/util/action-stack.js +++ b/src/util/action-stack.js @@ -1,4 +1,5 @@ var ios = require('../platforms/ios'), + wp7 = require('../platforms/wp7'), fs = require('fs'); function ActionStack() { @@ -23,15 +24,19 @@ ActionStack.prototype = { this.stack.push(tx); }, process:function(platform, project_dir, callback) { + var project_files; + // parse platform-specific project files once if (platform == 'ios') { - // parse xcode project files once - var project_files = ios.parseIOSProjectFiles(project_dir); + project_files = ios.parseIOSProjectFiles(project_dir); } + if (platform == 'wp7') { + project_files = wp7.parseWP7ProjectFile(project_dir); + } while(this.stack.length) { var action = this.stack.shift(); var handler = action.handler.run; var action_params = action.handler.params; - if (platform == 'ios') action_params.push(project_files); + if (platform == 'ios' || platform == 'wp7') action_params.push(project_files); try { handler.apply(null, action_params); } catch(e) { @@ -42,7 +47,7 @@ ActionStack.prototype = { var undo = this.completed.shift(); var revert = undo.reverter.run; var revert_params = undo.reverter.params; - if (platform == 'ios') revert_params.push(project_files); + if (platform == 'ios' || platform == 'wp7') revert_params.push(project_files); try { revert.apply(null, revert_params); } catch(err) { @@ -60,6 +65,9 @@ ActionStack.prototype = { // write out xcodeproj file fs.writeFileSync(project_files.pbx, project_files.xcode.writeSync()); } + if (platform == 'wp7') { + project_files.write(); + } if (callback) callback(); } }; http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/b356f593/src/util/csproj.js ---------------------------------------------------------------------- diff --git a/src/util/csproj.js b/src/util/csproj.js new file mode 100644 index 0000000..1fbe1b3 --- /dev/null +++ b/src/util/csproj.js @@ -0,0 +1,41 @@ +var xml_helpers = require('./xml_helpers'), + et = require('elementtree'), + fs = require('fs'); + +function csproj(location) { + this.location = location; + this.xml = xml_helpers.parseElementtreeSync(location); + return this; +} + +csproj.prototype = { + write:function() { + fs.writeFileSync(this.location, this.xml.write({indent:4}), 'utf-8'); + }, + addSourceFile:function(relative_path) { + relative_path = relative_path.join('/').join('\\'); + var item = new et.Element('ItemGroup'); + var compile = new et.Element('Compile'); + compile.attrib.Include = relative_path; + item.append(compile); + this.xml.getroot().append(item); + }, + removeSourceFile:function(relative_path) { + relative_path = relative_path.join('/').join('\\'); + var groups = this.xml.findall('ItemGroup'); + for (var i = 0, l = groups.length; i < l; i++) { + var group = groups[i]; + var compiles = group.findall('Compile'); + for (var j = 0, k = compiles.length; j < k; j++) { + var compile = compiles[j]; + if (compile.attrib.Include == relative_path) { + group.remove(0, compile); + return true; + } + } + } + return false; + } +}; + +module.exports = csproj;
