one-way-git-sync 3.4.0 → 4.1.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.
- package/README.md +15 -19
- package/bin/index.js +1 -1
- package/dist/cli.min.cjs +9 -0
- package/dist/cli.min.cjs.map +7 -0
- package/package.json +5 -17
- package/dist/index.js +0 -303
- package/dist/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -15,48 +15,44 @@ It provides three features:
|
|
|
15
15
|
### Initial Usage
|
|
16
16
|
|
|
17
17
|
Because `one-way-git-sync` finds a sync commit from the commit history of the dest repo,
|
|
18
|
-
you need to run `
|
|
18
|
+
you need to run `one-way-git-sync` with `--force` option to add an initial sync commit to the dest repo
|
|
19
19
|
by replacing all the files of the dest repo with those of src repo at first.
|
|
20
20
|
The sample command is as follows:
|
|
21
21
|
|
|
22
22
|
```
|
|
23
|
-
yarn dlx one-way-git-sync
|
|
24
|
-
-d git@github.com:WillBooster/sample-of-one-way-git-sync.git
|
|
25
|
-
-p https://github.com/WillBooster/one-way-git-sync/commits/
|
|
23
|
+
yarn dlx one-way-git-sync --force \
|
|
24
|
+
-d git@github.com:WillBooster/sample-of-one-way-git-sync.git
|
|
26
25
|
```
|
|
27
26
|
|
|
28
27
|
If you have no permission to write `git@github.com:WillBooster/sample-of-one-way-git-sync.git`,
|
|
29
28
|
please try `https://oauth2:<GitHub Personal Access Token>@github.com/WillBooster/sample-of-one-way-git-sync.git`.
|
|
30
|
-
`<GitHub Personal Access Token>` should be like `ghp_...
|
|
29
|
+
`<GitHub Personal Access Token>` should be like `ghp_...m4rh`.
|
|
31
30
|
|
|
32
31
|
### Usual Usage
|
|
33
32
|
|
|
34
33
|
If the last commit in the dest repo is a sync commit,
|
|
35
34
|
`one-way-git-sync` safely synchronizes the dest repo with the src repo.
|
|
36
|
-
The sample command is as follows:
|
|
35
|
+
So, you don't need `--force` option. The sample command is as follows:
|
|
37
36
|
|
|
38
37
|
```
|
|
39
38
|
yarn dlx one-way-git-sync \
|
|
40
|
-
-d git@github.com:WillBooster/sample-of-one-way-git-sync.git
|
|
41
|
-
-p https://github.com/WillBooster/one-way-git-sync/commits/
|
|
39
|
+
-d git@github.com:WillBooster/sample-of-one-way-git-sync.git
|
|
42
40
|
```
|
|
43
41
|
|
|
44
|
-
###
|
|
42
|
+
### Deal with Conflicts
|
|
45
43
|
|
|
46
|
-
If the last commit in the dest repo isn't a sync commit
|
|
44
|
+
If the last commit in the dest repo isn't a sync commit,
|
|
47
45
|
the dest repo probably has some commits (`conflict commits`) which don't exist in the src repo.
|
|
48
|
-
You need to merge
|
|
49
|
-
then, you need to
|
|
46
|
+
You need to merge missing commits in the src repo into the dest repo manually at first,
|
|
47
|
+
then, you need to run `one-way-git-sync` with `--force` option.
|
|
50
48
|
The sample commands are as follows:
|
|
51
49
|
|
|
52
|
-
1. `yarn one-way-git-sync` fails then you notice there
|
|
53
|
-
2. `
|
|
54
|
-
3. `git
|
|
55
|
-
4.
|
|
56
|
-
5. ```
|
|
50
|
+
1. `yarn dlx one-way-git-sync` fails, then you notice there are missing commits
|
|
51
|
+
2. (for merging) `git remote add upstream git@github.com:WillBooster/sample-of-one-way-git-sync.git`
|
|
52
|
+
3. (for merging) `git merge --allow-unrelated-histories upstream/main`
|
|
53
|
+
4. ```
|
|
57
54
|
yarn dlx one-way-git-sync --force \
|
|
58
|
-
-d git@github.com:WillBooster/sample-of-one-way-git-sync.git
|
|
59
|
-
-p https://github.com/WillBooster/one-way-git-sync/commits/
|
|
55
|
+
-d git@github.com:WillBooster/sample-of-one-way-git-sync.git
|
|
60
56
|
```
|
|
61
57
|
|
|
62
58
|
## Example Repository and Example GitHub Actions Workflows
|
package/bin/index.js
CHANGED
package/dist/cli.min.cjs
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
var _=Object.create;var w=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var B=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var S=t=>w(t,"__esModule",{value:!0});var z=(t,e)=>{for(var r in e)w(t,r,{get:e[r],enumerable:!0})},F=(t,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of q(e))!W.call(t,a)&&(r||a!=="default")&&w(t,a,{get:()=>e[a],enumerable:!(i=D(e,a))||i.enumerable});return t},m=(t,e)=>F(S(w(t!=null?_(B(t)):{},"default",!e&&t&&t.__esModule?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t),P=(t=>(e,r)=>t&&t.get(e)||(r=F(S({}),e,1),t&&t.set(e,r),r))(typeof WeakMap!="undefined"?new WeakMap:0);var M={};z(M,{cli:()=>K});var H=require("yargs/helpers"),I=m(require("yargs/yargs"));var d=require("winston"),o=(0,d.createLogger)({transports:[new d.transports.Console({format:d.format.cli({colors:{error:"red"}})})]});var E=m(require("child_process")),f=m(require("fs/promises")),h=m(require("path")),L=m(require("fs-extra")),$=m(require("micromatch")),g=m(require("simple-git"));async function G(t){var a,u,c;let r=(await t.getRemotes(!0)).find(n=>n.name==="origin"),i=((a=r==null?void 0:r.refs)==null?void 0:a.fetch)??((u=r==null?void 0:r.refs)==null?void 0:u.push);if(typeof i=="string"&&i.includes("github.com")){let n=i.split("/"),l=n[n.length-2],p=(c=n[n.length-1])==null?void 0:c.replace(/.git$/,"");if(l&&p)return`https://github.com/${l}/${p}/commits`}}var T=h.default.join("node_modules",".temp","sync-git-repo");async function j(t){await f.default.mkdir(T,{recursive:!0});let e=await f.default.mkdtemp(h.default.join(T,"repo-")),r=await Y(e,t);process.exit(r?0:1)}async function Y(t,e){var O;let r={"--single-branch":void 0};e.force||(r["--depth"]=1),e.branch&&(r["--branch"]=e.branch);try{await(0,g.default)().clone(e.dest,t,r)}catch{delete r["--single-branch"],await(0,g.default)().clone(e.dest,t,r),(0,g.default)(t).checkout(["-b",e.branch])}o.verbose(`Cloned destination repo on ${t}`);let i=(0,g.default)(t),a=await i.log(),[u,c]=J(a);if(c)o.verbose(`Extracted a valid commit: ${c}`),o.verbose(`(${u})`);else if(!e.force)return o.error("No valid commit in destination repo"),!1;let n=(0,g.default)(),l;try{l=await n.log(c?{from:c,to:"HEAD","--first-parent":void 0}:void 0)}catch(s){return o.error(`Failed to get source commit history: ${s.stack}`),!1}let p=(O=l.latest)==null?void 0:O.hash;if(!p)return o.info("No synchronizable commit"),!0;let[N,U]=await Promise.all([f.default.readdir(t),f.default.readdir(".")]);for(let s of $.default.not(N,e["ignore-patterns"]))await f.default.rm(h.default.join(t,s),{recursive:!0,force:!0});for(let s of $.default.not(U,e["ignore-patterns"]))L.default.copySync(s,h.default.join(t,s));await i.add("-A");let y="";if(e["tag-hash"]||e["tag-version"]){let s=`git describe --tags --always ${e["tag-version"]?"--abbrev=0":""}`;y=E.default.execSync(s).toString().trim()}let b=e.prefix??await G(n)??"";b&&!b.endsWith("/")&&(b+="/");let x=`${b}${p}`,k=y?`sync ${y} (${x})`:`sync ${x}`,C=c?l.all.map(s=>`* ${s.message}`).join(`
|
|
2
|
+
|
|
3
|
+
`):`Replace all the files with those of ${e.dest} due to missing sync commit.`;try{await i.commit(`${k}
|
|
4
|
+
|
|
5
|
+
${C}`),o.verbose(`Created a commit: ${k}`),o.verbose(` with body: ${C}`)}catch(s){return o.error(`Failed to commit changes: ${s.stack}\`);`),!1}let v=y||e.tag;if(v)try{await i.addTag(v),o.verbose(`Created a tag: ${v}`)}catch(s){return o.error(`Failed to commit changes: ${s.stack}\`);`),!1}if(e.dry)return o.verbose("Finished dry run"),!0;try{await i.push(),v&&await i.push({"--tags":null})}catch(s){return o.error(`Failed to push the commit: ${s.stack}`),!1}return o.verbose("Pushed the commit"),!0}function J(t){if(t.all.length===0)return o.verbose("No commit history"),[];for(let e of t.all){let[r,...i]=e.message.replace(/[()]/g,"").split(/[\s/]/);if(r==="sync"&&i.length)return[e.message,i[i.length-1]]}return o.verbose(`No sync commit: ${t.all[0].message}`),[]}var A={dest:{type:"string",alias:"d",describe:"A URL of a destination git repository.",demand:!0},prefix:{type:"string",alias:"p",describe:`A prefix of a commit hash used to generate a commit title, e.g. 'sync <prefix>/<hash>'.
|
|
6
|
+
A typical value is like 'https://github.com/WillBooster/one-way-git-sync/commits'`},branch:{type:"string",alias:"b",describe:"Specify branch of destination repo."},tag:{type:"string",alias:"t",describe:"Specify tag to be created in destination repo."},"tag-hash":{type:"boolean",describe:"Create version+hash tag (e.g. v1.31.5-2-gcdde507). It should be a unique tag."},"tag-version":{type:"boolean",describe:"Create version tag (e.g. v1.31.5). It could be a non-unique tag."},"ignore-patterns":{type:"string",alias:"i",describe:`Exclude the files whose path matches one of the given patterns.
|
|
7
|
+
The patterns are processed by micromatch (https://github.com/micromatch/micromatch).
|
|
8
|
+
You may specify the option multiple times. Default value is ['.git', '.github', 'node_modules', '.renovaterc.*']`,default:[".git",".github","node_modules",".renovaterc.*"]},dry:{type:"boolean",describe:"Enable dry-run mode."},force:{type:"boolean",describe:"Force to overwrite the destination git repository."},verbose:{type:"boolean",alias:"v",describe:"Show details logs."}};async function K(t){let e=await(0,I.default)((0,H.hideBin)(t)).options(A).middleware(r=>{o.level=r.verbose?"verbose":"info"}).argv;await j(e)}module.exports=P(M);0&&(module.exports={cli});
|
|
9
|
+
//# sourceMappingURL=cli.min.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cli.ts", "../src/logger.ts", "../src/sync.ts", "../src/gitHub.ts", "../src/yargsOptions.ts"],
|
|
4
|
+
"sourcesContent": ["import { hideBin } from 'yargs/helpers';\nimport yargs from 'yargs/yargs';\n\nimport { logger } from './logger';\nimport { sync } from './sync';\nimport { yargsOptions } from './yargsOptions';\n\nexport async function cli(args: string[]): Promise<void> {\n const argv = await yargs(hideBin(args))\n .options(yargsOptions)\n .middleware((argv) => {\n logger.level = argv.verbose ? 'verbose' : 'info';\n }).argv;\n await sync(argv);\n}\n", "import { createLogger, format, transports } from 'winston';\n\nexport const logger = createLogger({\n transports: [\n new transports.Console({\n format: format.cli({ colors: { error: 'red' } }),\n }),\n ],\n});\n", "import child_process from 'child_process';\nimport fsp from 'fs/promises';\nimport path from 'path';\n\nimport fse from 'fs-extra';\nimport micromatch from 'micromatch';\nimport type { LogResult, TaskOptions } from 'simple-git';\nimport simpleGit, { SimpleGit } from 'simple-git';\nimport { InferredOptionTypes } from 'yargs';\n\nimport { getGitHubCommitsUrl } from './gitHub';\nimport { logger } from './logger';\nimport { yargsOptions } from './yargsOptions';\n\nconst syncDirPath = path.join('node_modules', '.temp', 'sync-git-repo');\n\nexport async function sync(opts: InferredOptionTypes<typeof yargsOptions>): Promise<void> {\n await fsp.mkdir(syncDirPath, { recursive: true });\n const dirPath = await fsp.mkdtemp(path.join(syncDirPath, 'repo-'));\n const ret = await syncCore(dirPath, opts);\n // await fsp.rm(dirPath, { recursive: true, force: true });\n process.exit(ret ? 0 : 1);\n}\n\nasync function syncCore(destRepoPath: string, opts: InferredOptionTypes<typeof yargsOptions>): Promise<boolean> {\n const cloneOpts: Record<string, any> = { '--single-branch': undefined };\n if (!opts.force) {\n cloneOpts['--depth'] = 1;\n }\n if (opts.branch) {\n cloneOpts['--branch'] = opts.branch;\n }\n try {\n await simpleGit().clone(opts.dest, destRepoPath, cloneOpts);\n } catch (e) {\n delete cloneOpts['--single-branch'];\n await simpleGit().clone(opts.dest, destRepoPath, cloneOpts);\n simpleGit(destRepoPath).checkout(['-b', opts.branch] as TaskOptions);\n }\n logger.verbose(`Cloned destination repo on ${destRepoPath}`);\n\n const dstGit: SimpleGit = simpleGit(destRepoPath);\n const dstLog = await dstGit.log();\n\n const [head, from] = extractCommitHash(dstLog);\n if (from) {\n logger.verbose(`Extracted a valid commit: ${from}`);\n logger.verbose(`(${head})`);\n } else if (!opts.force) {\n logger.error('No valid commit in destination repo');\n return false;\n }\n\n const srcGit: SimpleGit = simpleGit();\n let srcLog: LogResult;\n try {\n // '--first-parent' hides children commits of merge commits\n srcLog = await srcGit.log(from ? { from, to: 'HEAD', '--first-parent': undefined } : undefined);\n } catch (e) {\n logger.error(`Failed to get source commit history: ${(e as Error).stack}`);\n return false;\n }\n\n const latestHash = srcLog.latest?.hash;\n if (!latestHash) {\n logger.info('No synchronizable commit');\n return true;\n }\n\n const [destFiles, srcFiles] = await Promise.all([fsp.readdir(destRepoPath), fsp.readdir('.')]);\n for (const destFile of micromatch.not(destFiles, opts['ignore-patterns'])) {\n await fsp.rm(path.join(destRepoPath, destFile), { recursive: true, force: true });\n }\n for (const srcFile of micromatch.not(srcFiles, opts['ignore-patterns'])) {\n fse.copySync(srcFile, path.join(destRepoPath, srcFile));\n }\n await dstGit.add('-A');\n\n let srcTag = '';\n if (opts['tag-hash'] || opts['tag-version']) {\n // e.g. `--abbrev=0` changes `v1.31.5-2-gcdde507` to `v1.31.5`\n const describeCommand = `git describe --tags --always ${opts['tag-version'] ? '--abbrev=0' : ''}`;\n srcTag = child_process.execSync(describeCommand).toString().trim();\n }\n let prefix = opts.prefix ?? (await getGitHubCommitsUrl(srcGit)) ?? '';\n if (prefix && !prefix.endsWith('/')) {\n prefix += '/';\n }\n const link = `${prefix}${latestHash}`;\n const title = srcTag ? `sync ${srcTag} (${link})` : `sync ${link}`;\n const body = from\n ? srcLog.all.map((l) => `* ${l.message}`).join('\\n\\n')\n : `Replace all the files with those of ${opts.dest} due to missing sync commit.`;\n try {\n await dstGit.commit(`${title}\\n\\n${body}`);\n logger.verbose(`Created a commit: ${title}`);\n logger.verbose(` with body: ${body}`);\n } catch (e) {\n logger.error(`Failed to commit changes: ${(e as Error).stack}\\`);`);\n return false;\n }\n\n const destTag = srcTag || opts.tag;\n if (destTag) {\n try {\n await dstGit.addTag(destTag);\n logger.verbose(`Created a tag: ${destTag}`);\n } catch (e) {\n logger.error(`Failed to commit changes: ${(e as Error).stack}\\`);`);\n return false;\n }\n }\n\n if (opts.dry) {\n logger.verbose('Finished dry run');\n return true;\n }\n\n try {\n await dstGit.push();\n if (destTag) {\n await dstGit.push({ '--tags': null });\n }\n } catch (e) {\n logger.error(`Failed to push the commit: ${(e as Error).stack}`);\n return false;\n }\n\n logger.verbose('Pushed the commit');\n return true;\n}\n\nfunction extractCommitHash(logResult: LogResult): [string, string] | [] {\n if (logResult.all.length === 0) {\n logger.verbose('No commit history');\n return [];\n }\n\n for (const log of logResult.all) {\n const [head, ...words] = log.message.replace(/[()]/g, '').split(/[\\s/]/);\n if (head === 'sync' && words.length) {\n return [log.message, words[words.length - 1]];\n }\n }\n logger.verbose(`No sync commit: ${logResult.all[0].message}`);\n return [];\n}\n", "import { SimpleGit } from 'simple-git';\n\nexport async function getGitHubCommitsUrl(git: SimpleGit): Promise<string | undefined> {\n const remotes = await git.getRemotes(true);\n const origin = remotes.find((r) => r.name === 'origin');\n const remoteUrl = origin?.refs?.fetch ?? origin?.refs?.push;\n if (typeof remoteUrl === 'string' && remoteUrl.includes('github.com')) {\n const words = remoteUrl.split('/');\n const org = words[words.length - 2];\n const name = words[words.length - 1]?.replace(/.git$/, '');\n if (org && name) return `https://github.com/${org}/${name}/commits`;\n }\n}\n", "export const yargsOptions = {\n dest: {\n type: 'string',\n alias: 'd',\n describe: 'A URL of a destination git repository.',\n demand: true,\n },\n prefix: {\n type: 'string',\n alias: 'p',\n describe: `A prefix of a commit hash used to generate a commit title, e.g. 'sync <prefix>/<hash>'.\n A typical value is like 'https://github.com/WillBooster/one-way-git-sync/commits'`,\n },\n branch: {\n type: 'string',\n alias: 'b',\n describe: 'Specify branch of destination repo.',\n },\n tag: {\n type: 'string',\n alias: 't',\n describe: 'Specify tag to be created in destination repo.',\n },\n 'tag-hash': {\n type: 'boolean',\n describe: 'Create version+hash tag (e.g. v1.31.5-2-gcdde507). It should be a unique tag.',\n },\n 'tag-version': {\n type: 'boolean',\n describe: 'Create version tag (e.g. v1.31.5). It could be a non-unique tag.',\n },\n 'ignore-patterns': {\n type: 'string',\n alias: 'i',\n describe: `Exclude the files whose path matches one of the given patterns.\n The patterns are processed by micromatch (https://github.com/micromatch/micromatch).\n You may specify the option multiple times. Default value is ['.git', '.github', 'node_modules', '.renovaterc.*']`,\n default: ['.git', '.github', 'node_modules', '.renovaterc.*'],\n },\n dry: {\n type: 'boolean',\n describe: 'Enable dry-run mode.',\n },\n force: {\n type: 'boolean',\n describe: 'Force to overwrite the destination git repository.',\n },\n verbose: {\n type: 'boolean',\n alias: 'v',\n describe: 'Show details logs.',\n },\n} as const;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"dist/"
|
|
15
15
|
],
|
|
16
16
|
"scripts": {
|
|
17
|
-
"build": "
|
|
17
|
+
"build": "node esbuild.js",
|
|
18
18
|
"cleanup": "yarn format && yarn lint-fix",
|
|
19
19
|
"format": "sort-package-json && yarn prettify",
|
|
20
20
|
"_postinstall": "husky install",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"postpack": "pinst --enable",
|
|
25
25
|
"prettify": "prettier --color --write \"**/{.*/,}*.{cjs,css,htm,html,js,json,json5,jsx,md,mjs,scss,ts,tsx,vue,yaml,yml}\" \"!**/test-fixtures/**\"",
|
|
26
26
|
"release": "yarn build && semantic-release",
|
|
27
|
-
"start": "
|
|
27
|
+
"start": "node -r esbuild-register src/start.ts",
|
|
28
28
|
"start-prod": "yarn build && yarn one-way-git-sync",
|
|
29
29
|
"typecheck": "tsc --noEmit --Pretty"
|
|
30
30
|
},
|
|
@@ -40,16 +40,6 @@
|
|
|
40
40
|
"yargs": "17.3.1"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@babel/core": "7.17.5",
|
|
44
|
-
"@babel/helper-plugin-utils": "7.16.7",
|
|
45
|
-
"@babel/node": "7.16.8",
|
|
46
|
-
"@babel/plugin-proposal-class-properties": "7.16.7",
|
|
47
|
-
"@babel/plugin-proposal-numeric-separator": "7.16.7",
|
|
48
|
-
"@babel/preset-env": "7.16.11",
|
|
49
|
-
"@babel/preset-typescript": "7.16.7",
|
|
50
|
-
"@rollup/plugin-babel": "5.3.1",
|
|
51
|
-
"@rollup/plugin-commonjs": "21.0.2",
|
|
52
|
-
"@rollup/plugin-node-resolve": "13.1.3",
|
|
53
43
|
"@types/eslint": "8.4.1",
|
|
54
44
|
"@types/fs-extra": "9.0.13",
|
|
55
45
|
"@types/micromatch": "4.0.2",
|
|
@@ -60,9 +50,9 @@
|
|
|
60
50
|
"@willbooster/eslint-config-ts": "9.0.0",
|
|
61
51
|
"@willbooster/prettier-config": "9.0.0",
|
|
62
52
|
"@willbooster/renovate-config": "9.2.0",
|
|
63
|
-
"babel-plugin-transform-remove-console": "6.9.4",
|
|
64
53
|
"conventional-changelog-conventionalcommits": "4.6.3",
|
|
65
|
-
"
|
|
54
|
+
"esbuild": "0.14.25",
|
|
55
|
+
"esbuild-register": "3.3.2",
|
|
66
56
|
"eslint": "8.10.0",
|
|
67
57
|
"eslint-config-prettier": "8.5.0",
|
|
68
58
|
"eslint-import-resolver-typescript": "2.5.0",
|
|
@@ -73,8 +63,6 @@
|
|
|
73
63
|
"lint-staged": "12.3.4",
|
|
74
64
|
"pinst": "3.0.0",
|
|
75
65
|
"prettier": "2.5.1",
|
|
76
|
-
"rollup": "2.69.1",
|
|
77
|
-
"rollup-plugin-node-externals": "4.0.0",
|
|
78
66
|
"semantic-release": "19.0.2",
|
|
79
67
|
"sort-package-json": "1.54.0",
|
|
80
68
|
"typescript": "4.6.2"
|
|
@@ -83,5 +71,5 @@
|
|
|
83
71
|
"node": ">=14"
|
|
84
72
|
},
|
|
85
73
|
"packageManager": "yarn@3.2.0",
|
|
86
|
-
"version": "
|
|
74
|
+
"version": "4.1.0"
|
|
87
75
|
}
|
package/dist/index.js
DELETED
|
@@ -1,303 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var helpers = require('yargs/helpers');
|
|
6
|
-
var yargs = require('yargs/yargs');
|
|
7
|
-
var child_process = require('child_process');
|
|
8
|
-
var fsp = require('fs/promises');
|
|
9
|
-
var path = require('path');
|
|
10
|
-
var fse = require('fs-extra');
|
|
11
|
-
var micromatch = require('micromatch');
|
|
12
|
-
var simpleGit = require('simple-git');
|
|
13
|
-
require('core-js/modules/esnext.array.at.js');
|
|
14
|
-
var winston = require('winston');
|
|
15
|
-
|
|
16
|
-
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
17
|
-
|
|
18
|
-
var yargs__default = /*#__PURE__*/_interopDefaultLegacy(yargs);
|
|
19
|
-
var child_process__default = /*#__PURE__*/_interopDefaultLegacy(child_process);
|
|
20
|
-
var fsp__default = /*#__PURE__*/_interopDefaultLegacy(fsp);
|
|
21
|
-
var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
|
|
22
|
-
var fse__default = /*#__PURE__*/_interopDefaultLegacy(fse);
|
|
23
|
-
var micromatch__default = /*#__PURE__*/_interopDefaultLegacy(micromatch);
|
|
24
|
-
var simpleGit__default = /*#__PURE__*/_interopDefaultLegacy(simpleGit);
|
|
25
|
-
|
|
26
|
-
async function getGitHubCommitsUrl(git) {
|
|
27
|
-
var _origin$refs$fetch, _origin$refs, _origin$refs2;
|
|
28
|
-
|
|
29
|
-
const remotes = await git.getRemotes(true);
|
|
30
|
-
const origin = remotes.find(r => r.name === 'origin');
|
|
31
|
-
const remoteUrl = (_origin$refs$fetch = origin === null || origin === void 0 ? void 0 : (_origin$refs = origin.refs) === null || _origin$refs === void 0 ? void 0 : _origin$refs.fetch) !== null && _origin$refs$fetch !== void 0 ? _origin$refs$fetch : origin === null || origin === void 0 ? void 0 : (_origin$refs2 = origin.refs) === null || _origin$refs2 === void 0 ? void 0 : _origin$refs2.push;
|
|
32
|
-
|
|
33
|
-
if (typeof remoteUrl === 'string' && remoteUrl.includes('github.com')) {
|
|
34
|
-
var _words$at;
|
|
35
|
-
|
|
36
|
-
const words = remoteUrl.split('/');
|
|
37
|
-
const org = words === null || words === void 0 ? void 0 : words.at(-2);
|
|
38
|
-
const name = words === null || words === void 0 ? void 0 : (_words$at = words.at(-1)) === null || _words$at === void 0 ? void 0 : _words$at.replace(/.git$/, '');
|
|
39
|
-
if (org && name) return `https://github.com/${org}/${name}/commits`;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const logger = winston.createLogger({
|
|
44
|
-
transports: [new winston.transports.Console({
|
|
45
|
-
format: winston.format.cli({
|
|
46
|
-
colors: {
|
|
47
|
-
error: 'red'
|
|
48
|
-
}
|
|
49
|
-
})
|
|
50
|
-
})]
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
const syncDirPath = path__default["default"].join('node_modules', '.temp', 'sync-git-repo');
|
|
54
|
-
async function sync(opts, init) {
|
|
55
|
-
await fsp__default["default"].mkdir(syncDirPath, {
|
|
56
|
-
recursive: true
|
|
57
|
-
});
|
|
58
|
-
const dirPath = await fsp__default["default"].mkdtemp(path__default["default"].join(syncDirPath, 'repo-'));
|
|
59
|
-
const ret = await syncCore(dirPath, opts, init);
|
|
60
|
-
await fsp__default["default"].rm(dirPath, {
|
|
61
|
-
recursive: true,
|
|
62
|
-
force: true
|
|
63
|
-
});
|
|
64
|
-
process.exit(ret ? 0 : 1);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async function syncCore(destRepoPath, opts, init) {
|
|
68
|
-
var _srcLog$latest, _ref, _opts$prefix;
|
|
69
|
-
|
|
70
|
-
const cloneOpts = {
|
|
71
|
-
'--single-branch': undefined
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
if (!opts.force) {
|
|
75
|
-
cloneOpts['--depth'] = 1;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (opts.branch) {
|
|
79
|
-
cloneOpts['--branch'] = opts.branch;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
try {
|
|
83
|
-
await simpleGit__default["default"]().clone(opts.dest, destRepoPath, cloneOpts);
|
|
84
|
-
} catch (e) {
|
|
85
|
-
if (!init) throw e;
|
|
86
|
-
delete cloneOpts['--single-branch'];
|
|
87
|
-
await simpleGit__default["default"]().clone(opts.dest, destRepoPath, cloneOpts);
|
|
88
|
-
simpleGit__default["default"](destRepoPath).checkout(['-b', opts.branch]);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
logger.verbose(`Cloned a destination repo on ${destRepoPath}`);
|
|
92
|
-
const dstGit = simpleGit__default["default"](destRepoPath);
|
|
93
|
-
const dstLog = await dstGit.log();
|
|
94
|
-
let from;
|
|
95
|
-
|
|
96
|
-
if (!init) {
|
|
97
|
-
from = extractCommitHash(dstLog);
|
|
98
|
-
|
|
99
|
-
if (!from) {
|
|
100
|
-
logger.error('No valid commit in destination repo');
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
logger.verbose(`Extracted a valid commit: ${from}`);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const srcGit = simpleGit__default["default"]();
|
|
108
|
-
let srcLog;
|
|
109
|
-
|
|
110
|
-
try {
|
|
111
|
-
// '--first-parent' hides children commits of merge commits
|
|
112
|
-
srcLog = await srcGit.log(from ? {
|
|
113
|
-
from,
|
|
114
|
-
to: 'HEAD',
|
|
115
|
-
'--first-parent': undefined
|
|
116
|
-
} : undefined);
|
|
117
|
-
} catch (e) {
|
|
118
|
-
logger.error(`Failed to get source commit history: ${e.stack}`);
|
|
119
|
-
return false;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const latestHash = (_srcLog$latest = srcLog.latest) === null || _srcLog$latest === void 0 ? void 0 : _srcLog$latest.hash;
|
|
123
|
-
|
|
124
|
-
if (!latestHash) {
|
|
125
|
-
logger.info('No synchronizable commit');
|
|
126
|
-
return true;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const [destFiles, srcFiles] = await Promise.all([fsp__default["default"].readdir(destRepoPath), fsp__default["default"].readdir('.')]);
|
|
130
|
-
|
|
131
|
-
for (const destFile of micromatch__default["default"].not(destFiles, opts['ignore-patterns'])) {
|
|
132
|
-
await fsp__default["default"].rm(path__default["default"].join(destRepoPath, destFile), {
|
|
133
|
-
recursive: true,
|
|
134
|
-
force: true
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
for (const srcFile of micromatch__default["default"].not(srcFiles, opts['ignore-patterns'])) {
|
|
139
|
-
fse__default["default"].copySync(srcFile, path__default["default"].join(destRepoPath, srcFile));
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
await dstGit.add('-A');
|
|
143
|
-
let srcTag = '';
|
|
144
|
-
|
|
145
|
-
if (opts['tag-hash'] || opts['tag-version']) {
|
|
146
|
-
// e.g. `--abbrev=0` changes `v1.31.5-2-gcdde507` to `v1.31.5`
|
|
147
|
-
const describeCommand = `git describe --tags --always ${opts['tag-version'] ? '--abbrev=0' : ''}`;
|
|
148
|
-
srcTag = child_process__default["default"].execSync(describeCommand).toString().trim();
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
let prefix = (_ref = (_opts$prefix = opts.prefix) !== null && _opts$prefix !== void 0 ? _opts$prefix : await getGitHubCommitsUrl(srcGit)) !== null && _ref !== void 0 ? _ref : '';
|
|
152
|
-
|
|
153
|
-
if (prefix && !prefix.endsWith('/')) {
|
|
154
|
-
prefix += '/';
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const link = `${prefix}${latestHash}`;
|
|
158
|
-
const title = srcTag ? `sync ${srcTag} (${link})` : `sync ${link}`;
|
|
159
|
-
const body = init ? `Initialize one-way-git-sync by replacing all the files with those of ${opts.dest}` : srcLog.all.map(l => `* ${l.message}`).join('\n\n');
|
|
160
|
-
|
|
161
|
-
try {
|
|
162
|
-
await dstGit.commit(`${title}\n\n${body}`);
|
|
163
|
-
logger.verbose(`Created a commit: ${title}`);
|
|
164
|
-
logger.verbose(` with body: ${body}`);
|
|
165
|
-
} catch (e) {
|
|
166
|
-
logger.error(`Failed to commit changes: ${e.stack}\`);`);
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
const destTag = srcTag || opts.tag;
|
|
171
|
-
|
|
172
|
-
if (destTag) {
|
|
173
|
-
try {
|
|
174
|
-
await dstGit.addTag(destTag);
|
|
175
|
-
logger.verbose(`Created a tag: ${destTag}`);
|
|
176
|
-
} catch (e) {
|
|
177
|
-
logger.error(`Failed to commit changes: ${e.stack}\`);`);
|
|
178
|
-
return false;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (opts.dry) {
|
|
183
|
-
logger.verbose('Finished dry run');
|
|
184
|
-
return true;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
try {
|
|
188
|
-
await dstGit.push();
|
|
189
|
-
|
|
190
|
-
if (destTag) {
|
|
191
|
-
await dstGit.push({
|
|
192
|
-
'--tags': null
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
} catch (e) {
|
|
196
|
-
logger.error(`Failed to push the commit: ${e.stack}`);
|
|
197
|
-
return false;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
logger.verbose('Pushed the commit');
|
|
201
|
-
return true;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
function extractCommitHash(logResult) {
|
|
205
|
-
if (logResult.all.length === 0) {
|
|
206
|
-
logger.error('No commit history');
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
for (const log of logResult.all) {
|
|
211
|
-
const [head, ...words] = log.message.replace(/[()]/g, '').split(/[\s/]/);
|
|
212
|
-
|
|
213
|
-
if (head === 'sync' && words.length) {
|
|
214
|
-
return words[words.length - 1];
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
logger.error(`No sync commit: ${logResult.all[0].message}`);
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
const initCommand = {
|
|
223
|
-
command: 'init',
|
|
224
|
-
describe: 'Initialize a destination git repository',
|
|
225
|
-
|
|
226
|
-
async handler(argv) {
|
|
227
|
-
await sync(argv, true);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
const syncCommand = {
|
|
233
|
-
command: 'sync',
|
|
234
|
-
describe: 'Synchronize a destination git repository with a source git repository',
|
|
235
|
-
|
|
236
|
-
async handler(argv) {
|
|
237
|
-
await sync(argv, false);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
};
|
|
241
|
-
|
|
242
|
-
const yargsOptions = {
|
|
243
|
-
dest: {
|
|
244
|
-
type: 'string',
|
|
245
|
-
alias: 'd',
|
|
246
|
-
describe: 'A URL of a destination git repository.',
|
|
247
|
-
demand: true
|
|
248
|
-
},
|
|
249
|
-
prefix: {
|
|
250
|
-
type: 'string',
|
|
251
|
-
alias: 'p',
|
|
252
|
-
describe: `A prefix of a commit hash used to generate a commit title, e.g. 'sync <prefix>/<hash>'.
|
|
253
|
-
A typical value is like 'https://github.com/WillBooster/one-way-git-sync/commits'`
|
|
254
|
-
},
|
|
255
|
-
branch: {
|
|
256
|
-
type: 'string',
|
|
257
|
-
alias: 'b',
|
|
258
|
-
describe: 'Specify branch of destination repo.'
|
|
259
|
-
},
|
|
260
|
-
tag: {
|
|
261
|
-
type: 'string',
|
|
262
|
-
alias: 't',
|
|
263
|
-
describe: 'Specify tag to be created in destination repo.'
|
|
264
|
-
},
|
|
265
|
-
'tag-hash': {
|
|
266
|
-
type: 'boolean',
|
|
267
|
-
describe: 'Create version+hash tag (e.g. v1.31.5-2-gcdde507). It should be a unique tag.'
|
|
268
|
-
},
|
|
269
|
-
'tag-version': {
|
|
270
|
-
type: 'boolean',
|
|
271
|
-
describe: 'Create version tag (e.g. v1.31.5). It could be a non-unique tag.'
|
|
272
|
-
},
|
|
273
|
-
'ignore-patterns': {
|
|
274
|
-
type: 'string',
|
|
275
|
-
alias: 'i',
|
|
276
|
-
describe: `Exclude the files whose path matches one of the given patterns.
|
|
277
|
-
The patterns are processed by micromatch (https://github.com/micromatch/micromatch).
|
|
278
|
-
You may specify the option multiple times. Default value is ['.git', '.github', 'node_modules']`,
|
|
279
|
-
default: ['.git', '.github', 'node_modules']
|
|
280
|
-
},
|
|
281
|
-
dry: {
|
|
282
|
-
type: 'boolean',
|
|
283
|
-
describe: 'Enable dry-run mode.'
|
|
284
|
-
},
|
|
285
|
-
force: {
|
|
286
|
-
type: 'boolean',
|
|
287
|
-
describe: 'Force to overwrite the destination git repository.'
|
|
288
|
-
},
|
|
289
|
-
verbose: {
|
|
290
|
-
type: 'boolean',
|
|
291
|
-
alias: 'v',
|
|
292
|
-
describe: 'Show details logs.'
|
|
293
|
-
}
|
|
294
|
-
};
|
|
295
|
-
|
|
296
|
-
async function cli(argv) {
|
|
297
|
-
await yargs__default["default"](helpers.hideBin(argv)).options(yargsOptions).middleware(argv => {
|
|
298
|
-
logger.level = argv.verbose ? 'verbose' : 'info';
|
|
299
|
-
}).command(initCommand).command(syncCommand).argv;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
exports.cli = cli;
|
|
303
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/gitHub.ts","../src/logger.ts","../src/index.ts","../src/initCommand.ts","../src/syncCommand.ts","../src/yargsOptions.ts","../src/cli.ts"],"sourcesContent":["import { SimpleGit } from 'simple-git';\n\nexport async function getGitHubCommitsUrl(git: SimpleGit): Promise<string | undefined> {\n const remotes = await git.getRemotes(true);\n const origin = remotes.find((r) => r.name === 'origin');\n const remoteUrl = origin?.refs?.fetch ?? origin?.refs?.push;\n if (typeof remoteUrl === 'string' && remoteUrl.includes('github.com')) {\n const words = remoteUrl.split('/');\n const org = words?.at(-2);\n const name = words?.at(-1)?.replace(/.git$/, '');\n if (org && name) return `https://github.com/${org}/${name}/commits`;\n }\n}\n","import { createLogger, format, transports } from 'winston';\n\nexport const logger = createLogger({\n transports: [\n new transports.Console({\n format: format.cli({ colors: { error: 'red' } }),\n }),\n ],\n});\n","import child_process from 'child_process';\nimport fsp from 'fs/promises';\nimport path from 'path';\n\nimport fse from 'fs-extra';\nimport micromatch from 'micromatch';\nimport type { LogResult, TaskOptions } from 'simple-git';\nimport simpleGit, { SimpleGit } from 'simple-git';\nimport { InferredOptionTypes } from 'yargs';\n\nimport { getGitHubCommitsUrl } from './gitHub';\nimport { logger } from './logger';\nimport { yargsOptions } from './yargsOptions';\n\nconst syncDirPath = path.join('node_modules', '.temp', 'sync-git-repo');\n\nexport async function sync(opts: InferredOptionTypes<typeof yargsOptions>, init: boolean): Promise<void> {\n await fsp.mkdir(syncDirPath, { recursive: true });\n const dirPath = await fsp.mkdtemp(path.join(syncDirPath, 'repo-'));\n const ret = await syncCore(dirPath, opts, init);\n await fsp.rm(dirPath, { recursive: true, force: true });\n process.exit(ret ? 0 : 1);\n}\n\nasync function syncCore(\n destRepoPath: string,\n opts: InferredOptionTypes<typeof yargsOptions>,\n init: boolean\n): Promise<boolean> {\n const cloneOpts: Record<string, any> = { '--single-branch': undefined };\n if (!opts.force) {\n cloneOpts['--depth'] = 1;\n }\n if (opts.branch) {\n cloneOpts['--branch'] = opts.branch;\n }\n try {\n await simpleGit().clone(opts.dest, destRepoPath, cloneOpts);\n } catch (e) {\n if (!init) throw e;\n\n delete cloneOpts['--single-branch'];\n await simpleGit().clone(opts.dest, destRepoPath, cloneOpts);\n simpleGit(destRepoPath).checkout(['-b', opts.branch] as TaskOptions);\n }\n logger.verbose(`Cloned a destination repo on ${destRepoPath}`);\n\n const dstGit: SimpleGit = simpleGit(destRepoPath);\n const dstLog = await dstGit.log();\n\n let from: string | undefined;\n if (!init) {\n from = extractCommitHash(dstLog);\n if (!from) {\n logger.error('No valid commit in destination repo');\n return false;\n }\n logger.verbose(`Extracted a valid commit: ${from}`);\n }\n\n const srcGit: SimpleGit = simpleGit();\n let srcLog: LogResult;\n try {\n // '--first-parent' hides children commits of merge commits\n srcLog = await srcGit.log(from ? { from, to: 'HEAD', '--first-parent': undefined } : undefined);\n } catch (e) {\n logger.error(`Failed to get source commit history: ${(e as Error).stack}`);\n return false;\n }\n\n const latestHash = srcLog.latest?.hash;\n if (!latestHash) {\n logger.info('No synchronizable commit');\n return true;\n }\n\n const [destFiles, srcFiles] = await Promise.all([fsp.readdir(destRepoPath), fsp.readdir('.')]);\n for (const destFile of micromatch.not(destFiles, opts['ignore-patterns'])) {\n await fsp.rm(path.join(destRepoPath, destFile), { recursive: true, force: true });\n }\n for (const srcFile of micromatch.not(srcFiles, opts['ignore-patterns'])) {\n fse.copySync(srcFile, path.join(destRepoPath, srcFile));\n }\n await dstGit.add('-A');\n\n let srcTag = '';\n if (opts['tag-hash'] || opts['tag-version']) {\n // e.g. `--abbrev=0` changes `v1.31.5-2-gcdde507` to `v1.31.5`\n const describeCommand = `git describe --tags --always ${opts['tag-version'] ? '--abbrev=0' : ''}`;\n srcTag = child_process.execSync(describeCommand).toString().trim();\n }\n let prefix = opts.prefix ?? (await getGitHubCommitsUrl(srcGit)) ?? '';\n if (prefix && !prefix.endsWith('/')) {\n prefix += '/';\n }\n const link = `${prefix}${latestHash}`;\n const title = srcTag ? `sync ${srcTag} (${link})` : `sync ${link}`;\n const body = init\n ? `Initialize one-way-git-sync by replacing all the files with those of ${opts.dest}`\n : srcLog.all.map((l) => `* ${l.message}`).join('\\n\\n');\n try {\n await dstGit.commit(`${title}\\n\\n${body}`);\n logger.verbose(`Created a commit: ${title}`);\n logger.verbose(` with body: ${body}`);\n } catch (e) {\n logger.error(`Failed to commit changes: ${(e as Error).stack}\\`);`);\n return false;\n }\n\n const destTag = srcTag || opts.tag;\n if (destTag) {\n try {\n await dstGit.addTag(destTag);\n logger.verbose(`Created a tag: ${destTag}`);\n } catch (e) {\n logger.error(`Failed to commit changes: ${(e as Error).stack}\\`);`);\n return false;\n }\n }\n\n if (opts.dry) {\n logger.verbose('Finished dry run');\n return true;\n }\n\n try {\n await dstGit.push();\n if (destTag) {\n await dstGit.push({ '--tags': null });\n }\n } catch (e) {\n logger.error(`Failed to push the commit: ${(e as Error).stack}`);\n return false;\n }\n\n logger.verbose('Pushed the commit');\n return true;\n}\n\nfunction extractCommitHash(logResult: LogResult): string | undefined {\n if (logResult.all.length === 0) {\n logger.error('No commit history');\n return;\n }\n\n for (const log of logResult.all) {\n const [head, ...words] = log.message.replace(/[()]/g, '').split(/[\\s/]/);\n if (head === 'sync' && words.length) {\n return words[words.length - 1];\n }\n }\n logger.error(`No sync commit: ${logResult.all[0].message}`);\n return;\n}\n","import type { CommandModule, InferredOptionTypes } from 'yargs';\n\nimport { yargsOptions } from './yargsOptions';\n\nimport { sync } from './index';\n\nexport const initCommand: CommandModule<unknown, InferredOptionTypes<typeof yargsOptions>> = {\n command: 'init',\n describe: 'Initialize a destination git repository',\n async handler(argv) {\n await sync(argv, true);\n },\n};\n","import type { CommandModule, InferredOptionTypes } from 'yargs';\n\nimport { yargsOptions } from './yargsOptions';\n\nimport { sync } from './index';\n\nexport const syncCommand: CommandModule<unknown, InferredOptionTypes<typeof yargsOptions>> = {\n command: 'sync',\n describe: 'Synchronize a destination git repository with a source git repository',\n async handler(argv) {\n await sync(argv, false);\n },\n};\n","export const yargsOptions = {\n dest: {\n type: 'string',\n alias: 'd',\n describe: 'A URL of a destination git repository.',\n demand: true,\n },\n prefix: {\n type: 'string',\n alias: 'p',\n describe: `A prefix of a commit hash used to generate a commit title, e.g. 'sync <prefix>/<hash>'.\n A typical value is like 'https://github.com/WillBooster/one-way-git-sync/commits'`,\n },\n branch: {\n type: 'string',\n alias: 'b',\n describe: 'Specify branch of destination repo.',\n },\n tag: {\n type: 'string',\n alias: 't',\n describe: 'Specify tag to be created in destination repo.',\n },\n 'tag-hash': {\n type: 'boolean',\n describe: 'Create version+hash tag (e.g. v1.31.5-2-gcdde507). It should be a unique tag.',\n },\n 'tag-version': {\n type: 'boolean',\n describe: 'Create version tag (e.g. v1.31.5). It could be a non-unique tag.',\n },\n 'ignore-patterns': {\n type: 'string',\n alias: 'i',\n describe: `Exclude the files whose path matches one of the given patterns.\n The patterns are processed by micromatch (https://github.com/micromatch/micromatch).\n You may specify the option multiple times. Default value is ['.git', '.github', 'node_modules']`,\n default: ['.git', '.github', 'node_modules'],\n },\n dry: {\n type: 'boolean',\n describe: 'Enable dry-run mode.',\n },\n force: {\n type: 'boolean',\n describe: 'Force to overwrite the destination git repository.',\n },\n verbose: {\n type: 'boolean',\n alias: 'v',\n describe: 'Show details logs.',\n },\n} as const;\n","import { hideBin } from 'yargs/helpers';\nimport yargs from 'yargs/yargs';\n\nimport { initCommand } from './initCommand';\nimport { logger } from './logger';\nimport { syncCommand } from './syncCommand';\nimport { yargsOptions } from './yargsOptions';\n\nexport async function cli(argv: string[]): Promise<void> {\n await yargs(hideBin(argv))\n .options(yargsOptions)\n .middleware((argv) => {\n logger.level = argv.verbose ? 'verbose' : 'info';\n })\n .command(initCommand)\n .command(syncCommand).argv;\n}\n"],"names":["getGitHubCommitsUrl","git","remotes","getRemotes","origin","find","r","name","remoteUrl","refs","fetch","push","includes","words","split","org","at","replace","logger","createLogger","transports","Console","format","cli","colors","error","syncDirPath","path","join","sync","opts","init","fsp","mkdir","recursive","dirPath","mkdtemp","ret","syncCore","rm","force","process","exit","destRepoPath","cloneOpts","undefined","branch","simpleGit","clone","dest","e","checkout","verbose","dstGit","dstLog","log","from","extractCommitHash","srcGit","srcLog","to","stack","latestHash","latest","hash","info","destFiles","srcFiles","Promise","all","readdir","destFile","micromatch","not","srcFile","fse","copySync","add","srcTag","describeCommand","child_process","execSync","toString","trim","prefix","endsWith","link","title","body","map","l","message","commit","destTag","tag","addTag","dry","logResult","length","head","initCommand","command","describe","handler","argv","syncCommand","yargsOptions","type","alias","demand","default","yargs","hideBin","options","middleware","level"],"mappings":"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"}
|