-
Notifications
You must be signed in to change notification settings - Fork 0
/
gatsby-node.js
135 lines (100 loc) · 2.64 KB
/
gatsby-node.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
const git = require('simple-git/promise')
const fs = require('fs-extra')
const folderExists = async (path) => {
const check = async (path) => {
try {
await fs.stat(path)
return true
} catch(e) {
return e
}
}
const ret = await check(path)
if (ret === true)
return true
if (ret.code === 'ENOENT') {
await fs.mkdirp(path)
return check(path)
}
return ret
}
const repoInitialized = async (repo, path) => {
const check = async (repo, path) => {
try {
const toplevel = (await repo.revparse(['--show-toplevel']))
// the slice remove the \n ending the returned string
.slice(0, -1)
return toplevel === path
} catch(e) {
return false;
}
}
const ret = await check(repo, path)
if (ret === true)
return true
await repo.init()
return check(repo, path)
}
const remotePresent = async (repo, remote, url) => {
const check = async (repo, remote, url) => {
const remotes = await repo.getRemotes(true)
return remotes.some(r => r.name === remote && r.refs.fetch === url)
}
const ret = await check(repo, remote, url)
if (ret === true)
return true
await repo.addRemote(remote, url)
return check(repo, remote, url)
}
const revisionFetched = async (repo, remote, revision) => {
const check = async (repo, revision) => {
try {
const log = await repo.log([revision])
return log.latest.hash === revision
} catch (e) {
return e
}
}
const ret = await check(repo, revision)
if (ret === true)
return true
// Fetch a single revision
await repo.fetch([remote, revision, '--depth=1'])
return check(repo, revision)
}
const revisionCheckedout = async (repo, revision) => {
const check = async (repo, revision) => {
try {
const head = (await repo.revparse(['HEAD']))
// the slice remove the \n ending the returned string
.slice(0, -1)
return head === revision
} catch (e) {
return false
}
}
const ret = await check(repo, revision)
if (ret === true)
return true
// Checkout a revision
await repo.checkout(revision)
return check(repo, revision)
}
const fetch = async ({
path,
url,
remote = 'origin',
revision,
}) => {
await folderExists(path)
const repo = await git(path).silent(true)
await repoInitialized(repo, path)
await remotePresent(repo, remote, url)
await revisionFetched(repo, remote, revision)
await revisionCheckedout(repo, revision)
}
exports.onPreBootstrap = async (_, { path, url, remote, revision }) => {
console.log('')
console.log('waiting for ' + path)
return await fetch({ path, url, remote, revision })
}