git-sync-js 0.4.7 → 1.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.
Files changed (66) hide show
  1. package/README.md +3 -2
  2. package/dist/src/clone.d.ts +13 -0
  3. package/dist/src/clone.d.ts.map +1 -0
  4. package/dist/src/clone.js +55 -0
  5. package/dist/src/clone.js.map +1 -0
  6. package/dist/src/commitAndSync.d.ts +21 -0
  7. package/dist/src/commitAndSync.d.ts.map +1 -0
  8. package/dist/src/commitAndSync.js +143 -0
  9. package/dist/src/commitAndSync.js.map +1 -0
  10. package/dist/{credential.d.ts → src/credential.d.ts} +3 -2
  11. package/dist/src/credential.d.ts.map +1 -0
  12. package/dist/{credential.js → src/credential.js} +7 -7
  13. package/dist/src/credential.js.map +1 -0
  14. package/dist/{defaultGitInfo.d.ts → src/defaultGitInfo.d.ts} +2 -0
  15. package/dist/src/defaultGitInfo.d.ts.map +1 -0
  16. package/dist/{defaultGitInfo.js → src/defaultGitInfo.js} +2 -0
  17. package/dist/src/defaultGitInfo.js.map +1 -0
  18. package/dist/{errors.d.ts → src/errors.d.ts} +5 -1
  19. package/dist/src/errors.d.ts.map +1 -0
  20. package/dist/{errors.js → src/errors.js} +5 -5
  21. package/dist/src/errors.js.map +1 -0
  22. package/dist/src/index.d.ts +12 -0
  23. package/dist/src/index.d.ts.map +1 -0
  24. package/dist/src/index.js +12 -0
  25. package/dist/src/index.js.map +1 -0
  26. package/dist/src/init.d.ts +25 -0
  27. package/dist/src/init.d.ts.map +1 -0
  28. package/dist/src/init.js +22 -0
  29. package/dist/src/init.js.map +1 -0
  30. package/dist/src/initGit.d.ts +26 -0
  31. package/dist/src/initGit.d.ts.map +1 -0
  32. package/dist/src/initGit.js +40 -0
  33. package/dist/src/initGit.js.map +1 -0
  34. package/dist/{inspect.d.ts → src/inspect.d.ts} +20 -7
  35. package/dist/src/inspect.d.ts.map +1 -0
  36. package/dist/{inspect.js → src/inspect.js} +99 -48
  37. package/dist/src/inspect.js.map +1 -0
  38. package/dist/{interface.d.ts → src/interface.d.ts} +7 -0
  39. package/dist/src/interface.d.ts.map +1 -0
  40. package/dist/{interface.js → src/interface.js} +5 -0
  41. package/dist/src/interface.js.map +1 -0
  42. package/dist/{sync.d.ts → src/sync.d.ts} +18 -1
  43. package/dist/src/sync.d.ts.map +1 -0
  44. package/dist/{sync.js → src/sync.js} +57 -4
  45. package/dist/src/sync.js.map +1 -0
  46. package/dist/src/utils.d.ts +3 -0
  47. package/dist/src/utils.d.ts.map +1 -0
  48. package/dist/src/utils.js +3 -0
  49. package/dist/src/utils.js.map +1 -0
  50. package/package.json +23 -19
  51. package/dist/credential.d.ts.map +0 -1
  52. package/dist/credential.js.map +0 -1
  53. package/dist/defaultGitInfo.d.ts.map +0 -1
  54. package/dist/defaultGitInfo.js.map +0 -1
  55. package/dist/errors.d.ts.map +0 -1
  56. package/dist/errors.js.map +0 -1
  57. package/dist/index.d.ts +0 -46
  58. package/dist/index.d.ts.map +0 -1
  59. package/dist/index.js +0 -238
  60. package/dist/index.js.map +0 -1
  61. package/dist/inspect.d.ts.map +0 -1
  62. package/dist/inspect.js.map +0 -1
  63. package/dist/interface.d.ts.map +0 -1
  64. package/dist/interface.js.map +0 -1
  65. package/dist/sync.d.ts.map +0 -1
  66. package/dist/sync.js.map +0 -1
@@ -14,7 +14,7 @@ export declare function getModifiedFileList(wikiFolderPath: string): Promise<Mod
14
14
  * @param dir wiki folder path, git folder to inspect
15
15
  * @returns remote url, without `'.git'`
16
16
  */
17
- export declare function getRemoteUrl(dir: string): Promise<string>;
17
+ export declare function getRemoteUrl(dir: string, remoteName: string): Promise<string>;
18
18
  /**
19
19
  * get the Github Repo Name, similar to "linonetwo/wiki", string after "https://github.com/"
20
20
  * @param remoteUrl full github repository url or other repository url
@@ -28,17 +28,19 @@ export declare function getRemoteRepoName(remoteUrl: string): string | undefined
28
28
  export declare function haveLocalChanges(wikiFolderPath: string): Promise<boolean>;
29
29
  /**
30
30
  * Get "master" or "main" from git repo
31
+ *
32
+ * https://github.com/simonthum/git-sync/blob/31cc140df2751e09fae2941054d5b61c34e8b649/git-sync#L228-L232
31
33
  * @param wikiFolderPath
32
34
  */
