@linahome/cli
Version:
lina components manage
185 lines (169 loc) • 5.55 kB
JavaScript
const ora = require('ora')
const shell = require('shelljs')
const inquirer = require('inquirer')
const fly = require('flyio')
const fs = require('fs')
const {
mkdir,
cd,
exec,
pwd,
rm,
mv
} = shell
// ora容器
let spinner = null
// 所有包的数据
let packageData = []
// 从选择列表选择的包名
let packageName = ''
// 配置的统一资源定位符(url😄)
let configUrl = ''
class HandlePull {
constructor({ argv, linaConfig }) {
this.argv = argv
this.linaConfig = linaConfig
// console.log(argv)
if (this.argv.pkgName !== '') { // 参数有模块名
/*
* ora 配置
* see https://www.npmjs.com/package/ora
*
* */
spinner = ora({
color: 'green',
indent: 1,
spinner: 'dots2'
}).start('please wait patiently\n')
this.argv.gitAlias === 'lina'
? this.findPkg() // 输入匹配到默认的别名
: this.actionToNopeDefaultAilas() // 如果不是默认
} else { // 输入参数的模块名没填写
spinner = ora({
color: 'green',
indent: 1,
spinner: 'dots5'
}).start('getting all packages, please wait for a moment...\n')
// 默认拉去远程拉取所有包名供选择
// 以下作用同上
this.argv.gitAlias === 'lina'
? this.getPackagesName()
: this.actionToNopeDefaultAilas()
}
}
actionToNopeDefaultAilas() {
const depArr = this.linaConfig.dependencies
if (this.isAliasInConfig(depArr)) { // 判断输入的别名是否在config文件里
this.getPackagesName()
} else {
spinner.fail(`no such git-alias: ${ this.argv.gitAlias }\n please check parameter and try again`)
process.exit(0)
}
}
isAliasInConfig(depArr) {
// returns the value of the first element in the provided array that satisfies the provided testing function.
return depArr.find(dep => dep.alias === this.argv.gitAlias)
}
async getPackagesName() {
const depArr = this.linaConfig.dependencies
let len = depArr.length
// 输入的参数 [--git-alias = lina] 或者 [--git-alias lina]
let { gitAlias, 'git-alias': literalAlias } = this.argv
let tmpAlias = gitAlias || literalAlias
while (len --) {
let item = depArr[len]
if (item.alias === tmpAlias) {
configUrl = item.config
break
}
}
try {
if (configUrl) {
// spinner.fail(`definitely no config file url,please complete entirely path`)
// process.exit(0)
let { data } = await fly.get(configUrl)
packageData = JSON.parse(data).packages
spinner.succeed(`got all packages, enjoy it`)
let { packages } = await inquirer.prompt([
{
type: 'rawlist',
name: 'packages',
message: '请选择模块名',
pageSize: packageData.length,
choices: packageData.filter(item => item.type && ~ item.type.indexOf('component'))
}
])
console.log('已选模块:', packages)
packageName = packages
spinner = ora({
color: 'green',
indent: 1,
spinner: 'dots2'
}).start('please wait patiently\n')
}
this.findPkg()
} catch (e) {
console.error('错误✖', e)
spinner.fail('error, please retry again')
}
}
/*
* 从命令行和linaConfig中获取仓库地址(别名)和其它信息
* */
findPkg() {
const depArr = this.linaConfig.dependencies
let len = depArr.length
// 输入的参数 [--git-alias = lina] 或者 [--git-alias lina]
let { gitAlias, 'git-alias': literalAlias } = this.argv
let tmpAlias = gitAlias || literalAlias
while (len --) {
if (depArr[len].alias === tmpAlias) {
// 执行拉取文件夹操作
let item = depArr[len]
let repository = item.repo
let pkgSrc = item.src
let dest = item.dest
dest = `./${ dest }`
!fs.existsSync(dest) && mkdir('-p', dest)
cd(dest)
this.pullPkg({
repository,
pkgSrc
})
break
}
}
}
/*
* 执行git 拉取操作
* */
pullPkg({ repository, pkgSrc }) {
let self = this
spinner.text = `now pulling ${ this.argv.pkgName || packageName }\n`
console.log('current path:', pwd().stdout)
exec('git init', { silent: true, async: false })
exec(`git remote add origin ${ repository }`, { silent: true, async: false })
exec('git config core.sparsecheckout true', { async: false })
// echo /languages/ >> .git/info/sparse-checkout
fs.writeFileSync('.git/info/sparse-checkout', `${ pkgSrc }/${ this.argv.pkgName || packageName }`)
exec(`git pull --depth=1 origin master`, { silent: true }, function (code) {
if (+ code !== 0) {
spinner.fail(`fail to pull ${ self.argv.pkgName || packageName }, please check parameter and try again`)
} else {
spinner.succeed(`succeed pull ${ self.argv.pkgName || packageName }`)
}
rm('-rf', './.git')
console.log('lina package 存放的目录:', pwd().stdout)
mv(`./${ pkgSrc }/${ self.argv.pkgName || packageName }`, './')
rm('-rf', `./${ pkgSrc.split('/')[0] }`)
// 有可能上面的while没有结束,所以exitCode默认为0
process.exit(0)
})
}
}
// use shorthand for module.exports
// exports.HandlePull = HandlePull
// or use full formation -> module.exports = { key: value }
module.exports = {
HandlePull
}