You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by gt...@apache.org on 2013/03/22 23:49:55 UTC

[10/14] git commit: test fixes and convention tweaks following merging in "merges" functionality

test fixes and convention  tweaks following merging in "merges" functionality


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

Branch: refs/heads/next
Commit: ec020e7f4f2903566d1a1907f545241f9dc8fef0
Parents: c20111f
Author: Fil Maj <ma...@gmail.com>
Authored: Mon Mar 4 16:06:15 2013 -0800
Committer: Fil Maj <ma...@gmail.com>
Committed: Mon Mar 4 16:06:15 2013 -0800

----------------------------------------------------------------------
 spec/build.spec.js                      |  199 --------------------------
 spec/metadata/android_parser.spec.js    |   48 +++----
 spec/metadata/blackberry_parser.spec.js |   52 +++----
 spec/metadata/ios_parser.spec.js        |   48 +++----
 spec/platform.spec.js                   |    3 +-
 src/metadata/android_parser.js          |   17 ++-
 src/metadata/blackberry_parser.js       |   13 +-
 src/metadata/ios_parser.js              |   15 +-
 src/platform.js                         |   48 ++----
 9 files changed, 100 insertions(+), 343 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ec020e7f/spec/build.spec.js
----------------------------------------------------------------------
diff --git a/spec/build.spec.js b/spec/build.spec.js
deleted file mode 100644
index 9eeffb5..0000000
--- a/spec/build.spec.js
+++ /dev/null
@@ -1,199 +0,0 @@
-/**
-    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 cordova = require('../cordova'),
-    et = require('elementtree'),
-    shell = require('shelljs'),
-    path = require('path'),
-    fs = require('fs'),
-    config_parser = require('../src/config_parser'),
-    android_parser = require('../src/metadata/android_parser'),
-    ios_parser = require('../src/metadata/ios_parser'),
-    blackberry_parser = require('../src/metadata/blackberry_parser'),
-    hooker = require('../src/hooker'),
-    fixtures = path.join(__dirname, 'fixtures'),
-    hooks = path.join(fixtures, 'hooks'),
-    tempDir = path.join(__dirname, '..', 'temp'),
-    cordova_project = path.join(fixtures, 'projects', 'cordova'),
-    ios_project_path = path.join(cordova_project, 'platforms', 'ios'),
-    blackberry_project_path = path.join(cordova_project, 'platforms', 'blackberry'),
-    www_config = path.join(cordova_project, 'www', 'config.xml');
-
-
-
-var cwd = process.cwd();
-
-describe('build command', function() {
-    beforeEach(function() {
-        shell.rm('-rf', tempDir);
-        shell.mkdir('-p', tempDir);
-    });
-
-    it('should not run inside a Cordova-based project with no added platforms', function() {
-        this.after(function() {
-            process.chdir(cwd);
-        });
-
-        cordova.create(tempDir);
-        process.chdir(tempDir);
-        expect(function() {
-            cordova.build();
-        }).toThrow();
-    });
-    
-    it('should run inside a Cordova-based project with at least one added platform', function() {
-        // move platform project fixtures over to fake cordova into thinking platforms were added
-        // TODO: possibly add this to helper?
-        shell.mv('-f', path.join(cordova_project, 'platforms', 'blackberry'), path.join(tempDir));
-        shell.mv('-f', path.join(cordova_project, 'platforms', 'ios'), path.join(tempDir));
-        this.after(function() {
-            process.chdir(cwd);
-            shell.mv('-f', path.join(tempDir, 'blackberry'), path.join(cordova_project, 'platforms', 'blackberry'));
-            shell.mv('-f', path.join(tempDir, 'ios'), path.join(cordova_project, 'platforms', 'ios'));
-        });
-
-        process.chdir(cordova_project);
-
-        var prepare_spy = spyOn(cordova, 'prepare');
-        var compile_spy = spyOn(cordova, 'compile');
-        expect(function() {
-            cordova.build();
-            var prep_cb = prepare_spy.mostRecentCall.args[0];
-            prep_cb();
-            expect(prepare_spy).toHaveBeenCalled();
-            expect(compile_spy).toHaveBeenCalled();
-        }).not.toThrow();
-    });
-    it('should not run outside of a Cordova-based project', function() {
-        this.after(function() {
-            process.chdir(cwd);
-        });
-
-        shell.mkdir('-p', tempDir);
-        process.chdir(tempDir);
-
-        expect(function() {
-            cordova.build();
-        }).toThrow();
-    });
-
-    describe('hooks', function() {
-        var s, p, c;
-        beforeEach(function() {
-            s = spyOn(hooker.prototype, 'fire').andReturn(true);
-            p = spyOn(cordova, 'prepare');
-            c = spyOn(cordova, 'compile');
-        });
-
-        describe('when platforms are added', function() {
-            beforeEach(function() {
-                shell.mv('-f', path.join(cordova_project, 'platforms', 'blackberry'), path.join(tempDir));
-                shell.mv('-f', path.join(cordova_project, 'platforms', 'ios'), path.join(tempDir));
-                process.chdir(cordova_project);
-            });
-            afterEach(function() {
-                shell.mv('-f', path.join(tempDir, 'blackberry'), path.join(cordova_project, 'platforms', 'blackberry'));
-                shell.mv('-f', path.join(tempDir, 'ios'), path.join(cordova_project, 'platforms', 'ios'));
-                process.chdir(cwd);
-            });
-
-            it('should fire before hooks through the hooker module', function() {
-                cordova.build();
-                expect(s).toHaveBeenCalledWith('before_build');
-            });
-            it('should fire after hooks through the hooker module', function() {
-                cordova.build();
-                p.mostRecentCall.args[0](); // prep cb
-                c.mostRecentCall.args[0](); // compile cb
-                expect(s).toHaveBeenCalledWith('after_build');
-            });
-        });
-
-        describe('with no platforms added', function() {
-            beforeEach(function() {
-                cordova.create(tempDir);
-                process.chdir(tempDir);
-            });
-            afterEach(function() {
-                process.chdir(cwd);
-            });
-            it('should not fire the hooker', function() {
-                expect(function() {
-                    cordova.build();
-                }).toThrow();
-                expect(s).not.toHaveBeenCalledWith('before_build');
-                expect(s).not.toHaveBeenCalledWith('after_build');
-            });
-        });
-
-    });
-
-    describe('merges', function() {
-        describe('per platform', function() {
-            beforeEach(function() {
-                process.chdir(cordova_project);
-            });
-
-            afterEach(function() {
-                process.chdir(cwd);
-            });
-
-            describe('Android', function() {
-                it('should call android_parser\'s update_overrides', function() {
-                    spyOn(require('shelljs'), 'exec').andReturn({code:0});
-                    var s = spyOn(android_parser.prototype, 'update_overrides');
-
-                    cordova.build('android');
-                    expect(s).toHaveBeenCalled();
-                });
-
-            });
-
-            describe('iOS', function() {
-                it('should call ios_parser\'s update_overrides', function(done) {
-                    var parser = new ios_parser(ios_project_path);
-                    var config = new config_parser(www_config);
-
-                    var s = spyOn(parser, 'update_overrides');
-                    parser.update_project(config, function() {
-                        expect(s).toHaveBeenCalled();
-                        done();
-                    });
-                });
-
-            });
-
-            describe('BlackBerry', function() {
-                it('should call blackberry_parser\'s update_overrides', function(done) {
-                    var parser = new blackberry_parser(blackberry_project_path);
-                    var config = new config_parser(www_config);
-
-                    var s = spyOn(parser, 'update_overrides');
-                    parser.update_project(config, function() {
-                        expect(s).toHaveBeenCalled();
-                        done();
-                    });
-                });
-
-            });
-
-
-        });
-    });
-
-});

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ec020e7f/spec/metadata/android_parser.spec.js
----------------------------------------------------------------------
diff --git a/spec/metadata/android_parser.spec.js b/spec/metadata/android_parser.spec.js
index 0f965e7..d051c6f 100644
--- a/spec/metadata/android_parser.spec.js
+++ b/spec/metadata/android_parser.spec.js
@@ -170,51 +170,32 @@ describe('android project parser', function() {
                 parser.update_www();
                 expect(fs.readFileSync(path.join(android_project_path, 'assets', 'www', 'cordova.js'),'utf-8')).toBe(fs.readFileSync(path.join(util.libDirectory, 'cordova-android', 'framework', 'assets', 'js', 'cordova.android.js'), 'utf-8'));
             });
-            it('should call out to util.deleteSvnFolders', function() {
-                var spy = spyOn(util, 'deleteSvnFolders');
-                parser.update_www();
-                expect(spy).toHaveBeenCalled();
-            });
         });
 
         describe('update_overrides method',function() {
-
-            it('should copy a new file from merges into www', function() {
-
-                var newFile = path.join(project_path, 'merges','android', 'merge.js');
-
-                this.after(function() {
-                    shell.rm('-rf', path.join(project_path, 'merges','android','merge.js'));
-                });
-
+            var mergesPath = path.join(project_path, 'merges', 'android');
+            var newFile = path.join(mergesPath, 'merge.js');
+            beforeEach(function() {
+                shell.mkdir('-p', mergesPath);
                 fs.writeFileSync(newFile, 'alert("sup");', 'utf-8');
+            });
+            afterEach(function() {
+                shell.rm('-rf', mergesPath);
+            });
+            it('should copy a new file from merges into www', function() {
                 parser.update_overrides();
                 expect(fs.existsSync(path.join(android_project_path, 'assets', 'www', 'merge.js'))).toBe(true);
             });
 
             it('should copy a file from merges over a file in www', function() {
-
-                var newFile = path.join(project_path, 'merges','android', 'merge.js');
                 var newFileWWW = path.join(project_path, 'www','merge.js');
-
+                fs.writeFileSync(newFileWWW, 'var foo=1;', 'utf-8');
                 this.after(function() {
-                    shell.rm('-rf', path.join(project_path, 'merges','android','merge.js'));
-                    shell.rm('-rf',path.join(project_path,'www','merge.js'));
+                    shell.rm('-rf', newFileWWW);
                 });
-
-                fs.writeFileSync(newFile, 'var foo=2;', 'utf-8');
-                fs.writeFileSync(newFileWWW, 'var foo=1;', 'utf-8');
                 parser.update_overrides();
                 expect(fs.existsSync(path.join(android_project_path, 'assets', 'www', 'merge.js'))).toBe(true);
-                console.log(fs.readFileSync(path.join(android_project_path, 'assets', 'www', 'merge.js')));
-                expect(fs.readFileSync(path.join(android_project_path, 'assets', 'www', 'merge.js'),'utf-8')).toEqual('var foo=2;');
-            });
-
-
-            it('should call out to util.deleteSvnFolders', function() {
-                var spy = spyOn(util, 'deleteSvnFolders');
-                parser.update_overrides();
-                expect(spy).toHaveBeenCalled();
+                expect(fs.readFileSync(path.join(android_project_path, 'assets', 'www', 'merge.js'),'utf-8')).toEqual('alert("sup");');
             });
         });
 
@@ -229,6 +210,11 @@ describe('android project parser', function() {
                 parser.update_project(config);
                 expect(spyConfig).toHaveBeenCalled();
             });
+            it('should call out to util.deleteSvnFolders', function() {
+                var spy = spyOn(util, 'deleteSvnFolders');
+                parser.update_project(config);
+                expect(spy).toHaveBeenCalled();
+            });
         });
     });
 });

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ec020e7f/spec/metadata/blackberry_parser.spec.js
----------------------------------------------------------------------
diff --git a/spec/metadata/blackberry_parser.spec.js b/spec/metadata/blackberry_parser.spec.js
index 21eb826..3336b59 100644
--- a/spec/metadata/blackberry_parser.spec.js
+++ b/spec/metadata/blackberry_parser.spec.js
@@ -138,54 +138,36 @@ describe('blackberry project parser', function() {
                 var bb_cfg = fs.readFileSync(blackberry_config, 'utf-8');
                 expect(bb_cfg).not.toBe(www_cfg);
             });
-            it('should call out to util.deleteSvnFolders', function() {
-                var spy = spyOn(util, 'deleteSvnFolders');
-                parser.update_www();
-                expect(spy).toHaveBeenCalled();
-            });
         });
 
         describe('update_overrides method',function() {
+            var mergesPath = path.join(project_path, 'merges', 'blackberry');
+            var newFile = path.join(mergesPath, 'merge.js');
+            beforeEach(function() {
+                shell.mkdir('-p', mergesPath);
+                fs.writeFileSync(newFile, 'alert("sup");', 'utf-8');
+            });
+            afterEach(function() {
+                shell.rm('-rf', mergesPath);
+            });
 
             it('should copy a new file from merges into www', function() {
-
-                var newFile = path.join(project_path, 'merges','blackberry', 'merge.js');
-
-                this.after(function() {
-                    shell.rm('-rf', path.join(project_path, 'merges','blackberry','merge.js'));
-                });
-
-                fs.writeFileSync(newFile, 'alert("sup");', 'utf-8');
                 parser.update_overrides();
                 expect(fs.existsSync(path.join(blackberry_project_path, 'www', 'merge.js'))).toBe(true);
             });
 
             it('should copy a file from merges over a file in www', function() {
-
-                var newFile = path.join(project_path, 'merges','blackberry', 'merge.js');
                 var newFileWWW = path.join(project_path, 'www','merge.js');
-
+                fs.writeFileSync(newFileWWW, 'var foo=1;', 'utf-8');
                 this.after(function() {
-                    shell.rm('-rf', path.join(project_path, 'merges','blackberry','merge.js'));
-                    shell.rm('-rf',path.join(project_path,'www','merge.js'));
+                    shell.rm('-rf', newFileWWW);
                 });
-
-                fs.writeFileSync(newFile, 'var foo=2;', 'utf-8');
-                fs.writeFileSync(newFileWWW, 'var foo=1;', 'utf-8');
                 parser.update_overrides();
                 expect(fs.existsSync(path.join(blackberry_project_path, 'www', 'merge.js'))).toBe(true);
-                expect(fs.readFileSync(path.join(blackberry_project_path, 'www', 'merge.js'),'utf-8')).toEqual('var foo=2;');
-            });
-
-
-            it('should call out to util.deleteSvnFolders', function() {
-                var spy = spyOn(util, 'deleteSvnFolders');
-                parser.update_overrides();
-                expect(spy).toHaveBeenCalled();
+                expect(fs.readFileSync(path.join(blackberry_project_path, 'www', 'merge.js'),'utf-8')).toEqual('alert("sup");');
             });
         });
 
-
         describe('update_project method', function() {
             var cordova_config_path = path.join(project_path, '.cordova', 'config.json');
             var original_config_json = fs.readFileSync(cordova_config_path, 'utf-8');
@@ -217,10 +199,18 @@ describe('blackberry project parser', function() {
                     parser.update_project(config);
                     expect(spyEnv).not.toHaveBeenCalled();
                 });
-                it('should write out project properties', function() {
+                it('should write out project properties', function(done) {
                     var spyProps = spyOn(parser, 'write_project_properties');
                     parser.update_project(config, function() { 
                         expect(spyProps).toHaveBeenCalled();
+                        done();
+                    });
+                });
+                it('should call out to util.deleteSvnFolders', function(done) {
+                    var spy = spyOn(util, 'deleteSvnFolders');
+                    parser.update_project(config, function() {
+                        expect(spy).toHaveBeenCalled();
+                        done();
                     });
                 });
             });

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ec020e7f/spec/metadata/ios_parser.spec.js
----------------------------------------------------------------------
diff --git a/spec/metadata/ios_parser.spec.js b/spec/metadata/ios_parser.spec.js
index de62b1c..dbd4816 100644
--- a/spec/metadata/ios_parser.spec.js
+++ b/spec/metadata/ios_parser.spec.js
@@ -159,51 +159,35 @@ describe('ios project parser', function () {
                 parser.update_www();
                 expect(fs.readFileSync(path.join(ios_project_path, 'www', 'cordova.js'), 'utf-8')).toBe(fs.readFileSync(path.join(util.libDirectory, 'cordova-ios', 'CordovaLib', 'cordova.ios.js'), 'utf-8'));
             });
-            it('should call out to util.deleteSvnFolders', function () {
-                var spy = spyOn(util, 'deleteSvnFolders');
-                parser.update_www();
-                expect(spy).toHaveBeenCalled();
-            });
         });
 
         describe('update_overrides method', function () {
+            var mergesPath = path.join(project_path, 'merges', 'ios');
+            var newFile = path.join(mergesPath, 'merge.js');
+            beforeEach(function() {
+                shell.mkdir('-p', mergesPath);
+                fs.writeFileSync(newFile, 'alert("sup");', 'utf-8');
+            });
+            afterEach(function() {
+                shell.rm('-rf', mergesPath);
+            });
 
             it('should copy a new file from merges into www', function () {
-
-                var newFile = path.join(project_path, 'merges', 'ios', 'merge.js');
-
-                this.after(function () {
-                    shell.rm('-rf', path.join(project_path, 'merges','ios','merge.js'));
-                });
-
-                fs.writeFileSync(newFile, 'alert("sup");', 'utf-8');
                 parser.update_overrides();
                 expect(fs.existsSync(path.join(ios_project_path, 'www', 'merge.js'))).toBe(true);
             });
 
             it('should copy a file from merges over a file in www', function () {
-
-                var newFile = path.join(project_path, 'merges', 'ios', 'merge.js');
                 var newFileWWW = path.join(project_path, 'www', 'merge.js');
-
+                fs.writeFileSync(newFileWWW, 'var foo=1;', 'utf-8');
                 this.after(function () {
-                    shell.rm('-rf', path.join(project_path, 'merges','ios','merge.js'));
-                    shell.rm('-rf', path.join(project_path, 'www', 'merge.js'));
+                    shell.rm('-rf', newFileWWW);
                 });
 
-                fs.writeFileSync(newFile, 'var foo=2;', 'utf-8');
-                fs.writeFileSync(newFileWWW, 'var foo=1;', 'utf-8');
                 parser.update_overrides();
                 expect(fs.existsSync(path.join(ios_project_path, 'www', 'merge.js'))).toBe(true);
-                expect(fs.readFileSync(path.join(ios_project_path, 'www', 'merge.js'), 'utf-8')).toEqual('var foo=2;');
+                expect(fs.readFileSync(path.join(ios_project_path, 'www', 'merge.js'), 'utf-8')).toEqual('alert("sup");');
             });
-
-            it('should call out to util.deleteSvnFolders', function() {
-                var spy = spyOn(util, 'deleteSvnFolders');
-                parser.update_overrides();
-                expect(spy).toHaveBeenCalled();
-            });
-
         });
 
         describe('update_project method', function () {
@@ -221,6 +205,14 @@ describe('ios project parser', function () {
                     done();
                 });
             });
+            it('should call out to util.deleteSvnFolders', function(done) {
+                var spy = spyOn(util, 'deleteSvnFolders');
+                var spyConfig = spyOn(parser, 'update_from_config').andCallThrough();
+                parser.update_project(config, function () {
+                    expect(spy).toHaveBeenCalled();
+                    done();
+                });
+            });
         });
     });
 });

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ec020e7f/spec/platform.spec.js
----------------------------------------------------------------------
diff --git a/spec/platform.spec.js b/spec/platform.spec.js
index c49a53c..b8dedec 100644
--- a/spec/platform.spec.js
+++ b/spec/platform.spec.js
@@ -267,10 +267,11 @@ describe('platform command', function() {
                 cr = spyOn(android_parser, 'check_requirements');
             });
             it('should fire before and after hooks through the hooker module', function() {
-                spyOn(android_parser.prototype, 'update_project');
+                var ap = spyOn(android_parser.prototype, 'update_project');
                 cordova.platform('add', 'android');
                 fake_reqs_check();
                 fake_create(path.join(tempDir, 'platforms', 'android'));
+                ap.mostRecentCall.args[1](); // fake out update_project
                 expect(s).toHaveBeenCalledWith('before_platform_add');
                 expect(s).toHaveBeenCalledWith('after_platform_add');
             });

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ec020e7f/src/metadata/android_parser.js
----------------------------------------------------------------------
diff --git a/src/metadata/android_parser.js b/src/metadata/android_parser.js
index c36491a..3dfaf22 100644
--- a/src/metadata/android_parser.js
+++ b/src/metadata/android_parser.js
@@ -131,30 +131,33 @@ module.exports.prototype = {
         var www = path.join(projectRoot, 'www');
         var platformWww = path.join(this.path, 'assets');
         // remove stock platform assets
-        shell.rm('-rf', path.join(platformWww, 'www'));
+        shell.rm('-rf', this.www_dir());
         // copy over all app www assets
         shell.cp('-rf', www, platformWww);
-        platformWww = path.join(platformWww, 'www');
 
         // write out android lib's cordova.js
         var jsPath = path.join(util.libDirectory, 'cordova-android', 'framework', 'assets', 'js', 'cordova.android.js');
-        fs.writeFileSync(path.join(platformWww, 'cordova.js'), fs.readFileSync(jsPath, 'utf-8'), 'utf-8');
+        fs.writeFileSync(path.join(this.www_dir(), 'cordova.js'), fs.readFileSync(jsPath, 'utf-8'), 'utf-8');
 
-        // delete any .svn folders copied over
-        util.deleteSvnFolders(platformWww);
     },
 
     // update the overrides folder into the www folder
     update_overrides:function() {
         var projectRoot = util.isCordova(this.path);
-        var overrides = path.join(projectRoot, 'merges','android','*');
-        shell.cp('-rf', overrides, this.www_dir());
+        var merges_path = path.join(projectRoot, 'merges', 'android');
+        if (fs.existsSync(merges_path)) {
+            var overrides = path.join(merges_path, '*');
+            shell.cp('-rf', overrides, this.www_dir());
+        }
     },
 
     update_project:function(cfg, callback) {
+        var platformWww = path.join(this.path, 'assets');
         this.update_from_config(cfg);
         this.update_www();
         this.update_overrides();
+        // delete any .svn folders copied over
+        util.deleteSvnFolders(platformWww);
         if (callback) callback();
     }
 };

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ec020e7f/src/metadata/blackberry_parser.js
----------------------------------------------------------------------
diff --git a/src/metadata/blackberry_parser.js b/src/metadata/blackberry_parser.js
index cacc260..ae1742c 100644
--- a/src/metadata/blackberry_parser.js
+++ b/src/metadata/blackberry_parser.js
@@ -64,6 +64,7 @@ module.exports.prototype = {
         self.update_from_config(cfg);
         self.update_www();
         self.update_overrides();
+        util.deleteSvnFolders(this.www_dir());
 
         // Do we have BB config?
         var projectRoot = util.isCordova(this.path);
@@ -91,7 +92,7 @@ module.exports.prototype = {
     update_www:function() {
         var projectRoot = util.isCordova(this.path);
         var www = path.join(projectRoot, 'www');
-        var platformWww = path.join(this.path, 'www');
+        var platformWww = this.www_dir();
 
         var finalWww = path.join(this.path, 'finalwww');
         shell.mkdir('-p', finalWww);
@@ -120,16 +121,16 @@ module.exports.prototype = {
         shell.rm('-rf', platformWww);
         shell.mv(finalWww, platformWww);
 
-        util.deleteSvnFolders(platformWww);
     },
 
     // update the overrides folder into the www folder
     update_overrides:function() {
         var projectRoot = util.isCordova(this.path);
-        var platformWww = path.join(this.path, 'www');
-        var overrides = path.join(projectRoot, 'merges','blackberry');
-        shell.cp('-rf', overrides+'/*',platformWww);
-        util.deleteSvnFolders(platformWww);
+        var merges_path = path.join(projectRoot, 'merges', 'blackberry');
+        if (fs.existsSync(merges_path)) {
+            var overrides = path.join(merges_path, '*');
+            shell.cp('-rf', overrides, this.www_dir());
+        }
     },
 
     write_project_properties:function() {

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ec020e7f/src/metadata/ios_parser.js
----------------------------------------------------------------------
diff --git a/src/metadata/ios_parser.js b/src/metadata/ios_parser.js
index 9cf4450..ee235dc 100644
--- a/src/metadata/ios_parser.js
+++ b/src/metadata/ios_parser.js
@@ -140,7 +140,7 @@ module.exports.prototype = {
     update_www:function() {
         var projectRoot = util.isCordova(this.path);
         var www = path.join(projectRoot, 'www');
-        var project_www = path.join(this.path, 'www');
+        var project_www = this.www_dir();
 
         // remove the stock www folder
         shell.rm('-rf', project_www);
@@ -151,18 +151,16 @@ module.exports.prototype = {
         // write out proper cordova.js
         shell.cp('-f', path.join(util.libDirectory, 'cordova-ios', 'CordovaLib', 'cordova.ios.js'), path.join(project_www, 'cordova.js'));
 
-        util.deleteSvnFolders(project_www);
     },
 
     // update the overrides folder into the www folder
     update_overrides:function() {
         var projectRoot = util.isCordova(this.path);
-        var project_www = path.join(this.path, 'www');
-        var overrides = path.join(projectRoot, 'merges','ios');
-        shell.cp('-rf', overrides+'/*',project_www);
-
-        util.deleteSvnFolders(project_www);
-
+        var merges_path = path.join(projectRoot, 'merges', 'ios');
+        if (fs.existsSync(merges_path)) {
+            var overrides = path.join(merges_path, '*');
+            shell.cp('-rf', overrides, this.www_dir());
+        }
     },
 
     update_project:function(cfg, callback) {
@@ -170,6 +168,7 @@ module.exports.prototype = {
         this.update_from_config(cfg, function() {
             self.update_www();
             self.update_overrides();
+            util.deleteSvnFolders(self.www_dir());
             if (callback) callback();
         });
     }

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ec020e7f/src/platform.js
----------------------------------------------------------------------
diff --git a/src/platform.js b/src/platform.js
index 604561d..966a76f 100644
--- a/src/platform.js
+++ b/src/platform.js
@@ -28,6 +28,12 @@ var config_parser     = require('./config_parser'),
     blackberry_parser = require('./metadata/blackberry_parser'),
     shell             = require('shelljs');
 
+var parsers = {
+    "android":android_parser,
+    "ios":ios_parser,
+    "blackberry":blackberry_parser
+};
+
 module.exports = function platform(command, targets, callback) {
     var projectRoot = cordova_util.isCordova(process.cwd());
 
@@ -38,8 +44,8 @@ module.exports = function platform(command, targets, callback) {
     var hooks = new hooker(projectRoot),
         end;
 
-    var createOverrides = function(target){
-        shell.mkdir('-p', path.join('merges',target));
+    var createOverrides = function(target) {
+        shell.mkdir('-p', path.join(projectRoot, 'merges', target));
     };
 
     if (arguments.length === 0) command = 'ls';
@@ -91,34 +97,12 @@ module.exports = function platform(command, targets, callback) {
                                 throw new Error('An error occured during creation of ' + target + ' sub-project. ' + create_output);
                             }
 
-                            switch(target) {
-                                case 'android':
-                                    var android = new android_parser(output);
-                                    createOverrides(target);
-
-                                    android.update_project(cfg);
-                                    hooks.fire('after_platform_add');
-                                    end();
-                                    break;
-                                case 'ios':
-                                    var ios = new ios_parser(output);
-                                    createOverrides(target);
-
-                                    ios.update_project(cfg, function() {
-                                        hooks.fire('after_platform_add');
-                                        end();
-                                    });
-                                    break;
-                                case 'blackberry':
-                                    var bb = new blackberry_parser(output);
-                                    createOverrides(target);
-
-                                    bb.update_project(cfg, function() {
-                                        hooks.fire('after_platform_add');
-                                        end();
-                                    });
-                                    break;
-                            }
+                            var parser = new parsers[target](output);
+                            parser.update_project(cfg, function() {
+                                createOverrides(target);
+                                hooks.fire('after_platform_add');
+                                end();
+                            });
                         });
                     }
                 });
@@ -129,11 +113,11 @@ module.exports = function platform(command, targets, callback) {
             targets.forEach(function(target) {
                 hooks.fire('before_platform_rm');
                 shell.rm('-rf', path.join(projectRoot, 'platforms', target));
-                shell.rm('-rf', path.join(projectRoot,'merges',target));
+                shell.rm('-rf', path.join(projectRoot, 'merges', target));
                 hooks.fire('after_platform_rm');
             });
             break;
         default:
-            throw ('Unrecognized command "' + command + '". Use either `add`, `remove`, or `list`.');
+            throw new Error('Unrecognized command "' + command + '". Use either `add`, `remove`, or `list`.');
     }
 };