git-sync-js 1.1.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -16
- package/dist/src/clone.d.ts +3 -3
- package/dist/src/clone.d.ts.map +1 -1
- package/dist/src/clone.js +15 -11
- package/dist/src/clone.js.map +1 -1
- package/dist/src/commitAndSync.d.ts +8 -8
- package/dist/src/commitAndSync.d.ts.map +1 -1
- package/dist/src/commitAndSync.js +70 -66
- package/dist/src/commitAndSync.js.map +1 -1
- package/dist/src/credential.d.ts.map +1 -1
- package/dist/src/credential.js +2 -2
- package/dist/src/credential.js.map +1 -1
- package/dist/src/errors.d.ts +3 -3
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +2 -1
- package/dist/src/errors.js.map +1 -1
- package/dist/src/forcePull.d.ts +22 -0
- package/dist/src/forcePull.d.ts.map +1 -0
- package/dist/src/forcePull.js +58 -0
- package/dist/src/forcePull.js.map +1 -0
- package/dist/src/index.d.ts +5 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/init.js.map +1 -1
- package/dist/src/initGit.d.ts +7 -7
- package/dist/src/initGit.d.ts.map +1 -1
- package/dist/src/initGit.js +2 -2
- package/dist/src/initGit.js.map +1 -1
- package/dist/src/inspect.d.ts +2 -2
- package/dist/src/inspect.d.ts.map +1 -1
- package/dist/src/inspect.js +24 -10
- package/dist/src/inspect.js.map +1 -1
- package/dist/src/interface.d.ts +53 -31
- package/dist/src/interface.d.ts.map +1 -1
- package/dist/src/interface.js +54 -25
- package/dist/src/interface.js.map +1 -1
- package/dist/src/sync.d.ts +5 -0
- package/dist/src/sync.d.ts.map +1 -1
- package/dist/src/sync.js +16 -2
- package/dist/src/sync.js.map +1 -1
- package/package.json +35 -39
package/README.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# git-sync-js
|
|
2
2
|
|
|
3
|
+
[Documentation Site](https://tiddly-gittly.github.io/git-sync-js/)
|
|
4
|
+
|
|
3
5
|
JS implementation for [Git-Sync](https://github.com/simonthum/git-sync), a handy script that backup your notes in a git repo to the remote git services.
|
|
4
6
|
|
|
5
|
-
Used by [
|
|
7
|
+
Used by OpenSource free bi-link second brain note taking & knowledge map app [TidGi-Desktop](https://github.com/tiddly-gittly/TidGi-Desktop), refactor out to be a npm package.
|
|
6
8
|
|
|
7
9
|
```shell
|
|
8
10
|
npm i git-sync-js
|
|
@@ -31,11 +33,13 @@ import {
|
|
|
31
33
|
} from 'git-sync-js';
|
|
32
34
|
```
|
|
33
35
|
|
|
34
|
-
|
|
36
|
+
See [api docs](./docs/api/) for full list of them.
|
|
37
|
+
|
|
38
|
+
You can see [TidGi-Desktop's usage](https://github.com/tiddly-gittly/TidGi-Desktop/blob/9e73bbf96deb5a4c085bbf9c56dc38e62efdd550/src/services/git/gitWorker.ts) for full example.
|
|
35
39
|
|
|
36
40
|
### initGit
|
|
37
41
|
|
|
38
|
-
Initialize a new `.git` on a folder. If set `syncImmediately` to `true`, it will push local git to remote immediately after init, you should provide `userInfo.accessToken` and `remoteUrl`, otherwise they are optional.
|
|
42
|
+
[initGit()](./docs/api/modules/initGit.md) Initialize a new `.git` on a folder. If set `syncImmediately` to `true`, it will push local git to remote immediately after init, you should provide `userInfo.accessToken` and `remoteUrl`, otherwise they are optional.
|
|
39
43
|
|
|
40
44
|
```ts
|
|
41
45
|
try {
|
|
@@ -45,10 +49,16 @@ try {
|
|
|
45
49
|
syncImmediately: isSyncedWiki,
|
|
46
50
|
userInfo: { ...defaultGitInfo, ...userInfo },
|
|
47
51
|
logger: {
|
|
48
|
-
log: (message: string, context: ILoggerContext): unknown =>
|
|
49
|
-
|
|
52
|
+
log: (message: string, context: ILoggerContext): unknown =>
|
|
53
|
+
logger.info(message, { callerFunction: 'initWikiGit', ...context }),
|
|
54
|
+
warn: (message: string, context: ILoggerContext): unknown =>
|
|
55
|
+
logger.warn(message, { callerFunction: 'initWikiGit', ...context }),
|
|
50
56
|
info: (message: GitStep, context: ILoggerContext): void => {
|
|
51
|
-
logger.notice(this.translateMessage(message), {
|
|
57
|
+
logger.notice(this.translateMessage(message), {
|
|
58
|
+
handler: WikiChannel.syncProgress,
|
|
59
|
+
callerFunction: 'initWikiGit',
|
|
60
|
+
...context,
|
|
61
|
+
});
|
|
52
62
|
},
|
|
53
63
|
},
|
|
54
64
|
});
|
|
@@ -59,7 +69,7 @@ try {
|
|
|
59
69
|
|
|
60
70
|
### commitAndSync
|
|
61
71
|
|
|
62
|
-
Core feature of git-sync, commit all unstaged files, and try rebase on remote, and push to the remote.
|
|
72
|
+
[commitAndSync()](./docs/api/modules/commitAndSync.md) is the Core feature of git-sync, commit all unstaged files, and try rebase on remote, and push to the remote.
|
|
63
73
|
|
|
64
74
|
```ts
|
|
65
75
|
try {
|
|
@@ -68,10 +78,16 @@ try {
|
|
|
68
78
|
remoteUrl,
|
|
69
79
|
userInfo: { ...defaultGitInfo, ...userInfo },
|
|
70
80
|
logger: {
|
|
71
|
-
log: (message: string, context: ILoggerContext): unknown =>
|
|
72
|
-
|
|
81
|
+
log: (message: string, context: ILoggerContext): unknown =>
|
|
82
|
+
logger.info(message, { callerFunction: 'commitAndSync', ...context }),
|
|
83
|
+
warn: (message: string, context: ILoggerContext): unknown =>
|
|
84
|
+
logger.warn(message, { callerFunction: 'commitAndSync', ...context }),
|
|
73
85
|
info: (message: GitStep, context: ILoggerContext): void => {
|
|
74
|
-
logger.notice(this.translateMessage(message), {
|
|
86
|
+
logger.notice(this.translateMessage(message), {
|
|
87
|
+
handler: WikiChannel.syncProgress,
|
|
88
|
+
callerFunction: 'commitAndSync',
|
|
89
|
+
...context,
|
|
90
|
+
});
|
|
75
91
|
},
|
|
76
92
|
},
|
|
77
93
|
filesToIgnore,
|
|
@@ -83,7 +99,7 @@ try {
|
|
|
83
99
|
|
|
84
100
|
### clone
|
|
85
101
|
|
|
86
|
-
Clone a remote repo to a local location.
|
|
102
|
+
[clone()](./docs/api/modules/clone.md) will Clone a remote repo to a local location.
|
|
87
103
|
|
|
88
104
|
```ts
|
|
89
105
|
try {
|
|
@@ -92,10 +108,16 @@ try {
|
|
|
92
108
|
remoteUrl,
|
|
93
109
|
userInfo: { ...defaultGitInfo, ...userInfo },
|
|
94
110
|
logger: {
|
|
95
|
-
log: (message: string, context: ILoggerContext): unknown =>
|
|
96
|
-
|
|
111
|
+
log: (message: string, context: ILoggerContext): unknown =>
|
|
112
|
+
logger.info(message, { callerFunction: 'clone', ...context }),
|
|
113
|
+
warn: (message: string, context: ILoggerContext): unknown =>
|
|
114
|
+
logger.warn(message, { callerFunction: 'clone', ...context }),
|
|
97
115
|
info: (message: GitStep, context: ILoggerContext): void => {
|
|
98
|
-
logger.notice(this.translateMessage(message), {
|
|
116
|
+
logger.notice(this.translateMessage(message), {
|
|
117
|
+
handler: WikiChannel.syncProgress,
|
|
118
|
+
callerFunction: 'clone',
|
|
119
|
+
...context,
|
|
120
|
+
});
|
|
99
121
|
},
|
|
100
122
|
},
|
|
101
123
|
});
|
|
@@ -161,7 +183,7 @@ Check if dir has `.git`.
|
|
|
161
183
|
|
|
162
184
|
## Steps
|
|
163
185
|
|
|
164
|
-
These
|
|
186
|
+
These is a git sync steps enum [GitStep](./docs/api/enums/interface.GitStep.md), that will log to logger when steps happened. You can write switch case on them in your custom logger, and translate them into user readable info.
|
|
165
187
|
|
|
166
188
|
```shell
|
|
167
189
|
StartGitInitialization
|
|
@@ -196,7 +218,7 @@ CantSyncInSpecialGitStateAutoFixSucceed
|
|
|
196
218
|
|
|
197
219
|
## Errors
|
|
198
220
|
|
|
199
|
-
These are the errors throw on git sync gets into fatal situations. You can try catch on major functions to get these errors, and `instanceof` these error to translate their message for user to read and report.
|
|
221
|
+
These are the errors like [AssumeSyncError](./docs/api/classes/errors.AssumeSyncError.md) that will throw on git sync gets into fatal situations. You can try catch on major functions to get these errors, and `instanceof` these error to translate their message for user to read and report.
|
|
200
222
|
|
|
201
223
|
```shell
|
|
202
224
|
AssumeSyncError
|
package/dist/src/clone.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { IGitUserInfos, ILogger } from './interface';
|
|
2
1
|
import { defaultGitInfo as defaultDefaultGitInfo } from './defaultGitInfo';
|
|
2
|
+
import { IGitUserInfos, ILogger } from './interface';
|
|
3
3
|
export declare function clone(options: {
|
|
4
|
+
defaultGitInfo?: typeof defaultDefaultGitInfo;
|
|
4
5
|
/** wiki folder path, can be relative, should exist before function call */
|
|
5
6
|
dir: string;
|
|
7
|
+
logger?: ILogger;
|
|
6
8
|
/** the storage service url we are sync to, for example your github repo url */
|
|
7
9
|
remoteUrl?: string;
|
|
8
10
|
/** user info used in the commit message */
|
|
9
11
|
userInfo?: IGitUserInfos;
|
|
10
|
-
logger?: ILogger;
|
|
11
|
-
defaultGitInfo?: typeof defaultDefaultGitInfo;
|
|
12
12
|
}): Promise<void>;
|
|
13
13
|
//# sourceMappingURL=clone.d.ts.map
|
package/dist/src/clone.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../../src/clone.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../../src/clone.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,IAAI,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAI3E,OAAO,EAAW,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE9D,wBAAsB,KAAK,CAAC,OAAO,EAAE;IACnC,cAAc,CAAC,EAAE,OAAO,qBAAqB,CAAC;IAC9C,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDhB"}
|
package/dist/src/clone.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { GitProcess } from 'dugite';
|
|
2
2
|
import { truncate } from 'lodash';
|
|
3
|
-
import {
|
|
4
|
-
import { SyncParameterMissingError, GitPullPushError } from './errors';
|
|
5
|
-
import { getRemoteName } from './inspect';
|
|
6
|
-
import { GitStep } from './interface';
|
|
3
|
+
import { credentialOff, credentialOn } from './credential';
|
|
7
4
|
import { defaultGitInfo as defaultDefaultGitInfo } from './defaultGitInfo';
|
|
5
|
+
import { GitPullPushError, SyncParameterMissingError } from './errors';
|
|
8
6
|
import { initGitWithBranch } from './init';
|
|
7
|
+
import { getRemoteName } from './inspect';
|
|
8
|
+
import { GitStep } from './interface';
|
|
9
9
|
export async function clone(options) {
|
|
10
10
|
const { dir, remoteUrl, userInfo, logger, defaultGitInfo = defaultDefaultGitInfo } = options;
|
|
11
11
|
const { gitUserName, branch } = userInfo ?? defaultGitInfo;
|
|
@@ -42,14 +42,18 @@ export async function clone(options) {
|
|
|
42
42
|
logDebug(`Successfully Running git init for clone in dir ${dir}`, GitStep.PrepareCloneOnlineWiki);
|
|
43
43
|
logProgress(GitStep.StartConfiguringGithubRemoteRepository);
|
|
44
44
|
await credentialOn(dir, remoteUrl, gitUserName, accessToken, remoteName);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
try {
|
|
46
|
+
logProgress(GitStep.StartFetchingFromGithubRemote);
|
|
47
|
+
const { stderr: pullStdError, exitCode } = await GitProcess.exec(['pull', remoteName, `${branch}:${branch}`], dir);
|
|
48
|
+
if (exitCode === 0) {
|
|
49
|
+
logProgress(GitStep.SynchronizationFinish);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
throw new GitPullPushError(options, pullStdError);
|
|
53
|
+
}
|
|
50
54
|
}
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
finally {
|
|
56
|
+
await credentialOff(dir, remoteName, remoteUrl);
|
|
53
57
|
}
|
|
54
58
|
}
|
|
55
59
|
//# sourceMappingURL=clone.js.map
|
package/dist/src/clone.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clone.js","sourceRoot":"","sources":["../../src/clone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"clone.js","sourceRoot":"","sources":["../../src/clone.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import { IGitUserInfos, ILogger } from './interface';
|
|
2
1
|
import { defaultGitInfo as defaultDefaultGitInfo } from './defaultGitInfo';
|
|
2
|
+
import { IGitUserInfos, ILogger } from './interface';
|
|
3
3
|
export interface ICommitAndSyncOptions {
|
|
4
|
+
/** the commit message */
|
|
5
|
+
commitMessage?: string;
|
|
6
|
+
commitOnly?: boolean;
|
|
7
|
+
defaultGitInfo?: typeof defaultDefaultGitInfo;
|
|
4
8
|
/** wiki folder path, can be relative */
|
|
5
9
|
dir: string;
|
|
6
|
-
|
|
10
|
+
/** if you want to use a dynamic .gitignore, you can passing an array contains filepaths that want to ignore */
|
|
11
|
+
filesToIgnore?: string[];
|
|
12
|
+
logger?: ILogger;
|
|
7
13
|
/** the storage service url we are sync to, for example your github repo url
|
|
8
14
|
* When empty, and commitOnly===true, it means we just want commit, without sync
|
|
9
15
|
*/
|
|
@@ -12,12 +18,6 @@ export interface ICommitAndSyncOptions {
|
|
|
12
18
|
* When empty, and commitOnly===true, it means we just want commit, without sync
|
|
13
19
|
*/
|
|
14
20
|
userInfo?: IGitUserInfos;
|
|
15
|
-
/** the commit message */
|
|
16
|
-
commitMessage?: string;
|
|
17
|
-
logger?: ILogger;
|
|
18
|
-
defaultGitInfo?: typeof defaultDefaultGitInfo;
|
|
19
|
-
/** if you want to use a dynamic .gitignore, you can passing an array contains filepaths that want to ignore */
|
|
20
|
-
filesToIgnore?: string[];
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* `git add .` + `git commit` + `git rebase` or something that can sync bi-directional
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commitAndSync.d.ts","sourceRoot":"","sources":["../../src/commitAndSync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commitAndSync.d.ts","sourceRoot":"","sources":["../../src/commitAndSync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,IAAI,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAG3E,OAAO,EAAW,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG9D,MAAM,WAAW,qBAAqB;IACpC,yBAAyB;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,qBAAqB,CAAC;IAC9C,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,+GAA+G;IAC/G,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AACD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+JjF"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { GitProcess } from 'dugite';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { credentialOff, credentialOn } from './credential';
|
|
3
|
+
import { defaultGitInfo as defaultDefaultGitInfo } from './defaultGitInfo';
|
|
4
|
+
import { CantSyncGitNotInitializedError, GitPullPushError, SyncParameterMissingError } from './errors';
|
|
4
5
|
import { assumeSync, getDefaultBranchName, getGitRepositoryState, getRemoteName, getSyncState, haveLocalChanges } from './inspect';
|
|
5
6
|
import { GitStep } from './interface';
|
|
6
|
-
import {
|
|
7
|
-
import { commitFiles, continueRebase, mergeUpstream, pushUpstream } from './sync';
|
|
7
|
+
import { commitFiles, continueRebase, fetchRemote, mergeUpstream, pushUpstream } from './sync';
|
|
8
8
|
/**
|
|
9
9
|
* `git add .` + `git commit` + `git rebase` or something that can sync bi-directional
|
|
10
10
|
*/
|
|
@@ -69,78 +69,82 @@ export async function commitAndSync(options) {
|
|
|
69
69
|
}
|
|
70
70
|
await credentialOn(dir, remoteUrl, gitUserName, accessToken, remoteName);
|
|
71
71
|
logProgress(GitStep.FetchingData);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
72
|
+
try {
|
|
73
|
+
await fetchRemote(dir, remoteName, defaultBranchName);
|
|
74
|
+
let exitCode = 0;
|
|
75
|
+
let stderr;
|
|
76
|
+
const syncStateAfterCommit = await getSyncState(dir, defaultBranchName, remoteName, logger);
|
|
77
|
+
switch (syncStateAfterCommit) {
|
|
78
|
+
case 'equal': {
|
|
79
|
+
logProgress(GitStep.NoNeedToSync);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
case 'noUpstreamOrBareUpstream': {
|
|
83
|
+
logProgress(GitStep.NoUpstreamCantPush);
|
|
84
|
+
// try push, if success, means it is bare, otherwise, it is no upstream
|
|
85
|
+
try {
|
|
86
|
+
await pushUpstream(dir, defaultBranchName, remoteName, userInfo, logger);
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
logWarn(`${JSON.stringify({ dir, remoteUrl, userInfo })}, remoteUrl may be not valid, noUpstreamOrBareUpstream after credentialOn`, GitStep.NoUpstreamCantPush);
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
case 'ahead': {
|
|
95
|
+
logProgress(GitStep.LocalAheadStartUpload);
|
|
86
96
|
await pushUpstream(dir, defaultBranchName, remoteName, userInfo, logger);
|
|
87
97
|
break;
|
|
88
98
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
case 'ahead': {
|
|
95
|
-
logProgress(GitStep.LocalAheadStartUpload);
|
|
96
|
-
await pushUpstream(dir, defaultBranchName, remoteName, userInfo, logger);
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
case 'behind': {
|
|
100
|
-
logProgress(GitStep.LocalStateBehindSync);
|
|
101
|
-
await mergeUpstream(dir, defaultBranchName, remoteName, userInfo, logger);
|
|
102
|
-
break;
|
|
103
|
-
}
|
|
104
|
-
case 'diverged': {
|
|
105
|
-
logProgress(GitStep.LocalStateDivergeRebase);
|
|
106
|
-
({ exitCode, stderr } = await GitProcess.exec(['rebase', `${remoteName}/${defaultBranchName}`], dir));
|
|
107
|
-
logProgress(GitStep.RebaseResultChecking);
|
|
108
|
-
if (exitCode !== 0) {
|
|
109
|
-
logWarn(`exitCode: ${exitCode}, stderr of git rebase: ${stderr}`, GitStep.RebaseResultChecking);
|
|
99
|
+
case 'behind': {
|
|
100
|
+
logProgress(GitStep.LocalStateBehindSync);
|
|
101
|
+
await mergeUpstream(dir, defaultBranchName, remoteName, userInfo, logger);
|
|
102
|
+
break;
|
|
110
103
|
}
|
|
111
|
-
|
|
112
|
-
(
|
|
113
|
-
(
|
|
114
|
-
logProgress(GitStep.
|
|
104
|
+
case 'diverged': {
|
|
105
|
+
logProgress(GitStep.LocalStateDivergeRebase);
|
|
106
|
+
({ exitCode, stderr } = await GitProcess.exec(['rebase', `${remoteName}/${defaultBranchName}`], dir));
|
|
107
|
+
logProgress(GitStep.RebaseResultChecking);
|
|
108
|
+
if (exitCode !== 0) {
|
|
109
|
+
logWarn(`exitCode: ${exitCode}, stderr of git rebase: ${stderr}`, GitStep.RebaseResultChecking);
|
|
110
|
+
}
|
|
111
|
+
if (exitCode === 0 &&
|
|
112
|
+
(await getGitRepositoryState(dir, logger)).length === 0 &&
|
|
113
|
+
(await getSyncState(dir, defaultBranchName, remoteName, logger)) === 'ahead') {
|
|
114
|
+
logProgress(GitStep.RebaseSucceed);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
await continueRebase(dir, gitUserName, email ?? defaultGitInfo.email, logger);
|
|
118
|
+
logProgress(GitStep.RebaseConflictNeedsResolve);
|
|
119
|
+
}
|
|
120
|
+
await pushUpstream(dir, defaultBranchName, remoteName, userInfo, logger);
|
|
121
|
+
break;
|
|
115
122
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
logProgress(GitStep.RebaseConflictNeedsResolve);
|
|
123
|
+
default: {
|
|
124
|
+
logProgress(GitStep.SyncFailedAlgorithmWrong);
|
|
119
125
|
}
|
|
120
|
-
await pushUpstream(dir, defaultBranchName, remoteName, userInfo, logger);
|
|
121
|
-
break;
|
|
122
126
|
}
|
|
123
|
-
|
|
124
|
-
logProgress(GitStep.
|
|
127
|
+
if (exitCode === 0) {
|
|
128
|
+
logProgress(GitStep.PerformLastCheckBeforeSynchronizationFinish);
|
|
129
|
+
await assumeSync(dir, defaultBranchName, remoteName, logger);
|
|
130
|
+
logProgress(GitStep.SynchronizationFinish);
|
|
125
131
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
case 128: {
|
|
137
|
-
throw new GitPullPushError(options, stderr ?? '');
|
|
138
|
-
}
|
|
139
|
-
// TODO: handle auth expire and throw here
|
|
140
|
-
default: {
|
|
141
|
-
throw new GitPullPushError(options, stderr ?? '');
|
|
132
|
+
else {
|
|
133
|
+
switch (exitCode) {
|
|
134
|
+
// "message":"exitCode: 128, stderr of git push: fatal: unable to access 'https://github.com/tiddly-gittly/TiddlyWiki-Chinese-Tutorial.git/': LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443 \n"
|
|
135
|
+
case 128: {
|
|
136
|
+
throw new GitPullPushError(options, stderr ?? '');
|
|
137
|
+
}
|
|
138
|
+
// TODO: handle auth expire and throw here
|
|
139
|
+
default: {
|
|
140
|
+
throw new GitPullPushError(options, stderr ?? '');
|
|
141
|
+
}
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
|
+
finally {
|
|
146
|
+
// always restore original remoteUrl without token
|
|
147
|
+
await credentialOff(dir, remoteUrl);
|
|
148
|
+
}
|
|
145
149
|
}
|
|
146
150
|
//# sourceMappingURL=commitAndSync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commitAndSync.js","sourceRoot":"","sources":["../../src/commitAndSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"commitAndSync.js","sourceRoot":"","sources":["../../src/commitAndSync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential.d.ts","sourceRoot":"","sources":["../../src/credential.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,uBAAuB,WAAY,MAAM,YAAY,MAAM,eAAe,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"credential.d.ts","sourceRoot":"","sources":["../../src/credential.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,uBAAuB,WAAY,MAAM,YAAY,MAAM,eAAe,MAAM,KAAG,MACoB,CAAC;AAGrH;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjJ;AACD;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5G"}
|
package/dist/src/credential.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { trim } from 'lodash';
|
|
2
1
|
import { GitProcess } from 'dugite';
|
|
2
|
+
import { trim } from 'lodash';
|
|
3
3
|
import { getRemoteUrl } from './inspect';
|
|
4
4
|
// TODO: support folderLocation as rawUrl like `/Users/linonetwo/Desktop/repo/git-sync-js/test/mockUpstreamRepo/credential` for test, or gitlab url.
|
|
5
|
-
export const getGitUrlWithCredential = (rawUrl, username, accessToken) => trim(rawUrl.
|
|
5
|
+
export const getGitUrlWithCredential = (rawUrl, username, accessToken) => trim(rawUrl.replaceAll('\n', '').replace('https://github.com/', `https://${username}:${accessToken}@github.com/`));
|
|
6
6
|
const getGitUrlWithOutCredential = (urlWithCredential) => trim(urlWithCredential.replace(/.+@/, 'https://'));
|
|
7
7
|
/**
|
|
8
8
|
* Add remote with credential
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential.js","sourceRoot":"","sources":["../../src/credential.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"credential.js","sourceRoot":"","sources":["../../src/credential.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,oJAAoJ;AACpJ,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAE,WAAmB,EAAU,EAAE,CACvG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,WAAW,QAAQ,IAAI,WAAW,cAAc,CAAC,CAAC,CAAC;AACrH,MAAM,0BAA0B,GAAG,CAAC,iBAAyB,EAAU,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;AAE7H;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAiB,EAAE,SAAiB,EAAE,QAAgB,EAAE,WAAmB,EAAE,UAAkB;IAChI,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACvF,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,oBAAoB,CAAC,EAAE,SAAS,CAAC,CAAC;IACtF,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,oBAAoB,CAAC,EAAE,SAAS,CAAC,CAAC;AAC5F,CAAC;AACD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB,EAAE,UAAkB,EAAE,SAAkB;IAC3F,MAAM,aAAa,GAAG,SAAS,IAAI,CAAC,MAAM,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/E,MAAM,uBAAuB,GAAG,0BAA0B,CAAC,aAAa,CAAC,CAAC;IAC1E,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,uBAAuB,CAAC,EAAE,SAAS,CAAC,CAAC;AAC/F,CAAC"}
|
package/dist/src/errors.d.ts
CHANGED
|
@@ -10,15 +10,15 @@ export declare class SyncParameterMissingError extends Error {
|
|
|
10
10
|
}
|
|
11
11
|
export declare class GitPullPushError extends Error {
|
|
12
12
|
constructor(configuration: {
|
|
13
|
+
branch?: string;
|
|
13
14
|
/** wiki folder path, can be relative */
|
|
14
15
|
dir: string;
|
|
15
|
-
/** the storage service url we are sync to, for example your github repo url */
|
|
16
|
-
remoteUrl?: string;
|
|
17
16
|
/** for example, origin */
|
|
18
17
|
remote?: string;
|
|
18
|
+
/** the storage service url we are sync to, for example your github repo url */
|
|
19
|
+
remoteUrl?: string;
|
|
19
20
|
/** user info used in the commit message */
|
|
20
21
|
userInfo?: IGitUserInfos | IGitUserInfosWithoutToken;
|
|
21
|
-
branch?: string;
|
|
22
22
|
}, extraMessages: string);
|
|
23
23
|
}
|
|
24
24
|
export declare class CantSyncGitNotInitializedError extends Error {
|
package/dist/src/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAEvE,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAEvE,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM;CAMpD;AACD,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;gBACV,aAAa,SAAgB;CAO1C;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAEvC,aAAa,EAAE;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,wCAAwC;QACxC,GAAG,EAAE,MAAM,CAAC;QACZ,0BAA0B;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,+EAA+E;QAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,2CAA2C;QAC3C,QAAQ,CAAC,EAAE,aAAa,GAAG,yBAAyB,CAAC;KACtD,EACD,aAAa,EAAE,MAAM;CAiBxB;AAED,qBAAa,8BAA+B,SAAQ,KAAK;IACvD,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;gBACN,SAAS,EAAE,MAAM;CAO9B;AAED,qBAAa,2BAA4B,SAAQ,KAAK;;CAOrD;AAED,qBAAa,sCAAuC,SAAQ,KAAK;IAC/D,YAAY,EAAE,MAAM,CAAC;gBACT,YAAY,EAAE,MAAM;CAQjC"}
|
package/dist/src/errors.js
CHANGED
|
@@ -64,7 +64,8 @@ export class CantSyncInSpecialGitStateAutoFixFailed extends Error {
|
|
|
64
64
|
Object.setPrototypeOf(this, CantSyncInSpecialGitStateAutoFixFailed.prototype);
|
|
65
65
|
this.stateMessage = stateMessage;
|
|
66
66
|
this.name = 'CantSyncInSpecialGitStateAutoFixFailed';
|
|
67
|
-
this.message =
|
|
67
|
+
this.message =
|
|
68
|
+
`E-6 Unable to Sync, this folder is in special condition, thus can't Sync directly. An auto-fix has been tried, but error still remains. Please resolve all the conflict manually (For example, use VSCode to open the wiki folder), if this still don't work out, please use professional Git tools (Source Tree, GitKraken) to solve this. This is caused by procedural bug in the git-sync-js.\n${stateMessage}`;
|
|
68
69
|
}
|
|
69
70
|
}
|
|
70
71
|
//# sourceMappingURL=errors.js.map
|
package/dist/src/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIlC,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,KAAgB,EAAE,YAAqB;QACjD,KAAK,CAAC,YAAY,CAAC,CAAC;QACpB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,4EAA4E,KAAK,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIlC,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,KAAgB,EAAE,YAAqB;QACjD,KAAK,CAAC,YAAY,CAAC,CAAC;QACpB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,4EAA4E,KAAK,2DAA2D,YAAY,IAAI,EAAE,EAAE,CAAC;IAClL,CAAC;CACF;AACD,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,gCAAgC;IAChC,aAAa,CAAS;IACtB,YAAY,aAAa,GAAG,aAAa;QACvC,KAAK,CAAC,aAAa,CAAC,CAAC;QACrB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,eAAe,aAAa,0CAA0C,aAAa,4BAA4B,CAAC;IACjI,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YACE,aAUC,EACD,aAAqB;QAErB,KAAK,CAAC,aAAa,CAAC,CAAC;QACrB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,2FACb,IAAI,CAAC,SAAS,CAAC;YACb,GAAG,aAAa;YAChB,QAAQ,EAAE;gBACR,GAAG,aAAa,CAAC,QAAQ;gBACzB,WAAW,EAAE,QAAQ,CAAE,aAAa,EAAE,QAA0B,EAAE,WAAW,EAAE;oBAC7E,MAAM,EAAE,EAAE;iBACX,CAAC;aACH;SACF,CACH,qBAAqB,aAAa,EAAE,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACvD,gDAAgD;IAChD,SAAS,CAAS;IAClB,YAAY,SAAiB;QAC3B,KAAK,CAAC,SAAS,CAAC,CAAC;QACjB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,8BAA8B,CAAC,SAAS,CAAC,CAAC;QACtE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,6GAA6G,SAAS,EAAE,CAAC;IAC1I,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACpD;QACE,KAAK,EAAE,CAAC;QACR,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,2BAA2B,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,6GAA6G,CAAC;IAC/H,CAAC;CACF;AAED,MAAM,OAAO,sCAAuC,SAAQ,KAAK;IAC/D,YAAY,CAAS;IACrB,YAAY,YAAoB;QAC9B,KAAK,CAAC,YAAY,CAAC,CAAC;QACpB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,sCAAsC,CAAC,SAAS,CAAC,CAAC;QAC9E,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,wCAAwC,CAAC;QACrD,IAAI,CAAC,OAAO;YACV,qYAAqY,YAAY,EAAE,CAAC;IACxZ,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { defaultGitInfo as defaultDefaultGitInfo } from './defaultGitInfo';
|
|
2
|
+
import { IGitUserInfos, ILogger } from './interface';
|
|
3
|
+
export interface IForcePullOptions {
|
|
4
|
+
defaultGitInfo?: typeof defaultDefaultGitInfo;
|
|
5
|
+
/** wiki folder path, can be relative */
|
|
6
|
+
dir: string;
|
|
7
|
+
logger?: ILogger;
|
|
8
|
+
/** the storage service url we are sync to, for example your github repo url
|
|
9
|
+
* When empty, and commitOnly===true, it means we just want commit, without sync
|
|
10
|
+
*/
|
|
11
|
+
remoteUrl?: string;
|
|
12
|
+
/** user info used in the commit message
|
|
13
|
+
* When empty, and commitOnly===true, it means we just want commit, without sync
|
|
14
|
+
*/
|
|
15
|
+
userInfo?: IGitUserInfos;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Ignore all local changes, force reset local to remote.
|
|
19
|
+
*/
|
|
20
|
+
export declare function forcePull(options: IForcePullOptions): Promise<void>;
|
|
21
|
+
export declare function hardResetLocalToRemote(dir: string, branch: string, remoteName: string): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=forcePull.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forcePull.d.ts","sourceRoot":"","sources":["../../src/forcePull.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,IAAI,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAG3E,OAAO,EAAW,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG9D,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,OAAO,qBAAqB,CAAC;IAC9C,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,iBAAiB,iBA4CzD;AAED,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAK3F"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { GitProcess } from 'dugite';
|
|
2
|
+
import { credentialOff, credentialOn } from './credential';
|
|
3
|
+
import { defaultGitInfo as defaultDefaultGitInfo } from './defaultGitInfo';
|
|
4
|
+
import { SyncParameterMissingError } from './errors';
|
|
5
|
+
import { getDefaultBranchName, getRemoteName } from './inspect';
|
|
6
|
+
import { GitStep } from './interface';
|
|
7
|
+
import { fetchRemote } from './sync';
|
|
8
|
+
/**
|
|
9
|
+
* Ignore all local changes, force reset local to remote.
|
|
10
|
+
*/
|
|
11
|
+
export async function forcePull(options) {
|
|
12
|
+
const { dir, logger, defaultGitInfo = defaultDefaultGitInfo, userInfo, remoteUrl } = options;
|
|
13
|
+
const { gitUserName, branch } = userInfo ?? defaultGitInfo;
|
|
14
|
+
const { accessToken } = userInfo ?? {};
|
|
15
|
+
const defaultBranchName = (await getDefaultBranchName(dir)) ?? branch;
|
|
16
|
+
const remoteName = await getRemoteName(dir, branch);
|
|
17
|
+
if (accessToken === '' || accessToken === undefined) {
|
|
18
|
+
throw new SyncParameterMissingError('accessToken');
|
|
19
|
+
}
|
|
20
|
+
if (remoteUrl === '' || remoteUrl === undefined) {
|
|
21
|
+
throw new SyncParameterMissingError('remoteUrl');
|
|
22
|
+
}
|
|
23
|
+
const logProgress = (step) => logger?.info(step, {
|
|
24
|
+
functionName: 'forcePull',
|
|
25
|
+
step,
|
|
26
|
+
dir,
|
|
27
|
+
remoteUrl,
|
|
28
|
+
branch: defaultBranchName,
|
|
29
|
+
});
|
|
30
|
+
const logDebug = (message, step) => logger?.debug(message, {
|
|
31
|
+
functionName: 'forcePull',
|
|
32
|
+
step,
|
|
33
|
+
dir,
|
|
34
|
+
remoteUrl,
|
|
35
|
+
branch: defaultBranchName,
|
|
36
|
+
});
|
|
37
|
+
logProgress(GitStep.StartForcePull);
|
|
38
|
+
logDebug(`Successfully Running git init for force pull in dir ${dir}`, GitStep.StartForcePull);
|
|
39
|
+
logProgress(GitStep.StartConfiguringGithubRemoteRepository);
|
|
40
|
+
await credentialOn(dir, remoteUrl, gitUserName, accessToken, remoteName);
|
|
41
|
+
try {
|
|
42
|
+
logProgress(GitStep.StartFetchingFromGithubRemote);
|
|
43
|
+
await fetchRemote(dir, defaultGitInfo.remote, defaultGitInfo.branch);
|
|
44
|
+
logProgress(GitStep.StartResettingLocalToRemote);
|
|
45
|
+
await hardResetLocalToRemote(dir, branch, remoteName);
|
|
46
|
+
logProgress(GitStep.FinishForcePull);
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await credentialOff(dir, remoteName, remoteUrl);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function hardResetLocalToRemote(dir, branch, remoteName) {
|
|
53
|
+
const { exitCode, stderr } = await GitProcess.exec(['reset', '--hard', `${remoteName}/${branch}`], dir);
|
|
54
|
+
if (exitCode !== 0) {
|
|
55
|
+
throw new Error(`Failed to reset local to remote: ${stderr}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=forcePull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forcePull.js","sourceRoot":"","sources":["../../src/forcePull.ts"],"names":[],"mappings":"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"}
|