33
- export declare function getDefaultBranchName(wikiFolderPath: string): Promise<string>;
34
- export declare type SyncState = 'noUpstream' | 'equal' | 'ahead' | 'behind' | 'diverged';
35
+ export declare function getDefaultBranchName(wikiFolderPath: string): Promise<string | undefined>;
36
+ export declare type SyncState = 'noUpstreamOrBareUpstream' | 'equal' | 'ahead' | 'behind' | 'diverged';
35
37
  /**
36
38
  * determine sync state of repository, i.e. how the remote relates to our HEAD
37
39
  * 'ahead' means our local state is ahead of remote, 'behind' means local state is behind of the remote
38
40
  * @param dir repo path to test
39
41
  */
40
- export declare function getSyncState(dir: string, logger?: ILogger, defaultBranchName?: string): Promise<SyncState>;
41
- export declare function assumeSync(wikiFolderPath: string, logger?: ILogger, defaultBranchName?: string): Promise<void>;
42
+ export declare function getSyncState(dir: string, defaultBranchName: string, remoteName: string, logger?: ILogger): Promise<SyncState>;
43
+ export declare function assumeSync(wikiFolderPath: string, defaultBranchName: string, remoteName: string, logger?: ILogger): Promise<void>;
42
44
  /**
43
45
  * get various repo state in string format
44
46
  * @param wikiFolderPath repo path to check
@@ -51,6 +53,17 @@ export declare function getGitRepositoryState(wikiFolderPath: string, logger?: I
51
53
  * @param dir repo path
52
54
  */
53
55
  export declare function getGitDirectory(dir: string, logger?: ILogger): Promise<string>;
54
- /** Check if dir has `.git`. */
55
- export declare function hasGit(dir: string): Promise<boolean>;
56
+ /**
57
+ * Check if dir has `.git`.
58
+ * @param dir folder that may contains a git
59
+ * @param strict if is true, then dir should be the root of the git repo. Default is true
60
+ * @returns
61
+ */
62
+ export declare function hasGit(dir: string, strict?: boolean): Promise<boolean>;
63
+ /**
64
+ * get things like "origin"
65
+ *
66
+ * https://github.com/simonthum/git-sync/blob/31cc140df2751e09fae2941054d5b61c34e8b649/git-sync#L238-L257
67
+ */
68
+ export declare function getRemoteName(dir: string, branch: string): Promise<string>;
56
69
  //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../src/inspect.ts"],"names":[],"mappings":"AAQA,OAAO,EAAW,OAAO,EAAE,MAAM,aAAa,CAAC;AAM/C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoC7F;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOnF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUvE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAK/E;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB9F;AAED,oBAAY,SAAS,GAAG,0BAA0B,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAC/F;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CA4BnI;AAED,wBAAsB,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvI;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDrG;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBpF;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAYzE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAchF"}
@@ -1,12 +1,15 @@
1
+ /* eslint-disable security/detect-non-literal-fs-filename */
1
2
  /* eslint-disable unicorn/prevent-abbreviations */
2
3
  import fs from 'fs-extra';
3
4
  import path from 'path';
4
- import git from 'isomorphic-git';
5
+ import { listRemotes } from 'isomorphic-git';
5
6
  import { compact } from 'lodash';
6
7
  import { GitProcess } from 'dugite';
7
8
  import url from 'url';
8
9
  import { GitStep } from './interface';
9
10
  import { AssumeSyncError, CantSyncGitNotInitializedError } from './errors';
