git-sync-js 0.6.0 → 1.0.0

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 (101) hide show
  1. package/dist/src/clone.d.ts +13 -0
  2. package/dist/src/clone.d.ts.map +1 -0
  3. package/dist/src/clone.js +55 -0
  4. package/dist/src/clone.js.map +1 -0
  5. package/dist/src/commitAndSync.d.ts +21 -0
  6. package/dist/src/commitAndSync.d.ts.map +1 -0
  7. package/dist/src/commitAndSync.js +143 -0
  8. package/dist/src/commitAndSync.js.map +1 -0
  9. package/dist/{credential.d.ts → src/credential.d.ts} +3 -2
  10. package/dist/src/credential.d.ts.map +1 -0
  11. package/dist/{credential.js → src/credential.js} +7 -7
  12. package/dist/src/credential.js.map +1 -0
  13. package/dist/{defaultGitInfo.d.ts → src/defaultGitInfo.d.ts} +1 -0
  14. package/dist/src/defaultGitInfo.d.ts.map +1 -0
  15. package/dist/{defaultGitInfo.js → src/defaultGitInfo.js} +1 -0
  16. package/dist/src/defaultGitInfo.js.map +1 -0
  17. package/dist/{errors.d.ts → src/errors.d.ts} +5 -1
  18. package/dist/src/errors.d.ts.map +1 -0
  19. package/dist/{errors.js → src/errors.js} +5 -5
  20. package/dist/src/errors.js.map +1 -0
  21. package/dist/src/index.d.ts +12 -0
  22. package/dist/src/index.d.ts.map +1 -0
  23. package/dist/src/index.js +12 -0
  24. package/dist/src/index.js.map +1 -0
  25. package/dist/src/init.d.ts +25 -0
  26. package/dist/src/init.d.ts.map +1 -0
  27. package/dist/src/init.js +22 -0
  28. package/dist/src/init.js.map +1 -0
  29. package/dist/src/initGit.d.ts +26 -0
  30. package/dist/src/initGit.d.ts.map +1 -0
  31. package/dist/src/initGit.js +40 -0
  32. package/dist/src/initGit.js.map +1 -0
  33. package/dist/{inspect.d.ts → src/inspect.d.ts} +19 -6
  34. package/dist/src/inspect.d.ts.map +1 -0
  35. package/dist/{inspect.js → src/inspect.js} +98 -44
  36. package/dist/src/inspect.js.map +1 -0
  37. package/dist/{interface.d.ts → src/interface.d.ts} +6 -0
  38. package/dist/src/interface.d.ts.map +1 -0
  39. package/dist/{interface.js → src/interface.js} +5 -0
  40. package/dist/src/interface.js.map +1 -0
  41. package/dist/{sync.d.ts → src/sync.d.ts} +17 -0
  42. package/dist/src/sync.d.ts.map +1 -0
  43. package/dist/{sync.js → src/sync.js} +47 -2
  44. package/dist/src/sync.js.map +1 -0
  45. package/dist/src/utils.d.ts +3 -0
  46. package/dist/src/utils.d.ts.map +1 -0
  47. package/dist/src/utils.js +3 -0
  48. package/dist/src/utils.js.map +1 -0
  49. package/dist/test/clone.test.d.ts +2 -0
  50. package/dist/test/clone.test.d.ts.map +1 -0
  51. package/dist/test/clone.test.js +42 -0
  52. package/dist/test/clone.test.js.map +1 -0
  53. package/dist/test/commitAndSync.test.d.ts +2 -0
  54. package/dist/test/commitAndSync.test.d.ts.map +1 -0
  55. package/dist/test/commitAndSync.test.js +27 -0
  56. package/dist/test/commitAndSync.test.js.map +1 -0
  57. package/dist/test/constants.d.ts +23 -0
  58. package/dist/test/constants.d.ts.map +1 -0
  59. package/dist/test/constants.js +51 -0
  60. package/dist/test/constants.js.map +1 -0
  61. package/dist/test/constants.test.d.ts +2 -0
  62. package/dist/test/constants.test.d.ts.map +1 -0
  63. package/dist/test/constants.test.js +7 -0
  64. package/dist/test/constants.test.js.map +1 -0
  65. package/dist/test/initGit.test.d.ts +2 -0
  66. package/dist/test/initGit.test.d.ts.map +1 -0
  67. package/dist/test/initGit.test.js +90 -0
  68. package/dist/test/initGit.test.js.map +1 -0
  69. package/dist/test/inspect.test.d.ts +2 -0
  70. package/dist/test/inspect.test.d.ts.map +1 -0
  71. package/dist/test/inspect.test.js +224 -0
  72. package/dist/test/inspect.test.js.map +1 -0
  73. package/dist/test/jest.setup.d.ts +2 -0
  74. package/dist/test/jest.setup.d.ts.map +1 -0
  75. package/dist/test/jest.setup.js +30 -0
  76. package/dist/test/jest.setup.js.map +1 -0
  77. package/dist/test/sync.test.d.ts +2 -0
  78. package/dist/test/sync.test.d.ts.map +1 -0
  79. package/dist/test/sync.test.js +75 -0
  80. package/dist/test/sync.test.js.map +1 -0
  81. package/dist/test/utils.d.ts +5 -0
  82. package/dist/test/utils.d.ts.map +1 -0
  83. package/dist/test/utils.js +38 -0
  84. package/dist/test/utils.js.map +1 -0
  85. package/package.json +24 -17
  86. package/dist/credential.d.ts.map +0 -1
  87. package/dist/credential.js.map +0 -1
  88. package/dist/defaultGitInfo.d.ts.map +0 -1
  89. package/dist/defaultGitInfo.js.map +0 -1
  90. package/dist/errors.d.ts.map +0 -1
  91. package/dist/errors.js.map +0 -1
  92. package/dist/index.d.ts +0 -48
  93. package/dist/index.d.ts.map +0 -1
  94. package/dist/index.js +0 -238
  95. package/dist/index.js.map +0 -1
  96. package/dist/inspect.d.ts.map +0 -1
  97. package/dist/inspect.js.map +0 -1
  98. package/dist/interface.d.ts.map +0 -1
  99. package/dist/interface.js.map +0 -1
  100. package/dist/sync.d.ts.map +0 -1
  101. 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
