-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathgit.js
83 lines (81 loc) · 2.21 KB
/
git.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
'use strict'
const fs = require('fs')
const { join } = require('path')
const { spawn, execFile } = require('child_process')
const rimraf = require('rimraf')
module.exports = args => {
const url = args.url || args.u
const branch = args.branch || args.b || 'master'
const git = args.git || args.g || 'git'
if (!url) {
throw new Error('no url given! (e.g. --url https://github/me/myrepo.git)')
}
return output =>
new Promise((resolve, reject) => {
// Checkout repository
fs.mkdtemp('penguin-git-clone-', (err, path) => {
if (err) return reject(err)
execFile(
git,
[
'clone',
'--no-checkout',
'--depth',
'1',
'--branch',
branch,
url,
path
],
err => {
if (err) return reject(err)
rimraf(join(output, '.git'), err => {
if (err) return reject(err)
fs.rename(join(path, '.git'), join(output, '.git'), err => {
if (err) return reject(err)
fs.rmdir(path, err => {
if (err) return reject(err)
resolve()
})
})
})
}
)
})
}).then(() => {
return new Promise((resolve, reject) => {
spawn(git, ['add', '.'], { stdio: 'inherit', cwd: output })
.on('error', reject)
.on('close', code => {
if (code !== 0) return reject(new Error(code))
commit()
})
function commit() {
execFile(
git,
[
'-c',
'user.name=Penguin',
'-c',
'user.email=<>',
'commit',
'--quiet',
'-m',
'Update content from penguin.js'
],
{ cwd: output },
err => {
if (err && err.code !== 1) return reject(err)
push()
}
)
}
function push() {
execFile(git, ['push', url, branch], { cwd: output }, err => {
if (err) return reject(err)
resolve()
})
}
})
})
}