11
+ const gitEscapeToEncodedUri = (str) => str.replace(/\\(\d{3})/g, (_, $1) => `%${Number.parseInt($1, 8).toString(16)}`);
12
+ const decodeGitEscape = (rawString) => decodeURIComponent(gitEscapeToEncodedUri(rawString));
10
13
  /**
11
14
  * Get modified files and modify type in a folder
12
15
  * @param {string} wikiFolderPath location to scan git modify state
@@ -16,7 +19,8 @@ export async function getModifiedFileList(wikiFolderPath) {
16
19
  const stdoutLines = stdout.split('\n');
17
20
  const nonEmptyLines = compact(stdoutLines);
18
21
  const statusMatrixLines = compact(nonEmptyLines.map((line) => /^\s?(\?\?|[ACMR]|[ACMR][DM])\s?(\S+.*\S+)$/.exec(line))).filter(([_, type, fileRelativePath]) => type !== undefined && fileRelativePath !== undefined);
19
- return statusMatrixLines.map(([_, type, rawFileRelativePath]) => {
22
+ return statusMatrixLines
23
+ .map(([_, type, rawFileRelativePath]) => {
20
24
  /**
21
25
  * If filename contains Chinese, it will becomes:
22
26
  * ```js
@@ -30,29 +34,30 @@ export async function getModifiedFileList(wikiFolderPath) {
30
34
  *
31
35
  * So simply `decodeURIComponent(escape` will work on `tiddlers/\346\226\260\346\235\241\347\233\256.tid` (the logged string), but not on `tiddlers/\\346\\226\\260\\346\\235\\241\\347\\233\\256.tid` (the actual string).
32
36
  * So how to transform actual string to logged string? Answer is `eval()` it. But we have to check is there any evil script use `;` or `,` mixed into the filename.
37
+ *
38
+ * But actually those 346 226 are in radix 8 , if we transform it to radix 16 and add prefix % we can make it uri component.
39
+ * And it should not be parsed in groups of three, because only the CJK between 0x0800 - 0xffff are encoded into three bytes; so we should just replace all the \\\d{3} with hexadecimal, and then give it to the decodeURIComponent to parse.
33
40
  */
34
41
  const isSafeUtf8UnescapedString = rawFileRelativePath.startsWith('"') && rawFileRelativePath.endsWith('"') && !rawFileRelativePath.includes(';') && !rawFileRelativePath.includes(',');
35
- function decode(str) {
36
- return str.replace(/\\(\d{3})\\(\d{3})\\(\d{3})/g, (_, $1, $2, $3) => decodeURIComponent(`%${Number.parseInt($1, 8).toString(16)}%${Number.parseInt($2, 8).toString(16)}%${Number.parseInt($3, 8).toString(16)}`));
37
- }
38
- const fileRelativePath = isSafeUtf8UnescapedString ? decode(rawFileRelativePath).replace(/^"/, '').replace(/"$/, '') : rawFileRelativePath;
42
+ const fileRelativePath = isSafeUtf8UnescapedString ? decodeGitEscape(rawFileRelativePath).replace(/^"/, '').replace(/"$/, '') : rawFileRelativePath;
39
43
  return {
40
44
  type,
41
45
  fileRelativePath,
42
46
  filePath: path.join(wikiFolderPath, fileRelativePath),
43
47
  };
44
- });
48
+ })
49
+ .sort((item, item2) => item.fileRelativePath.localeCompare(item2.fileRelativePath, 'zh'));
45
50
  }
46
51
  /**
47
52
  * Inspect git's remote url from folder's .git config
48
53
  * @param dir wiki folder path, git folder to inspect
49
54
  * @returns remote url, without `'.git'`
50
55
  */
