1 | const { execSync } = require('child_process')
|
2 | const fs = require('fs-extra')
|
3 | const path = require('path')
|
4 |
|
5 | const { resolveCwd } = require('./utils')
|
6 |
|
7 | const TEXT_FILE_EXT = [
|
8 | '.js', '.json', '.css', '.scss', '.sass', '.html',
|
9 | '.log', '.xml', '.vue'
|
10 | ]
|
11 | const textFileTypes = new Set(TEXT_FILE_EXT)
|
12 | const isTextFile = function (type) {
|
13 | return textFileTypes.has(type)
|
14 | }
|
15 |
|
16 | module.exports = (target, empty, src) => {
|
17 | const srcStats = fs.lstatSync(src)
|
18 | const srcExt = path.extname(src)
|
19 |
|
20 | if (isTextFile(srcExt) || !srcExt || srcStats.isDirectory()) {
|
21 | if (fs.existsSync(target) && !srcStats.isDirectory()) {
|
22 | try {
|
23 | const child = execSync(`git merge-file ${target} ${empty} ${src}`)
|
24 | } catch (err) {
|
25 | const rst = fs.readFileSync(target, { encoding: 'utf-8' })
|
26 | const conflictRE = /\>{6,}/
|
27 | const hasConflict = conflictRE.test(rst)
|
28 |
|
29 | if (hasConflict) return false
|
30 | else throw err
|
31 | }
|
32 | } else {
|
33 | fs.copySync(src, target)
|
34 | }
|
35 | } else {
|
36 | fs.copySync(src, target)
|
37 | }
|
38 |
|
39 | return true
|
40 | }
|
41 |
|
42 |
|