35
  export declare function getDefaultBranchName(wikiFolderPath: string): Promise<string | undefined>;
34
- export declare type SyncState = 'noUpstream' | 'equal' | 'ahead' | 'behind' | 'diverged';
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, defaultBranchName: string, logger?: ILogger): Promise<SyncState>;
41
- export declare function assumeSync(wikiFolderPath: string, defaultBranchName: string, logger?: ILogger): 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,24 +89,34 @@ 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;
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;
96
112
  }
97
- return branchName;
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, defaultBranchName, logger) {
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',
@@ -109,10 +124,14 @@ export async function getSyncState(dir, defaultBranchName, logger) {
109
124
  dir,
110
125
  });
111
126
  logProgress(GitStep.CheckingLocalSyncState);
112
- 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);
113
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
+ }
114
133
  if (stdout === '') {
115
- return 'noUpstream';
134
+ return 'noUpstreamOrBareUpstream';
116
135
  }
117
136
  if (/0\t0/.exec(stdout) !== null) {
118
137
  return 'equal';
@@ -125,11 +144,12 @@ export async function getSyncState(dir, defaultBranchName, logger) {
125
144
  }
126
145
  return 'diverged';
127
146
  }
128
- export async function assumeSync(wikiFolderPath, defaultBranchName, logger) {
129
- if ((await getSyncState(wikiFolderPath, defaultBranchName, logger)) === 'equal') {
147
+ export async function assumeSync(wikiFolderPath, defaultBranchName, remoteName, logger) {
148
+ const syncState = await getSyncState(wikiFolderPath, defaultBranchName, remoteName, logger);
149
+ if (syncState === 'equal') {
130
150
  return;
131
151
  }
132
- throw new AssumeSyncError();
152
+ throw new AssumeSyncError(syncState);
133
153
  }
134
154
  /**
135
155
  * get various repo state in string format
@@ -138,18 +158,23 @@ export async function assumeSync(wikiFolderPath, defaultBranchName, logger) {
138
158
  * // TODO: use template literal type to get exact type of git state
139
159
  */
140
160
  export async function getGitRepositoryState(wikiFolderPath, logger) {
141
- const gitDirectory = await getGitDirectory(wikiFolderPath, logger);
142
- if (typeof gitDirectory !== 'string' || gitDirectory.length === 0) {
161
+ if (!(await hasGit(wikiFolderPath))) {
143
162
  return 'NOGIT';
144
163
  }
145
- 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
146
167
  (await fs.lstat(path.join(gitDirectory, 'rebase-merge', 'interactive')).catch(() => ({})))?.isFile?.(),
168
+ // isRebaseM
147
169
  (await fs.lstat(path.join(gitDirectory, 'rebase-merge')).catch(() => ({})))?.isDirectory?.(),
170
+ // isAMRebase
148
171
  (await fs.lstat(path.join(gitDirectory, 'rebase-apply')).catch(() => ({})))?.isDirectory?.(),
172
+ // isMerging
149
173
  (await fs.lstat(path.join(gitDirectory, 'MERGE_HEAD')).catch(() => ({})))?.isFile?.(),
174
+ // isCherryPicking
150
175
  (await fs.lstat(path.join(gitDirectory, 'CHERRY_PICK_HEAD')).catch(() => ({})))?.isFile?.(),
176
+ // isBisecting
151
177
  (await fs.lstat(path.join(gitDirectory, 'BISECT_LOG')).catch(() => ({})))?.isFile?.(),
152
- (await GitProcess.exec(['rev-parse', '--is-inside-git-dir', wikiFolderPath], wikiFolderPath))?.stdout?.startsWith('true'),
153
178
  ]);
154
179
  let result = '';
155
180
  /* eslint-disable @typescript-eslint/strict-boolean-expressions */
@@ -173,17 +198,18 @@ export async function getGitRepositoryState(wikiFolderPath, logger) {
173
198
  result += 'BISECTING';
174
199
  }
175
200
  }
176
- if (isInsideGitDir) {
177
- result += (await GitProcess.exec(['rev-parse', '--is-bare-repository', wikiFolderPath], wikiFolderPath)).stdout.startsWith('true') ? '|BARE' : '|GIT_DIR';
178
- }
179
- else if ((await GitProcess.exec(['rev-parse', '--is-inside-work-tree', wikiFolderPath], wikiFolderPath)).stdout.startsWith('true')) {
180
- const { exitCode } = await GitProcess.exec(['diff', '--no-ext-diff', '--quiet', '--exit-code'], wikiFolderPath);
181
- // 1 if there were differences and 0 means no differences.
182
- if (exitCode !== 0) {
183
- result += '|DIRTY';
184
- }
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';
185
212
  }
186
- /* eslint-enable @typescript-eslint/strict-boolean-expressions */
187
213
  return result;
188
214
  }
