forked from eduardoboucas/staticman
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGitHub.js
124 lines (106 loc) · 3.02 KB
/
GitHub.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
'use strict'
const path = require('path')
const config = require(path.join(__dirname, '/../config'))
const errorHandler = require('./ErrorHandler')
const GitHubApi = require('github')
const yaml = require('js-yaml')
const GitHub = function (options) {
this.options = options
this.api = new GitHubApi({
debug: config.get('env') === 'development',
protocol: 'https',
host: 'api.github.com',
pathPrefix: '',
headers: {
'user-agent': 'Staticman agent'
},
timeout: 5000,
Promise: Promise
})
this.api.authenticate({
type: 'oauth',
token: config.get('githubToken')
})
}
GitHub.prototype.readFile = function (path, getFullResponse) {
const extension = path.split('.').pop()
return this.api.repos.getContent({
user: this.options.username,
repo: this.options.repository,
path,
ref: this.options.branch
}).then(res => {
let content = Buffer.from(res.content, 'base64').toString()
try {
switch (extension) {
case 'yml':
case 'yaml':
content = yaml.safeLoad(content, 'utf8')
break
case 'json':
content = JSON.parse(content)
break
}
return getFullResponse ? {
content: content,
file: {
content: res.content
}
} : content
} catch (err) {
let errorData = {
err
}
if (err.message) {
errorData.data = err.message
}
return Promise.reject(errorHandler('PARSING_ERROR', errorData))
}
}).catch(err => {
return Promise.reject(errorHandler('GITHUB_READING_FILE', {err}))
})
}
GitHub.prototype.writeFile = function (filePath, data, branch, commitTitle) {
branch = branch || this.options.branch
commitTitle = commitTitle || 'Add Staticman file'
return this.api.repos.createFile({
user: this.options.username,
repo: this.options.repository,
path: filePath,
content: Buffer.from(data).toString('base64'),
message: commitTitle,
branch: branch
}).catch(err => {
return Promise.reject(errorHandler('GITHUB_WRITING_FILE', {err}))
})
}
GitHub.prototype.writeFileAndSendPR = function (filePath, data, branch, commitTitle, commitBody) {
commitTitle = commitTitle || 'Add Staticman file'
commitBody = commitBody || ''
return this.api.repos.getBranch({
user: this.options.username,
repo: this.options.repository,
branch: this.options.branch
}).then(res => {
return this.api.gitdata.createReference({
user: this.options.username,
repo: this.options.repository,
ref: 'refs/heads/' + branch,
sha: res.commit.sha
})
}).then(res => {
return this.writeFile(filePath, data, branch, commitTitle)
}).then(res => {
return this.api.pullRequests.create({
user: this.options.username,
repo: this.options.repository,
title: commitTitle,
head: branch,
base: this.options.branch,
body: commitBody
})
}).catch(err => {
return Promise.reject(errorHandler('GITHUB_CREATING_PR', {err}))
})
}
module.exports = GitHub