Skip to content

Commit

Permalink
Make stdout/stderr configurable
Browse files Browse the repository at this point in the history
  • Loading branch information
Yurii Rashkovskii committed Jan 27, 2015
1 parent 30d7c2b commit 5e4dc68
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 27 deletions.
50 changes: 28 additions & 22 deletions tasks/build-atom-shell-task.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,11 @@ module.exports = (grunt) ->

rx.Disposable.empty

bootstrapAtomShell = (buildDir, atomShellDir, remoteUrl, tag) ->
bootstrapAtomShell = (buildDir, atomShellDir, remoteUrl, tag, stdout, stderr) ->
cmds = [
{ cmd: 'git', args: ['fetch', 'origin'], opts: {cwd: atomShellDir} },
{ cmd: 'git', args: ['reset', '--hard', 'HEAD'], opts: {cwd: atomShellDir} },
{ cmd: 'git', args: ['checkout', tag, ], opts: {cwd: atomShellDir} },
{ cmd: 'git', args: ['fetch', 'origin'], opts: {cwd: atomShellDir}, stdout: stdout, stderr: stderr },
{ cmd: 'git', args: ['reset', '--hard', 'HEAD'], opts: {cwd: atomShellDir}, stdout: stdout, stderr: stderr },
{ cmd: 'git', args: ['checkout', tag, ], opts: {cwd: atomShellDir}, stdout: stdout, stderr: stderr },
]

if fs.existsSync(atomShellDir)
Expand All @@ -69,20 +69,24 @@ module.exports = (grunt) ->
ewg.GYP_DEFINES = "#{process.env.GYP_DEFINES} #{ewg.GYP_DEFINES}"
ewg

buildAtomShell = (atomShellDir, config, projectName, productName, forceRebuild) ->
buildAtomShell = (atomShellDir, config, projectName, productName, forceRebuild, stdout, stderr) ->
cmdOptions =
cwd: atomShellDir
env: envWithGypDefines(projectName, productName)

bootstrapCmd =
cmd: 'python'
args: ['script/bootstrap.py']
args: ['script/bootstrap.py', '-v']
opts: cmdOptions
stdout: stdout
stderr: stderr

buildCmd =
cmd: 'python'
args: ['script/build.py', '-c', config, '-t', projectName]
opts: cmdOptions
stdout: stdout
stderr: stderr

rx.Observable.create (subj) ->
grunt.verbose.ok "Rigging atom.gyp to have correct name"
Expand All @@ -108,7 +112,7 @@ module.exports = (grunt) ->
.takeLast(1)
.subscribe(subj)

generateNodeLib = (atomShellDir, config, projectName, forceRebuild, nodeVersion) ->
generateNodeLib = (atomShellDir, config, projectName, forceRebuild, nodeVersion, stdout, stderr) ->
return rx.Observable.return(true) unless process.platform is 'win32'

homeDir = if process.platform is 'win32' then process.env.USERPROFILE else process.env.HOME
Expand All @@ -129,10 +133,12 @@ module.exports = (grunt) ->
cmd: 'python'
args: ['script/build.py', '-c', config, '-t', 'generate_node_lib']
opts: { cwd: atomShellDir }
stdout: stdout
stderr: stderr

spawnObservable(buildNodeLib).do(-> cp source, target).subscribe(subj)

installNode = (projectName, nodeVersion) ->
installNode = (projectName, nodeVersion, stdout, stderr) ->
nodeArch = switch process.platform
when 'darwin' then 'x64'
when 'win32' then 'ia32'
Expand Down Expand Up @@ -160,9 +166,9 @@ module.exports = (grunt) ->

rx.Observable.create (subj) ->
grunt.verbose.ok 'Installing node.js'
spawnObservable({cmd, args, opts: {env}}).subscribe(subj)
spawnObservable({cmd, args, opts: {env}, stdout: stdout, stderr: stderr}).subscribe(subj)

rebuildNativeModules = (projectName, nodeVersion) ->
rebuildNativeModules = (projectName, nodeVersion, stdout, stderr) ->
nodeArch = switch process.platform
when 'darwin' then 'x64'
when 'win32' then 'ia32'
Expand All @@ -179,19 +185,19 @@ module.exports = (grunt) ->

rx.Observable.create (subj) ->
grunt.verbose.ok 'Rebuilding native modules against Atom Shell'
spawnObservable({cmd, args, opts: {env}}).subscribe(subj)
spawnObservable({cmd, args, opts: {env}, stdout: stdout, stderr: stderr}).subscribe(subj)