189
215
  /**
@@ -191,9 +217,9 @@ export async function getGitRepositoryState(wikiFolderPath, logger) {
191
217
  * @param dir repo path
192
218
  */
193
219
  export async function getGitDirectory(dir, logger) {
194
- const logDebug = (message, step) => logger?.debug?.(message, { functionName: 'getSyncState', step, dir });
220
+ const logDebug = (message, step) => logger?.debug?.(message, { functionName: 'getGitDirectory', step, dir });
195
221
  const logProgress = (step) => logger?.info?.(step, {
196
- functionName: 'getSyncState',
222
+ functionName: 'getGitDirectory',
197
223
  step,
198
224
  dir,
199
225
  });
@@ -207,15 +233,23 @@ export async function getGitDirectory(dir, logger) {
207
233
  const { stdout: stdout2 } = await GitProcess.exec(['rev-parse', '--git-dir', dir], dir);
208
234
  const [gitPath2, gitPath1] = compact(stdout2.split('\n'));
209
235
  if (gitPath2 !== undefined && gitPath1 !== undefined) {
210
- return path.resolve(`${gitPath1}/${gitPath2}`);
236
+ return path.resolve(gitPath1, gitPath2);
211
237
  }
212
238
  }
213
239
  throw new CantSyncGitNotInitializedError(dir);
214
240
  }
