Updated Branches:
  refs/heads/future 1884aac2a -> bcd609841

blackberry handler test stubs.


Project: http://git-wip-us.apache.org/repos/asf/cordova-plugman/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugman/commit/bcd60984
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugman/tree/bcd60984
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugman/diff/bcd60984

Branch: refs/heads/future
Commit: bcd60984115288958ca81857bbd4deb8eadbc520
Parents: 1884aac
Author: Fil Maj <[email protected]>
Authored: Mon Apr 22 17:52:13 2013 -0700
Committer: Fil Maj <[email protected]>
Committed: Mon Apr 22 17:52:13 2013 -0700

----------------------------------------------------------------------
 spec/platforms/blackberry.spec.js |   50 ++++++++
 src/platforms/blackberry.js       |  215 ++++++++++---------------------
 2 files changed, 120 insertions(+), 145 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/bcd60984/spec/platforms/blackberry.spec.js
----------------------------------------------------------------------
diff --git a/spec/platforms/blackberry.spec.js 
b/spec/platforms/blackberry.spec.js
index e69de29..f599845 100644
--- a/spec/platforms/blackberry.spec.js
+++ b/spec/platforms/blackberry.spec.js
@@ -0,0 +1,50 @@
+var blackberry = require('../../src/platforms/blackberry');
+
+describe('blackberry project handler', function() {
+    it('should have an install function', function() {
+        expect(typeof blackberry.install).toEqual('function');
+    });
+    it('should have an uninstall function', function() {
+        expect(typeof blackberry.uninstall).toEqual('function');
+    });
+    it('should return cordova-blackberry project www location using www_dir', 
function() {
+        expect(android.www_dir('/')).toEqual('/www');
+    });
+
+    describe('installation', function() {
+        describe('of <source-file> elements', function() {
+            it('should copy stuff from one location to another by calling 
common.straightCopy');
+            it('should throw if source file cannot be found');
+            it('should throw if target file already exists');
+        });
+        describe('of <library-file> elements', function() {
+            it('should copy stuff from one location to another by calling 
common.straightCopy');
+            it('should throw if source file cannot be found');
+            it('should throw if target file already exists');
+        });
+        describe('of <config-file> elements', function() {
+            it('should only target config.xml if that is applicable');
+            it('should call into xml helper\'s graftXML');
+        });
+        it('should interpolate variables properly');
+    });
+
+    describe('uninstallation', function() {
+        describe('of <source-file> elements', function() {
+            it('should remove stuff by calling common.deleteJava');
+            it('should remove empty dirs from java src dir heirarchy');
+        });
+        describe('of <library-file> elements', function() {
+            it('should remove stuff using fs.unlinkSync');
+        });
+        describe('of <config-file> elements', function() {
+            it('should only target config.xml if that is applicable');
+            it('should only target plugins.xml if that is applicable');
+            it('should call into xml helper\'s pruneXML');
+        });
+        describe('of <asset> elements', function() {
+            it('should remove www\'s plugins <plugin-id> directory');
+            it('should remove stuff specified by the element');
+        });
+    });
+});

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/bcd60984/src/platforms/blackberry.js
----------------------------------------------------------------------
diff --git a/src/platforms/blackberry.js b/src/platforms/blackberry.js
index 75b3c3a..c558190 100644
--- a/src/platforms/blackberry.js
+++ b/src/platforms/blackberry.js
@@ -26,160 +26,85 @@ var fs = require('fs')  // use existsSync in 0.6.x
    , xml_helpers = require(path.join(__dirname, '..', 'util', 'xml-helpers'));
 
 module.exports = {
-    handleInstall:function(project_dir, plugin_dir, plugin_et, variables) {
-        handlePlugin('install', project_dir, plugin_dir, plugin_et, variables);
+    install:function(transactions, plugin_id, project_dir, plugin_dir, 
variables, callback) {
+        handlePlugin('install', plugin_id, transactions, project_dir, 
plugin_dir, variables, callback);
     },
-    handleUninstall:function(project_dir, plugin_dir, plugin_et, variables) {
-        handlePlugin('uninstall', project_dir, plugin_dir, plugin_et, 
variables);
-    },
-    forceInstall:function(project_dir, plugin_dir, plugin_et, variables) {
-        handlePlugin('force-install', project_dir, plugin_dir, plugin_et, 
variables);
-    },
-    forceUninstall:function(project_dir, plugin_dir, plugin_et, variables) {
-        handlePlugin('force-uninstall', project_dir, plugin_dir, plugin_et, 
variables);
+    uninstall:function(transactions, plugin_id, project_dir, plugin_dir, 
callback) {
+        handlePlugin('uninstall', plugin_id, transactions, project_dir, 
plugin_dir, null, callback);
     },
     www_dir:function(project_dir) {
         return path.join(project_dir, 'www');
     }
 };
 
-function handlePlugin(action, project_dir, plugin_dir, plugin_et, variables) {
-    var plugin_id = plugin_et._root.attrib['id']
-      , version = plugin_et._root.attrib['version']
-      , external_hosts = []
-      , platformTag = plugin_et.find('./platform[@name="blackberry"]')
-
-    if (!platformTag) {
-        // Either this plugin doesn't support this platform, or it's a JS-only 
plugin.
-        // Either way, return now.
-        return;
-    }
-
-    var sourceFiles = platformTag.findall('./source-file')
-      , libFiles = platformTag.findall('./library-file')
-      , configChanges = getConfigChanges(platformTag);
-    // find which config-files we're interested in
-    Object.keys(configChanges).forEach(function (configFile) {
-        if (!fs.existsSync(path.resolve(project_dir, configFile))) {
-            delete configChanges[configFile];
-        }
-    });
-
-    // collision detection 
-    if(action.match(/force-/) == null) {
-      if(action == "install" && pluginInstalled(plugin_et, project_dir)) {
-          throw new Error("Plugin "+plugin_id+" already installed");
-      } else if(action == "uninstall" && !pluginInstalled(plugin_et, 
project_dir)) {
-          throw new Error("Plugin "+plugin_id+" not installed");
-      }
-    } else {
-      action = action.replace('force-', '');
-    }
-    
-    // move source files
-    sourceFiles.forEach(function (sourceFile) {
-        var srcDir = path.resolve(project_dir,
-                                sourceFile.attrib['target-dir'])
-          , destFile = path.resolve(srcDir,
-                                path.basename(sourceFile.attrib['src']));
-
-        if (action == 'install') {
-            shell.mkdir('-p', srcDir);
-            var srcFile = srcPath(plugin_dir, sourceFile.attrib['src']);
-            shell.cp(srcFile, destFile);
-        } else {
-            fs.unlinkSync(destFile);
-            // check if directory is empty
-            var curDir = srcDir;
-            while(curDir !== path.join(project_dir, 'src')) {
-                if(fs.readdirSync(curDir).length == 0) {
-                    fs.rmdirSync(curDir);
-                    curDir = path.resolve(curDir, '..');
-                } else {
-                    // directory not empty...do nothing
+function handlePlugin(action, plugin_id, txs, project_dir, plugin_dir, 
variables, callback) {
+    var completed = [];
+    while(txs.length) {
+        var mod = txs.shift();
+        try {
+            switch(mod.tag.toLowerCase()) {
+                case 'source-file':
+                    var destFile = path.join(mod.attrib['target-dir'], 
path.basename(mod.attrib['src']));
+
+                    if (action == 'install') {
+                        common.straightCopy(plugin_dir, mod.attrib['src'], 
project_dir, destFile);
+                    } else {
+                        common.deleteJava(project_dir, destFile);
+                    }
+                    break;
+                case 'library-file':
+                    var destFile = path.join(mod.attrib['target-dir'], 
path.basename(mod.attrib['src']));
+
+                    if (action == 'install') {
+                        common.straightCopy(plugin_dir, mod.attrib['src'], 
project_dir, destFile);
+                    } else {
+                        fs.unlinkSync(path.resolve(project_dir, destFile));
+                    }
+                    break;
+                case 'config-file':
+                    // Only modify config files that exist.
+                    var config_file = path.resolve(project_dir, 
mod.attrib['target']);
+                    if (fs.existsSync(config_file)) {
+                        var xmlDoc = 
xml_helpers.parseElementtreeSync(config_file);
+                        var selector = mod.attrib["parent"];
+                        var children = mod.findall('*');
+
+                        if (action == 'install') {
+                            if (!xml_helpers.graftXML(xmlDoc, children, 
selector)) {
+                                throw new Error('failed to add config-file 
children to "' + filename + '"');
+                            }
+                        } else {
+                            if (!xml_helpers.pruneXML(xmlDoc, children, 
selector)) {
+                                throw new Error('failed to remove config-file 
children from "' + filename + '"');
+                            }
+                        }
+
+                        var output = xmlDoc.write({indent: 4});
+                        fs.writeFileSync(config_file, output);
+                    }
+                    break;
+                case 'asset':
+                    if (action == 'uninstall') {
+                        var target = mod.attrib.target;
+                        shell.rm('-rf', path.resolve(module.exports.www_dir(), 
target));
+                        shell.rm('-rf', path.resolve(module.exports.www_dir(), 
'plugins', plugin_id));
+                    }
+                    break;
+                default:
+                    throw new Error('Unrecognized plugin.xml element/action in 
blackberry installer: ' + mod.tag);
                     break;
-                }
-            }
-        }
-    })
-
-    // move library files
-    libFiles.forEach(function (libFile) {
-        var libDir = path.resolve(project_dir,
-                                libFile.attrib['target-dir'])
-
-        if (action == 'install') {
-            shell.mkdir('-p', libDir);
-
-            var src = path.resolve(plugin_dir,
-                                        libFile.attrib['src']),
-                dest = path.resolve(libDir,
-                                path.basename(libFile.attrib['src']));
-            
-            shell.cp(src, dest);
-        } else {
-            var destFile = path.resolve(libDir,
-                            path.basename(libFile.attrib['src']));
-
-            fs.unlinkSync(destFile);
-            // check if directory is empty
-            var files = fs.readdirSync(libDir);
-            if(files.length == 0) {
-                shell.rm('-rf', libDir);
             }
+        } catch(e) {
+            // propagate error up and provide completed tx log
+            e.transactions = {
+                executed:completed,
+                incomplete:txs.unshift(mod)
+            };
+            if (callback) callback(e);
+            else throw e;
+            return;
         }
-    })
-
-
-    // edit configuration files
-    Object.keys(configChanges).forEach(function (filename) {
-        var filepath = path.resolve(project_dir, filename),
-            xmlDoc = xml_helpers.parseElementtreeSync(filepath),
-            output;
-
-        configChanges[filename].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 ' + filename);
-                }
-            } else {
-                if (!xml_helpers.pruneXML(xmlDoc, children, selector)) {
-                    throw new Error('failed to remove children from' + 
filename);
-                }
-            }
-        });
-
-        output = xmlDoc.write({indent: 4});
-        fs.writeFileSync(filepath, output);
-    });
-
-    // Remove all assets and JS modules installed by this plugin.
-    if (action == 'uninstall') {
-        var assets = plugin_et.findall('./asset');
-        assets && assets.forEach(function(asset) {
-            var target = asset.attrib.target;
-            shell.rm('-rf', path.join(project_dir, 'www', target));
-        });
-
-        shell.rm('-rf', path.join(project_dir, 'www', 'plugins', plugin_id));
-    }
-}
-
-
-function srcPath(pluginPath, filename) {
-    return path.resolve(pluginPath, filename);
-}
-
-function pluginInstalled(plugin_et, project_dir) {
-    var config_tag = 
plugin_et.find('./platform[@name="blackberry"]/config-file[@target="config.xml"]/feature');
-    if (!config_tag) {
-        return false;
+        completed.push(mod);
     }
-    var plugin_name = config_tag.attrib.id;
-    return (fs.readFileSync(path.resolve(project_dir, 'config.xml'), 'utf8')
-           .match(new RegExp(plugin_name, "g")) != null);
+    if (callback) callback();
 }
-

Reply via email to