grunt.registerTask 'rebuild-native-modules', "Rebuild native modules (debugging)", ->
done = @async()

{buildDir, config, projectName, nodeVersion} = grunt.config 'build-atom-shell'
{buildDir, config, projectName, nodeVersion, stdout, stderr} = grunt.config 'build-atom-shell'
config ?= 'Release'
atomShellDir = path.join buildDir, 'atom-shell'

rebuild = rx.Observable.concat(
installNode(projectName, nodeVersion),
generateNodeLib(atomShellDir, config, projectName, true),
rebuildNativeModules(projectName, nodeVersion)).takeLast(1)
installNode(projectName, nodeVersion, stdout, stderr),
generateNodeLib(atomShellDir, config, projectName, true, stdout, stderr),
rebuildNativeModules(projectName, nodeVersion, stdout, stderr)).takeLast(1)

rebuild.subscribe(done, done)

Expand All @@ -209,23 +215,23 @@ module.exports = (grunt) ->

@requiresConfig "#{@name}.buildDir", "#{@name}.tag", "#{@name}.projectName", "#{@name}.productName"

{buildDir, targetDir, config, remoteUrl, projectName, productName, tag, forceRebuild, nodeVersion} = grunt.config @name
{buildDir, targetDir, config, remoteUrl, projectName, productName, tag, forceRebuild, nodeVersion, stdout, stderr} = grunt.config @name
config ?= 'Release'
remoteUrl ?= 'https://github.com/atom/atom-shell'
targetDir ?= 'atom-shell'
atomShellDir = path.join buildDir, 'atom-shell'
nodeVersion ?= process.env.ATOM_NODE_VERSION ? '0.20.0'

buildAndTryBootstrappingIfItDoesntWork =
buildAtomShell(atomShellDir, config, projectName, productName, forceRebuild)
.catch(buildAtomShell(atomShellDir, config, projectName, productName, true))
buildAtomShell(atomShellDir, config, projectName, productName, forceRebuild, stdout, stderr)
.catch(buildAtomShell(atomShellDir, config, projectName, productName, true, stdout, stderr))

buildErrything = rx.Observable.concat(
bootstrapAtomShell(buildDir, atomShellDir, remoteUrl, tag),
bootstrapAtomShell(buildDir, atomShellDir, remoteUrl, tag, stdout, stderr),
buildAndTryBootstrappingIfItDoesntWork,
installNode(projectName, nodeVersion),
generateNodeLib(atomShellDir, config, projectName, forceRebuild, nodeVersion),
rebuildNativeModules(projectName, nodeVersion)).takeLast(1)
installNode(projectName, nodeVersion, stdout, stderr),
generateNodeLib(atomShellDir, config, projectName, forceRebuild, nodeVersion, stdout, stderr),
rebuildNativeModules(projectName, nodeVersion, stdout, stderr)).takeLast(1)

buildErrything
.map (x) ->
Expand Down
19 changes: 14 additions & 5 deletions tasks/task-helpers.coffee
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
fs = require 'fs-plus'
path = require 'path'
_ = require 'underscore'

module.exports = (grunt) ->
cp: (source, destination, {filter}={}) ->
Expand Down Expand Up @@ -47,15 +48,23 @@ module.exports = (grunt) ->

spawn: (options, callback) ->
childProcess = require 'child_process'
stdout = []
stderr = []
stdout = (options.stdout && process.stdout) || []
stderr = (options.stderr && process.stderr) || []
error = null
proc = childProcess.spawn(options.cmd, options.args, options.opts)
proc.stdout.on 'data', (data) -> stdout.push(data.toString())
proc.stderr.on 'data', (data) -> stderr.push(data.toString())
proc.stdout.on 'data', (data) ->
if stdout is []
stdout.push(data.toString())
else
stdout.write(data.toString())
proc.stderr.on 'data', (data) ->
if stderr is []
stderr.push(data.toString())
else
stderr.write(data.toString())
proc.on 'error', (processError) -> error ?= processError
proc.on 'close', (exitCode, signal) ->
error ?= new Error(signal) if exitCode != 0
results = {stderr: stderr.join(''), stdout: stdout.join(''), code: exitCode}
results = {stderr: (if _.isArray(stderr) then stderr.join('') else ''), stdout: (if _.isArray(stdout) then stdout.join('') else ''), code: exitCode}
grunt.log.error results.stderr if exitCode != 0
callback(error, results, exitCode)

0 comments on commit 5e4dc68

Please sign in to comment.