-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
105 lines (88 loc) · 2.51 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
const cac = require('cac')
const path = require('path')
const fs = require('fs')
const spawn = require('cross-spawn')
const ora = require('ora')
const parseArgs = require('../utils/parseArgs')
const logger = require('../utils/logger')
const matcher = require('multimatch')
const kleur = require('kleur')
module.exports = class Core {
constructor() {
this.cwd = process.cwd()
this.rawArgs = process.argv
this.args = parseArgs(this.rawArgs)
this.isRemotes = this.args.has('r') || this.args.has('remotes')
this.isGitProject()
this.initCli()
}
initCli() {
const cli = (this.cli = cac())
this.command = cli
.command('[...branches]')
.usage('[...branches] [options]')
.option('-r, --remotes', 'Delete remotes branches')
.action((branches, options) => {
if (branches.length === 0) cli.outputHelp()
this.deleteBranch(branches, options)
})
if (this.isRemotes) {
cli.option('--scope <scope>', 'Remote branch scope', {
default: 'origin'
})
}
cli.version(require('../package.json').version).help()
this.cli.parse(this.rawArgs, { run: false })
}
isGitProject() {
if (!fs.existsSync(path.join(this.cwd, '.git'))) {
logger.error('Current working directory is not a git project!')
process.exit(1)
}
return true
}
getBranch(options) {
const { stdout } = spawn.sync(
'git',
['branch'].concat(this.isRemotes ? ['-r'] : [])
)
let branch = []
branch = stdout
.toString()
.trimRight()
.split('\n')
.map(b => {
if (!b.includes('*')) {
return b.trim()
}
})
if (this.isRemotes && options.scope) {
branch = matcher(branch, [`${options.scope}/**`]).map(b => {
if (!b.includes('->')) {
return b.replace(`${options.scope}/`, '')
}
})
}
return branch.filter(Boolean)
}
deleteBranch(branches, options) {
const matched = matcher(this.getBranch(options), branches)
matched.forEach(branch => {
const spinner = ora(`Deleting${this.text(branch)}`)
spinner.start()
const args = this.isRemotes
? ['push', options.scope, `:${branch}`]
: ['branch', branch, '-D']
const ps = spawn.sync('git', args)
if (ps.status === 0) {
spinner.succeed(`Deleted${this.text(branch)}`)
}
})
}
text(branch) {
return `${this.isRemotes ? ' remotes' : ''} branch ` + kleur.magenta(branch)
}
run() {
this.cli.runMatchedCommand()
}
}