@oneblink/release-cli 1.1.1 → 1.2.0-beta.3
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/CHANGELOG.md +28 -0
- package/dist/bin.js +59 -59
- package/dist/startReleaseProcess.js +170 -170
- package/node_modules/@yarnpkg/lockfile/README.md +22 -0
- package/node_modules/@yarnpkg/lockfile/index.js +10273 -0
- package/node_modules/@yarnpkg/lockfile/package.json +19 -0
- package/node_modules/ansi-styles/index.js +165 -0
- package/node_modules/ansi-styles/license +9 -0
- package/node_modules/ansi-styles/package.json +60 -0
- package/node_modules/ansi-styles/readme.md +147 -0
- package/node_modules/balanced-match/.github/FUNDING.yml +2 -0
- package/node_modules/balanced-match/LICENSE.md +21 -0
- package/node_modules/balanced-match/README.md +97 -0
- package/node_modules/balanced-match/index.js +62 -0
- package/node_modules/balanced-match/package.json +52 -0
- package/node_modules/brace-expansion/LICENSE +21 -0
- package/node_modules/brace-expansion/README.md +129 -0
- package/node_modules/brace-expansion/index.js +201 -0
- package/node_modules/brace-expansion/package.json +51 -0
- package/node_modules/braces/CHANGELOG.md +184 -0
- package/node_modules/braces/LICENSE +21 -0
- package/node_modules/braces/README.md +593 -0
- package/node_modules/braces/index.js +170 -0
- package/node_modules/braces/lib/compile.js +57 -0
- package/node_modules/braces/lib/constants.js +57 -0
- package/node_modules/braces/lib/expand.js +113 -0
- package/node_modules/braces/lib/parse.js +333 -0
- package/node_modules/braces/lib/stringify.js +32 -0
- package/node_modules/braces/lib/utils.js +112 -0
- package/node_modules/braces/package.json +81 -0
- package/node_modules/chalk/index.js +228 -0
- package/node_modules/chalk/index.js.flow +93 -0
- package/node_modules/chalk/license +9 -0
- package/node_modules/chalk/package.json +75 -0
- package/node_modules/chalk/readme.md +314 -0
- package/node_modules/chalk/templates.js +128 -0
- package/node_modules/chalk/types/index.d.ts +97 -0
- package/node_modules/changelog-parser/.DS_Store +0 -0
- package/node_modules/changelog-parser/.travis.yml +7 -0
- package/node_modules/changelog-parser/CHANGELOG.md +128 -0
- package/node_modules/changelog-parser/CONTRIBUTING.md +55 -0
- package/node_modules/changelog-parser/LICENSE.md +15 -0
- package/node_modules/changelog-parser/README.md +247 -0
- package/node_modules/changelog-parser/bin/cli.js +19 -0
- package/node_modules/changelog-parser/index.js +201 -0
- package/node_modules/changelog-parser/package.json +54 -0
- package/node_modules/changelog-parser/test/fixtures/CHANGELOG.md +44 -0
- package/node_modules/changelog-parser/test/fixtures/expected.js +113 -0
- package/node_modules/changelog-parser/test/fixtures/remove-markdown-expected.js +113 -0
- package/node_modules/changelog-parser/test/index.js +105 -0
- package/node_modules/ci-info/CHANGELOG.md +78 -0
- package/node_modules/ci-info/LICENSE +21 -0
- package/node_modules/ci-info/README.md +108 -0
- package/node_modules/ci-info/index.js +66 -0
- package/node_modules/ci-info/package.json +40 -0
- package/node_modules/ci-info/vendors.json +153 -0
- package/node_modules/color-convert/CHANGELOG.md +54 -0
- package/node_modules/color-convert/LICENSE +21 -0
- package/node_modules/color-convert/README.md +68 -0
- package/node_modules/color-convert/conversions.js +868 -0
- package/node_modules/color-convert/index.js +78 -0
- package/node_modules/color-convert/package.json +50 -0
- package/node_modules/color-convert/route.js +97 -0
- package/node_modules/color-name/.eslintrc.json +43 -0
- package/node_modules/color-name/.npmignore +107 -0
- package/node_modules/color-name/LICENSE +8 -0
- package/node_modules/color-name/README.md +11 -0
- package/node_modules/color-name/index.js +152 -0
- package/node_modules/color-name/package.json +29 -0
- package/node_modules/color-name/test.js +7 -0
- package/node_modules/concat-map/.travis.yml +4 -0
- package/node_modules/concat-map/LICENSE +18 -0
- package/node_modules/concat-map/README.markdown +62 -0
- package/node_modules/concat-map/example/map.js +6 -0
- package/node_modules/concat-map/index.js +13 -0
- package/node_modules/concat-map/package.json +47 -0
- package/node_modules/concat-map/test/map.js +39 -0
- package/node_modules/escape-string-regexp/index.js +11 -0
- package/node_modules/escape-string-regexp/license +21 -0
- package/node_modules/escape-string-regexp/package.json +45 -0
- package/node_modules/escape-string-regexp/readme.md +27 -0
- package/node_modules/fill-range/LICENSE +21 -0
- package/node_modules/fill-range/README.md +237 -0
- package/node_modules/fill-range/index.js +249 -0
- package/node_modules/fill-range/package.json +73 -0
- package/node_modules/find-yarn-workspace-root/CHANGELOG.md +53 -0
- package/node_modules/find-yarn-workspace-root/LICENSE +201 -0
- package/node_modules/find-yarn-workspace-root/README.md +56 -0
- package/node_modules/find-yarn-workspace-root/index.d.ts +3 -0
- package/node_modules/find-yarn-workspace-root/index.js +53 -0
- package/node_modules/find-yarn-workspace-root/package.json +38 -0
- package/node_modules/fs-extra/CHANGELOG.md +842 -0
- package/node_modules/fs-extra/LICENSE +15 -0
- package/node_modules/fs-extra/README.md +261 -0
- package/node_modules/fs-extra/lib/copy/copy.js +246 -0
- package/node_modules/fs-extra/lib/copy/index.js +6 -0
- package/node_modules/fs-extra/lib/copy-sync/copy-sync.js +193 -0
- package/node_modules/fs-extra/lib/copy-sync/index.js +5 -0
- package/node_modules/fs-extra/lib/empty/index.js +48 -0
- package/node_modules/fs-extra/lib/ensure/file.js +49 -0
- package/node_modules/fs-extra/lib/ensure/index.js +23 -0
- package/node_modules/fs-extra/lib/ensure/link.js +61 -0
- package/node_modules/fs-extra/lib/ensure/symlink-paths.js +99 -0
- package/node_modules/fs-extra/lib/ensure/symlink-type.js +31 -0
- package/node_modules/fs-extra/lib/ensure/symlink.js +63 -0
- package/node_modules/fs-extra/lib/fs/index.js +104 -0
- package/node_modules/fs-extra/lib/index.js +28 -0
- package/node_modules/fs-extra/lib/json/index.js +16 -0
- package/node_modules/fs-extra/lib/json/jsonfile.js +12 -0
- package/node_modules/fs-extra/lib/json/output-json-sync.js +18 -0
- package/node_modules/fs-extra/lib/json/output-json.js +27 -0
- package/node_modules/fs-extra/lib/mkdirs/index.js +14 -0
- package/node_modules/fs-extra/lib/mkdirs/mkdirs-sync.js +54 -0
- package/node_modules/fs-extra/lib/mkdirs/mkdirs.js +63 -0
- package/node_modules/fs-extra/lib/mkdirs/win32.js +25 -0
- package/node_modules/fs-extra/lib/move/index.js +82 -0
- package/node_modules/fs-extra/lib/move-sync/index.js +117 -0
- package/node_modules/fs-extra/lib/output/index.js +40 -0
- package/node_modules/fs-extra/lib/path-exists/index.js +12 -0
- package/node_modules/fs-extra/lib/remove/index.js +9 -0
- package/node_modules/fs-extra/lib/remove/rimraf.js +314 -0
- package/node_modules/fs-extra/lib/util/buffer.js +12 -0
- package/node_modules/fs-extra/lib/util/utimes.js +79 -0
- package/node_modules/fs-extra/package.json +72 -0
- package/node_modules/fs.realpath/LICENSE +43 -0
- package/node_modules/fs.realpath/README.md +33 -0
- package/node_modules/fs.realpath/index.js +66 -0
- package/node_modules/fs.realpath/old.js +303 -0
- package/node_modules/fs.realpath/package.json +30 -0
- package/node_modules/glob/LICENSE +21 -0
- package/node_modules/glob/README.md +375 -0
- package/node_modules/glob/changelog.md +67 -0
- package/node_modules/glob/common.js +240 -0
- package/node_modules/glob/glob.js +790 -0
- package/node_modules/glob/package.json +50 -0
- package/node_modules/glob/sync.js +486 -0
- package/node_modules/graceful-fs/LICENSE +15 -0
- package/node_modules/graceful-fs/README.md +133 -0
- package/node_modules/graceful-fs/clone.js +23 -0
- package/node_modules/graceful-fs/graceful-fs.js +373 -0
- package/node_modules/graceful-fs/legacy-streams.js +118 -0
- package/node_modules/graceful-fs/package.json +54 -0
- package/node_modules/graceful-fs/polyfills.js +346 -0
- package/node_modules/has-flag/index.js +8 -0
- package/node_modules/has-flag/license +9 -0
- package/node_modules/has-flag/package.json +48 -0
- package/node_modules/has-flag/readme.md +70 -0
- package/node_modules/inflight/LICENSE +15 -0
- package/node_modules/inflight/README.md +37 -0
- package/node_modules/inflight/inflight.js +54 -0
- package/node_modules/inflight/package.json +33 -0
- package/node_modules/inherits/LICENSE +16 -0
- package/node_modules/inherits/README.md +42 -0
- package/node_modules/inherits/inherits.js +9 -0
- package/node_modules/inherits/inherits_browser.js +27 -0
- package/node_modules/inherits/package.json +33 -0
- package/node_modules/is-ci/CHANGELOG.md +14 -0
- package/node_modules/is-ci/LICENSE +21 -0
- package/node_modules/is-ci/README.md +50 -0
- package/node_modules/is-ci/bin.js +4 -0
- package/node_modules/is-ci/index.js +3 -0
- package/node_modules/is-ci/package.json +42 -0
- package/node_modules/is-docker/cli.js +5 -0
- package/node_modules/is-docker/index.d.ts +15 -0
- package/node_modules/is-docker/index.js +29 -0
- package/node_modules/is-docker/license +9 -0
- package/node_modules/is-docker/package.json +46 -0
- package/node_modules/is-docker/readme.md +27 -0
- package/node_modules/is-number/LICENSE +21 -0
- package/node_modules/is-number/README.md +187 -0
- package/node_modules/is-number/index.js +18 -0
- package/node_modules/is-number/package.json +86 -0
- package/node_modules/is-wsl/index.d.ts +15 -0
- package/node_modules/is-wsl/index.js +31 -0
- package/node_modules/is-wsl/license +9 -0
- package/node_modules/is-wsl/package.json +49 -0
- package/node_modules/is-wsl/readme.md +36 -0
- package/node_modules/isexe/.npmignore +2 -0
- package/node_modules/isexe/LICENSE +15 -0
- package/node_modules/isexe/README.md +51 -0
- package/node_modules/isexe/index.js +57 -0
- package/node_modules/isexe/mode.js +41 -0
- package/node_modules/isexe/package.json +35 -0
- package/node_modules/isexe/test/basic.js +221 -0
- package/node_modules/isexe/windows.js +42 -0
- package/node_modules/jsonfile/CHANGELOG.md +145 -0
- package/node_modules/jsonfile/LICENSE +15 -0
- package/node_modules/jsonfile/README.md +168 -0
- package/node_modules/jsonfile/index.js +134 -0
- package/node_modules/jsonfile/package.json +41 -0
- package/node_modules/klaw-sync/CHANGELOG.md +73 -0
- package/node_modules/klaw-sync/LICENSE +20 -0
- package/node_modules/klaw-sync/README.md +164 -0
- package/node_modules/klaw-sync/klaw-sync.js +29 -0
- package/node_modules/klaw-sync/package.json +51 -0
- package/node_modules/line-reader/LICENSE +20 -0
- package/node_modules/line-reader/README.md +75 -0
- package/node_modules/line-reader/lib/line_reader.js +174 -0
- package/node_modules/line-reader/package.json +18 -0
- package/node_modules/line-reader/test/data/empty_file.txt +0 -0
- package/node_modules/line-reader/test/data/multi_separator_file.txt +2 -0
- package/node_modules/line-reader/test/data/multibyte_file.txt +2 -0
- package/node_modules/line-reader/test/data/normal_file.txt +6 -0
- package/node_modules/line-reader/test/data/one_line_file.txt +1 -0
- package/node_modules/line-reader/test/data/separator_file.txt +2 -0
- package/node_modules/line-reader/test/data/three_line_file.txt +3 -0
- package/node_modules/line-reader/test/line_reader.js +222 -0
- package/node_modules/lru-cache/LICENSE +15 -0
- package/node_modules/lru-cache/README.md +166 -0
- package/node_modules/lru-cache/index.js +334 -0
- package/node_modules/lru-cache/package.json +38 -0
- package/node_modules/micromatch/CHANGELOG.md +109 -0
- package/node_modules/micromatch/LICENSE +21 -0
- package/node_modules/micromatch/README.md +1008 -0
- package/node_modules/micromatch/index.js +467 -0
- package/node_modules/micromatch/package.json +123 -0
- package/node_modules/minimatch/LICENSE +15 -0
- package/node_modules/minimatch/README.md +209 -0
- package/node_modules/minimatch/minimatch.js +923 -0
- package/node_modules/minimatch/package.json +34 -0
- package/node_modules/minimist/.travis.yml +8 -0
- package/node_modules/minimist/LICENSE +18 -0
- package/node_modules/minimist/example/parse.js +2 -0
- package/node_modules/minimist/index.js +245 -0
- package/node_modules/minimist/package.json +49 -0
- package/node_modules/minimist/readme.markdown +95 -0
- package/node_modules/minimist/test/all_bool.js +32 -0
- package/node_modules/minimist/test/bool.js +178 -0
- package/node_modules/minimist/test/dash.js +31 -0
- package/node_modules/minimist/test/default_bool.js +35 -0
- package/node_modules/minimist/test/dotted.js +22 -0
- package/node_modules/minimist/test/kv_short.js +16 -0
- package/node_modules/minimist/test/long.js +31 -0
- package/node_modules/minimist/test/num.js +36 -0
- package/node_modules/minimist/test/parse.js +197 -0
- package/node_modules/minimist/test/parse_modified.js +9 -0
- package/node_modules/minimist/test/proto.js +44 -0
- package/node_modules/minimist/test/short.js +67 -0
- package/node_modules/minimist/test/stop_early.js +15 -0
- package/node_modules/minimist/test/unknown.js +102 -0
- package/node_modules/minimist/test/whitespace.js +8 -0
- package/node_modules/nice-try/CHANGELOG.md +21 -0
- package/node_modules/nice-try/LICENSE +21 -0
- package/node_modules/nice-try/README.md +32 -0
- package/node_modules/nice-try/package.json +37 -0
- package/node_modules/nice-try/src/index.js +12 -0
- package/node_modules/once/LICENSE +15 -0
- package/node_modules/once/README.md +79 -0
- package/node_modules/once/once.js +42 -0
- package/node_modules/once/package.json +37 -0
- package/node_modules/open/index.d.ts +88 -0
- package/node_modules/open/index.js +195 -0
- package/node_modules/open/license +9 -0
- package/node_modules/open/package.json +64 -0
- package/node_modules/open/readme.md +154 -0
- package/node_modules/open/xdg-open +1066 -0
- package/node_modules/os-tmpdir/index.js +25 -0
- package/node_modules/os-tmpdir/license +21 -0
- package/node_modules/os-tmpdir/package.json +45 -0
- package/node_modules/os-tmpdir/readme.md +32 -0
- package/node_modules/patch-package/CHANGELOG.md +389 -0
- package/node_modules/patch-package/LICENSE +19 -0
- package/node_modules/patch-package/README.md +269 -0
- package/node_modules/patch-package/dist/PackageDetails.js +102 -0
- package/node_modules/patch-package/dist/PackageDetails.test.js +228 -0
- package/node_modules/patch-package/dist/applyPatches.js +261 -0
- package/node_modules/patch-package/dist/assertNever.js +8 -0
- package/node_modules/patch-package/dist/createIssue.js +83 -0
- package/node_modules/patch-package/dist/detectPackageManager.js +64 -0
- package/node_modules/patch-package/dist/filterFiles.js +17 -0
- package/node_modules/patch-package/dist/getAppRootPath.js +22 -0
- package/node_modules/patch-package/dist/getPackageResolution.js +85 -0
- package/node_modules/patch-package/dist/getPackageVersion.js +9 -0
- package/node_modules/patch-package/dist/index.js +161 -0
- package/node_modules/patch-package/dist/makePatch.js +231 -0
- package/node_modules/patch-package/dist/makeRegExp.js +28 -0
- package/node_modules/patch-package/dist/packageIsDevDependency.js +15 -0
- package/node_modules/patch-package/dist/packageIsDevDependency.test.js +32 -0
- package/node_modules/patch-package/dist/patch/apply.js +197 -0
- package/node_modules/patch-package/dist/patch/parse.js +330 -0
- package/node_modules/patch-package/dist/patch/read.js +49 -0
- package/node_modules/patch-package/dist/patch/reverse.js +96 -0
- package/node_modules/patch-package/dist/patchFs.js +20 -0
- package/node_modules/patch-package/dist/path.js +17 -0
- package/node_modules/patch-package/dist/resolveRelativeFileDependencies.js +21 -0
- package/node_modules/patch-package/dist/resolveRelativeFileDependencies.test.js +22 -0
- package/node_modules/patch-package/dist/spawnSafe.js +28 -0
- package/node_modules/patch-package/index.js +3 -0
- package/node_modules/patch-package/node_modules/cross-spawn/CHANGELOG.md +100 -0
- package/node_modules/patch-package/node_modules/cross-spawn/LICENSE +21 -0
- package/node_modules/patch-package/node_modules/cross-spawn/README.md +94 -0
- package/node_modules/patch-package/node_modules/cross-spawn/index.js +39 -0
- package/node_modules/patch-package/node_modules/cross-spawn/lib/enoent.js +59 -0
- package/node_modules/patch-package/node_modules/cross-spawn/lib/parse.js +125 -0
- package/node_modules/patch-package/node_modules/cross-spawn/lib/util/escape.js +45 -0
- package/node_modules/patch-package/node_modules/cross-spawn/lib/util/readShebang.js +32 -0
- package/node_modules/patch-package/node_modules/cross-spawn/lib/util/resolveCommand.js +47 -0
- package/node_modules/patch-package/node_modules/cross-spawn/package.json +80 -0
- package/node_modules/patch-package/node_modules/path-key/index.js +13 -0
- package/node_modules/patch-package/node_modules/path-key/license +21 -0
- package/node_modules/patch-package/node_modules/path-key/package.json +43 -0
- package/node_modules/patch-package/node_modules/path-key/readme.md +51 -0
- package/node_modules/patch-package/node_modules/rimraf/LICENSE +15 -0
- package/node_modules/patch-package/node_modules/rimraf/README.md +101 -0
- package/node_modules/patch-package/node_modules/rimraf/bin.js +50 -0
- package/node_modules/patch-package/node_modules/rimraf/package.json +33 -0
- package/node_modules/patch-package/node_modules/rimraf/rimraf.js +372 -0
- package/node_modules/patch-package/node_modules/semver/CHANGELOG.md +39 -0
- package/node_modules/patch-package/node_modules/semver/LICENSE +15 -0
- package/node_modules/patch-package/node_modules/semver/README.md +412 -0
- package/node_modules/patch-package/node_modules/semver/bin/semver +160 -0
- package/node_modules/patch-package/node_modules/semver/package.json +32 -0
- package/node_modules/patch-package/node_modules/semver/range.bnf +16 -0
- package/node_modules/patch-package/node_modules/semver/semver.js +1483 -0
- package/node_modules/patch-package/node_modules/shebang-command/index.js +19 -0
- package/node_modules/patch-package/node_modules/shebang-command/license +21 -0
- package/node_modules/patch-package/node_modules/shebang-command/package.json +43 -0
- package/node_modules/patch-package/node_modules/shebang-command/readme.md +39 -0
- package/node_modules/patch-package/node_modules/shebang-regex/index.js +2 -0
- package/node_modules/patch-package/node_modules/shebang-regex/license +21 -0
- package/node_modules/patch-package/node_modules/shebang-regex/package.json +36 -0
- package/node_modules/patch-package/node_modules/shebang-regex/readme.md +29 -0
- package/node_modules/patch-package/node_modules/slash/index.js +11 -0
- package/node_modules/patch-package/node_modules/slash/license +9 -0
- package/node_modules/patch-package/node_modules/slash/package.json +38 -0
- package/node_modules/patch-package/node_modules/slash/readme.md +44 -0
- package/node_modules/patch-package/node_modules/which/CHANGELOG.md +152 -0
- package/node_modules/patch-package/node_modules/which/LICENSE +15 -0
- package/node_modules/patch-package/node_modules/which/README.md +51 -0
- package/node_modules/patch-package/node_modules/which/bin/which +52 -0
- package/node_modules/patch-package/node_modules/which/package.json +34 -0
- package/node_modules/patch-package/node_modules/which/which.js +135 -0
- package/node_modules/patch-package/package.json +100 -0
- package/node_modules/path-is-absolute/index.js +20 -0
- package/node_modules/path-is-absolute/license +21 -0
- package/node_modules/path-is-absolute/package.json +47 -0
- package/node_modules/path-is-absolute/readme.md +59 -0
- package/node_modules/picomatch/CHANGELOG.md +120 -0
- package/node_modules/picomatch/LICENSE +21 -0
- package/node_modules/picomatch/README.md +691 -0
- package/node_modules/picomatch/index.js +3 -0
- package/node_modules/picomatch/lib/constants.js +179 -0
- package/node_modules/picomatch/lib/parse.js +1078 -0
- package/node_modules/picomatch/lib/picomatch.js +339 -0
- package/node_modules/picomatch/lib/scan.js +385 -0
- package/node_modules/picomatch/lib/utils.js +64 -0
- package/node_modules/picomatch/package.json +85 -0
- package/node_modules/remove-markdown/.npmignore +1 -0
- package/node_modules/remove-markdown/LICENSE +21 -0
- package/node_modules/remove-markdown/README.md +44 -0
- package/node_modules/remove-markdown/index.js +60 -0
- package/node_modules/remove-markdown/package.json +31 -0
- package/node_modules/remove-markdown/test/remove-markdown.js +139 -0
- package/node_modules/semver/CHANGELOG.md +111 -0
- package/node_modules/semver/LICENSE +15 -0
- package/node_modules/semver/README.md +566 -0
- package/node_modules/semver/bin/semver.js +173 -0
- package/node_modules/semver/classes/comparator.js +135 -0
- package/node_modules/semver/classes/index.js +5 -0
- package/node_modules/semver/classes/range.js +510 -0
- package/node_modules/semver/classes/semver.js +287 -0
- package/node_modules/semver/functions/clean.js +6 -0
- package/node_modules/semver/functions/cmp.js +48 -0
- package/node_modules/semver/functions/coerce.js +51 -0
- package/node_modules/semver/functions/compare-build.js +7 -0
- package/node_modules/semver/functions/compare-loose.js +3 -0
- package/node_modules/semver/functions/compare.js +5 -0
- package/node_modules/semver/functions/diff.js +23 -0
- package/node_modules/semver/functions/eq.js +3 -0
- package/node_modules/semver/functions/gt.js +3 -0
- package/node_modules/semver/functions/gte.js +3 -0
- package/node_modules/semver/functions/inc.js +15 -0
- package/node_modules/semver/functions/lt.js +3 -0
- package/node_modules/semver/functions/lte.js +3 -0
- package/node_modules/semver/functions/major.js +3 -0
- package/node_modules/semver/functions/minor.js +3 -0
- package/node_modules/semver/functions/neq.js +3 -0
- package/node_modules/semver/functions/parse.js +33 -0
- package/node_modules/semver/functions/patch.js +3 -0
- package/node_modules/semver/functions/prerelease.js +6 -0
- package/node_modules/semver/functions/rcompare.js +3 -0
- package/node_modules/semver/functions/rsort.js +3 -0
- package/node_modules/semver/functions/satisfies.js +10 -0
- package/node_modules/semver/functions/sort.js +3 -0
- package/node_modules/semver/functions/valid.js +6 -0
- package/node_modules/semver/index.js +48 -0
- package/node_modules/semver/internal/constants.js +17 -0
- package/node_modules/semver/internal/debug.js +9 -0
- package/node_modules/semver/internal/identifiers.js +23 -0
- package/node_modules/semver/internal/parse-options.js +11 -0
- package/node_modules/semver/internal/re.js +182 -0
- package/node_modules/semver/package.json +45 -0
- package/node_modules/semver/preload.js +2 -0
- package/node_modules/semver/range.bnf +16 -0
- package/node_modules/semver/ranges/gtr.js +4 -0
- package/node_modules/semver/ranges/intersects.js +7 -0
- package/node_modules/semver/ranges/ltr.js +4 -0
- package/node_modules/semver/ranges/max-satisfying.js +25 -0
- package/node_modules/semver/ranges/min-satisfying.js +24 -0
- package/node_modules/semver/ranges/min-version.js +60 -0
- package/node_modules/semver/ranges/outside.js +80 -0
- package/node_modules/semver/ranges/simplify.js +44 -0
- package/node_modules/semver/ranges/subset.js +222 -0
- package/node_modules/semver/ranges/to-comparators.js +8 -0
- package/node_modules/semver/ranges/valid.js +11 -0
- package/node_modules/supports-color/browser.js +5 -0
- package/node_modules/supports-color/index.js +131 -0
- package/node_modules/supports-color/license +9 -0
- package/node_modules/supports-color/package.json +57 -0
- package/node_modules/supports-color/readme.md +66 -0
- package/node_modules/tmp/LICENSE +21 -0
- package/node_modules/tmp/README.md +314 -0
- package/node_modules/tmp/lib/tmp.js +611 -0
- package/node_modules/tmp/package.json +42 -0
- package/node_modules/to-regex-range/LICENSE +21 -0
- package/node_modules/to-regex-range/README.md +305 -0
- package/node_modules/to-regex-range/index.js +288 -0
- package/node_modules/to-regex-range/package.json +92 -0
- package/node_modules/universalify/LICENSE +20 -0
- package/node_modules/universalify/README.md +76 -0
- package/node_modules/universalify/index.js +25 -0
- package/node_modules/universalify/package.json +38 -0
- package/node_modules/wrappy/LICENSE +15 -0
- package/node_modules/wrappy/README.md +36 -0
- package/node_modules/wrappy/package.json +33 -0
- package/node_modules/wrappy/wrappy.js +33 -0
- package/node_modules/yallist/LICENSE +15 -0
- package/node_modules/yallist/README.md +204 -0
- package/node_modules/yallist/iterator.js +8 -0
- package/node_modules/yallist/package.json +33 -0
- package/node_modules/yallist/yallist.js +426 -0
- package/package.json +8 -3
- package/patches/changelog-parser+2.8.0.patch +10 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.executeEffects = void 0;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const assertNever_1 = require("../assertNever");
|
|
10
|
+
const executeEffects = (effects, { dryRun }) => {
|
|
11
|
+
effects.forEach(eff => {
|
|
12
|
+
switch (eff.type) {
|
|
13
|
+
case "file deletion":
|
|
14
|
+
if (dryRun) {
|
|
15
|
+
if (!fs_extra_1.default.existsSync(eff.path)) {
|
|
16
|
+
throw new Error("Trying to delete file that doesn't exist: " + eff.path);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
// TODO: integrity checks
|
|
21
|
+
fs_extra_1.default.unlinkSync(eff.path);
|
|
22
|
+
}
|
|
23
|
+
break;
|
|
24
|
+
case "rename":
|
|
25
|
+
if (dryRun) {
|
|
26
|
+
// TODO: see what patch files look like if moving to exising path
|
|
27
|
+
if (!fs_extra_1.default.existsSync(eff.fromPath)) {
|
|
28
|
+
throw new Error("Trying to move file that doesn't exist: " + eff.fromPath);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
fs_extra_1.default.moveSync(eff.fromPath, eff.toPath);
|
|
33
|
+
}
|
|
34
|
+
break;
|
|
35
|
+
case "file creation":
|
|
36
|
+
if (dryRun) {
|
|
37
|
+
if (fs_extra_1.default.existsSync(eff.path)) {
|
|
38
|
+
throw new Error("Trying to create file that already exists: " + eff.path);
|
|
39
|
+
}
|
|
40
|
+
// todo: check file contents matches
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const fileContents = eff.hunk
|
|
44
|
+
? eff.hunk.parts[0].lines.join("\n") +
|
|
45
|
+
(eff.hunk.parts[0].noNewlineAtEndOfFile ? "" : "\n")
|
|
46
|
+
: "";
|
|
47
|
+
fs_extra_1.default.ensureDirSync(path_1.dirname(eff.path));
|
|
48
|
+
fs_extra_1.default.writeFileSync(eff.path, fileContents, { mode: eff.mode });
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
case "patch":
|
|
52
|
+
applyPatch(eff, { dryRun });
|
|
53
|
+
break;
|
|
54
|
+
case "mode change":
|
|
55
|
+
const currentMode = fs_extra_1.default.statSync(eff.path).mode;
|
|
56
|
+
if (((isExecutable(eff.newMode) && isExecutable(currentMode)) ||
|
|
57
|
+
(!isExecutable(eff.newMode) && !isExecutable(currentMode))) &&
|
|
58
|
+
dryRun) {
|
|
59
|
+
console.warn(`Mode change is not required for file ${eff.path}`);
|
|
60
|
+
}
|
|
61
|
+
fs_extra_1.default.chmodSync(eff.path, eff.newMode);
|
|
62
|
+
break;
|
|
63
|
+
default:
|
|
64
|
+
assertNever_1.assertNever(eff);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
exports.executeEffects = executeEffects;
|
|
69
|
+
function isExecutable(fileMode) {
|
|
70
|
+
// tslint:disable-next-line:no-bitwise
|
|
71
|
+
return (fileMode & 64) > 0;
|
|
72
|
+
}
|
|
73
|
+
const trimRight = (s) => s.replace(/\s+$/, "");
|
|
74
|
+
function linesAreEqual(a, b) {
|
|
75
|
+
return trimRight(a) === trimRight(b);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* How does noNewLineAtEndOfFile work?
|
|
79
|
+
*
|
|
80
|
+
* if you remove the newline from a file that had one without editing other bits:
|
|
81
|
+
*
|
|
82
|
+
* it creates an insertion/removal pair where the insertion has \ No new line at end of file
|
|
83
|
+
*
|
|
84
|
+
* if you edit a file that didn't have a new line and don't add one:
|
|
85
|
+
*
|
|
86
|
+
* both insertion and deletion have \ No new line at end of file
|
|
87
|
+
*
|
|
88
|
+
* if you edit a file that didn't have a new line and add one:
|
|
89
|
+
*
|
|
90
|
+
* deletion has \ No new line at end of file
|
|
91
|
+
* but not insertion
|
|
92
|
+
*
|
|
93
|
+
* if you edit a file that had a new line and leave it in:
|
|
94
|
+
*
|
|
95
|
+
* neither insetion nor deletion have the annoation
|
|
96
|
+
*
|
|
97
|
+
*/
|
|
98
|
+
function applyPatch({ hunks, path }, { dryRun }) {
|
|
99
|
+
// modifying the file in place
|
|
100
|
+
const fileContents = fs_extra_1.default.readFileSync(path).toString();
|
|
101
|
+
const mode = fs_extra_1.default.statSync(path).mode;
|
|
102
|
+
const fileLines = fileContents.split(/\n/);
|
|
103
|
+
const result = [];
|
|
104
|
+
for (const hunk of hunks) {
|
|
105
|
+
let fuzzingOffset = 0;
|
|
106
|
+
while (true) {
|
|
107
|
+
const modifications = evaluateHunk(hunk, fileLines, fuzzingOffset);
|
|
108
|
+
if (modifications) {
|
|
109
|
+
result.push(modifications);
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
fuzzingOffset =
|
|
113
|
+
fuzzingOffset < 0 ? fuzzingOffset * -1 : fuzzingOffset * -1 - 1;
|
|
114
|
+
if (Math.abs(fuzzingOffset) > 20) {
|
|
115
|
+
throw new Error(`Cant apply hunk ${hunks.indexOf(hunk)} for file ${path}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (dryRun) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
let diffOffset = 0;
|
|
123
|
+
for (const modifications of result) {
|
|
124
|
+
for (const modification of modifications) {
|
|
125
|
+
switch (modification.type) {
|
|
126
|
+
case "splice":
|
|
127
|
+
fileLines.splice(modification.index + diffOffset, modification.numToDelete, ...modification.linesToInsert);
|
|
128
|
+
diffOffset +=
|
|
129
|
+
modification.linesToInsert.length - modification.numToDelete;
|
|
130
|
+
break;
|
|
131
|
+
case "pop":
|
|
132
|
+
fileLines.pop();
|
|
133
|
+
break;
|
|
134
|
+
case "push":
|
|
135
|
+
fileLines.push(modification.line);
|
|
136
|
+
break;
|
|
137
|
+
default:
|
|
138
|
+
assertNever_1.assertNever(modification);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
fs_extra_1.default.writeFileSync(path, fileLines.join("\n"), { mode });
|
|
143
|
+
}
|
|
144
|
+
function evaluateHunk(hunk, fileLines, fuzzingOffset) {
|
|
145
|
+
const result = [];
|
|
146
|
+
let contextIndex = hunk.header.original.start - 1 + fuzzingOffset;
|
|
147
|
+
// do bounds checks for index
|
|
148
|
+
if (contextIndex < 0) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
if (fileLines.length - contextIndex < hunk.header.original.length) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
for (const part of hunk.parts) {
|
|
155
|
+
switch (part.type) {
|
|
156
|
+
case "deletion":
|
|
157
|
+
case "context":
|
|
158
|
+
for (const line of part.lines) {
|
|
159
|
+
const originalLine = fileLines[contextIndex];
|
|
160
|
+
if (!linesAreEqual(originalLine, line)) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
contextIndex++;
|
|
164
|
+
}
|
|
165
|
+
if (part.type === "deletion") {
|
|
166
|
+
result.push({
|
|
167
|
+
type: "splice",
|
|
168
|
+
index: contextIndex - part.lines.length,
|
|
169
|
+
numToDelete: part.lines.length,
|
|
170
|
+
linesToInsert: [],
|
|
171
|
+
});
|
|
172
|
+
if (part.noNewlineAtEndOfFile) {
|
|
173
|
+
result.push({
|
|
174
|
+
type: "push",
|
|
175
|
+
line: "",
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
break;
|
|
180
|
+
case "insertion":
|
|
181
|
+
result.push({
|
|
182
|
+
type: "splice",
|
|
183
|
+
index: contextIndex,
|
|
184
|
+
numToDelete: 0,
|
|
185
|
+
linesToInsert: part.lines,
|
|
186
|
+
});
|
|
187
|
+
if (part.noNewlineAtEndOfFile) {
|
|
188
|
+
result.push({ type: "pop" });
|
|
189
|
+
}
|
|
190
|
+
break;
|
|
191
|
+
default:
|
|
192
|
+
assertNever_1.assertNever(part.type);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGF0Y2gvYXBwbHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0RBQXlCO0FBQ3pCLCtCQUE4QjtBQUU5QixnREFBNEM7QUFFckMsTUFBTSxjQUFjLEdBQUcsQ0FDNUIsT0FBd0IsRUFDeEIsRUFBRSxNQUFNLEVBQXVCLEVBQy9CLEVBQUU7SUFDRixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3BCLFFBQVEsR0FBRyxDQUFDLElBQUksRUFBRTtZQUNoQixLQUFLLGVBQWU7Z0JBQ2xCLElBQUksTUFBTSxFQUFFO29CQUNWLElBQUksQ0FBQyxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQ2IsNENBQTRDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FDeEQsQ0FBQTtxQkFDRjtpQkFDRjtxQkFBTTtvQkFDTCx5QkFBeUI7b0JBQ3pCLGtCQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtpQkFDeEI7Z0JBQ0QsTUFBSztZQUNQLEtBQUssUUFBUTtnQkFDWCxJQUFJLE1BQU0sRUFBRTtvQkFDVixpRUFBaUU7b0JBQ2pFLElBQUksQ0FBQyxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7d0JBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ2IsMENBQTBDLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FDMUQsQ0FBQTtxQkFDRjtpQkFDRjtxQkFBTTtvQkFDTCxrQkFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtpQkFDdEM7Z0JBQ0QsTUFBSztZQUNQLEtBQUssZUFBZTtnQkFDbEIsSUFBSSxNQUFNLEVBQUU7b0JBQ1YsSUFBSSxrQkFBRSxDQUFD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QUksQ0FBQyxFQUFFO3dCQUN0QyxPQUFPLElBQUksQ0FBQTtxQkFDWjtvQkFDRCxZQUFZLEVBQUUsQ0FBQTtpQkFDZjtnQkFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO29CQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDO3dCQUNWLElBQUksRUFBRSxRQUFRO3dCQUNkLEtBQUssRUFBRSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO3dCQUN2QyxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO3dCQUM5QixhQUFhLEVBQUUsRUFBRTtxQkFDbEIsQ0FBQyxDQUFBO29CQUVGLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO3dCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDOzRCQUNWLElBQUksRUFBRSxNQUFNOzRCQUNaLElBQUksRUFBRSxFQUFFO3lCQUNULENBQUMsQ0FBQTtxQkFDSDtpQkFDRjtnQkFDRCxNQUFLO1lBQ1AsS0FBSyxXQUFXO2dCQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1YsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsS0FBSyxFQUFFLFlBQVk7b0JBQ25CLFdBQVcsRUFBRSxDQUFDO29CQUNkLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSztpQkFDMUIsQ0FBQyxDQUFBO2dCQUNGLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO29CQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7aUJBQzdCO2dCQUNELE1BQUs7WUFDUDtnQkFDRSx5QkFBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUN6QjtLQUNGO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgUGFyc2VkUGF0Y2hGaWxlLCBGaWxlUGF0Y2gsIEh1bmsgfSBmcm9tIFwiLi9wYXJzZVwiXG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gXCIuLi9hc3NlcnROZXZlclwiXG5cbmV4cG9ydCBjb25zdCBleGVjdXRlRWZmZWN0cyA9IChcbiAgZWZmZWN0czogUGFyc2VkUGF0Y2hGaWxlLFxuICB7IGRyeVJ1biB9OiB7IGRyeVJ1bjogYm9vbGVhbiB9LFxuKSA9PiB7XG4gIGVmZmVjdHMuZm9yRWFjaChlZmYgPT4ge1xuICAgIHN3aXRjaCAoZWZmLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJmaWxlIGRlbGV0aW9uXCI6XG4gICAgICAgIGlmIChkcnlSdW4pIHtcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZWZmLnBhdGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIFwiVHJ5aW5nIHRvIGRlbGV0ZSBmaWxlIHRoYXQgZG9lc24ndCBleGlzdDogXCIgKyBlZmYucGF0aCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVE9ETzogaW50ZWdyaXR5IGNoZWNrc1xuICAgICAgICAgIGZzLnVubGlua1N5bmMoZWZmLnBhdGgpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJyZW5hbWVcIjpcbiAgICAgICAgaWYgKGRyeVJ1bikge1xuICAgICAgICAgIC8vIFRPRE86IHNlZSB3aGF0IHBhdGNoIGZpbGVzIGxvb2sgbGlrZSBpZiBtb3ZpbmcgdG8gZXhpc2luZyBwYXRoXG4gICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGVmZi5mcm9tUGF0aCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgXCJUcnlpbmcgdG8gbW92ZSBmaWxlIHRoYXQgZG9lc24ndCBleGlzdDogXCIgKyBlZmYuZnJvbVBhdGgsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLm1vdmVTeW5jKGVmZi5mcm9tUGF0aCwgZWZmLnRvUGF0aClcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImZpbGUgY3JlYXRpb25cIjpcbiAgICAgICAgaWYgKGRyeVJ1bikge1xuICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGVmZi5wYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBcIlRyeWluZyB0byBjcmVhdGUgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzOiBcIiArIGVmZi5wYXRoLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB0b2RvOiBjaGVjayBmaWxlIGNvbnRlbnRzIG1hdGNoZXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBmaWxlQ29udGVudHMgPSBlZmYuaHVua1xuICAgICAgICAgICAgPyBlZmYuaHVuay5wYXJ0c1swXS5saW5lcy5qb2luKFwiXFxuXCIpICtcbiAgICAgICAgICAgICAgKGVmZi5odW5rLnBhcnRzWzBdLm5vTmV3bGluZUF0RW5kT2ZGaWxlID8gXCJcIiA6IFwiXFxuXCIpXG4gICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKGRpcm5hbWUoZWZmLnBhdGgpKVxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZWZmLnBhdGgsIGZpbGVDb250ZW50cywgeyBtb2RlOiBlZmYubW9kZSB9KVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwicGF0Y2hcIjpcbiAgICAgICAgYXBwbHlQYXRjaChlZmYsIHsgZHJ5UnVuIH0pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibW9kZSBjaGFuZ2VcIjpcbiAgICAgICAgY29uc3QgY3VycmVudE1vZGUgPSBmcy5zdGF0U3luYyhlZmYucGF0aCkubW9kZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgKChpc0V4ZWN1dGFibGUoZWZmLm5ld01vZGUpICYmIGlzRXhlY3V0YWJsZShjdXJyZW50TW9kZSkpIHx8XG4gICAgICAgICAgICAoIWlzRXhlY3V0YWJsZShlZmYubmV3TW9kZSkgJiYgIWlzRXhlY3V0YWJsZShjdXJyZW50TW9kZSkpKSAmJlxuICAgICAgICAgIGRyeVJ1blxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYE1vZGUgY2hhbmdlIGlzIG5vdCByZXF1aXJlZCBmb3IgZmlsZSAke2VmZi5wYXRofWApXG4gICAgICAgIH1cbiAgICAgICAgZnMuY2htb2RTeW5jKGVmZi5wYXRoLCBlZmYubmV3TW9kZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFzc2VydE5ldmVyKGVmZilcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIGlzRXhlY3V0YWJsZShmaWxlTW9kZTogbnVtYmVyKSB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gIHJldHVybiAoZmlsZU1vZGUgJiAwYjAwMV8wMDBfMDAwKSA+IDBcbn1cblxuY29uc3QgdHJpbVJpZ2h0ID0gKHM6IHN0cmluZykgPT4gcy5yZXBsYWNlKC9cXHMrJC8sIFwiXCIpXG5mdW5jdGlvbiBsaW5lc0FyZUVxdWFsKGE6IHN0cmluZywgYjogc3RyaW5nKSB7XG4gIHJldHVybiB0cmltUmlnaHQoYSkgPT09IHRyaW1SaWdodChiKVxufVxuXG4vKipcbiAqIEhvdyBkb2VzIG5vTmV3TGluZUF0RW5kT2ZGaWxlIHdvcms/XG4gKlxuICogaWYgeW91IHJlbW92ZSB0aGUgbmV3bGluZSBmcm9tIGEgZmlsZSB0aGF0IGhhZCBvbmUgd2l0aG91dCBlZGl0aW5nIG90aGVyIGJpdHM6XG4gKlxuICogICAgaXQgY3JlYXRlcyBhbiBpbnNlcnRpb24vcmVtb3ZhbCBwYWlyIHdoZXJlIHRoZSBpbnNlcnRpb24gaGFzIFxcIE5vIG5ldyBsaW5lIGF0IGVuZCBvZiBmaWxlXG4gKlxuICogaWYgeW91IGVkaXQgYSBmaWxlIHRoYXQgZGlkbid0IGhhdmUgYSBuZXcgbGluZSBhbmQgZG9uJ3QgYWRkIG9uZTpcbiAqXG4gKiAgICBib3RoIGluc2VydGlvbiBhbmQgZGVsZXRpb24gaGF2ZSBcXCBObyBuZXcgbGluZSBhdCBlbmQgb2YgZmlsZVxuICpcbiAqIGlmIHlvdSBlZGl0IGEgZmlsZSB0aGF0IGRpZG4ndCBoYXZlIGEgbmV3IGxpbmUgYW5kIGFkZCBvbmU6XG4gKlxuICogICAgZGVsZXRpb24gaGFzIFxcIE5vIG5ldyBsaW5lIGF0IGVuZCBvZiBmaWxlXG4gKiAgICBidXQgbm90IGluc2VydGlvblxuICpcbiAqIGlmIHlvdSBlZGl0IGEgZmlsZSB0aGF0IGhhZCBhIG5ldyBsaW5lIGFuZCBsZWF2ZSBpdCBpbjpcbiAqXG4gKiAgICBuZWl0aGVyIGluc2V0aW9uIG5vciBkZWxldGlvbiBoYXZlIHRoZSBhbm5vYXRpb25cbiAqXG4gKi9cblxuZnVuY3Rpb24gYXBwbHlQYXRjaChcbiAgeyBodW5rcywgcGF0aCB9OiBGaWxlUGF0Y2gsXG4gIHsgZHJ5UnVuIH06IHsgZHJ5UnVuOiBib29sZWFuIH0sXG4pOiB2b2lkIHtcbiAgLy8gbW9kaWZ5aW5nIHRoZSBmaWxlIGluIHBsYWNlXG4gIGNvbnN0IGZpbGVDb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhwYXRoKS50b1N0cmluZygpXG4gIGNvbnN0IG1vZGUgPSBmcy5zdGF0U3luYyhwYXRoKS5tb2RlXG5cbiAgY29uc3QgZmlsZUxpbmVzOiBzdHJpbmdbXSA9IGZpbGVDb250ZW50cy5zcGxpdCgvXFxuLylcblxuICBjb25zdCByZXN1bHQ6IE1vZGlmaWNhaXRvbltdW10gPSBbXVxuXG4gIGZvciAoY29uc3QgaHVuayBvZiBodW5rcykge1xuICAgIGxldCBmdXp6aW5nT2Zmc2V0ID0gMFxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBtb2RpZmljYXRpb25zID0gZXZhbHVhdGVIdW5rKGh1bmssIGZpbGVMaW5lcywgZnV6emluZ09mZnNldClcbiAgICAgIGlmIChtb2RpZmljYXRpb25zKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG1vZGlmaWNhdGlvbnMpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGZ1enppbmdPZmZzZXQgPVxuICAgICAgICBmdXp6aW5nT2Zmc2V0IDwgMCA/IGZ1enppbmdPZmZzZXQgKiAtMSA6IGZ1enppbmdPZmZzZXQgKiAtMSAtIDFcblxuICAgICAgaWYgKE1hdGguYWJzKGZ1enppbmdPZmZzZXQpID4gMjApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW50IGFwcGx5IGh1bmsgJHtodW5rcy5pbmRleE9mKGh1bmspfSBmb3IgZmlsZSAke3BhdGh9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChkcnlSdW4pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGxldCBkaWZmT2Zmc2V0ID0gMFxuXG4gIGZvciAoY29uc3QgbW9kaWZpY2F0aW9ucyBvZiByZXN1bHQpIHtcbiAgICBmb3IgKGNvbnN0IG1vZGlmaWNhdGlvbiBvZiBtb2RpZmljYXRpb25zKSB7XG4gICAgICBzd2l0Y2ggKG1vZGlmaWNhdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJzcGxpY2VcIjpcbiAgICAgICAgICBmaWxlTGluZXMuc3BsaWNlKFxuICAgICAgICAgICAgbW9kaWZpY2F0aW9uLmluZGV4ICsgZGlmZk9mZnNldCxcbiAgICAgICAgICAgIG1vZGlmaWNhdGlvbi5udW1Ub0RlbGV0ZSxcbiAgICAgICAgICAgIC4uLm1vZGlmaWNhdGlvbi5saW5lc1RvSW5zZXJ0LFxuICAgICAgICAgIClcbiAgICAgICAgICBkaWZmT2Zmc2V0ICs9XG4gICAgICAgICAgICBtb2RpZmljYXRpb24ubGluZXNUb0luc2VydC5sZW5ndGggLSBtb2RpZmljYXRpb24ubnVtVG9EZWxldGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIFwicG9wXCI6XG4gICAgICAgICAgZmlsZUxpbmVzLnBvcCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBcInB1c2hcIjpcbiAgICAgICAgICBmaWxlTGluZXMucHVzaChtb2RpZmljYXRpb24ubGluZSlcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGFzc2VydE5ldmVyKG1vZGlmaWNhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmcy53cml0ZUZpbGVTeW5jKHBhdGgsIGZpbGVMaW5lcy5qb2luKFwiXFxuXCIpLCB7IG1vZGUgfSlcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICB0eXBlOiBcInB1c2hcIlxuICBsaW5lOiBzdHJpbmdcbn1cbmludGVyZmFjZSBQb3Age1xuICB0eXBlOiBcInBvcFwiXG59XG5pbnRlcmZhY2UgU3BsaWNlIHtcbiAgdHlwZTogXCJzcGxpY2VcIlxuICBpbmRleDogbnVtYmVyXG4gIG51bVRvRGVsZXRlOiBudW1iZXJcbiAgbGluZXNUb0luc2VydDogc3RyaW5nW11cbn1cblxudHlwZSBNb2RpZmljYWl0b24gPSBQdXNoIHwgUG9wIHwgU3BsaWNlXG5cbmZ1bmN0aW9uIGV2YWx1YXRlSHVuayhcbiAgaHVuazogSHVuayxcbiAgZmlsZUxpbmVzOiBzdHJpbmdbXSxcbiAgZnV6emluZ09mZnNldDogbnVtYmVyLFxuKTogTW9kaWZpY2FpdG9uW10gfCBudWxsIHtcbiAgY29uc3QgcmVzdWx0OiBNb2RpZmljYWl0b25bXSA9IFtdXG4gIGxldCBjb250ZXh0SW5kZXggPSBodW5rLmhlYWRlci5vcmlnaW5hbC5zdGFydCAtIDEgKyBmdXp6aW5nT2Zmc2V0XG4gIC8vIGRvIGJvdW5kcyBjaGVja3MgZm9yIGluZGV4XG4gIGlmIChjb250ZXh0SW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBpZiAoZmlsZUxpbmVzLmxlbmd0aCAtIGNvbnRleHRJbmRleCA8IGh1bmsuaGVhZGVyLm9yaWdpbmFsLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgaHVuay5wYXJ0cykge1xuICAgIHN3aXRjaCAocGFydC50eXBlKSB7XG4gICAgICBjYXNlIFwiZGVsZXRpb25cIjpcbiAgICAgIGNhc2UgXCJjb250ZXh0XCI6XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBwYXJ0LmxpbmVzKSB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxMaW5lID0gZmlsZUxpbmVzW2NvbnRleHRJbmRleF1cbiAgICAgICAgICBpZiAoIWxpbmVzQXJlRXF1YWwob3JpZ2luYWxMaW5lLCBsaW5lKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGV4dEluZGV4KytcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiZGVsZXRpb25cIikge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwic3BsaWNlXCIsXG4gICAgICAgICAgICBpbmRleDogY29udGV4dEluZGV4IC0gcGFydC5saW5lcy5sZW5ndGgsXG4gICAgICAgICAgICBudW1Ub0RlbGV0ZTogcGFydC5saW5lcy5sZW5ndGgsXG4gICAgICAgICAgICBsaW5lc1RvSW5zZXJ0OiBbXSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgaWYgKHBhcnQubm9OZXdsaW5lQXRFbmRPZkZpbGUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJwdXNoXCIsXG4gICAgICAgICAgICAgIGxpbmU6IFwiXCIsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImluc2VydGlvblwiOlxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJzcGxpY2VcIixcbiAgICAgICAgICBpbmRleDogY29udGV4dEluZGV4LFxuICAgICAgICAgIG51bVRvRGVsZXRlOiAwLFxuICAgICAgICAgIGxpbmVzVG9JbnNlcnQ6IHBhcnQubGluZXMsXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChwYXJ0Lm5vTmV3bGluZUF0RW5kT2ZGaWxlKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goeyB0eXBlOiBcInBvcFwiIH0pXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFzc2VydE5ldmVyKHBhcnQudHlwZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG4iXX0=
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyHunkIntegrity = exports.parsePatchFile = exports.interpretParsedPatchFile = exports.EXECUTABLE_FILE_MODE = exports.NON_EXECUTABLE_FILE_MODE = exports.parseHunkHeaderLine = void 0;
|
|
4
|
+
const assertNever_1 = require("../assertNever");
|
|
5
|
+
const parseHunkHeaderLine = (headerLine) => {
|
|
6
|
+
const match = headerLine
|
|
7
|
+
.trim()
|
|
8
|
+
.match(/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/);
|
|
9
|
+
if (!match) {
|
|
10
|
+
throw new Error(`Bad header line: '${headerLine}'`);
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
original: {
|
|
14
|
+
start: Math.max(Number(match[1]), 1),
|
|
15
|
+
length: Number(match[3] || 1),
|
|
16
|
+
},
|
|
17
|
+
patched: {
|
|
18
|
+
start: Math.max(Number(match[4]), 1),
|
|
19
|
+
length: Number(match[6] || 1),
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
exports.parseHunkHeaderLine = parseHunkHeaderLine;
|
|
24
|
+
exports.NON_EXECUTABLE_FILE_MODE = 0o644;
|
|
25
|
+
exports.EXECUTABLE_FILE_MODE = 0o755;
|
|
26
|
+
const emptyFilePatch = () => ({
|
|
27
|
+
diffLineFromPath: null,
|
|
28
|
+
diffLineToPath: null,
|
|
29
|
+
oldMode: null,
|
|
30
|
+
newMode: null,
|
|
31
|
+
deletedFileMode: null,
|
|
32
|
+
newFileMode: null,
|
|
33
|
+
renameFrom: null,
|
|
34
|
+
renameTo: null,
|
|
35
|
+
beforeHash: null,
|
|
36
|
+
afterHash: null,
|
|
37
|
+
fromPath: null,
|
|
38
|
+
toPath: null,
|
|
39
|
+
hunks: null,
|
|
40
|
+
});
|
|
41
|
+
const emptyHunk = (headerLine) => ({
|
|
42
|
+
header: exports.parseHunkHeaderLine(headerLine),
|
|
43
|
+
parts: [],
|
|
44
|
+
});
|
|
45
|
+
const hunkLinetypes = {
|
|
46
|
+
"@": "header",
|
|
47
|
+
"-": "deletion",
|
|
48
|
+
"+": "insertion",
|
|
49
|
+
" ": "context",
|
|
50
|
+
"\\": "pragma",
|
|
51
|
+
// Treat blank lines as context
|
|
52
|
+
undefined: "context",
|
|
53
|
+
};
|
|
54
|
+
function parsePatchLines(lines, { supportLegacyDiffs }) {
|
|
55
|
+
const result = [];
|
|
56
|
+
let currentFilePatch = emptyFilePatch();
|
|
57
|
+
let state = "parsing header";
|
|
58
|
+
let currentHunk = null;
|
|
59
|
+
let currentHunkMutationPart = null;
|
|
60
|
+
function commitHunk() {
|
|
61
|
+
if (currentHunk) {
|
|
62
|
+
if (currentHunkMutationPart) {
|
|
63
|
+
currentHunk.parts.push(currentHunkMutationPart);
|
|
64
|
+
currentHunkMutationPart = null;
|
|
65
|
+
}
|
|
66
|
+
currentFilePatch.hunks.push(currentHunk);
|
|
67
|
+
currentHunk = null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function commitFilePatch() {
|
|
71
|
+
commitHunk();
|
|
72
|
+
result.push(currentFilePatch);
|
|
73
|
+
currentFilePatch = emptyFilePatch();
|
|
74
|
+
}
|
|
75
|
+
for (let i = 0; i < lines.length; i++) {
|
|
76
|
+
const line = lines[i];
|
|
77
|
+
if (state === "parsing header") {
|
|
78
|
+
if (line.startsWith("@@")) {
|
|
79
|
+
state = "parsing hunks";
|
|
80
|
+
currentFilePatch.hunks = [];
|
|
81
|
+
i--;
|
|
82
|
+
}
|
|
83
|
+
else if (line.startsWith("diff --git ")) {
|
|
84
|
+
if (currentFilePatch && currentFilePatch.diffLineFromPath) {
|
|
85
|
+
commitFilePatch();
|
|
86
|
+
}
|
|
87
|
+
const match = line.match(/^diff --git a\/(.*?) b\/(.*?)\s*$/);
|
|
88
|
+
if (!match) {
|
|
89
|
+
throw new Error("Bad diff line: " + line);
|
|
90
|
+
}
|
|
91
|
+
currentFilePatch.diffLineFromPath = match[1];
|
|
92
|
+
currentFilePatch.diffLineToPath = match[2];
|
|
93
|
+
}
|
|
94
|
+
else if (line.startsWith("old mode ")) {
|
|
95
|
+
currentFilePatch.oldMode = line.slice("old mode ".length).trim();
|
|
96
|
+
}
|
|
97
|
+
else if (line.startsWith("new mode ")) {
|
|
98
|
+
currentFilePatch.newMode = line.slice("new mode ".length).trim();
|
|
99
|
+
}
|
|
100
|
+
else if (line.startsWith("deleted file mode ")) {
|
|
101
|
+
currentFilePatch.deletedFileMode = line
|
|
102
|
+
.slice("deleted file mode ".length)
|
|
103
|
+
.trim();
|
|
104
|
+
}
|
|
105
|
+
else if (line.startsWith("new file mode ")) {
|
|
106
|
+
currentFilePatch.newFileMode = line
|
|
107
|
+
.slice("new file mode ".length)
|
|
108
|
+
.trim();
|
|
109
|
+
}
|
|
110
|
+
else if (line.startsWith("rename from ")) {
|
|
111
|
+
currentFilePatch.renameFrom = line.slice("rename from ".length).trim();
|
|
112
|
+
}
|
|
113
|
+
else if (line.startsWith("rename to ")) {
|
|
114
|
+
currentFilePatch.renameTo = line.slice("rename to ".length).trim();
|
|
115
|
+
}
|
|
116
|
+
else if (line.startsWith("index ")) {
|
|
117
|
+
const match = line.match(/(\w+)\.\.(\w+)/);
|
|
118
|
+
if (!match) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
currentFilePatch.beforeHash = match[1];
|
|
122
|
+
currentFilePatch.afterHash = match[2];
|
|
123
|
+
}
|
|
124
|
+
else if (line.startsWith("--- ")) {
|
|
125
|
+
currentFilePatch.fromPath = line.slice("--- a/".length).trim();
|
|
126
|
+
}
|
|
127
|
+
else if (line.startsWith("+++ ")) {
|
|
128
|
+
currentFilePatch.toPath = line.slice("+++ b/".length).trim();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
if (supportLegacyDiffs && line.startsWith("--- a/")) {
|
|
133
|
+
state = "parsing header";
|
|
134
|
+
commitFilePatch();
|
|
135
|
+
i--;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
// parsing hunks
|
|
139
|
+
const lineType = hunkLinetypes[line[0]] || null;
|
|
140
|
+
switch (lineType) {
|
|
141
|
+
case "header":
|
|
142
|
+
commitHunk();
|
|
143
|
+
currentHunk = emptyHunk(line);
|
|
144
|
+
break;
|
|
145
|
+
case null:
|
|
146
|
+
// unrecognized, bail out
|
|
147
|
+
state = "parsing header";
|
|
148
|
+
commitFilePatch();
|
|
149
|
+
i--;
|
|
150
|
+
break;
|
|
151
|
+
case "pragma":
|
|
152
|
+
if (!line.startsWith("\")) {
|
|
153
|
+
throw new Error("Unrecognized pragma in patch file: " + line);
|
|
154
|
+
}
|
|
155
|
+
if (!currentHunkMutationPart) {
|
|
156
|
+
throw new Error("Bad parser state: No newline at EOF pragma encountered without context");
|
|
157
|
+
}
|
|
158
|
+
currentHunkMutationPart.noNewlineAtEndOfFile = true;
|
|
159
|
+
break;
|
|
160
|
+
case "insertion":
|
|
161
|
+
case "deletion":
|
|
162
|
+
case "context":
|
|
163
|
+
if (!currentHunk) {
|
|
164
|
+
throw new Error("Bad parser state: Hunk lines encountered before hunk header");
|
|
165
|
+
}
|
|
166
|
+
if (currentHunkMutationPart &&
|
|
167
|
+
currentHunkMutationPart.type !== lineType) {
|
|
168
|
+
currentHunk.parts.push(currentHunkMutationPart);
|
|
169
|
+
currentHunkMutationPart = null;
|
|
170
|
+
}
|
|
171
|
+
if (!currentHunkMutationPart) {
|
|
172
|
+
currentHunkMutationPart = {
|
|
173
|
+
type: lineType,
|
|
174
|
+
lines: [],
|
|
175
|
+
noNewlineAtEndOfFile: false,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
currentHunkMutationPart.lines.push(line.slice(1));
|
|
179
|
+
break;
|
|
180
|
+
default:
|
|
181
|
+
// exhausitveness check
|
|
182
|
+
assertNever_1.assertNever(lineType);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
commitFilePatch();
|
|
187
|
+
for (const { hunks } of result) {
|
|
188
|
+
if (hunks) {
|
|
189
|
+
for (const hunk of hunks) {
|
|
190
|
+
verifyHunkIntegrity(hunk);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
function interpretParsedPatchFile(files) {
|
|
197
|
+
const result = [];
|
|
198
|
+
for (const file of files) {
|
|
199
|
+
const { diffLineFromPath, diffLineToPath, oldMode, newMode, deletedFileMode, newFileMode, renameFrom, renameTo, beforeHash, afterHash, fromPath, toPath, hunks, } = file;
|
|
200
|
+
const type = renameFrom
|
|
201
|
+
? "rename"
|
|
202
|
+
: deletedFileMode
|
|
203
|
+
? "file deletion"
|
|
204
|
+
: newFileMode
|
|
205
|
+
? "file creation"
|
|
206
|
+
: hunks && hunks.length > 0
|
|
207
|
+
? "patch"
|
|
208
|
+
: "mode change";
|
|
209
|
+
let destinationFilePath = null;
|
|
210
|
+
switch (type) {
|
|
211
|
+
case "rename":
|
|
212
|
+
if (!renameFrom || !renameTo) {
|
|
213
|
+
throw new Error("Bad parser state: rename from & to not given");
|
|
214
|
+
}
|
|
215
|
+
result.push({
|
|
216
|
+
type: "rename",
|
|
217
|
+
fromPath: renameFrom,
|
|
218
|
+
toPath: renameTo,
|
|
219
|
+
});
|
|
220
|
+
destinationFilePath = renameTo;
|
|
221
|
+
break;
|
|
222
|
+
case "file deletion": {
|
|
223
|
+
const path = diffLineFromPath || fromPath;
|
|
224
|
+
if (!path) {
|
|
225
|
+
throw new Error("Bad parse state: no path given for file deletion");
|
|
226
|
+
}
|
|
227
|
+
result.push({
|
|
228
|
+
type: "file deletion",
|
|
229
|
+
hunk: (hunks && hunks[0]) || null,
|
|
230
|
+
path,
|
|
231
|
+
mode: parseFileMode(deletedFileMode),
|
|
232
|
+
hash: beforeHash,
|
|
233
|
+
});
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
case "file creation": {
|
|
237
|
+
const path = diffLineToPath || toPath;
|
|
238
|
+
if (!path) {
|
|
239
|
+
throw new Error("Bad parse state: no path given for file creation");
|
|
240
|
+
}
|
|
241
|
+
result.push({
|
|
242
|
+
type: "file creation",
|
|
243
|
+
hunk: (hunks && hunks[0]) || null,
|
|
244
|
+
path,
|
|
245
|
+
mode: parseFileMode(newFileMode),
|
|
246
|
+
hash: afterHash,
|
|
247
|
+
});
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
case "patch":
|
|
251
|
+
case "mode change":
|
|
252
|
+
destinationFilePath = toPath || diffLineToPath;
|
|
253
|
+
break;
|
|
254
|
+
default:
|
|
255
|
+
assertNever_1.assertNever(type);
|
|
256
|
+
}
|
|
257
|
+
if (destinationFilePath && oldMode && newMode && oldMode !== newMode) {
|
|
258
|
+
result.push({
|
|
259
|
+
type: "mode change",
|
|
260
|
+
path: destinationFilePath,
|
|
261
|
+
oldMode: parseFileMode(oldMode),
|
|
262
|
+
newMode: parseFileMode(newMode),
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
if (destinationFilePath && hunks && hunks.length) {
|
|
266
|
+
result.push({
|
|
267
|
+
type: "patch",
|
|
268
|
+
path: destinationFilePath,
|
|
269
|
+
hunks,
|
|
270
|
+
beforeHash,
|
|
271
|
+
afterHash,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return result;
|
|
276
|
+
}
|
|
277
|
+
exports.interpretParsedPatchFile = interpretParsedPatchFile;
|
|
278
|
+
function parseFileMode(mode) {
|
|
279
|
+
// tslint:disable-next-line:no-bitwise
|
|
280
|
+
const parsedMode = parseInt(mode, 8) & 0o777;
|
|
281
|
+
if (parsedMode !== exports.NON_EXECUTABLE_FILE_MODE &&
|
|
282
|
+
parsedMode !== exports.EXECUTABLE_FILE_MODE) {
|
|
283
|
+
throw new Error("Unexpected file mode string: " + mode);
|
|
284
|
+
}
|
|
285
|
+
return parsedMode;
|
|
286
|
+
}
|
|
287
|
+
function parsePatchFile(file) {
|
|
288
|
+
const lines = file.split(/\n/g);
|
|
289
|
+
if (lines[lines.length - 1] === "") {
|
|
290
|
+
lines.pop();
|
|
291
|
+
}
|
|
292
|
+
try {
|
|
293
|
+
return interpretParsedPatchFile(parsePatchLines(lines, { supportLegacyDiffs: false }));
|
|
294
|
+
}
|
|
295
|
+
catch (e) {
|
|
296
|
+
if (e instanceof Error &&
|
|
297
|
+
e.message === "hunk header integrity check failed") {
|
|
298
|
+
return interpretParsedPatchFile(parsePatchLines(lines, { supportLegacyDiffs: true }));
|
|
299
|
+
}
|
|
300
|
+
throw e;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
exports.parsePatchFile = parsePatchFile;
|
|
304
|
+
function verifyHunkIntegrity(hunk) {
|
|
305
|
+
// verify hunk integrity
|
|
306
|
+
let originalLength = 0;
|
|
307
|
+
let patchedLength = 0;
|
|
308
|
+
for (const { type, lines } of hunk.parts) {
|
|
309
|
+
switch (type) {
|
|
310
|
+
case "context":
|
|
311
|
+
patchedLength += lines.length;
|
|
312
|
+
originalLength += lines.length;
|
|
313
|
+
break;
|
|
314
|
+
case "deletion":
|
|
315
|
+
originalLength += lines.length;
|
|
316
|
+
break;
|
|
317
|
+
case "insertion":
|
|
318
|
+
patchedLength += lines.length;
|
|
319
|
+
break;
|
|
320
|
+
default:
|
|
321
|
+
assertNever_1.assertNever(type);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
if (originalLength !== hunk.header.original.length ||
|
|
325
|
+
patchedLength !== hunk.header.patched.length) {
|
|
326
|
+
throw new Error("hunk header integrity check failed");
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
exports.verifyHunkIntegrity = verifyHunkIntegrity;
|
|
330
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGF0Y2gvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0RBQTRDO0FBYXJDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxVQUFrQixFQUFjLEVBQUU7SUFDcEUsTUFBTSxLQUFLLEdBQUcsVUFBVTtTQUNyQixJQUFJLEVBQUU7U0FDTixLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtJQUNyRCxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsVUFBVSxHQUFHLENBQUMsQ0FBQTtLQUNwRDtJQUVELE9BQU87UUFDTCxRQUFRLEVBQUU7WUFDUixLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtRQUNELE9BQU8sRUFBRTtZQUNQLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCO0tBQ0YsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQWxCWSxRQUFBLG1CQUFtQix1QkFrQi9CO0FBRVksUUFBQSx3QkFBd0IsR0FBRyxLQUFLLENBQUE7QUFDaEMsUUFBQSxvQkFBb0IsR0FBRyxLQUFLLENBQUE7QUErRXpDLE1BQU0sY0FBYyxHQUFHLEdBQWMsRUFBRSxDQUFDLENBQUM7SUFDdkMsZ0JBQWdCLEVBQUUsSUFBSTtJQUN0QixjQUFjLEVBQUUsSUFBSTtJQUNwQixPQUFPLEVBQUUsSUFBSTtJQUNiLE9B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TUFBTSxFQUM1QztRQUNBLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQTtLQUN0RDtBQUNILENBQUM7QUEzQkQsa0RBMkJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzZXJ0TmV2ZXIgfSBmcm9tIFwiLi4vYXNzZXJ0TmV2ZXJcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEh1bmtIZWFkZXIge1xuICBvcmlnaW5hbDoge1xuICAgIHN0YXJ0OiBudW1iZXJcbiAgICBsZW5ndGg6IG51bWJlclxuICB9XG4gIHBhdGNoZWQ6IHtcbiAgICBzdGFydDogbnVtYmVyXG4gICAgbGVuZ3RoOiBudW1iZXJcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VIdW5rSGVhZGVyTGluZSA9IChoZWFkZXJMaW5lOiBzdHJpbmcpOiBIdW5rSGVhZGVyID0+IHtcbiAgY29uc3QgbWF0Y2ggPSBoZWFkZXJMaW5lXG4gICAgLnRyaW0oKVxuICAgIC5tYXRjaCgvXkBAIC0oXFxkKykoLChcXGQrKSk/IFxcKyhcXGQrKSgsKFxcZCspKT8gQEAuKi8pXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEJhZCBoZWFkZXIgbGluZTogJyR7aGVhZGVyTGluZX0nYClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3JpZ2luYWw6IHtcbiAgICAgIHN0YXJ0OiBNYXRoLm1heChOdW1iZXIobWF0Y2hbMV0pLCAxKSxcbiAgICAgIGxlbmd0aDogTnVtYmVyKG1hdGNoWzNdIHx8IDEpLFxuICAgIH0sXG4gICAgcGF0Y2hlZDoge1xuICAgICAgc3RhcnQ6IE1hdGgubWF4KE51bWJlcihtYXRjaFs0XSksIDEpLFxuICAgICAgbGVuZ3RoOiBOdW1iZXIobWF0Y2hbNl0gfHwgMSksXG4gICAgfSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgTk9OX0VYRUNVVEFCTEVfRklMRV9NT0RFID0gMG82NDRcbmV4cG9ydCBjb25zdCBFWEVDVVRBQkxFX0ZJTEVfTU9ERSA9IDBvNzU1XG5cbnR5cGUgRmlsZU1vZGUgPSB0eXBlb2YgTk9OX0VYRUNVVEFCTEVfRklMRV9NT0RFIHwgdHlwZW9mIEVYRUNVVEFCTEVfRklMRV9NT0RFXG5cbmludGVyZmFjZSBQYXRjaE11dGF0aW9uUGFydCB7XG4gIHR5cGU6IFwiY29udGV4dFwiIHwgXCJpbnNlcnRpb25cIiB8IFwiZGVsZXRpb25cIlxuICBsaW5lczogc3RyaW5nW11cbiAgbm9OZXdsaW5lQXRFbmRPZkZpbGU6IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEZpbGVSZW5hbWUge1xuICB0eXBlOiBcInJlbmFtZVwiXG4gIGZyb21QYXRoOiBzdHJpbmdcbiAgdG9QYXRoOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIEZpbGVNb2RlQ2hhbmdlIHtcbiAgdHlwZTogXCJtb2RlIGNoYW5nZVwiXG4gIHBhdGg6IHN0cmluZ1xuICBvbGRNb2RlOiBGaWxlTW9kZVxuICBuZXdNb2RlOiBGaWxlTW9kZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVQYXRjaCB7XG4gIHR5cGU6IFwicGF0Y2hcIlxuICBwYXRoOiBzdHJpbmdcbiAgaHVua3M6IEh1bmtbXVxuICBiZWZvcmVIYXNoOiBzdHJpbmcgfCBudWxsXG4gIGFmdGVySGFzaDogc3RyaW5nIHwgbnVsbFxufVxuXG5pbnRlcmZhY2UgRmlsZURlbGV0aW9uIHtcbiAgdHlwZTogXCJmaWxlIGRlbGV0aW9uXCJcbiAgcGF0aDogc3RyaW5nXG4gIG1vZGU6IEZpbGVNb2RlXG4gIGh1bms6IEh1bmsgfCBudWxsXG4gIGhhc2g6IHN0cmluZyB8IG51bGxcbn1cblxuaW50ZXJmYWNlIEZpbGVDcmVhdGlvbiB7XG4gIHR5cGU6IFwiZmlsZSBjcmVhdGlvblwiXG4gIG1vZGU6IEZpbGVNb2RlXG4gIHBhdGg6IHN0cmluZ1xuICBodW5rOiBIdW5rIHwgbnVsbFxuICBoYXNoOiBzdHJpbmcgfCBudWxsXG59XG5cbmV4cG9ydCB0eXBlIFBhdGNoRmlsZVBhcnQgPVxuICB8IEZpbGVQYXRjaFxuICB8IEZpbGVEZWxldGlvblxuICB8IEZpbGVDcmVhdGlvblxuICB8IEZpbGVSZW5hbWVcbiAgfCBGaWxlTW9kZUNoYW5nZVxuXG5leHBvcnQgdHlwZSBQYXJzZWRQYXRjaEZpbGUgPSBQYXRjaEZpbGVQYXJ0W11cblxudHlwZSBTdGF0ZSA9IFwicGFyc2luZyBoZWFkZXJcIiB8IFwicGFyc2luZyBodW5rc1wiXG5cbmludGVyZmFjZSBGaWxlRGVldHMge1xuICBkaWZmTGluZUZyb21QYXRoOiBzdHJpbmcgfCBudWxsXG4gIGRpZmZMaW5lVG9QYXRoOiBzdHJpbmcgfCBudWxsXG4gIG9sZE1vZGU6IHN0cmluZyB8IG51bGxcbiAgbmV3TW9kZTogc3RyaW5nIHwgbnVsbFxuICBkZWxldGVkRmlsZU1vZGU6IHN0cmluZyB8IG51bGxcbiAgbmV3RmlsZU1vZGU6IHN0cmluZyB8IG51bGxcbiAgcmVuYW1lRnJvbTogc3RyaW5nIHwgbnVsbFxuICByZW5hbWVUbzogc3RyaW5nIHwgbnVsbFxuICBiZWZvcmVIYXNoOiBzdHJpbmcgfCBudWxsXG4gIGFmdGVySGFzaDogc3RyaW5nIHwgbnVsbFxuICBmcm9tUGF0aDogc3RyaW5nIHwgbnVsbFxuICB0b1BhdGg6IHN0cmluZyB8IG51bGxcbiAgaHVua3M6IEh1bmtbXSB8IG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIdW5rIHtcbiAgaGVhZGVyOiBIdW5rSGVhZGVyXG4gIHBhcnRzOiBQYXRjaE11dGF0aW9uUGFydFtdXG59XG5cbmNvbnN0IGVtcHR5RmlsZVBhdGNoID0gKCk6IEZpbGVEZWV0cyA9PiAoe1xuICBkaWZmTGluZUZyb21QYXRoOiBudWxsLFxuICBkaWZmTGluZVRvUGF0aDogbnVsbCxcbiAgb2xkTW9kZTogbnVsbCxcbiAgbmV3TW9kZTogbnVsbCxcbiAgZGVsZXRlZEZpbGVNb2RlOiBudWxsLFxuICBuZXdGaWxlTW9kZTogbnVsbCxcbiAgcmVuYW1lRnJvbTogbnVsbCxcbiAgcmVuYW1lVG86IG51bGwsXG4gIGJlZm9yZUhhc2g6IG51bGwsXG4gIGFmdGVySGFzaDogbnVsbCxcbiAgZnJvbVBhdGg6IG51bGwsXG4gIHRvUGF0aDogbnVsbCxcbiAgaHVua3M6IG51bGwsXG59KVxuXG5jb25zdCBlbXB0eUh1bmsgPSAoaGVhZGVyTGluZTogc3RyaW5nKTogSHVuayA9PiAoe1xuICBoZWFkZXI6IHBhcnNlSHVua0hlYWRlckxpbmUoaGVhZGVyTGluZSksXG4gIHBhcnRzOiBbXSxcbn0pXG5cbmNvbnN0IGh1bmtMaW5ldHlwZXM6IHtcbiAgW2s6IHN0cmluZ106IFBhdGNoTXV0YXRpb25QYXJ0W1widHlwZVwiXSB8IFwicHJhZ21hXCIgfCBcImhlYWRlclwiXG59ID0ge1xuICBcIkBcIjogXCJoZWFkZXJcIixcbiAgXCItXCI6IFwiZGVsZXRpb25cIixcbiAgXCIrXCI6IFwiaW5zZXJ0aW9uXCIsXG4gIFwiIFwiOiBcImNvbnRleHRcIixcbiAgXCJcXFxcXCI6IFwicHJhZ21hXCIsXG4gIC8vIFRyZWF0IGJsYW5rIGxpbmVzIGFzIGNvbnRleHRcbiAgdW5kZWZpbmVkOiBcImNvbnRleHRcIixcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXRjaExpbmVzKFxuICBsaW5lczogc3RyaW5nW10sXG4gIHsgc3VwcG9ydExlZ2FjeURpZmZzIH06IHsgc3VwcG9ydExlZ2FjeURpZmZzOiBib29sZWFuIH0sXG4pOiBGaWxlRGVldHNbXSB7XG4gIGNvbnN0IHJlc3VsdDogRmlsZURlZXRzW10gPSBbXVxuICBsZXQgY3VycmVudEZpbGVQYXRjaDogRmlsZURlZXRzID0gZW1wdHlGaWxlUGF0Y2goKVxuICBsZXQgc3RhdGU6IFN0YXRlID0gXCJwYXJzaW5nIGhlYWRlclwiXG4gIGxldCBjdXJyZW50SHVuazogSHVuayB8IG51bGwgPSBudWxsXG4gIGxldCBjdXJyZW50SHVua011dGF0aW9uUGFydDogUGF0Y2hNdXRhdGlvblBhcnQgfCBudWxsID0gbnVsbFxuXG4gIGZ1bmN0aW9uIGNvbW1pdEh1bmsoKSB7XG4gICAgaWYgKGN1cnJlbnRIdW5rKSB7XG4gICAgICBpZiAoY3VycmVudEh1bmtNdXRhdGlvblBhcnQpIHtcbiAgICAgICAgY3VycmVudEh1bmsucGFydHMucHVzaChjdXJyZW50SHVua011dGF0aW9uUGFydClcbiAgICAgICAgY3VycmVudEh1bmtNdXRhdGlvblBhcnQgPSBudWxsXG4gICAgICB9XG4gICAgICBjdXJyZW50RmlsZVBhdGNoLmh1bmtzIS5wdXNoKGN1cnJlbnRIdW5rKVxuICAgICAgY3VycmVudEh1bmsgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29tbWl0RmlsZVBhdGNoKCkge1xuICAgIGNvbW1pdEh1bmsoKVxuICAgIHJlc3VsdC5wdXNoKGN1cnJlbnRGaWxlUGF0Y2gpXG4gICAgY3VycmVudEZpbGVQYXRjaCA9IGVtcHR5RmlsZVBhdGNoKClcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBsaW5lID0gbGluZXNbaV1cblxuICAgIGlmIChzdGF0ZSA9PT0gXCJwYXJzaW5nIGhlYWRlclwiKSB7XG4gICAgICBpZiAobGluZS5zdGFydHNXaXRoKFwiQEBcIikpIHtcbiAgICAgICAgc3RhdGUgPSBcInBhcnNpbmcgaHVua3NcIlxuICAgICAgICBjdXJyZW50RmlsZVBhdGNoLmh1bmtzID0gW11cbiAgICAgICAgaS0tXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcImRpZmYgLS1naXQgXCIpKSB7XG4gICAgICAgIGlmIChjdXJyZW50RmlsZVBhdGNoICYmIGN1cnJlbnRGaWxlUGF0Y2guZGlmZkxpbmVGcm9tUGF0aCkge1xuICAgICAgICAgIGNvbW1pdEZpbGVQYXRjaCgpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eZGlmZiAtLWdpdCBhXFwvKC4qPykgYlxcLyguKj8pXFxzKiQvKVxuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIGRpZmYgbGluZTogXCIgKyBsaW5lKVxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2guZGlmZkxpbmVGcm9tUGF0aCA9IG1hdGNoWzFdXG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2guZGlmZkxpbmVUb1BhdGggPSBtYXRjaFsyXVxuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCJvbGQgbW9kZSBcIikpIHtcbiAgICAgICAgY3VycmVudEZpbGVQYXRjaC5vbGRNb2RlID0gbGluZS5zbGljZShcIm9sZCBtb2RlIFwiLmxlbmd0aCkudHJpbSgpXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcIm5ldyBtb2RlIFwiKSkge1xuICAgICAgICBjdXJyZW50RmlsZVBhdGNoLm5ld01vZGUgPSBsaW5lLnNsaWNlKFwibmV3IG1vZGUgXCIubGVuZ3RoKS50cmltKClcbiAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFwiZGVsZXRlZCBmaWxlIG1vZGUgXCIpKSB7XG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2guZGVsZXRlZEZpbGVNb2RlID0gbGluZVxuICAgICAgICAgIC5zbGljZShcImRlbGV0ZWQgZmlsZSBtb2RlIFwiLmxlbmd0aClcbiAgICAgICAgICAudHJpbSgpXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcIm5ldyBmaWxlIG1vZGUgXCIpKSB7XG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2gubmV3RmlsZU1vZGUgPSBsaW5lXG4gICAgICAgICAgLnNsaWNlKFwibmV3IGZpbGUgbW9kZSBcIi5sZW5ndGgpXG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCJyZW5hbWUgZnJvbSBcIikpIHtcbiAgICAgICAgY3VycmVudEZpbGVQYXRjaC5yZW5hbWVGcm9tID0gbGluZS5zbGljZShcInJlbmFtZSBmcm9tIFwiLmxlbmd0aCkudHJpbSgpXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcInJlbmFtZSB0byBcIikpIHtcbiAgICAgICAgY3VycmVudEZpbGVQYXRjaC5yZW5hbWVUbyA9IGxpbmUuc2xpY2UoXCJyZW5hbWUgdG8gXCIubGVuZ3RoKS50cmltKClcbiAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFwiaW5kZXggXCIpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvKFxcdyspXFwuXFwuKFxcdyspLylcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEZpbGVQYXRjaC5iZWZvcmVIYXNoID0gbWF0Y2hbMV1cbiAgICAgICAgY3VycmVudEZpbGVQYXRjaC5hZnRlckhhc2ggPSBtYXRjaFsyXVxuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCItLS0gXCIpKSB7XG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2guZnJvbVBhdGggPSBsaW5lLnNsaWNlKFwiLS0tIGEvXCIubGVuZ3RoKS50cmltKClcbiAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFwiKysrIFwiKSkge1xuICAgICAgICBjdXJyZW50RmlsZVBhdGNoLnRvUGF0aCA9IGxpbmUuc2xpY2UoXCIrKysgYi9cIi5sZW5ndGgpLnRyaW0oKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3VwcG9ydExlZ2FjeURpZmZzICYmIGxpbmUuc3RhcnRzV2l0aChcIi0tLSBhL1wiKSkge1xuICAgICAgICBzdGF0ZSA9IFwicGFyc2luZyBoZWFkZXJcIlxuICAgICAgICBjb21taXRGaWxlUGF0Y2goKVxuICAgICAgICBpLS1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIC8vIHBhcnNpbmcgaHVua3NcbiAgICAgIGNvbnN0IGxpbmVUeXBlID0gaHVua0xpbmV0eXBlc1tsaW5lWzBdXSB8fCBudWxsXG4gICAgICBzd2l0Y2ggKGxpbmVUeXBlKSB7XG4gICAgICAgIGNhc2UgXCJoZWFkZXJcIjpcbiAgICAgICAgICBjb21taXRIdW5rKClcbiAgICAgICAgICBjdXJyZW50SHVuayA9IGVtcHR5SHVuayhsaW5lKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgbnVsbDpcbiAgICAgICAgICAvLyB1bnJlY29nbml6ZWQsIGJhaWwgb3V0XG4gICAgICAgICAgc3RhdGUgPSBcInBhcnNpbmcgaGVhZGVyXCJcbiAgICAgICAgICBjb21taXRGaWxlUGF0Y2goKVxuICAgICAgICAgIGktLVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgXCJwcmFnbWFcIjpcbiAgICAgICAgICBpZiAoIWxpbmUuc3RhcnRzV2l0aChcIlxcXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZVwiKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIHByYWdtYSBpbiBwYXRjaCBmaWxlOiBcIiArIGxpbmUpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghY3VycmVudEh1bmtNdXRhdGlvblBhcnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgXCJCYWQgcGFyc2VyIHN0YXRlOiBObyBuZXdsaW5lIGF0IEVPRiBwcmFnbWEgZW5jb3VudGVyZWQgd2l0aG91dCBjb250ZXh0XCIsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0Lm5vTmV3bGluZUF0RW5kT2ZGaWxlID0gdHJ1ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgXCJpbnNlcnRpb25cIjpcbiAgICAgICAgY2FzZSBcImRlbGV0aW9uXCI6XG4gICAgICAgIGNhc2UgXCJjb250ZXh0XCI6XG4gICAgICAgICAgaWYgKCFjdXJyZW50SHVuaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBcIkJhZCBwYXJzZXIgc3RhdGU6IEh1bmsgbGluZXMgZW5jb3VudGVyZWQgYmVmb3JlIGh1bmsgaGVhZGVyXCIsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0ICYmXG4gICAgICAgICAgICBjdXJyZW50SHVua011dGF0aW9uUGFydC50eXBlICE9PSBsaW5lVHlwZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY3VycmVudEh1bmsucGFydHMucHVzaChjdXJyZW50SHVua011dGF0aW9uUGFydClcbiAgICAgICAgICAgIGN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0ID0gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0KSB7XG4gICAgICAgICAgICBjdXJyZW50SHVua011dGF0aW9uUGFydCA9IHtcbiAgICAgICAgICAgICAgdHlwZTogbGluZVR5cGUsXG4gICAgICAgICAgICAgIGxpbmVzOiBbXSxcbiAgICAgICAgICAgICAgbm9OZXdsaW5lQXRFbmRPZkZpbGU6IGZhbHNlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50SHVua011dGF0aW9uUGFydC5saW5lcy5wdXNoKGxpbmUuc2xpY2UoMSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBleGhhdXNpdHZlbmVzcyBjaGVja1xuICAgICAgICAgIGFzc2VydE5ldmVyKGxpbmVUeXBlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbW1pdEZpbGVQYXRjaCgpXG5cbiAgZm9yIChjb25zdCB7IGh1bmtzIH0gb2YgcmVzdWx0KSB7XG4gICAgaWYgKGh1bmtzKSB7XG4gICAgICBmb3IgKGNvbnN0IGh1bmsgb2YgaHVua3MpIHtcbiAgICAgICAgdmVyaWZ5SHVua0ludGVncml0eShodW5rKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludGVycHJldFBhcnNlZFBhdGNoRmlsZShmaWxlczogRmlsZURlZXRzW10pOiBQYXJzZWRQYXRjaEZpbGUge1xuICBjb25zdCByZXN1bHQ6IFBhcnNlZFBhdGNoRmlsZSA9IFtdXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGlmZkxpbmVGcm9tUGF0aCxcbiAgICAgIGRpZmZMaW5lVG9QYXRoLFxuICAgICAgb2xkTW9kZSxcbiAgICAgIG5ld01vZGUsXG4gICAgICBkZWxldGVkRmlsZU1vZGUsXG4gICAgICBuZXdGaWxlTW9kZSxcbiAgICAgIHJlbmFtZUZyb20sXG4gICAgICByZW5hbWVUbyxcbiAgICAgIGJlZm9yZUhhc2gsXG4gICAgICBhZnRlckhhc2gsXG4gICAgICBmcm9tUGF0aCxcbiAgICAgIHRvUGF0aCxcbiAgICAgIGh1bmtzLFxuICAgIH0gPSBmaWxlXG4gICAgY29uc3QgdHlwZTogUGF0Y2hGaWxlUGFydFtcInR5cGVcIl0gPSByZW5hbWVGcm9tXG4gICAgICA/IFwicmVuYW1lXCJcbiAgICAgIDogZGVsZXRlZEZpbGVNb2RlXG4gICAgICA/IFwiZmlsZSBkZWxldGlvblwiXG4gICAgICA6IG5ld0ZpbGVNb2RlXG4gICAgICA/IFwiZmlsZSBjcmVhdGlvblwiXG4gICAgICA6IGh1bmtzICYmIGh1bmtzLmxlbmd0aCA+IDBcbiAgICAgID8gXCJwYXRjaFwiXG4gICAgICA6IFwibW9kZSBjaGFuZ2VcIlxuXG4gICAgbGV0IGRlc3RpbmF0aW9uRmlsZVBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwicmVuYW1lXCI6XG4gICAgICAgIGlmICghcmVuYW1lRnJvbSB8fCAhcmVuYW1lVG8pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgcGFyc2VyIHN0YXRlOiByZW5hbWUgZnJvbSAmIHRvIG5vdCBnaXZlblwiKVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInJlbmFtZVwiLFxuICAgICAgICAgIGZyb21QYXRoOiByZW5hbWVGcm9tLFxuICAgICAgICAgIHRvUGF0aDogcmVuYW1lVG8sXG4gICAgICAgIH0pXG4gICAgICAgIGRlc3RpbmF0aW9uRmlsZVBhdGggPSByZW5hbWVUb1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImZpbGUgZGVsZXRpb25cIjoge1xuICAgICAgICBjb25zdCBwYXRoID0gZGlmZkxpbmVGcm9tUGF0aCB8fCBmcm9tUGF0aFxuICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgcGFyc2Ugc3RhdGU6IG5vIHBhdGggZ2l2ZW4gZm9yIGZpbGUgZGVsZXRpb25cIilcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJmaWxlIGRlbGV0aW9uXCIsXG4gICAgICAgICAgaHVuazogKGh1bmtzICYmIGh1bmtzWzBdKSB8fCBudWxsLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgbW9kZTogcGFyc2VGaWxlTW9kZShkZWxldGVkRmlsZU1vZGUhKSxcbiAgICAgICAgICBoYXNoOiBiZWZvcmVIYXNoLFxuICAgICAgICB9KVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBcImZpbGUgY3JlYXRpb25cIjoge1xuICAgICAgICBjb25zdCBwYXRoID0gZGlmZkxpbmVUb1BhdGggfHwgdG9QYXRoXG4gICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCBwYXJzZSBzdGF0ZTogbm8gcGF0aCBnaXZlbiBmb3IgZmlsZSBjcmVhdGlvblwiKVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcImZpbGUgY3JlYXRpb25cIixcbiAgICAgICAgICBodW5rOiAoaHVua3MgJiYgaHVua3NbMF0pIHx8IG51bGwsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBtb2RlOiBwYXJzZUZpbGVNb2RlKG5ld0ZpbGVNb2RlISksXG4gICAgICAgICAgaGFzaDogYWZ0ZXJIYXNoLFxuICAgICAgICB9KVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBcInBhdGNoXCI6XG4gICAgICBjYXNlIFwibW9kZSBjaGFuZ2VcIjpcbiAgICAgICAgZGVzdGluYXRpb25GaWxlUGF0aCA9IHRvUGF0aCB8fCBkaWZmTGluZVRvUGF0aFxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXNzZXJ0TmV2ZXIodHlwZSlcbiAgICB9XG5cbiAgICBpZiAoZGVzdGluYXRpb25GaWxlUGF0aCAmJiBvbGRNb2RlICYmIG5ld01vZGUgJiYgb2xkTW9kZSAhPT0gbmV3TW9kZSkge1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICB0eXBlOiBcIm1vZGUgY2hhbmdlXCIsXG4gICAgICAgIHBhdGg6IGRlc3RpbmF0aW9uRmlsZVBhdGgsXG4gICAgICAgIG9sZE1vZGU6IHBhcnNlRmlsZU1vZGUob2xkTW9kZSksXG4gICAgICAgIG5ld01vZGU6IHBhcnNlRmlsZU1vZGUobmV3TW9kZSksXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChkZXN0aW5hdGlvbkZpbGVQYXRoICYmIGh1bmtzICYmIGh1bmtzLmxlbmd0aCkge1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICB0eXBlOiBcInBhdGNoXCIsXG4gICAgICAgIHBhdGg6IGRlc3RpbmF0aW9uRmlsZVBhdGgsXG4gICAgICAgIGh1bmtzLFxuICAgICAgICBiZWZvcmVIYXNoLFxuICAgICAgICBhZnRlckhhc2gsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gcGFyc2VGaWxlTW9kZShtb2RlOiBzdHJpbmcpOiBGaWxlTW9kZSB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gIGNvbnN0IHBhcnNlZE1vZGUgPSBwYXJzZUludChtb2RlLCA4KSAmIDBvNzc3XG4gIGlmIChcbiAgICBwYXJzZWRNb2RlICE9PSBOT05fRVhFQ1VUQUJMRV9GSUxFX01PREUgJiZcbiAgICBwYXJzZWRNb2RlICE9PSBFWEVDVVRBQkxFX0ZJTEVfTU9ERVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGZpbGUgbW9kZSBzdHJpbmc6IFwiICsgbW9kZSlcbiAgfVxuICByZXR1cm4gcGFyc2VkTW9kZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRjaEZpbGUoZmlsZTogc3RyaW5nKTogUGFyc2VkUGF0Y2hGaWxlIHtcbiAgY29uc3QgbGluZXMgPSBmaWxlLnNwbGl0KC9cXG4vZylcbiAgaWYgKGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID09PSBcIlwiKSB7XG4gICAgbGluZXMucG9wKClcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBpbnRlcnByZXRQYXJzZWRQYXRjaEZpbGUoXG4gICAgICBwYXJzZVBhdGNoTGluZXMobGluZXMsIHsgc3VwcG9ydExlZ2FjeURpZmZzOiBmYWxzZSB9KSxcbiAgICApXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoXG4gICAgICBlIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgIGUubWVzc2FnZSA9PT0gXCJodW5rIGhlYWRlciBpbnRlZ3JpdHkgY2hlY2sgZmFpbGVkXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBpbnRlcnByZXRQYXJzZWRQYXRjaEZpbGUoXG4gICAgICAgIHBhcnNlUGF0Y2hMaW5lcyhsaW5lcywgeyBzdXBwb3J0TGVnYWN5RGlmZnM6IHRydWUgfSksXG4gICAgICApXG4gICAgfVxuICAgIHRocm93IGVcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5SHVua0ludGVncml0eShodW5rOiBIdW5rKSB7XG4gIC8vIHZlcmlmeSBodW5rIGludGVncml0eVxuICBsZXQgb3JpZ2luYWxMZW5ndGggPSAwXG4gIGxldCBwYXRjaGVkTGVuZ3RoID0gMFxuICBmb3IgKGNvbnN0IHsgdHlwZSwgbGluZXMgfSBvZiBodW5rLnBhcnRzKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiY29udGV4dFwiOlxuICAgICAgICBwYXRjaGVkTGVuZ3RoICs9IGxpbmVzLmxlbmd0aFxuICAgICAgICBvcmlnaW5hbExlbmd0aCArPSBsaW5lcy5sZW5ndGhcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJkZWxldGlvblwiOlxuICAgICAgICBvcmlnaW5hbExlbmd0aCArPSBsaW5lcy5sZW5ndGhcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJpbnNlcnRpb25cIjpcbiAgICAgICAgcGF0Y2hlZExlbmd0aCArPSBsaW5lcy5sZW5ndGhcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFzc2VydE5ldmVyKHR5cGUpXG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIG9yaWdpbmFsTGVuZ3RoICE9PSBodW5rLmhlYWRlci5vcmlnaW5hbC5sZW5ndGggfHxcbiAgICBwYXRjaGVkTGVuZ3RoICE9PSBodW5rLmhlYWRlci5wYXRjaGVkLmxlbmd0aFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJodW5rIGhlYWRlciBpbnRlZ3JpdHkgY2hlY2sgZmFpbGVkXCIpXG4gIH1cbn1cbiJdfQ==
|