-
Notifications
You must be signed in to change notification settings - Fork 8
/
git.ts
executable file
·128 lines (116 loc) · 3.52 KB
/
git.ts
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
import { editor, shell, system } from "@silverbulletmd/silverbullet/syscalls";
export async function commit(message?: string) {
if (!message) {
message = "Snapshot";
}
console.log(
"Snapshotting the current space to git with commit message",
message,
);
const { code } = await shell.run("git", ["add", "./*"]);
console.log("Git add code", code);
try {
await shell.run("git", ["commit", "-a", "-m", message]);
} catch {
// We can ignore, this happens when there's no changes to commit
}
console.log("Done!");
}
export async function snapshotCommand() {
let revName = await editor.prompt(`Revision name:`);
if (!revName) {
revName = "Snapshot";
}
console.log("Revision name", revName);
await commit(revName);
await editor.flashNotification("Done!");
}
export async function syncCommand() {
await editor.flashNotification("Syncing with git");
await sync();
await editor.flashNotification("Git sync complete!");
}
async function sync() {
console.log("Going to sync with git");
await commit();
console.log("Then pulling from remote");
await shell.run("git", ["pull"]);
console.log("And then pushing to remote");
await shell.run("git", ["push"]);
console.log("Done!");
}
async function initRepo(pieces: string[], name: string, email: string) {
const url = pieces.join('/') + '.git';
await editor.flashNotification('Now going to clone the project, this may take some time.');
await shell.run("mkdir", ["-p", "_checkout"]);
await shell.run("git", ["clone", url, "_checkout"]);
// Moving all files from _checkout to the current directory, which will complain a bit about . and .., but we'll ignore that
await shell.run("bash", ["-c", "mv -f _checkout/{.,}* . 2> /dev/null; true"]);
await shell.run("rm", ["-rf", "_checkout"]);
await shell.run("git", ["config", "user.name", name]);
await shell.run("git", ["config", "user.email", email]);
await editor.flashNotification(
"Done. Now just wait for sync to kick in to get all the content.",
);
}
export async function githubCloneCommand() {
const url = await editor.prompt(`Github project URL:`);
if (!url) {
return;
}
const token = await editor.prompt(`Github token:`);
if (!token) {
return;
}
const name = await editor.prompt(`Your name:`);
if (!name) {
return;
}
const email = await editor.prompt(`Your email:`);
if (!email) {
return;
}
const pieces = url.split("/");
pieces[2] = `${token}@${pieces[2]}`;
await initRepo(pieces, name, email);
}
export async function gitlabCloneCommand() {
const url = await editor.prompt('Gitlab project URL:');
if (!url) {
return;
}
const userName = await editor.prompt(`Gitlab Username:`);
if (!userName) {
return;
}
const token = await editor.prompt('Gitlab token:');
if (!token) {
return;
}
const name = await editor.prompt(`Your name:`);
if (!name) {
return;
}
const email = await editor.prompt(`Your email:`);
if (!email) {
return;
}
const pieces = url.split('/');
pieces[2] = `${userName}:${token}@${pieces[2]}`;
await initRepo(pieces, name, email);
}
export async function autoCommit() {
const git = await system.getSpaceConfig("git", {});
if (git.autoCommitMinutes) {
console.log("Triggered auto commit with config", git);
const currentMinutes = new Date().getMinutes();
if (currentMinutes % git.autoCommitMinutes === 0) {
console.log("Auto commit time!");
if (git.autoSync) {
await sync();
} else {
await commit("Auto commit");
}
}
}
}