215
- /** Check if dir has `.git`. */
216
- 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) {
217
248
  try {
218
- await getGitDirectory(dir);
249
+ const resultDir = await getGitDirectory(dir);
250
+ if (strict && path.dirname(resultDir) !== dir) {
251
+ return false;
252
+ }
219
253
  }
220
254
  catch (error) {
221
255
  if (error instanceof CantSyncGitNotInitializedError) {
@@ -224,4 +258,24 @@ export async function hasGit(dir) {
224
258
  }
225
259
  return true;
226
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
+ }
227
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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"}
@@ -26,6 +26,7 @@ export interface ILoggerContext {
26
26
  step: GitStep;
27
27
  dir?: string;
28
28
  remoteUrl?: string;
29
+ branch?: string;
29
30
  }
30
31
  export declare enum GitStep {
31
32
  StartGitInitialization = "StartGitInitialization",
@@ -41,6 +42,7 @@ export declare enum GitStep {
41
42
  PreparingUserInfo = "PreparingUserInfo",
42
43
  FetchingData = "FetchingData",
43
44
  NoNeedToSync = "NoNeedToSync",
45
+ NoUpstreamCantPush = "NoUpstreamCantPush",
44
46
  LocalAheadStartUpload = "LocalAheadStartUpload",
45
47
  CheckingLocalSyncState = "CheckingLocalSyncState",
46
48
  CheckingLocalGitRepoSanity = "CheckingLocalGitRepoSanity",
@@ -49,7 +51,11 @@ export declare enum GitStep {
49
51
  RebaseResultChecking = "RebaseResultChecking",
50
52
  RebaseConflictNeedsResolve = "RebaseConflictNeedsResolve",
51
53
  RebaseSucceed = "RebaseSucceed",
54
+ GitPush = "GitPush",
55
+ GitMerge = "GitMerge",
52
56
  GitPushFailed = "GitPushFailed",
57
+ GitPushComplete = "GitPushComplete",
58
+ GitMergeComplete = "GitMergeComplete",
53
59
  GitMergeFailed = "GitMergeFailed",
54
60
  /** this means our algorithm have some problems */
55
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"}
@@ -8,6 +8,23 @@ import { ILogger } from './interface';
8
8
  * @param message
9
9
  */
10
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"}
@@ -2,7 +2,7 @@
2
2
  import { GitProcess } from 'dugite';
3
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,7 +12,7 @@ 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', filesToIgnore = [], 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,
@@ -31,6 +31,51 @@ export async function commitFiles(dir, username, email, message = 'Initialize wi
31
31
  logProgress(GitStep.AddComplete);
32
32
  return await GitProcess.exec(['commit', '-m', message, `--author="${username} <${email}>"`], dir);
33
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
+ }
34
79
  /**
35
80
  * try to continue rebase, simply adding and committing all things, leave them to user to resolve in the TiddlyWiki later.
36
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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=clone.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone.test.d.ts","sourceRoot":"","sources":["../../test/clone.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ /* eslint-disable security/detect-non-literal-fs-filename */
2
+ import fs from 'fs-extra';
3
+ import { getDefaultBranchName, getSyncState, hasGit, haveLocalChanges } from '../src/inspect';
4
+ import { defaultGitInfo } from '../src/defaultGitInfo';
5
+ import {
6
+ // eslint-disable-next-line unicorn/prevent-abbreviations
7
+ dir, exampleToken, gitDirectory,
8
+ // eslint-disable-next-line unicorn/prevent-abbreviations
9
+ upstreamDir, } from './constants';
10
+ import { clone } from '../src/clone';
11
+ import { addAndCommitUsingDugite, addSomeFiles } from './utils';
12
+ describe('clone', () => {
13
+ beforeEach(async () => {
14
+ // remove dir's .git folder in this test suit, so we have a clean folder to clone
15
+ await fs.remove(gitDirectory);
16
+ });
17
+ describe('with upstream', () => {
18
+ test('equal to upstream after clone', async () => {
19
+ await clone({
20
+ dir,
21
+ userInfo: { ...defaultGitInfo, accessToken: exampleToken },
22
+ remoteUrl: upstreamDir,
23
+ });
24
+ expect(await hasGit(dir)).toBe(true);
25
+ expect(await haveLocalChanges(dir)).toBe(false);
26
+ expect(await getSyncState(dir, defaultGitInfo.branch, defaultGitInfo.remote)).toBe('equal');
27
+ expect(await getDefaultBranchName(dir)).toBe(defaultGitInfo.branch);
28
+ });
29
+ test('equal to committed upstream', async () => {
30
+ // modify upstream
31
+ await addSomeFiles(upstreamDir);
32
+ await addAndCommitUsingDugite(upstreamDir);
33
+ await clone({
34
+ dir,
35
+ userInfo: { ...defaultGitInfo, accessToken: exampleToken },
36
+ remoteUrl: upstreamDir,
37
+ });
38
+ expect(await getSyncState(dir, defaultGitInfo.branch, defaultGitInfo.remote)).toBe('equal');
39
+ });
40
+ });
41
+ });
42
+ //# sourceMappingURL=clone.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone.test.js","sourceRoot":"","sources":["../../test/clone.test.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAa,MAAM,gBAAgB,CAAC;AACzG,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO;AACL,yDAAyD;AACzD,GAAG,EACH,YAAY,EACZ,YAAY;AACZ,yDAAyD;AACzD,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEhE,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,iFAAiF;QACjF,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,KAAK,CAAC;gBACV,GAAG;gBACH,QAAQ,EAAE,EAAE,GAAG,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE;gBAC1D,SAAS,EAAE,WAAW;aACvB,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAY,OAAO,CAAC,CAAC;YACvG,MAAM,CAAC,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC7C,kBAAkB;YAClB,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;YAChC,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;YAE3C,MAAM,KAAK,CAAC;gBACV,GAAG;gBACH,QAAQ,EAAE,EAAE,GAAG,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE;gBAC1D,SAAS,EAAE,WAAW;aACvB,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAY,OAAO,CAAC,CAAC;QACzG,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=commitAndSync.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commitAndSync.test.d.ts","sourceRoot":"","sources":["../../test/commitAndSync.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ /* eslint-disable security/detect-non-literal-fs-filename */
2
+ import { getSyncState } from '../src/inspect';
3
+ import { defaultGitInfo } from '../src/defaultGitInfo';
4
+ import {
5
+ // eslint-disable-next-line unicorn/prevent-abbreviations
6
+ dir, exampleToken,
7
+ // eslint-disable-next-line unicorn/prevent-abbreviations
8
+ upstreamDir, } from './constants';
9
+ import { addBareUpstream, addSomeFiles } from './utils';
10
+ import { commitAndSync } from '../src/commitAndSync';
11
+ describe('commitAndSync', () => {
12
+ beforeEach(async () => {
13
+ await addBareUpstream();
14
+ });
15
+ const getCommitAndSyncOptions = () => ({
16
+ dir,
17
+ remoteUrl: upstreamDir,
18
+ userInfo: { ...defaultGitInfo, accessToken: exampleToken },
19
+ });
20
+ test('equal to upstream that been commitAndSync to', async () => {
21
+ expect(await getSyncState(dir, defaultGitInfo.branch, defaultGitInfo.remote)).toBe('noUpstreamOrBareUpstream');
22
+ await addSomeFiles();
23
+ await commitAndSync(getCommitAndSyncOptions());
24
+ expect(await getSyncState(dir, defaultGitInfo.branch, defaultGitInfo.remote)).toBe('equal');
25
+ });
26
+ });
27
+ //# sourceMappingURL=commitAndSync.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commitAndSync.test.js","sourceRoot":"","sources":["../../test/commitAndSync.test.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EAAE,YAAY,EAAa,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO;AACL,yDAAyD;AACzD,GAAG,EACH,YAAY;AACZ,yDAAyD;AACzD,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,aAAa,EAAyB,MAAM,sBAAsB,CAAC;AAE5E,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,eAAe,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,MAAM,uBAAuB,GAAG,GAA0B,EAAE,CAAC,CAAC;QAC5D,GAAG;QACH,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,EAAE,GAAG,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE;KAC3D,CAAC,CAAC;IAEH,IAAI,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAY,0BAA0B,CAAC,CAAC;QAC1H,MAAM,YAAY,EAAE,CAAC;QACrB,MAAM,aAAa,CAAC,uBAAuB,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAY,OAAO,CAAC,CAAC;IACzG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}