ern-container-publisher-cocoapod-git
Version:
Electrode Native CocoaPod Git Container Publisher
108 lines (95 loc) • 3.67 kB
text/typescript
import { ContainerPublisher } from 'ern-container-publisher'
import { createTmpDir, gitCli, shell, log, NativePlatform, mustacheUtils } from 'ern-core'
import path from 'path'
import fs from 'fs'
export default class CocoaPodGitPublisher implements ContainerPublisher {
get name(): string {
return 'cocoapod-git'
}
get platforms(): NativePlatform[] {
return ['ios']
}
public async publish({
containerPath,
containerVersion,
url,
platform,
extra
}: {
containerPath: string
containerVersion: string
url?: string,
platform: string,
extra?: {
branch?: string,
subdir?: string,
allowVersionOverwrite?: boolean,
podspec?: {
name?: string,
summary?: string,
homepage?: string,
license?: string,
author?: string,
swift_version?: string,
deployment_target?: string
}
}
}) {
const workingGitDir = createTmpDir()
const branch = (extra && extra.branch) || 'main'
const allowVersionOverwrite = (extra && extra.allowVersionOverwrite) || false
const pathToXCFramework = path.join(containerPath, 'ElectrodeContainer.xcframework');
if (!url) {
throw new Error('url is required')
}
if (!fs.existsSync(pathToXCFramework)) {
throw new Error(`Couldn't find container xcframework in ${pathToXCFramework}`)
}
try {
shell.pushd(workingGitDir)
const git = gitCli()
const re = new RegExp(`refs/heads/${branch}`)
const remoteHeads = await gitCli().raw(['ls-remote', '--heads', url])
log.debug(`workingGitDir: ${workingGitDir}`)
if (re.test(remoteHeads)) {
log.debug(`${branch} branch exists in remote. Reusing it.`)
log.debug(`Running 'git clone ${url} . --single-branch --branch ${branch} --depth 1`)
await gitCli().clone(url, '.', ['--single-branch', '--branch', branch, '--depth', '1'])
} else {
log.debug(`${branch} branch does not exists in remote. Creating it.`)
log.debug(`Running 'git clone ${url} . --depth 1`)
await gitCli().clone(url, '.', ['--depth', '1'])
await git.checkoutLocalBranch(branch)
}
shell.rm('-rf', path.join(workingGitDir, '*'))
shell.cp('-Rf', path.join(containerPath, 'ElectrodeContainer.xcframework'), workingGitDir)
await mustacheUtils.mustacheRenderToOutputFileUsingTemplateFile(
path.join(__dirname, 'ElectrodeContainer.podspec.mustache'),
{
containerVersion,
url,
name: extra?.podspec?.name ?? "ElectrodeContainer",
summary: extra?.podspec?.summary ?? "Electrode Native Container",
homepage: extra?.podspec?.homepage ?? "https://native.electrode.io",
license: extra?.podspec?.license ?? "MIT",
author: extra?.podspec?.author ?? "Electrode Native Platform",
swift_version: extra?.podspec?.swift_version ?? "5.0",
deployment_target: extra?.podspec?.deployment_target ?? "11.0"
},
path.join(workingGitDir, 'ElectrodeContainer.podspec')
)
await git.add('./*')
await git.commit(`Container v${containerVersion}`)
const tagsOptions = allowVersionOverwrite ? ['-f'] : []
await git.tag([`v${containerVersion}`, ...tagsOptions])
await git.push('origin', branch)
await git.raw(['push', 'origin', '--tags', ...tagsOptions])
log.info('[=== Completed publication of the Container ===]')
log.info(`[Publication url : ${url}]`)
log.info(`[Git Branch: ${branch}]`)
log.info(`[Git Tag: v${containerVersion}]`)
} finally {
shell.popd()
}
}
}