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

[04/10] Added command line project creation.

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/CordovaMac/www/css/index.css
----------------------------------------------------------------------
diff --git a/CordovaMac/www/css/index.css b/CordovaMac/www/css/index.css
deleted file mode 100644
index 51daa79..0000000
--- a/CordovaMac/www/css/index.css
+++ /dev/null
@@ -1,115 +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.
- */
-* {
-    -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */
-}
-
-body {
-    -webkit-touch-callout: none;                /* prevent callout to copy image, etc when tap to hold */
-    -webkit-text-size-adjust: none;             /* prevent webkit from resizing text to fit */
-    -webkit-user-select: none;                  /* prevent copy paste, to allow, change 'none' to 'text' */
-    background-color:#E4E4E4;
-    background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
-    background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
-    background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
-    background-image:-webkit-gradient(
-        linear,
-        left top,
-        left bottom,
-        color-stop(0, #A7A7A7),
-        color-stop(0.51, #E4E4E4)
-    );
-    background-attachment:fixed;
-    font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif;
-    font-size:12px;
-    height:100%;
-    margin:0px;
-    padding:0px;
-    text-transform:uppercase;
-    width:100%;
-}
-
-/* Portrait layout (default) */
-.app {
-    background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */
-    position:absolute;             /* position in the center of the screen */
-    left:50%;
-    top:50%;
-    height:50px;                   /* text area height */
-    width:225px;                   /* text area width */
-    text-align:center;
-    padding:180px 0px 0px 0px;     /* image height is 200px (bottom 20px are overlapped with text) */
-    margin:-115px 0px 0px -112px;  /* offset vertical: half of image height and text area height */
-                                   /* offset horizontal: half of text area width */
-}
-
-/* Landscape layout (with min-width) */
-@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) {
-    .app {
-        background-position:left center;
-        padding:75px 0px 75px 170px;  /* padding-top + padding-bottom + text area = image height */
-        margin:-90px 0px 0px -198px;  /* offset vertical: half of image height */
-                                      /* offset horizontal: half of image width and text area width */
-    }
-}
-
-h1 {
-    font-size:24px;
-    font-weight:normal;
-    margin:0px;
-    overflow:visible;
-    padding:0px;
-    text-align:center;
-}
-
-.event {
-    border-radius:4px;
-    -webkit-border-radius:4px;
-    color:#FFFFFF;
-    font-size:12px;
-    margin:0px 30px;
-    padding:2px 0px;
-}
-
-.event.listening {
-    background-color:#333333;
-    display:block;
-}
-
-.event.received {
-    background-color:#4B946A;
-    display:none;
-}
-
-@keyframes fade {
-    from { opacity: 1.0; }
-    50% { opacity: 0.4; }
-    to { opacity: 1.0; }
-}
- 
-@-webkit-keyframes fade {
-    from { opacity: 1.0; }
-    50% { opacity: 0.4; }
-    to { opacity: 1.0; }
-}
- 
-.blink {
-    animation:fade 3000ms infinite;
-    -webkit-animation:fade 3000ms infinite;
-}

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/CordovaMac/www/img/logo.png
----------------------------------------------------------------------
diff --git a/CordovaMac/www/img/logo.png b/CordovaMac/www/img/logo.png
deleted file mode 100644
index 9519e7d..0000000
Binary files a/CordovaMac/www/img/logo.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/CordovaMac/www/index.html
----------------------------------------------------------------------
diff --git a/CordovaMac/www/index.html b/CordovaMac/www/index.html
deleted file mode 100644
index 48d3e36..0000000
--- a/CordovaMac/www/index.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<!--
-    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.
--->
-<html>
-    <head>
-        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-        <meta name="format-detection" content="telephone=no" />
-        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
-        <link rel="stylesheet" type="text/css" href="css/index.css" />
-        <title>Hello World</title>
-    </head>
-    <body>
-        <div class="app">
-            <h1>Apache Cordova</h1>
-            <div id="deviceready" class="blink">
-                <p class="event listening">Connecting to Device</p>
-                <p class="event received">Device is Ready</p>
-            </div>
-        </div>
-        <script type="text/javascript" src="cordova.osx.js"></script>
-        <script type="text/javascript" src="js/index.js"></script>
-        <script type="text/javascript">
-            app.initialize();
-        </script>
-    </body>
-</html>

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/CordovaMac/www/js/index.js
----------------------------------------------------------------------
diff --git a/CordovaMac/www/js/index.js b/CordovaMac/www/js/index.js
deleted file mode 100644
index 31d9064..0000000
--- a/CordovaMac/www/js/index.js
+++ /dev/null
@@ -1,49 +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 app = {
-    // Application Constructor
-    initialize: function() {
-        this.bindEvents();
-    },
-    // Bind Event Listeners
-    //
-    // Bind any events that are required on startup. Common events are:
-    // 'load', 'deviceready', 'offline', and 'online'.
-    bindEvents: function() {
-        document.addEventListener('deviceready', this.onDeviceReady, false);
-    },
-    // deviceready Event Handler
-    //
-    // The scope of 'this' is the event. In order to call the 'receivedEvent'
-    // function, we must explicity call 'app.receivedEvent(...);'
-    onDeviceReady: function() {
-        app.receivedEvent('deviceready');
-    },
-    // Update DOM on a Received Event
-    receivedEvent: function(id) {
-        var parentElement = document.getElementById(id);
-        var listeningElement = parentElement.querySelector('.listening');
-        var receivedElement = parentElement.querySelector('.received');
-
-        listeningElement.setAttribute('style', 'display:none;');
-        receivedElement.setAttribute('style', 'display:block;');
-
-        console.log('Received Event: ' + id);
-    }
-};

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/CordovaMac/www/spec.html
----------------------------------------------------------------------
diff --git a/CordovaMac/www/spec.html b/CordovaMac/www/spec.html
deleted file mode 100644
index 71f00de..0000000
--- a/CordovaMac/www/spec.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<!DOCTYPE html>
-<!--
-    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.
--->
-<html>
-    <head>
-        <title>Jasmine Spec Runner</title>
-
-        <!-- jasmine source -->
-        <link rel="shortcut icon" type="image/png" href="spec/lib/jasmine-1.2.0/jasmine_favicon.png">
-        <link rel="stylesheet" type="text/css" href="spec/lib/jasmine-1.2.0/jasmine.css">
-        <script type="text/javascript" src="spec/lib/jasmine-1.2.0/jasmine.js"></script>
-        <script type="text/javascript" src="spec/lib/jasmine-1.2.0/jasmine-html.js"></script>
-
-        <!-- include source files here... -->
-        <script type="text/javascript" src="js/index.js"></script>
-
-        <!-- include spec files here... -->
-        <script type="text/javascript" src="spec/helper.js"></script>
-        <script type="text/javascript" src="spec/index.js"></script>
-
-        <script type="text/javascript">
-            (function() {
-                var jasmineEnv = jasmine.getEnv();
-                jasmineEnv.updateInterval = 1000;
-
-                var htmlReporter = new jasmine.HtmlReporter();
-
-                jasmineEnv.addReporter(htmlReporter);
-
-                jasmineEnv.specFilter = function(spec) {
-                    return htmlReporter.specFilter(spec);
-                };
-
-                var currentWindowOnload = window.onload;
-
-                window.onload = function() {
-                    if (currentWindowOnload) {
-                        currentWindowOnload();
-                    }
-                    execJasmine();
-                };
-
-                function execJasmine() {
-                    jasmineEnv.execute();
-                }
-            })();
-        </script>
-    </head>
-    <body>
-        <div id="stage" style="display:none;"></div>
-    </body>
-</html>

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/CordovaMac/www/spec/helper.js
----------------------------------------------------------------------
diff --git a/CordovaMac/www/spec/helper.js b/CordovaMac/www/spec/helper.js
deleted file mode 100644
index 929f776..0000000
--- a/CordovaMac/www/spec/helper.js
+++ /dev/null
@@ -1,33 +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.
- */
-afterEach(function() {
-    document.getElementById('stage').innerHTML = '';
-});
-
-var helper = {
-    trigger: function(obj, name) {
-        var e = document.createEvent('Event');
-        e.initEvent(name, true, true);
-        obj.dispatchEvent(e);
-    },
-    getComputedStyle: function(querySelector, property) {
-        var element = document.querySelector(querySelector);
-        return window.getComputedStyle(element).getPropertyValue(property);
-    }
-};

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/CordovaMac/www/spec/index.js
----------------------------------------------------------------------
diff --git a/CordovaMac/www/spec/index.js b/CordovaMac/www/spec/index.js
deleted file mode 100644
index 20f8be5..0000000
--- a/CordovaMac/www/spec/index.js
+++ /dev/null
@@ -1,67 +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.
- */
-describe('app', function() {
-    describe('initialize', function() {
-        it('should bind deviceready', function() {
-            runs(function() {
-                spyOn(app, 'onDeviceReady');
-                app.initialize();
-                helper.trigger(window.document, 'deviceready');
-            });
-
-            waitsFor(function() {
-                return (app.onDeviceReady.calls.length > 0);
-            }, 'onDeviceReady should be called once', 500);
-
-            runs(function() {
-                expect(app.onDeviceReady).toHaveBeenCalled();
-            });
-        });
-    });
-
-    describe('onDeviceReady', function() {
-        it('should report that it fired', function() {
-            spyOn(app, 'receivedEvent');
-            app.onDeviceReady();
-            expect(app.receivedEvent).toHaveBeenCalledWith('deviceready');
-        });
-    });
-
-    describe('receivedEvent', function() {
-        beforeEach(function() {
-            var el = document.getElementById('stage');
-            el.innerHTML = ['<div id="deviceready">',
-                            '    <p class="event listening">Listening</p>',
-                            '    <p class="event received">Received</p>',
-                            '</div>'].join('\n');
-        });
-
-        it('should hide the listening element', function() {
-            app.receivedEvent('deviceready');
-            var displayStyle = helper.getComputedStyle('#deviceready .listening', 'display');
-            expect(displayStyle).toEqual('none');
-        });
-
-        it('should show the received element', function() {
-            app.receivedEvent('deviceready');
-            var displayStyle = helper.getComputedStyle('#deviceready .received', 'display');
-            expect(displayStyle).toEqual('block');
-        });
-    });
-});

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/VERSION
----------------------------------------------------------------------
diff --git a/VERSION b/VERSION
deleted file mode 100644
index 0c271bc..0000000
--- a/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-2.1.0rc1

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/bin/create
----------------------------------------------------------------------
diff --git a/bin/create b/bin/create
new file mode 100755
index 0000000..91435f3
--- /dev/null
+++ b/bin/create
@@ -0,0 +1,139 @@
+#! /bin/sh
+
+#
+# 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.
+#
+
+#
+# create a Cordova/OS X project
+#
+# USAGE
+#   ./create <path_to_new_project> <package_name> <project_name>
+#
+# EXAMPLE
+#  ./create ~/Desktop/radness org.apache.cordova.radness Radness
+#
+set -e
+
+function usage() {
+  echo "Usage: $0 [--shared] <path_to_new_project> <package_name> <project_name>"
+  echo "	--shared (optional): Link directly against the shared copy of the CordovaFramework instead of a copy of it."
+  echo "	<path_to_new_project>: Path to your new Cordova OS X project"
+  echo "	<package_name>: Package name, following reverse-domain style convention"
+  echo "	<project_name>: Project name"
+  exit 1
+}
+
+USE_SHARED=0
+if [[ $1 == "--shared" ]]; then
+    USE_SHARED=1
+    shift;
+fi
+
+# check whether it is a proper create command (at least 3 arguments)
+if [ $# -lt 3 ]; then
+	usage
+fi
+
+# the two lines below are to get the current folder, and resolve symlinks
+SCRIPT="$0"
+# need this for relative symlinks
+while [ -h "$SCRIPT" ] ; do
+   SCRIPT=`readlink "$SCRIPT"`
+done
+
+BINDIR=$( cd "$( dirname "$SCRIPT" )" && pwd )
+CORDOVAFRAMEWORK_DIR="$BINDIR/../CordovaFramework"
+CDV_VER=$(cat $CORDOVAFRAMEWORK_DIR/VERSION)
+
+PROJECT_PATH=$1
+PACKAGE=$2
+PROJECT_NAME=$3
+
+# check whether the project path exists and is not empty
+if [ -d "$PROJECT_PATH" ]; then
+	if [ "$(ls -1A "$PROJECT_PATH")" ]; then
+		echo "\033[31mError: $PROJECT_PATH is not empty. Please specify an empty folder.\033[m"
+		exit 1
+	fi
+fi
+
+# copy the files in; then modify them
+cp -r "$BINDIR/templates/project/" "$PROJECT_PATH"
+
+# Copy in the JS.
+cp "$CORDOVAFRAMEWORK_DIR/cordova.osx.js" "$PROJECT_PATH/www/cordova-$CDV_VER.js"
+# Change the filename reference in the html from cordova.osx.js -> cordova-VERSION.js.
+/usr/bin/sed -i "" "s/src[ 	]*=[ 	]*[\\'\"]cordova.osx.js[\\'\"]/src=\"cordova-${CDV_VER}.js\"/g" "$PROJECT_PATH/www/index.html"
+
+# I've tried to be thorough in my documentation of the manual actions below...
+# on first brush it would seem that the right solution would be to brute force
+# recurse the directory tree renaming instances of __ID__ and __TESTING__ ...however this is a little blunt
+# and while so the below is too being very manual it was/is easier to test, fucking manually, and sort out the automation
+
+# rename the folders/files:
+#
+# - ./__TESTING__.xcodeproj/
+# - ./__TESTING__/
+# - ./__TESTING__/__TESTING__-info.plist
+# - ./__TESTING__/__TESTING__-Prefix.plist
+# - ./__TESTING__/Resources/__TESTING__.icns
+mv "$PROJECT_PATH/__TESTING__.xcodeproj" "$PROJECT_PATH/$PROJECT_NAME.xcodeproj"
+mv "$PROJECT_PATH/__TESTING__" "$PROJECT_PATH/$PROJECT_NAME"
+mv "$PROJECT_PATH/$PROJECT_NAME/__TESTING__-Info.plist" "$PROJECT_PATH/$PROJECT_NAME/$PROJECT_NAME-Info.plist"
+mv "$PROJECT_PATH/$PROJECT_NAME/__TESTING__-Prefix.pch" "$PROJECT_PATH/$PROJECT_NAME/$PROJECT_NAME-Prefix.pch"
+mv "$PROJECT_PATH/$PROJECT_NAME/Resources/__TESTING__.icns" "$PROJECT_PATH/$PROJECT_NAME/Resources/$PROJECT_NAME.icns"
+
+# lets store a reference to the root
+R=$PROJECT_PATH/$PROJECT_NAME
+
+# replace __TESTING__ and --ID-- with ACTIVITY and ID strings, respectively, in:
+#
+# - ./__TESTING__.xcodeproj/project.pbxproj
+# - ./__TESTING__/Classes/AppDelegate.h
+# - ./__TESTING__/Classes/AppDelegate.m
+# - ./__TESTING__/Resources/main.m
+# - ./__TESTING__/Resources/__TESTING__-info.plist
+# - ./__TESTING__/Resources/__TESTING__-Prefix.plist
+# - ./__TESTING__/Resources/en.lproj/MainViewController.xib
+
+"$BINDIR/replaces" "$R.xcodeproj/project.pbxproj" __TESTING__ "$PROJECT_NAME"
+"$BINDIR/replaces" "$R/Classes/AppDelegate.h"     __TESTING__ "$PROJECT_NAME"
+"$BINDIR/replaces" "$R/Classes/AppDelegate.m"     __TESTING__ "$PROJECT_NAME"
+"$BINDIR/replaces" "$R/Classes/MainViewController.h" __TESTING__ "$PROJECT_NAME"
+"$BINDIR/replaces" "$R/Classes/MainViewController.m" __TESTING__ "$PROJECT_NAME"
+"$BINDIR/replaces" "$R/main.m"                    __TESTING__ "$PROJECT_NAME"
+"$BINDIR/replaces" "$R/$PROJECT_NAME-Info.plist"  __TESTING__ "$PROJECT_NAME"
+"$BINDIR/replaces" "$R/$PROJECT_NAME-Prefix.pch"  __TESTING__ "$PROJECT_NAME"
+"$BINDIR/replaces" "$R/$PROJECT_NAME-Info.plist" --ID-- $PACKAGE
+"$BINDIR/replaces" "$R/Resources/en.lproj/MainViewController.xib"  __TESTING__ "$PROJECT_NAME"
+
+if [[ $USE_SHARED = 1 ]]; then
+    # Make the sub-project reference to Cordova have the correct path.
+    "$BINDIR/update_cordova_subproject" "$R.xcodeproj/project.pbxproj"
+else
+    # Copy in the CordovaFramework directory.
+    mkdir -p "$PROJECT_PATH/CordovaFramework/CordovaFramework.xcodeproj"
+    mkdir -p "$PROJECT_PATH/CordovaFramework/CordovaFramework/"
+    cp -r "$BINDIR/../CordovaFramework/CordovaFramework/" "$PROJECT_PATH/CordovaFramework/CordovaFramework/"
+    cp "$BINDIR/../CordovaFramework/VERSION" "$PROJECT_PATH/CordovaFramework"
+    cp "$BINDIR/../CordovaFramework/CordovaFramework.xcodeproj/project.pbxproj" "$PROJECT_PATH/CordovaFramework/CordovaFramework.xcodeproj"
+    # Make the sub-project reference to Cordova have the correct path.
+    "$BINDIR/update_cordova_subproject" "$R.xcodeproj/project.pbxproj" "$PROJECT_PATH/CordovaFramework/CordovaFramework.xcodeproj/project.pbxproj" > /dev/null
+fi
+

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/bin/replaces
----------------------------------------------------------------------
diff --git a/bin/replaces b/bin/replaces
new file mode 100755
index 0000000..4aee85a
--- /dev/null
+++ b/bin/replaces
@@ -0,0 +1,28 @@
+#! /bin/sh
+#
+# 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.
+#
+
+# 
+# USAGE
+#   ./replaces path from to
+#
+# EXAMPLE
+#   ./replaces ./foo.txt FOO BAR
+#
+sed "s/$2/$3/g" "$1" > tmpFile ; mv tmpFile "$1"

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/bin/templates/project/__TESTING__.xcodeproj/project.pbxproj
----------------------------------------------------------------------
diff --git a/bin/templates/project/__TESTING__.xcodeproj/project.pbxproj b/bin/templates/project/__TESTING__.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..1a2c4f5
--- /dev/null
+++ b/bin/templates/project/__TESTING__.xcodeproj/project.pbxproj
@@ -0,0 +1,429 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		48B43519152E5E3500906A36 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48B43518152E5E3500906A36 /* Cocoa.framework */; };
+		48B43525152E5E3500906A36 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 48B43524152E5E3500906A36 /* main.m */; };
+		48B43536152E5E4100906A36 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48B43535152E5E4100906A36 /* WebKit.framework */; };
+		48B43538152E5E6B00906A36 /* www in Resources */ = {isa = PBXBuildFile; fileRef = 48B43537152E5E6B00906A36 /* www */; };
+		7E4C0B0916EAA4EB00542982 /* Cordova.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E4C0B0416EAA3CF00542982 /* Cordova.framework */; };
+		7E4C0B0D16EAA6A700542982 /* Cordova.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7E4C0B0416EAA3CF00542982 /* Cordova.framework */; };
+		7E608F2B16E7D9B00018F512 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7E608F2A16E7D9B00018F512 /* config.xml */; };
+		7E608F3C16E7EE8D0018F512 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E608F3416E7EE8D0018F512 /* AppDelegate.m */; };
+		7E608F4816E7EE970018F512 /* Cordova.icns in Resources */ = {isa = PBXBuildFile; fileRef = 7E608F4116E7EE970018F512 /* Cordova.icns */; };
+		7E608F4916E7EE970018F512 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 7E608F4216E7EE970018F512 /* Credits.rtf */; };
+		7E608F4A16E7EE970018F512 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7E608F4416E7EE970018F512 /* InfoPlist.strings */; };
+		7E608F4B16E7EE970018F512 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7E608F4616E7EE970018F512 /* MainViewController.xib */; };
+		7E608F8216E7F0880018F512 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E608F8116E7F0880018F512 /* MainViewController.m */; };
+		7E79276A16E7C900002E20B9 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E79276916E7C8FF002E20B9 /* SystemConfiguration.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		7E4C0B0316EAA3CF00542982 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 7E4C0AFE16EAA3CF00542982 /* CordovaFramework.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 7E4C0A7016EAA1C600542982;
+			remoteInfo = Cordova;
+		};
+		7E4C0B0516EAA3CF00542982 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 7E4C0AFE16EAA3CF00542982 /* CordovaFramework.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 7E4C0A8816EAA1C600542982;
+			remoteInfo = CordovaFrameworkTests;
+		};
+		7E4C0B0716EAA4C500542982 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 7E4C0AFE16EAA3CF00542982 /* CordovaFramework.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = 7E4C0A6F16EAA1C600542982;
+			remoteInfo = Cordova;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		7E4C0B0B16EAA68E00542982 /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+				7E4C0B0D16EAA6A700542982 /* Cordova.framework in CopyFiles */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		48B43514152E5E3500906A36 /* __TESTING__.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = __TESTING__.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		48B43518152E5E3500906A36 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+		48B4351B152E5E3500906A36 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
+		48B4351C152E5E3500906A36 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
+		48B4351D152E5E3500906A36 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+		48B43524152E5E3500906A36 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = main.m; path = __TESTING__/main.m; sourceTree = "<group>"; };
+		48B43526152E5E3500906A36 /* __TESTING__-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "__TESTING__-Prefix.pch"; path = "__TESTING__/__TESTING__-Prefix.pch"; sourceTree = "<group>"; };
+		48B43535152E5E4100906A36 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+		48B43537152E5E6B00906A36 /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = "<group>"; };
+		7E4C0AFE16EAA3CF00542982 /* CordovaFramework.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CordovaFramework.xcodeproj; path = ../CordovaFramework/CordovaFramework.xcodeproj; sourceTree = "<group>"; };
+		7E608F2A16E7D9B00018F512 /* config.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = config.xml; path = __TESTING__/config.xml; sourceTree = "<group>"; };
+		7E608F3316E7EE8D0018F512 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+		7E608F3416E7EE8D0018F512 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+		7E608F4116E7EE970018F512 /* __TESTING__.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = __TESTING__.icns; sourceTree = "<group>"; };
+		7E608F4316E7EE970018F512 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = "<group>"; };
+		7E608F4516E7EE970018F512 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		7E608F4716E7EE970018F512 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainViewController.xib; sourceTree = "<group>"; };
+		7E608F8016E7F0880018F512 /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = "<group>"; };
+		7E608F8116E7F0880018F512 /* MainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainViewController.m; sourceTree = "<group>"; };
+		7E608F8316E7F6940018F512 /* __TESTING__-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "__TESTING__-Info.plist"; path = "__TESTING__/__TESTING__-Info.plist"; sourceTree = SOURCE_ROOT; };
+		7E79276916E7C8FF002E20B9 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		48B43511152E5E3500906A36 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				7E4C0B0916EAA4EB00542982 /* Cordova.framework in Frameworks */,
+				7E79276A16E7C900002E20B9 /* SystemConfiguration.framework in Frameworks */,
+				48B43536152E5E4100906A36 /* WebKit.framework in Frameworks */,
+				48B43519152E5E3500906A36 /* Cocoa.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		48B43509152E5E3500906A36 = {
+			isa = PBXGroup;
+			children = (
+				7E608F2A16E7D9B00018F512 /* config.xml */,
+				48B43537152E5E6B00906A36 /* www */,
+				7E4C0AFE16EAA3CF00542982 /* CordovaFramework.xcodeproj */,
+				7E608F4016E7EE970018F512 /* Resources */,
+				7E608F3216E7EE8D0018F512 /* Classes */,
+				7E608F2E16E7EC900018F512 /* Other Sources */,
+				48B43517152E5E3500906A36 /* Frameworks */,
+				48B43515152E5E3500906A36 /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		48B43515152E5E3500906A36 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				48B43514152E5E3500906A36 /* __TESTING__.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		48B43517152E5E3500906A36 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				48B4351B152E5E3500906A36 /* AppKit.framework */,
+				48B4351C152E5E3500906A36 /* CoreData.framework */,
+				48B4351D152E5E3500906A36 /* Foundation.framework */,
+				7E79276916E7C8FF002E20B9 /* SystemConfiguration.framework */,
+				48B43535152E5E4100906A36 /* WebKit.framework */,
+				48B43518152E5E3500906A36 /* Cocoa.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		7E4C0AFF16EAA3CF00542982 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				7E4C0B0416EAA3CF00542982 /* Cordova.framework */,
+				7E4C0B0616EAA3CF00542982 /* CordovaFrameworkTests.octest */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		7E608F2E16E7EC900018F512 /* Other Sources */ = {
+			isa = PBXGroup;
+			children = (
+				48B43524152E5E3500906A36 /* main.m */,
+				48B43526152E5E3500906A36 /* __TESTING__-Prefix.pch */,
+			);
+			name = "Other Sources";
+			sourceTree = "<group>";
+		};
+		7E608F3216E7EE8D0018F512 /* Classes */ = {
+			isa = PBXGroup;
+			children = (
+				7E608F4616E7EE970018F512 /* MainViewController.xib */,
+				7E608F3316E7EE8D0018F512 /* AppDelegate.h */,
+				7E608F3416E7EE8D0018F512 /* AppDelegate.m */,
+				7E608F8016E7F0880018F512 /* MainViewController.h */,
+				7E608F8116E7F0880018F512 /* MainViewController.m */,
+			);
+			name = Classes;
+			path = __TESTING__/Classes;
+			sourceTree = "<group>";
+		};
+		7E608F4016E7EE970018F512 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				7E608F8316E7F6940018F512 /* __TESTING__-Info.plist */,
+				7E608F4116E7EE970018F512 /* __TESTING__.icns */,
+				7E608F4216E7EE970018F512 /* Credits.rtf */,
+				7E608F4416E7EE970018F512 /* InfoPlist.strings */,
+			);
+			name = Resources;
+			path = "__TESTING__/Resources";
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		48B43513152E5E3500906A36 /* __TESTING__ */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 48B43532152E5E3600906A36 /* Build configuration list for PBXNativeTarget "__TESTING__" */;
+			buildPhases = (
+				48B43510152E5E3500906A36 /* Sources */,
+				48B43511152E5E3500906A36 /* Frameworks */,
+				48B43512152E5E3500906A36 /* Resources */,
+				7E4C0B0B16EAA68E00542982 /* CopyFiles */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				7E4C0B0816EAA4C500542982 /* PBXTargetDependency */,
+			);
+			name = __TESTING__;
+			productName = __TESTING__;
+			productReference = 48B43514152E5E3500906A36 /* __TESTING__.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		48B4350B152E5E3500906A36 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				CLASSPREFIX = CDV;
+				LastUpgradeCheck = 0460;
+				ORGANIZATIONNAME = OpenOSX.org;
+			};
+			buildConfigurationList = 48B4350E152E5E3500906A36 /* Build configuration list for PBXProject "__TESTING__" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+			);
+			mainGroup = 48B43509152E5E3500906A36;
+			productRefGroup = 48B43515152E5E3500906A36 /* Products */;
+			projectDirPath = "";
+			projectReferences = (
+				{
+					ProductGroup = 7E4C0AFF16EAA3CF00542982 /* Products */;
+					ProjectRef = 7E4C0AFE16EAA3CF00542982 /* CordovaFramework.xcodeproj */;
+				},
+			);
+			projectRoot = "";
+			targets = (
+				48B43513152E5E3500906A36 /* __TESTING__ */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+		7E4C0B0416EAA3CF00542982 /* Cordova.framework */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.framework;
+			path = Cordova.framework;
+			remoteRef = 7E4C0B0316EAA3CF00542982 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		7E4C0B0616EAA3CF00542982 /* CordovaFrameworkTests.octest */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.cfbundle;
+			path = CordovaFrameworkTests.octest;
+			remoteRef = 7E4C0B0516EAA3CF00542982 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+		48B43512152E5E3500906A36 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				48B43538152E5E6B00906A36 /* www in Resources */,
+				7E608F2B16E7D9B00018F512 /* config.xml in Resources */,
+				7E608F4816E7EE970018F512 /* __TESTING__.icns in Resources */,
+				7E608F4916E7EE970018F512 /* Credits.rtf in Resources */,
+				7E608F4A16E7EE970018F512 /* InfoPlist.strings in Resources */,
+				7E608F4B16E7EE970018F512 /* MainViewController.xib in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		48B43510152E5E3500906A36 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				48B43525152E5E3500906A36 /* main.m in Sources */,
+				7E608F3C16E7EE8D0018F512 /* AppDelegate.m in Sources */,
+				7E608F8216E7F0880018F512 /* MainViewController.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		7E4C0B0816EAA4C500542982 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = Cordova;
+			targetProxy = 7E4C0B0716EAA4C500542982 /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+		7E608F4216E7EE970018F512 /* Credits.rtf */ = {
+			isa = PBXVariantGroup;
+			children = (
+				7E608F4316E7EE970018F512 /* en */,
+			);
+			name = Credits.rtf;
+			sourceTree = "<group>";
+		};
+		7E608F4416E7EE970018F512 /* InfoPlist.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				7E608F4516E7EE970018F512 /* en */,
+			);
+			name = InfoPlist.strings;
+			sourceTree = "<group>";
+		};
+		7E608F4616E7EE970018F512 /* MainViewController.xib */ = {
+			isa = PBXVariantGroup;
+			children = (
+				7E608F4716E7EE970018F512 /* en */,
+			);
+			name = MainViewController.xib;
+			path = ../Resources;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		48B43530152E5E3600906A36 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				INSTALL_PATH = "";
+				LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
+				MACOSX_DEPLOYMENT_TARGET = 10.7;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		48B43531152E5E3600906A36 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = YES;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				INSTALL_PATH = "";
+				LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
+				MACOSX_DEPLOYMENT_TARGET = 10.7;
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		48B43533152E5E3600906A36 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CLANG_ENABLE_OBJC_ARC = YES;
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "__TESTING__/__TESTING__-Prefix.pch";
+				INFOPLIST_FILE = "__TESTING__/__TESTING__-Info.plist";
+				INSTALL_PATH = "";
+				LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Debug;
+		};
+		48B43534152E5E3600906A36 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CLANG_ENABLE_OBJC_ARC = YES;
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "__TESTING__/__TESTING__-Prefix.pch";
+				INFOPLIST_FILE = "__TESTING__/__TESTING__-Info.plist";
+				INSTALL_PATH = "";
+				LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		48B4350E152E5E3500906A36 /* Build configuration list for PBXProject "__TESTING__" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				48B43530152E5E3600906A36 /* Debug */,
+				48B43531152E5E3600906A36 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		48B43532152E5E3600906A36 /* Build configuration list for PBXNativeTarget "__TESTING__" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				48B43533152E5E3600906A36 /* Debug */,
+				48B43534152E5E3600906A36 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 48B4350B152E5E3500906A36 /* Project object */;
+}

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/bin/templates/project/__TESTING__/Classes/AppDelegate.h
----------------------------------------------------------------------
diff --git a/bin/templates/project/__TESTING__/Classes/AppDelegate.h b/bin/templates/project/__TESTING__/Classes/AppDelegate.h
new file mode 100644
index 0000000..ccbb9d2
--- /dev/null
+++ b/bin/templates/project/__TESTING__/Classes/AppDelegate.h
@@ -0,0 +1,32 @@
+/*
+ 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.
+ */
+
+#import <Cocoa/Cocoa.h>
+#import <Cordova/CDVViewController.h>
+
+@interface AppDelegate : NSObject <NSApplicationDelegate> {
+
+	IBOutlet NSWindow* window;
+}
+
+@property (nonatomic, strong) IBOutlet NSWindow* window;
+@property (nonatomic, strong) IBOutlet CDVViewController* viewController;
+
+
+@end

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/bin/templates/project/__TESTING__/Classes/AppDelegate.m
----------------------------------------------------------------------
diff --git a/bin/templates/project/__TESTING__/Classes/AppDelegate.m b/bin/templates/project/__TESTING__/Classes/AppDelegate.m
new file mode 100644
index 0000000..9a463e0
--- /dev/null
+++ b/bin/templates/project/__TESTING__/Classes/AppDelegate.m
@@ -0,0 +1,47 @@
+/*
+ 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.
+ */
+
+#import "AppDelegate.h"
+#import "MainViewController.h"
+
+@implementation AppDelegate
+
+
+@synthesize window;
+
+- (id)init
+{
+    self = [super init];
+    return self;
+}
+
+- (void) applicationDidStartLaunching:(NSNotification*) aNotification 
+{
+}
+
+- (void) applicationWillFinishLaunching:(NSNotification*)aNotification
+{
+}
+
+- (void) applicationDidFinishLaunching:(NSNotification*)aNotification 
+{
+
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/bin/templates/project/__TESTING__/Classes/MainViewController.h
----------------------------------------------------------------------
diff --git a/bin/templates/project/__TESTING__/Classes/MainViewController.h b/bin/templates/project/__TESTING__/Classes/MainViewController.h
new file mode 100644
index 0000000..4d02eeb
--- /dev/null
+++ b/bin/templates/project/__TESTING__/Classes/MainViewController.h
@@ -0,0 +1,32 @@
+/*
+ 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.
+ */
+
+#import <Cordova/CDVViewController.h>
+#import <Cordova/CDVCommandDelegateImpl.h>
+#import <Cordova/CDVCommandQueue.h>
+
+@interface MainViewController : CDVViewController
+
+@end
+
+@interface MainCommandDelegate : CDVCommandDelegateImpl
+@end
+
+@interface MainCommandQueue : CDVCommandQueue
+@end
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/bin/templates/project/__TESTING__/Classes/MainViewController.m
----------------------------------------------------------------------
diff --git a/bin/templates/project/__TESTING__/Classes/MainViewController.m b/bin/templates/project/__TESTING__/Classes/MainViewController.m
new file mode 100644
index 0000000..d82132b
--- /dev/null
+++ b/bin/templates/project/__TESTING__/Classes/MainViewController.m
@@ -0,0 +1,114 @@
+/*
+ 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.
+ */
+
+#import "MainViewController.h"
+
+@interface MainViewController ()
+
+@end
+
+@implementation MainViewController
+
+- (id)initWithWindow:(NSWindow *)window
+{
+    self = [super initWithWindow:window];
+    if (self) {
+        // Initialization code here.
+    }
+    
+    return self;
+}
+
+- (id)initWithWindowNibName:(NSString*)nibNameOrNil
+{
+    self = [super initWithWindowNibName:nibNameOrNil];
+    if (self) {
+        // Uncomment to override the CDVCommandDelegateImpl used
+        // _commandDelegate = [[MainCommandDelegate alloc] initWithViewController:self];
+        // Uncomment to override the CDVCommandQueue used
+        // _commandQueue = [[MainCommandQueue alloc] initWithViewController:self];
+    }
+    return self;
+}
+
+
+- (id)init
+{
+    self = [super init];
+    if (self) {
+        // Uncomment to override the CDVCommandDelegateImpl used
+        // _commandDelegate = [[MainCommandDelegate alloc] initWithViewController:self];
+        // Uncomment to override the CDVCommandQueue used
+        // _commandQueue = [[MainCommandQueue alloc] initWithViewController:self];
+    }
+    return self;
+}
+
+
+- (void)windowDidLoad
+{
+    [super windowDidLoad];
+    
+    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
+}
+
+@end
+
+@implementation MainCommandDelegate
+
+/* To override the methods, uncomment the line in the init function(s)
+ in MainViewController.m
+ */
+
+#pragma mark CDVCommandDelegate implementation
+
+- (id)getCommandInstance:(NSString*)className
+{
+    return [super getCommandInstance:className];
+}
+
+/*
+ NOTE: this will only inspect execute calls coming explicitly from native plugins,
+ not the commandQueue (from JavaScript). To see execute calls from JavaScript, see
+ MainCommandQueue below
+ */
+- (BOOL)execute:(CDVInvokedUrlCommand*)command
+{
+    return [super execute:command];
+}
+
+- (NSString*)pathForResource:(NSString*)resourcepath;
+{
+    return [super pathForResource:resourcepath];
+}
+
+@end
+
+@implementation MainCommandQueue
+
+/* To override, uncomment the line in the init function(s)
+ in MainViewController.m
+ */
+- (BOOL)execute:(CDVInvokedUrlCommand*)command
+{
+    return [super execute:command];
+}
+
+@end
+

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/bin/templates/project/__TESTING__/Plugins/README
----------------------------------------------------------------------
diff --git a/bin/templates/project/__TESTING__/Plugins/README b/bin/templates/project/__TESTING__/Plugins/README
new file mode 100644
index 0000000..f6e19d7
--- /dev/null
+++ b/bin/templates/project/__TESTING__/Plugins/README
@@ -0,0 +1,20 @@
+#
+# 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.
+#
+
+Put the .h and .m files of your plugin here. The .js files of your plugin belong in the www folder.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/bin/templates/project/__TESTING__/Resources/__TESTING__.icns
----------------------------------------------------------------------
diff --git a/bin/templates/project/__TESTING__/Resources/__TESTING__.icns b/bin/templates/project/__TESTING__/Resources/__TESTING__.icns
new file mode 100644
index 0000000..20fc3d3
Binary files /dev/null and b/bin/templates/project/__TESTING__/Resources/__TESTING__.icns differ

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/bin/templates/project/__TESTING__/Resources/en.lproj/Credits.rtf
----------------------------------------------------------------------
diff --git a/bin/templates/project/__TESTING__/Resources/en.lproj/Credits.rtf b/bin/templates/project/__TESTING__/Resources/en.lproj/Credits.rtf
new file mode 100644
index 0000000..816c9db
--- /dev/null
+++ b/bin/templates/project/__TESTING__/Resources/en.lproj/Credits.rtf
@@ -0,0 +1,18 @@
+{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf320
+{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;\f1\fnil\fcharset0 HelveticaNeue-Light;}
+{\colortbl;\red255\green255\blue255;}
+\vieww9600\viewh8400\viewkind0
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+{\field{\*\fldinst{HYPERLINK "http://www.apache.org/"}}{\fldrslt 
+\f0\fs36 \cf0 Apache Software Foundation\
+}}\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f1\fs36 \cf0 \
+
+\fs28 The {\field{\*\fldinst{HYPERLINK "http://phonegap.com/about"}}{\fldrslt PhoneGap}} code was contributed to the Apache Software Foundation (ASF) under the name Apache Callback in October 2011. It is currently under incubation until it can become a full Apache project. Through the ASF, future {\field{\*\fldinst{HYPERLINK "http://phonegap.com/about"}}{\fldrslt PhoneGap}} development will ensure open stewardship of the project. It will always remain free and open source under the Apache License, Version 2.0.
+\fs32 \
+\
+\pard\tx560\pardeftab560\pardirnatural
+
+\fs28 \cf0 \CocoaLigature0 Licensed to the {\field{\*\fldinst{HYPERLINK "http://www.apache.org/"}}{\fldrslt 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 {\field{\*\fldinst{HYPERLINK "http://www.apache.org/licenses/LICENSE-2.0"}}{\fldrslt 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.\
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/42ebcc90/bin/templates/project/__TESTING__/Resources/en.lproj/InfoPlist.strings
----------------------------------------------------------------------
diff --git a/bin/templates/project/__TESTING__/Resources/en.lproj/InfoPlist.strings b/bin/templates/project/__TESTING__/Resources/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..d277f9d
--- /dev/null
+++ b/bin/templates/project/__TESTING__/Resources/en.lproj/InfoPlist.strings
@@ -0,0 +1,23 @@
+/*
+ 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.
+ */
+
+
+
+/* Localized versions of Info.plist keys */
+