From 5b866b0922ee142eb712b9612a602af7fab5b9fe Mon Sep 17 00:00:00 2001 From: Marcus Wangnusson Date: Sun, 31 Jan 2016 20:04:30 +0100 Subject: [PATCH 1/3] Added support for Windows --- package.json | 1 + re-natal.coffee | 34 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 8b377c4..7765526 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "chalk": "^1.1.1", "coffee-script": "^1.9.3", "commander": "^2.8.1", + "fs-extra": "^0.26.5", "semver": "^5.0.1", "check-dependencies":"^0.11.0" }, diff --git a/re-natal.coffee b/re-natal.coffee index 45ecff1..5cdfedf 100644 --- a/re-natal.coffee +++ b/re-natal.coffee @@ -4,7 +4,7 @@ # http://oxism.com # MIT License -fs = require 'fs' +fs = require 'fs-extra' net = require 'net' http = require 'http' crypto = require 'crypto' @@ -224,14 +224,14 @@ copyDevEnvironmentFiles = (projNameHyph, projName, devHost) -> mkdirSync "env/dev/env/android" userNsPath = "env/dev/user.clj" - exec "cp #{resources}user.clj #{userNsPath}" + fs.copySync("#{resources}user.clj", userNsPath) mainIosDevPath = "env/dev/env/ios/main.cljs" mainAndroidDevPath = "env/dev/env/android/main.cljs" - exec "cp #{resources}cljs/main_dev.cljs #{mainIosDevPath}" + fs.copySync("#{resources}cljs/main_dev.cljs", mainIosDevPath) edit mainIosDevPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName], [platformRx, "ios"], [devHostRx, devHost] ] - exec "cp #{resources}cljs/main_dev.cljs #{mainAndroidDevPath}" + fs.copySync("#{resources}cljs/main_dev.cljs", mainAndroidDevPath) edit mainAndroidDevPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName], [platformRx, "android"], [devHostRx, devHost]] copyProdEnvironmentFiles = (projNameHyph, projName) -> @@ -243,13 +243,13 @@ copyProdEnvironmentFiles = (projNameHyph, projName) -> mainIosProdPath = "env/prod/env/ios/main.cljs" mainAndroidProdPath = "env/prod/env/android/main.cljs" - exec "cp #{resources}cljs/main_prod.cljs #{mainIosProdPath}" + fs.copySync("#{resources}cljs/main_prod.cljs", mainIosProdPath) edit mainIosProdPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName], [platformRx, "ios"]] - exec "cp #{resources}cljs/main_prod.cljs #{mainAndroidProdPath}" + fs.copySync("#{resources}cljs/main_prod.cljs", mainAndroidProdPath) edit mainAndroidProdPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName], [platformRx, "android"]] copyFigwheelBridge = (projNameUs) -> - exec "cp #{resources}figwheel-bridge.js ." + fs.copySync("#{resources}figwheel-bridge.js", "./figwheel-bridge.js") edit "figwheel-bridge.js", [[projNameUsRx, projNameUs]] updateGitIgnore = () -> @@ -275,21 +275,21 @@ init = (projName) -> if fs.existsSync projNameHyph throw new Error "Directory #{projNameHyph} already exists" - exec 'type lein' + exec 'lein' log 'Creating Leiningen project' exec "lein new #{projNameHyph}" log 'Updating Leiningen project' process.chdir projNameHyph - exec "cp #{resources}project.clj project.clj" + fs.copySync("#{resources}project.clj", "project.clj") edit \ 'project.clj', [ [projNameHyphRx, projNameHyph] ] - exec "rm -rf resources" + fs.removeSync "resources" corePath = "src/#{projNameUs}/core.clj" fs.unlinkSync corePath @@ -297,16 +297,16 @@ init = (projName) -> handlersPath = "src/#{projNameUs}/handlers.cljs" subsPath = "src/#{projNameUs}/subs.cljs" dbPath = "src/#{projNameUs}/db.cljs" - exec "cp #{resources}cljs/handlers.cljs #{handlersPath}" - exec "cp #{resources}cljs/subs.cljs #{subsPath}" - exec "cp #{resources}cljs/db.cljs #{dbPath}" + fs.copySync("#{resources}cljs/handlers.cljs", handlersPath) + fs.copySync("#{resources}cljs/subs.cljs", subsPath) + fs.copySync("#{resources}cljs/db.cljs", dbPath) edit handlersPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName]] edit subsPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName]] edit dbPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName]] fs.mkdirSync 'src/cljsjs' - exec "echo '(ns cljsjs.react)' > src/cljsjs/react.cljs" + fs.writeFileSync("src/cljsjs/react.cljs", "(ns cljsjs.react)") fs.mkdirSync "src/#{projNameUs}/android" fs.mkdirSync "src/#{projNameUs}/ios" @@ -314,10 +314,10 @@ init = (projName) -> coreAndroidPath = "src/#{projNameUs}/android/core.cljs" coreIosPath = "src/#{projNameUs}/ios/core.cljs" - exec "cp #{resources}cljs/core.cljs #{coreAndroidPath}" + fs.copySync("#{resources}cljs/core.cljs", coreAndroidPath) edit coreAndroidPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName], [platformRx, "android"]] - exec "cp #{resources}cljs/core.cljs #{coreIosPath}" + fs.copySync("#{resources}cljs/core.cljs", coreIosPath) edit coreIosPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName], [platformRx, "ios"]] fs.mkdirSync "env" @@ -325,7 +325,7 @@ init = (projName) -> copyDevEnvironmentFiles(projNameHyph, projName, "localhost") copyProdEnvironmentFiles(projNameHyph, projName) - exec "cp -r #{resources}images ." + fs.copySync("#{resources}images", "./images") log 'Creating React Native skeleton. Relax, this takes a while...' From 2ea5143529b47c25ec2f7f1c1628beb6f310cf34 Mon Sep 17 00:00:00 2001 From: Marcus Wangnusson Date: Sun, 31 Jan 2016 20:56:44 +0100 Subject: [PATCH 2/3] Fixed Leiningen prerequisite check --- re-natal.coffee | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/re-natal.coffee b/re-natal.coffee index 5cdfedf..436ffc3 100644 --- a/re-natal.coffee +++ b/re-natal.coffee @@ -45,6 +45,12 @@ exec = (cmd, keepOutput) -> else child.execSync cmd, stdio: 'ignore' +executableAvailable = (executable) -> + try + exec executable + return true + catch + return false readFile = (path) -> fs.readFileSync path, encoding: 'ascii' @@ -275,7 +281,9 @@ init = (projName) -> if fs.existsSync projNameHyph throw new Error "Directory #{projNameHyph} already exists" - exec 'lein' + if not executableAvailable 'lein' + logErr 'Leiningen is required (http://leiningen.org)' + return log 'Creating Leiningen project' exec "lein new #{projNameHyph}" @@ -383,9 +391,7 @@ init = (projName) -> catch {message} logErr \ - if message.match /type.+lein/i - 'Leiningen is required (http://leiningen.org)' - else if message.match /npm/i + if message.match /npm/i "npm install failed. This may be a network issue. Check #{projNameHyph}/npm-debug.log for details." else message From 5daf7989ac774ef0ac192aadc0b912b9ffb67a7f Mon Sep 17 00:00:00 2001 From: Marcus Wangnusson Date: Mon, 1 Feb 2016 19:26:41 +0100 Subject: [PATCH 3/3] Revert to previous way of checking Leiningen installation. For Windows, check using where. If missing, throw error similar to when running on OSX/Linux. --- re-natal.coffee | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/re-natal.coffee b/re-natal.coffee index 436ffc3..cc6ee22 100644 --- a/re-natal.coffee +++ b/re-natal.coffee @@ -7,6 +7,7 @@ fs = require 'fs-extra' net = require 'net' http = require 'http' +os = require 'os' crypto = require 'crypto' child = require 'child_process' cli = require 'commander' @@ -45,12 +46,14 @@ exec = (cmd, keepOutput) -> else child.execSync cmd, stdio: 'ignore' -executableAvailable = (executable) -> - try - exec executable - return true - catch - return false +ensureExecutableAvailable = (executable) -> + if os.platform() == 'win32' + try + exec "where #{executable}" + catch e + throw new Error("type: #{executable}: not found") + else + exec "type #{executable}" readFile = (path) -> fs.readFileSync path, encoding: 'ascii' @@ -281,9 +284,7 @@ init = (projName) -> if fs.existsSync projNameHyph throw new Error "Directory #{projNameHyph} already exists" - if not executableAvailable 'lein' - logErr 'Leiningen is required (http://leiningen.org)' - return + ensureExecutableAvailable 'lein' log 'Creating Leiningen project' exec "lein new #{projNameHyph}" @@ -391,7 +392,9 @@ init = (projName) -> catch {message} logErr \ - if message.match /npm/i + if message.match /type.+lein/i + 'Leiningen is required (http://leiningen.org)' + else if message.match /npm/i "npm install failed. This may be a network issue. Check #{projNameHyph}/npm-debug.log for details." else message