51
- export async function getRemoteUrl(dir) {
52
- const remotes = await git.listRemotes({ fs, dir });
53
- const githubRemote = remotes.find(({ remote }) => remote === 'origin') ?? remotes[0];
56
+ export async function getRemoteUrl(dir, remoteName) {
57
+ const remotes = await listRemotes({ fs, dir });
58
+ const githubRemote = remotes.find(({ remote }) => remote === remoteName) ?? remotes[0];
54
59
  if ((githubRemote?.url?.length ?? 0) > 0) {
55
- return githubRemote.url.replace('.git', '');
60
+ return githubRemote.url;
56
61
  }
57
62
  return '';
58
63
  }
@@ -84,38 +89,49 @@ export async function haveLocalChanges(wikiFolderPath) {
84
89
  }
85
90
  /**
86
91
  * Get "master" or "main" from git repo
92
+ *
93
+ * https://github.com/simonthum/git-sync/blob/31cc140df2751e09fae2941054d5b61c34e8b649/git-sync#L228-L232
87
94
  * @param wikiFolderPath
88
95
  */
89
96
  export async function getDefaultBranchName(wikiFolderPath) {
90
- const { stdout } = await GitProcess.exec(['remote', 'show', 'origin'], wikiFolderPath);
91
- const lines = stdout.split('\n');
92
- const lineWithHEAD = lines.find((line) => line.includes('HEAD branch: '));
93
- const branchName = lineWithHEAD?.replace?.('HEAD branch: ', '')?.replace?.(/\s/g, '');
94
- if (branchName === undefined || branchName.includes('(unknown)')) {
95
- return 'master';
96
- }
97
- return branchName;
97
+ try {
98
+ const { stdout } = await GitProcess.exec(['rev-parse', '--abbrev-ref', 'HEAD'], wikiFolderPath);
99
+ const [branchName] = stdout.split('\n');
100
+ // don't return empty string, so we can use ?? syntax
101
+ if (branchName === '') {
102
+ return;
103
+ }
104
+ return branchName;
105
+ }
106
+ catch {
107
+ /**
108
+ * Catch "Unable to find path to repository on disk."
109
+ at node_modules/dugite/lib/git-process.ts:226:29
110
+ */
111
+ return undefined;
112
+ }
98
113
  }
99
114
  /**
100
115
  * determine sync state of repository, i.e. how the remote relates to our HEAD
101
116
  * 'ahead' means our local state is ahead of remote, 'behind' means local state is behind of the remote
102
117
  * @param dir repo path to test
103
118
  */
104
- export async function getSyncState(dir, logger, defaultBranchName) {
119
+ export async function getSyncState(dir, defaultBranchName, remoteName, logger) {
105
120
  const logDebug = (message, step) => logger?.debug?.(message, { functionName: 'getSyncState', step, dir });
106
121
  const logProgress = (step) => logger?.info?.(step, {
107
122
  functionName: 'getSyncState',
108
123
  step,
109
124
  dir,
110
125
  });
111
- if (defaultBranchName === undefined) {
112
- defaultBranchName = await getDefaultBranchName(dir);
113
- }
114
126
  logProgress(GitStep.CheckingLocalSyncState);
115
- const { stdout } = await GitProcess.exec(['rev-list', '--count', '--left-right', `origin/${defaultBranchName}...HEAD`], dir);
127
+ remoteName = remoteName ?? (await getRemoteName(dir, defaultBranchName));
128
+ const { stdout, stderr } = await GitProcess.exec(['rev-list', '--count', '--left-right', `${remoteName}/${defaultBranchName}...HEAD`], dir);
116
129
  logDebug(`Checking sync state with upstream, stdout:\n${stdout}\n(stdout end)`, GitStep.CheckingLocalSyncState);
130
+ if (stderr.length > 0) {
131
+ logDebug(`Have problem checking sync state with upstream,stderr:\n${stderr}\n(stderr end)`, GitStep.CheckingLocalSyncState);
132
+ }
117
133
  if (stdout === '') {
118
- return 'noUpstream';
134
+ return 'noUpstreamOrBareUpstream';
119
135
  }
120
136
  if (/0\t0/.exec(stdout) !== null) {
121
137
  return 'equal';
@@ -128,11 +144,12 @@ export async function getSyncState(dir, logger, defaultBranchName) {
128
144
  }
129
145
  return 'diverged';
130
146
  }
131
- export async function assumeSync(wikiFolderPath, logger, defaultBranchName) {
132
- if ((await getSyncState(wikiFolderPath, logger, defaultBranchName)) === 'equal') {
147
+ export async function assumeSync(wikiFolderPath, defaultBranchName, remoteName, logger) {
148
+ const syncState = await getSyncState(wikiFolderPath, defaultBranchName, remoteName, logger);
149
+ if (syncState === 'equal') {
133
150
  return;
134
151
  }
135
- throw new AssumeSyncError();
152
+ throw new AssumeSyncError(syncState);
136
153
  }
137
154
  /**
138
155
  * get various repo state in string format
@@ -141,18 +158,23 @@ export async function assumeSync(wikiFolderPath, logger, defaultBranchName) {
141
158
  * // TODO: use template literal type to get exact type of git state
142
159
  */
143
160
  export async function getGitRepositoryState(wikiFolderPath, logger) {
144
- const gitDirectory = await getGitDirectory(wikiFolderPath, logger);
145
- if (typeof gitDirectory !== 'string' || gitDirectory.length === 0) {
161
+ if (!(await hasGit(wikiFolderPath))) {
146
162
  return 'NOGIT';
147
163
  }
148
- const [isRebaseI, isRebaseM, isAMRebase, isMerging, isCherryPicking, isBisecting, isInsideGitDir] = await Promise.all([
164
+ const gitDirectory = await getGitDirectory(wikiFolderPath, logger);
165
+ const [isRebaseI, isRebaseM, isAMRebase, isMerging, isCherryPicking, isBisecting] = await Promise.all([
166
+ // isRebaseI
149
167
  (await fs.lstat(path.join(gitDirectory, 'rebase-merge', 'interactive')).catch(() => ({})))?.isFile?.(),
168
+ // isRebaseM
150
169
  (await fs.lstat(path.join(gitDirectory, 'rebase-merge')).catch(() => ({})))?.isDirectory?.(),
170
+ // isAMRebase
151
171
  (await fs.lstat(path.join(gitDirectory, 'rebase-apply')).catch(() => ({})))?.isDirectory?.(),
172
+ // isMerging
152
173
  (await fs.lstat(path.join(gitDirectory, 'MERGE_HEAD')).catch(() => ({})))?.isFile?.(),
174
+ // isCherryPicking
153
175
  (await fs.lstat(path.join(gitDirectory, 'CHERRY_PICK_HEAD')).catch(() => ({})))?.isFile?.(),
176
+ // isBisecting
154
177
  (await fs.lstat(path.join(gitDirectory, 'BISECT_LOG')).catch(() => ({})))?.isFile?.(),
155
- (await GitProcess.exec(['rev-parse', '--is-inside-git-dir', wikiFolderPath], wikiFolderPath))?.stdout?.startsWith('true'),
156
178
  ]);
157
179
  let result = '';
158
180
  /* eslint-disable @typescript-eslint/strict-boolean-expressions */
@@ -176,17 +198,18 @@ export async function getGitRepositoryState(wikiFolderPath, logger) {
176
198
  result += 'BISECTING';
177
199
  }
178
200
  }
179
- if (isInsideGitDir) {
180
- result += (await GitProcess.exec(['rev-parse', '--is-bare-repository', wikiFolderPath], wikiFolderPath)).stdout.startsWith('true') ? '|BARE' : '|GIT_DIR';
181
- }
182
- else if ((await GitProcess.exec(['rev-parse', '--is-inside-work-tree', wikiFolderPath], wikiFolderPath)).stdout.startsWith('true')) {
183
- const { exitCode } = await GitProcess.exec(['diff', '--no-ext-diff', '--quiet', '--exit-code'], wikiFolderPath);
184
- // 1 if there were differences and 0 means no differences.
185
- if (exitCode !== 0) {
186
- result += '|DIRTY';
187
- }
201
+ result += (await GitProcess.exec(['rev-parse', '--is-bare-repository', wikiFolderPath], wikiFolderPath)).stdout.startsWith('true') ? '|BARE' : '';
202
+ /* if ((await GitProcess.exec(['rev-parse', '--is-inside-work-tree', wikiFolderPath], wikiFolderPath)).stdout.startsWith('true')) {
203
+ const { exitCode } = await GitProcess.exec(['diff', '--no-ext-diff', '--quiet', '--exit-code'], wikiFolderPath);
204
+ // 1 if there were differences and 0 means no differences.
205
+ if (exitCode !== 0) {
206
+ result += '|DIRTY';
207
+ }
208
+ } */
209
+ // previous above `git diff --no-ext-diff --quiet --exit-code` logic from git-sync script can only detect if an existed file changed, can't detect newly added file, so we use `haveLocalChanges` instead
210
+ if (await haveLocalChanges(wikiFolderPath)) {
211
+ result += '|DIRTY';
188
212
  }
189
- /* eslint-enable @typescript-eslint/strict-boolean-expressions */
190
213
  return result;
191
214
  }
192
215
  /**
@@ -194,9 +217,9 @@ export async function getGitRepositoryState(wikiFolderPath, logger) {
194
217
  * @param dir repo path
195
218
  */
196
219
  export async function getGitDirectory(dir, logger) {
197
- const logDebug = (message, step) => logger?.debug?.(message, { functionName: 'getSyncState', step, dir });
220
+ const logDebug = (message, step) => logger?.debug?.(message, { functionName: 'getGitDirectory', step, dir });
198
221
  const logProgress = (step) => logger?.info?.(step, {
199
- functionName: 'getSyncState',
222
+ functionName: 'getGitDirectory',
200
223
  step,
201
224
  dir,
202
225
  });
@@ -210,15 +233,23 @@ export async function getGitDirectory(dir, logger) {
210
233
  const { stdout: stdout2 } = await GitProcess.exec(['rev-parse', '--git-dir', dir], dir);
211
234
  const [gitPath2, gitPath1] = compact(stdout2.split('\n'));
212
235
  if (gitPath2 !== undefined && gitPath1 !== undefined) {
213
- return path.resolve(`${gitPath1}/${gitPath2}`);
236
+ return path.resolve(gitPath1, gitPath2);
214
237
  }
215
238
  }
216
239
  throw new CantSyncGitNotInitializedError(dir);
217
240
  }
218
- /** Check if dir has `.git`. */
219
- export async function hasGit(dir) {
241
+ /**
242
+ * Check if dir has `.git`.
243
+ * @param dir folder that may contains a git
244
+ * @param strict if is true, then dir should be the root of the git repo. Default is true
245
+ * @returns
246
+ */
247
+ export async function hasGit(dir, strict = true) {
220
248
  try {
221
- await getGitDirectory(dir);
249
+ const resultDir = await getGitDirectory(dir);
250
+ if (strict && path.dirname(resultDir) !== dir) {
251
+ return false;
252
+ }
222
253
  }
223
254
  catch (error) {
224
255
  if (error instanceof CantSyncGitNotInitializedError) {
@@ -227,4 +258,24 @@ export async function hasGit(dir) {
227
258
  }
228
259
  return true;
229
260
  }
261
+ /**
262
+ * get things like "origin"
263
+ *
264
+ * https://github.com/simonthum/git-sync/blob/31cc140df2751e09fae2941054d5b61c34e8b649/git-sync#L238-L257
265
+ */
266
+ export async function getRemoteName(dir, branch) {
267
+ let { stdout } = await GitProcess.exec(['config', '--get', `branch.${branch}.pushRemote`], dir);
268
+ if (stdout.trim()) {
269
+ return stdout.trim();
270
+ }
271
+ ({ stdout } = await GitProcess.exec(['config', '--get', `remote.pushDefault`], dir));
272
+ if (stdout.trim()) {
273
+ return stdout.trim();
274
+ }
275
+ ({ stdout } = await GitProcess.exec(['config', '--get', `branch.${branch}.remote`], dir));
276
+ if (stdout.trim()) {
277
+ return stdout.trim();
278
+ }
279
+ return 'origin';
280
+ }
230
281
  //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/inspect.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ export interface IGitUserInfosWithoutToken {
7
7
  email: string | null | undefined;
8
8
  /** Github Login: username , this is also used to filter user's repo when searching repo */
9
9
  gitUserName: string;
10
+ branch: string;
10
11
  }
11
12
  /** custom logger to report progress on each step
12
13
  * we don't use logger to report error, we throw errors.
@@ -25,6 +26,7 @@ export interface ILoggerContext {
25
26
  step: GitStep;
26
27
  dir?: string;
27
28
  remoteUrl?: string;
29
+ branch?: string;
28
30
  }
29
31
  export declare enum GitStep {
30
32
  StartGitInitialization = "StartGitInitialization",
@@ -40,6 +42,7 @@ export declare enum GitStep {
40
42
  PreparingUserInfo = "PreparingUserInfo",
41
43
  FetchingData = "FetchingData",
42
44
  NoNeedToSync = "NoNeedToSync",
45
+ NoUpstreamCantPush = "NoUpstreamCantPush",
43
46
  LocalAheadStartUpload = "LocalAheadStartUpload",
44
47
  CheckingLocalSyncState = "CheckingLocalSyncState",
45
48
  CheckingLocalGitRepoSanity = "CheckingLocalGitRepoSanity",
@@ -48,7 +51,11 @@ export declare enum GitStep {
48
51
  RebaseResultChecking = "RebaseResultChecking",
49
52
  RebaseConflictNeedsResolve = "RebaseConflictNeedsResolve",
50
53
  RebaseSucceed = "RebaseSucceed",
54
+ GitPush = "GitPush",
55
+ GitMerge = "GitMerge",
51
56
  GitPushFailed = "GitPushFailed",
57
+ GitPushComplete = "GitPushComplete",
58
+ GitMergeComplete = "GitMergeComplete",
52
59
  GitMergeFailed = "GitMergeFailed",
53
60
  /** this means our algorithm have some problems */
54
61
  SyncFailedAlgorithmWrong = "SyncFailedAlgorithmWrong",
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAc,SAAQ,yBAAyB;IAC9D,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACxC,+BAA+B;IAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,2FAA2F;IAC3F,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,qDAAqD;IACrD,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC;IAC7D,gCAAgC;IAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC;IAC7D,8CAA8C;IAC9C,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC;CAC7D;AACD,sDAAsD;AACtD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,oBAAY,OAAO;IACjB,sBAAsB,2BAA2B;IACjD,sBAAsB,2BAA2B;IACjD,kCAAkC,uCAAuC;IACzE,sCAAsC,2CAA2C;IACjF,sBAAsB,2BAA2B;IACjD,WAAW,gBAAgB;IAC3B,kBAAkB,uBAAuB;IACzC,WAAW,gBAAgB;IAC3B,WAAW,gBAAgB;IAC3B,cAAc,mBAAmB;IACjC,iBAAiB,sBAAsB;IACvC,YAAY,iBAAiB;IAC7B,YAAY,iBAAiB;IAC7B,kBAAkB,uBAAuB;IACzC,qBAAqB,0BAA0B;IAC/C,sBAAsB,2BAA2B;IACjD,0BAA0B,+BAA+B;IACzD,oBAAoB,yBAAyB;IAC7C,uBAAuB,4BAA4B;IACnD,oBAAoB,yBAAyB;IAC7C,0BAA0B,+BAA+B;IACzD,aAAa,kBAAkB;IAC/B,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,aAAa,kBAAkB;IAC/B,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IACrC,cAAc,mBAAmB;IACjC,kDAAkD;IAClD,wBAAwB,6BAA6B;IACrD,2CAA2C,gDAAgD;IAC3F,qBAAqB,0BAA0B;IAC/C,6BAA6B,kCAAkC;IAC/D,uCAAuC,4CAA4C;CACpF;AACD;;GAEG;AACH,eAAO,MAAM,gBAAgB,WAA8E,CAAC"}
@@ -13,6 +13,7 @@ export var GitStep;
13
13
  GitStep["PreparingUserInfo"] = "PreparingUserInfo";
14
14
  GitStep["FetchingData"] = "FetchingData";
15
15
  GitStep["NoNeedToSync"] = "NoNeedToSync";
16
+ GitStep["NoUpstreamCantPush"] = "NoUpstreamCantPush";
16
17
  GitStep["LocalAheadStartUpload"] = "LocalAheadStartUpload";
17
18
  GitStep["CheckingLocalSyncState"] = "CheckingLocalSyncState";
18
19
  GitStep["CheckingLocalGitRepoSanity"] = "CheckingLocalGitRepoSanity";
@@ -21,7 +22,11 @@ export var GitStep;
21
22
  GitStep["RebaseResultChecking"] = "RebaseResultChecking";
22
23
  GitStep["RebaseConflictNeedsResolve"] = "RebaseConflictNeedsResolve";
23
24
  GitStep["RebaseSucceed"] = "RebaseSucceed";
25
+ GitStep["GitPush"] = "GitPush";
26
+ GitStep["GitMerge"] = "GitMerge";
24
27
  GitStep["GitPushFailed"] = "GitPushFailed";
28
+ GitStep["GitPushComplete"] = "GitPushComplete";
29
+ GitStep["GitMergeComplete"] = "GitMergeComplete";
25
30
  GitStep["GitMergeFailed"] = "GitMergeFailed";
26
31
  /** this means our algorithm have some problems */
27
32
  GitStep["SyncFailedAlgorithmWrong"] = "SyncFailedAlgorithmWrong";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/interface.ts"],"names":[],"mappings":"AAiCA,MAAM,CAAN,IAAY,OAmCX;AAnCD,WAAY,OAAO;IACjB,4DAAiD,CAAA;IACjD,4DAAiD,CAAA;IACjD,oFAAyE,CAAA;IACzE,4FAAiF,CAAA;IACjF,4DAAiD,CAAA;IACjD,sCAA2B,CAAA;IAC3B,oDAAyC,CAAA;IACzC,sCAA2B,CAAA;IAC3B,sCAA2B,CAAA;IAC3B,4CAAiC,CAAA;IACjC,kDAAuC,CAAA;IACvC,wCAA6B,CAAA;IAC7B,wCAA6B,CAAA;IAC7B,oDAAyC,CAAA;IACzC,0DAA+C,CAAA;IAC/C,4DAAiD,CAAA;IACjD,oEAAyD,CAAA;IACzD,wDAA6C,CAAA;IAC7C,8DAAmD,CAAA;IACnD,wDAA6C,CAAA;IAC7C,oEAAyD,CAAA;IACzD,0CAA+B,CAAA;IAC/B,8BAAmB,CAAA;IACnB,gCAAqB,CAAA;IACrB,0CAA+B,CAAA;IAC/B,8CAAmC,CAAA;IACnC,gDAAqC,CAAA;IACrC,4CAAiC,CAAA;IACjC,kDAAkD;IAClD,gEAAqD,CAAA;IACrD,sGAA2F,CAAA;IAC3F,0DAA+C,CAAA;IAC/C,0EAA+D,CAAA;IAC/D,8FAAmF,CAAA;AACrF,CAAC,EAnCW,OAAO,KAAP,OAAO,QAmClB;AACD;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC"}
@@ -7,7 +7,24 @@ import { ILogger } from './interface';
7
7
  * @param email
8
8
  * @param message
9
9
  */
10
- export declare function commitFiles(dir: string, username: string, email: string, message?: string, logger?: ILogger): Promise<IGitResult>;
10
+ export declare function commitFiles(dir: string, username: string, email: string, message?: string, filesToIgnore?: string[], logger?: ILogger): Promise<IGitResult>;
11
+ /**
12
+ * Git push -f origin master
13
+ * This does force push, to deal with `--allow-unrelated-histories` case
14
+ * @param dir
15
+ * @param username
16
+ * @param email
17
+ * @param message
18
+ */
19
+ export declare function pushUpstream(dir: string, branch: string, remoteName: string, logger?: ILogger): Promise<IGitResult>;
20
+ /**
21
+ * Git merge origin master
22
+ * @param dir
23
+ * @param username
24
+ * @param email
25
+ * @param message
26
+ */
27
+ export declare function mergeUpstream(dir: string, branch: string, remoteName: string, logger?: ILogger): Promise<IGitResult>;
11
28
  /**
12
29
  * try to continue rebase, simply adding and committing all things, leave them to user to resolve in the TiddlyWiki later.
13
30
  * @param dir
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,UAAU,EAAE,MAAM,QAAQ,CAAC;AAMhD,OAAO,EAAW,OAAO,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,SAA4B,EACnC,aAAa,GAAE,MAAM,EAAO,EAC5B,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,UAAU,CAAC,CAqBrB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBzH;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAe1H;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,uBAAuB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCpJ"}
@@ -1,8 +1,8 @@
1
1
  /* eslint-disable unicorn/prevent-abbreviations */
2
2
  import { GitProcess } from 'dugite';
3
- import git from 'isomorphic-git';
3
+ import { add, listFiles, remove } from 'isomorphic-git';
4
4
  import fs from 'fs-extra';
5
- import { CantSyncInSpecialGitStateAutoFixFailed, SyncScriptIsInDeadLoopError } from './errors';
5
+ import { CantSyncInSpecialGitStateAutoFixFailed, GitPullPushError, SyncScriptIsInDeadLoopError } from './errors';
6
6
  import { getGitRepositoryState } from './inspect';
7
7
  import { GitStep } from './interface';
8
8
  /**
@@ -12,17 +12,70 @@ import { GitStep } from './interface';
12
12
  * @param email
13
13
  * @param message
14
14
  */
15
- export async function commitFiles(dir, username, email, message = 'Initialize with TiddlyGit-Desktop', logger) {
15
+ export async function commitFiles(dir, username, email, message = 'Commit with Git-Sync-JS', filesToIgnore = [], logger) {
16
16
  const logProgress = (step) => logger?.info(step, {
17
17
  functionName: 'commitFiles',
18
18
  step,
19
19
  dir,
20
20
  });
21
21
  logProgress(GitStep.AddingFiles);
22
- await git.add({ dir, filepath: '.', fs });
22
+ await add({ dir, filepath: '.', fs });
23
+ // find and unStage files that are in the ignore list
24
+ const stagedFiles = await listFiles({ fs, dir });
25
+ if (filesToIgnore.length > 0) {
26
+ const stagedFilesToIgnore = filesToIgnore.filter((file) => stagedFiles.includes(file));
27
+ if (stagedFilesToIgnore.length > 0) {
28
+ await Promise.all(stagedFilesToIgnore.map(async (file) => await remove({ dir, filepath: file, fs })));
29
+ }
30
+ }
23
31
  logProgress(GitStep.AddComplete);
24
32
  return await GitProcess.exec(['commit', '-m', message, `--author="${username} <${email}>"`], dir);
25
33
  }
34
+ /**
35
+ * Git push -f origin master
36
+ * This does force push, to deal with `--allow-unrelated-histories` case
37
+ * @param dir
38
+ * @param username
39
+ * @param email
40
+ * @param message
41
+ */
42
+ export async function pushUpstream(dir, branch, remoteName, logger) {
43
+ const logProgress = (step) => logger?.info(step, {
44
+ functionName: 'pushUpstream',
45
+ step,
46
+ dir,
47
+ });
48
+ /** when push to remote, we need to specify the local branch name and remote branch name */
49
+ const branchMapping = `${branch}:${branch}`;
50
+ logProgress(GitStep.GitPush);
51
+ const pushResult = await GitProcess.exec(['push', remoteName, branchMapping], dir);
52
+ logProgress(GitStep.GitPushComplete);
53
+ if (pushResult.exitCode !== 0) {
54
+ throw new GitPullPushError({ dir, branch, remote: remoteName }, pushResult.stdout + pushResult.stderr);
55
+ }
56
+ return pushResult;
57
+ }
58
+ /**
59
+ * Git merge origin master
60
+ * @param dir
61
+ * @param username
62
+ * @param email
63
+ * @param message
64
+ */
65
+ export async function mergeUpstream(dir, branch, remoteName, logger) {
66
+ const logProgress = (step) => logger?.info(step, {
67
+ functionName: 'mergeUpstream',
68
+ step,
69
+ dir,
70
+ });
71
+ logProgress(GitStep.GitMerge);
72
+ const mergeResult = await GitProcess.exec(['merge', '--ff', '--ff-only', `${remoteName}/${branch}`], dir);
73
+ logProgress(GitStep.GitMergeComplete);
74
+ if (mergeResult.exitCode !== 0) {
75
+ throw new GitPullPushError({ dir, branch, remote: remoteName }, mergeResult.stdout + mergeResult.stderr);
76
+ }
77
+ return mergeResult;
78
+ }
26
79
  /**
27
80
  * try to continue rebase, simply adding and committing all things, leave them to user to resolve in the TiddlyWiki later.
28
81
  * @param dir
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const getGitUrlWithGitSuffix: (url: string) => string;
2
+ export declare const getGitUrlWithOutGitSuffix: (url: string) => string;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,QAAS,MAAM,KAAG,MAAsB,CAAC;AAC5E,eAAO,MAAM,yBAAyB,QAAS,MAAM,KAAG,MAAmC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export const getGitUrlWithGitSuffix = (url) => `${url}.git`;
2
+ export const getGitUrlWithOutGitSuffix = (url) => url.replace(/\.git$/, '');
3
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC;AAC5E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC"}