@lamantin/fastpush
Version:
Typed fastlane frontend for pushing builds to store
58 lines (49 loc) • 1.93 kB
text/typescript
import child_process from 'child_process'
import jetpack = require('fs-jetpack')
import { FastlaneError } from './FastlaneError'
import { promisify } from 'util'
export async function fastlane(platformDirectory: string, task: string, debug = false) {
const fastfilePath = platformDirectory + '/fastlane/Fastfile'
const contextFilePath = jetpack
.cwd(__dirname)
.cwd('../../assets')
.path('Context.rb')
const fastfileOriginal = jetpack
.read(fastfilePath)
.split('\n')
.filter(it => !it.includes('Context.rb'))
.join('\n')
const importLine = `import '${contextFilePath}'`
const fastfileModifyed = `${importLine}\n${fastfileOriginal}`
jetpack.write(fastfilePath, fastfileModifyed)
function revertChanges() {
try {
jetpack.write(fastfilePath, fastfileOriginal)
} catch (e) {
console.warn('Unable revert changes', e)
}
}
// shell.exec(`bundle install`)
// TODO: validate user input for security policy
// shelljs not supported interactive input/output so we should use child_process
// child_process.execSync('cd ' + jetpack.cwd())
try {
const command = `bundle exec fastlane ${task}`.trim()
if (debug) {
console.log('Execute fastlane in directory:', platformDirectory, `with command:\n${command}\n`)
}
const exec = promisify(child_process.exec)
const promise = exec(`cd ${platformDirectory} && ${command}`.trim(), { maxBuffer: Number.POSITIVE_INFINITY })
promise.child.stdout.pipe(process.stdout)
promise.child.stderr.pipe(process.stderr)
promise.child.stdin.pipe(process.stdin)
promise.child.on('exit', revertChanges)
promise.child.on('disconnect', revertChanges)
promise.child.on('uncaughtException', revertChanges)
promise.child.on('unhandledRejection', revertChanges)
await promise
} catch (e) {
revertChanges()
throw new FastlaneError(e.message, e.status || e.code)
}
}