- echo "Usage: node-starter.sh package-name"
+ echo "!!! Usage: node-starter.sh package-name"
-printf 'PACKAGE NAME: %s\n' "$packageName"
-if [ -d $packageName ]; then
- echo "ERROR: folder ${packageName} already exists"
- echo "Folder ${packageName} does not exist"
BITBUCKET_USER=mitchallen
# need to escape slashes in url for sed command
npmAuthor="$AUTHOR_NAME <npm@mitchallen.com> (http:\/\/mitchallen.com)"
+# Create folder if it doesn't exist
+function CreatePackageFolder {
+ echo "*** $FUNCNAME $1"
+ if [[ $# -ne 1 ]]; then
+ echo "!!! Usage: $FUNCNAME folder-name "
+ printf '... PACKAGE NAME: %s\n' "$__folder"
+ if [ -d $__folder ]; then
+ echo "!!! ERROR: folder '$__folder' already exists"
+ echo "... Folder '$__folder' does not exist, creating ..."
+ echo "... Changing to subfolder '$__folder'"
+function CreateSubfolders {
+ echo "... Creating subfolder 'test'"
+ echo "... Creating subfolder 'examples'"
+function DemandSuccess {
+ # Don't show argument 2 (error message)
+ # Logging error message argument in call looks like a fail in the log
+ echo "*** $FUNCNAME $1"
+ if [[ $# -ne 2 ]]; then
+ echo "!!! Usage: $FUNCNAME result message "
+ if [ $__result -eq 0 ]; then
+ echo "!!! ERROR: $__message"
+function CloneStarterKit {
+ git clone http://bitbucket.org/mitchallen/node-starter-kit.git
+ DemandSuccess $? "Could not clone starter kit"
+function CopyCloneFiles {
+ echo "*** $FUNCNAME $1"
+ if [[ $# -ne 1 ]]; then
+ echo "!!! Usage: $FUNCNAME clone-folder "
+ if [ -d $__cloneFolder ]; then
+ echo "... VERIFYING: found clone folder '$__cloneFolder'"
+ echo "!!! ERROR: Clone folder '$__cloneFolder' does not exist!"
+ echo "... Copying clone files"
+ # copy files from clones kit folder
+ cp $__cloneFolder/kit/Gruntfile.js .
+ cp $__cloneFolder/kit/package.json .
+ cp $__cloneFolder/kit/index.js .
+ cp $__cloneFolder/kit/smoke-test.js test/smoke-test.js
+ cp $__cloneFolder/kit/npmignore.txt .npmignore
+ cp $__cloneFolder/kit/README.template README.md
+ echo "... Removing clone folder '$__cloneFolder'"
+ echo "*** $FUNCNAME $1"
+ if [[ $# -ne 1 ]]; then
+ echo "!!! Usage: $FUNCNAME file"
+ if [ ! -f $__demandFile ]; then
+ echo "!!! ERROR: Can't find file: $__demandFile"
+function FillTemplates {
+ # Update fields in cloned files
+ echo "... Updating index.js"
+ sed -i .bak "s/NPM_SCOPE/$NPM_SCOPE/g" index.js
+ sed -i .bak "s/PACKAGE_NAME/$packageName/g" index.js
+ sed -i .bak "s/AUTHOR_NAME/$AUTHOR_NAME/g" index.js
+ # File: test/smoke-test.js
+ DemandFile "test/smoke-test.js"
+ echo "... updating test/smoke-test.js"
+ sed -i .bak "s/NPM_SCOPE/$NPM_SCOPE/g" test/smoke-test.js
+ sed -i .bak "s/PACKAGE_NAME/$packageName/g" test/smoke-test.js
+ sed -i .bak "s/AUTHOR_NAME/$AUTHOR_NAME/g" test/smoke-test.js
+ DemandFile "package.json"
+ echo "... Updating package.json"
+ sed -i .bak "s/NPM_SCOPE/$NPM_SCOPE/g" package.json
+ sed -i .bak "s/PACKAGE_NAME/$packageName/g" package.json
+ sed -i .bak "s/BITBUCKET_USER/$BITBUCKET_USER/g" package.json
+ sed -i .bak "s/GITHUB_USER/$GITHUB_USER/g" package.json
+ sed -i .bak "s/NPM_AUTHOR/$npmAuthor/g" package.json
+ echo "... Updating README.md"
+ sed -i .bak "s/NPM_SCOPE/$NPM_SCOPE/g" README.md
+ sed -i .bak "s/PACKAGE_NAME/$packageName/g" README.md
+ sed -i .bak "s/BITBUCKET_USER/$BITBUCKET_USER/g" README.md
+ sed -i .bak "s/GITHUB_USER/$GITHUB_USER/g" README.md
+ sed -i .bak "s/NPM_AUTHOR/$npmAuthor/g" README.md
+ echo "... Removing sed backup files"
+ echo "... $ npm install"
+ DemandSuccess $? "'npm install' failed"
+ DemandSuccess $? "'git init' failed"
+ DemandSuccess $? "'git add' failed"
+ echo "... $ git commit -m 'init commit'"
+ git commit -m 'init commit'
+ DemandSuccess $? "'git commit' failed"
+function CreateBitbucketRepo {
-# Change to the package folder
+ if [[ $# -ne 4 ]]; then
+ echo "!!! Usage: CreateBitbucketRepo bb-user is_private package-name language"
+ # Create Bitbucket Repo (THIS WILL BE PUBLIC BY DEFAULT)
+ # Will ask user for password
+ echo "========================================================================"
+ echo "* Enter your BITBUCKET password at the prompt: "
+ # OLD Bitbucket 1.0 way
+ # curl --user $BITBUCKET_USER https://api.bitbucket.org/1.0/repositories --data name=$packageName
-echo "// Author: ${AUTHOR_NAME}" >> index.js
-echo "// Package: @${NPM_SCOPE}/${packageName}" >> index.js
+ # Note that the language string must be all lowercase
+ curl -X POST -v -u $__bbUser -H "Content-Type: application/json" \
+ https://api.bitbucket.org/2.0/repositories/$__bbUser/$__packageName \
+ -d "{\"scm\": \"git\", \"is_private\": \"$__bbIsPrivate\", \"language\": \"$__language\" }"
+ DemandSuccess $? "'curl command failed"
-# must match name of cloned repo below
-cloneFolder="node-starter-kit"
+ # Add Bitbuucket remote
+ echo "... $ git remote add origin git@bitbucket.org:$__bbUser/$__packageName.git"
+ git remote add origin git@bitbucket.org:$__bbUser/$__packageName.git
+ DemandSuccess $? "'git remote add origin' failed"
-git clone http://bitbucket.org/mitchallen/node-starter-kit.git
+ echo "... $ git remote -v show"
+ DemandSuccess $? "'git remote -v show' failed"
-# copy files from clones kit folder
-cp $cloneFolder/kit/Gruntfile.js .
-cp $cloneFolder/kit/package.json .
-cp $cloneFolder/kit/index.js .
-cp $cloneFolder/kit/smoke-test.js test/smoke-test.js
-cp $cloneFolder/kit/npmignore.txt .npmignore
-cp $cloneFolder/kit/README.template README.md
+function CreateGitHubRepo {
-# Update fields in cloned files
+ if [[ $# -ne 4 ]]; then
+ echo "!!! Usage: CreateGitHubRepo gh-user is_private package-name language"
-sed -i .bak "s/NPM_SCOPE/$NPM_SCOPE/g" index.js
-sed -i .bak "s/PACKAGE_NAME/$packageName/g" index.js
-sed -i .bak "s/AUTHOR_NAME/$AUTHOR_NAME/g" index.js
-sed -i .bak "s/NPM_SCOPE/$NPM_SCOPE/g" test/smoke-test.js
-sed -i .bak "s/PACKAGE_NAME/$packageName/g" test/smoke-test.js
-sed -i .bak "s/AUTHOR_NAME/$AUTHOR_NAME/g" test/smoke-test.js
+ # Create Github Repo (THIS WILL BE PUBLIC BY DEFAULT)
+ # Will ask user for password
+ echo "========================================================================"
+ echo "* Enter your GITHUB password at the prompt: "
-sed -i .bak "s/NPM_SCOPE/$NPM_SCOPE/g" package.json
-sed -i .bak "s/PACKAGE_NAME/$packageName/g" package.json
-sed -i .bak "s/BITBUCKET_USER/$BITBUCKET_USER/g" package.json
-sed -i .bak "s/GITHUB_USER/$GITHUB_USER/g" package.json
-sed -i .bak "s/NPM_AUTHOR/$npmAuthor/g" package.json
+ curl -u $__ghUser https://api.github.com/user/repos -d "{\"name\":\"$__packageName\" }"
-sed -i .bak "s/NPM_SCOPE/$NPM_SCOPE/g" README.md
-sed -i .bak "s/PACKAGE_NAME/$packageName/g" README.md
-sed -i .bak "s/BITBUCKET_USER/$BITBUCKET_USER/g" README.md
-sed -i .bak "s/GITHUB_USER/$GITHUB_USER/g" README.md
-sed -i .bak "s/NPM_AUTHOR/$npmAuthor/g" README.md
+ DemandSuccess $? "'curl command failed"
+ # Reference: http://blog.kevinlee.io/2013/03/11/git-push-to-pull-from-both-github-and-bitbucket/
+ # Append Github remote to origin
+ echo "... $ git remote set-url origin --add git@github.com:$__ghUser/$__packageName.git"
+ git remote set-url origin --add git@github.com:$__ghUser/$__packageName.git
+ DemandSuccess $? "'git remote set-url origin --add' failed"
+ echo "... $ git remote -v show"
+ DemandSuccess $? "'git remote -v show' failed"
-git commit -m 'init commit'
+ echo "... $git push -u origin --all"
+ git push -u origin --all # pushes up the repo and its refs for the first time
+ DemandSuccess $? "'push -u origin --all' failed"
-# Create Bitbucket Repo (THIS WILL BE PUBLIC BY DEFAULT)
-# Will ask user for password
-echo "========================================================================"
-echo "* Enter your BITBUCKET password at the prompt: "
+ echo "... $ git push origin --tags"
+ git push origin --tags # pushes up any tags
+ DemandSuccess $? "'push origin --tags' failed"
-# curl --user $BITBUCKET_USER https://api.bitbucket.org/1.0/repositories --data name=$packageName
-# Note that the language string must be all lowercase
-curl -X POST -v -u $BITBUCKET_USER -H "Content-Type: application/json" \
- https://api.bitbucket.org/2.0/repositories/$BITBUCKET_USER/$packageName \
- -d "{\"scm\": \"git\", \"is_private\": \"$BITBUCKET_IS_PRIVATE\", \"language\": \"javascript\" }"
-# Create Github Repo (THIS WILL BE PUBLIC BY DEFAULT)
-# Will ask user for password
-echo "========================================================================"
-echo "* Enter your GITHUB password at the prompt: "
+ # Run grunt (to do a lint check)
+ DemandSuccess $? "'grunt' failed"
-curl -u $GITHUB_USER https://api.github.com/user/repos -d "{\"name\":\"$packageName\" }"
-# Reference: http://blog.kevinlee.io/2013/03/11/git-push-to-pull-from-both-github-and-bitbucket/
-git remote add origin git@bitbucket.org:$BITBUCKET_USER/$packageName.git
+ DemandSuccess $? "'npm test' failed"
-# Append Github remote to origin
-git remote set-url origin --add git@github.com:$GITHUB_USER/$packageName.git
-git push -u origin --all # pushes up the repo and its refs for the first time
-git push origin --tags # pushes up any tags
+ CreatePackageFolder $packageName
+ # clone folder must match clone repo name
+ CopyCloneFiles "node-starter-kit"
+ # Language must be lowercase ("javascript")
+ CreateBitbucketRepo $BITBUCKET_USER $BITBUCKET_IS_PRIVATE $packageName "javascript"
+ CreateGitHubRepo $GITHUB_USER $GITHUB_IS_PRIVATE $packageName "javascript"
-# Run grunt (to do a lint check)
-# Verify testing is setup
+ echo "========================================================================"
+ echo "* New starter project created in $packageName"
+ echo "* Created $packageName on Bitbucket and Github"
+ echo "* WARNING: repos may be public"
+ echo "========================================================================"
-echo "========================================================================"
-echo "* New starter project created in $packageName"
-echo "* Created $packageName on Bitbucket and Github"
-echo "* WARNING: repos may be public"
-echo "========================================================================"