forked from newrelic/node-newrelic
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgit-commands.js
154 lines (125 loc) · 3.66 KB
/
git-commands.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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
* Copyright 2021 New Relic Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
'use strict'
const { exec } = require('child_process')
// in CI we clone `node-newrelic` for reusable workflows
// we do not want it to be part of `git status` nor adding via `git add .`
const AGENT_SUB_REPO = 'agent-repo'
const DOCS_SUB_REPO = 'docs-website'
async function getPushRemotes() {
const stdout = await execAsPromise('git remote -v')
const remotes = stdout.split('\n')
return remotes.reduce((remotePairs, currentRemote) => {
const parts = currentRemote.split('\t')
if (parts.length < 2) {
return remotePairs
}
const [name, url] = parts
if (url.indexOf('(push)') >= 0) {
remotePairs[name] = url
}
return remotePairs
}, {})
}
async function getLocalChanges() {
const stdout = await execAsPromise('git status --short --porcelain')
return stdout.split('\n').filter((line) => {
return line.length > 0 && !line.includes(AGENT_SUB_REPO || DOCS_SUB_REPO)
})
}
async function getCurrentBranch() {
const stdout = await execAsPromise('git branch --show-current')
return stdout.trim()
}
async function checkoutNewBranch(name) {
const stdout = await execAsPromise(`git checkout -b ${name}`)
return stdout.trim()
}
async function addAllFiles() {
const stdout = await execAsPromise(`git add . ':!${AGENT_SUB_REPO}'`)
return stdout.trim()
}
async function addFiles(files) {
files = files.join(' ')
const stdout = await execAsPromise(`git add ${files}`)
return stdout.trim()
}
async function commit(message) {
const stdout = await execAsPromise(`git commit -m "${message}"`)
return stdout.trim()
}
async function pushToRemote(remote, branchName) {
const stdout = await execAsPromise(`git push --set-upstream ${remote} ${branchName}`)
return stdout.trim()
}
async function createAnnotatedTag(name, message) {
const stdout = await execAsPromise(`git tag -a ${name} -m ${message}`)
return stdout.trim()
}
async function pushTags() {
const stdout = await execAsPromise('git push --tags')
return stdout.trim()
}
async function checkout(branchName) {
const stdout = await execAsPromise(`git checkout ${branchName}`)
return stdout.trim()
}
async function clone(url, name, args) {
const argsString = args.join(' ')
const stdout = await execAsPromise(`git clone ${argsString} ${url} ${name}`)
return stdout.trim()
}
async function setSparseCheckoutFolders(folders) {
const foldersString = folders.join(' ')
const stdout = await execAsPromise(`git sparse-checkout set --no-cone ${foldersString}`)
return stdout.trim()
}
async function sparseCloneRepo(repoInfo, checkoutFiles) {
const { name, repository, branch } = repoInfo
const cloneOptions = [
'--filter=blob:none',
'--no-checkout',
'--depth 1',
'--sparse',
`--branch=${branch}`
]
await clone(repository, name, cloneOptions)
process.chdir(name)
await setSparseCheckoutFolders(checkoutFiles)
await checkout(branch)
process.chdir('..')
}
async function setUser(name, email) {
const setName = await execAsPromise(`git config user.name ${name}`)
const setEmail = await execAsPromise(`git config user.email ${email}`)
return [setName, setEmail].join(' ')
}
function execAsPromise(command) {
return new Promise((resolve, reject) => {
console.log(`Executing: '${command}'`)
exec(command, (err, stdout) => {
if (err) {
reject(err)
}
resolve(stdout)
})
})
}
module.exports = {
getPushRemotes,
getLocalChanges,
getCurrentBranch,
checkoutNewBranch,
addAllFiles,
commit,
pushToRemote,
createAnnotatedTag,
pushTags,
checkout,
clone,
sparseCloneRepo,
addFiles,
setUser
}