grf-cli 1.0.2 → 1.0.4
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 -7
- package/README.zh-CN.md +15 -7
- package/dist/cli.js +2 -14
- package/dist/cli.js.map +1 -1
- package/dist/commands/add/display.d.ts +10 -0
- package/dist/commands/add/display.d.ts.map +1 -0
- package/dist/commands/add/display.js +25 -0
- package/dist/commands/add/display.js.map +1 -0
- package/dist/commands/add/helpers.d.ts +11 -0
- package/dist/commands/add/helpers.d.ts.map +1 -0
- package/dist/commands/add/helpers.js +59 -0
- package/dist/commands/add/helpers.js.map +1 -0
- package/dist/commands/add/index.d.ts +12 -0
- package/dist/commands/add/index.d.ts.map +1 -0
- package/dist/commands/add/index.js +57 -0
- package/dist/commands/add/index.js.map +1 -0
- package/dist/commands/add/types.d.ts +32 -0
- package/dist/commands/add/types.d.ts.map +1 -0
- package/dist/commands/add/types.js +6 -0
- package/dist/commands/add/types.js.map +1 -0
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +21 -21
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/clean/display.d.ts +30 -0
- package/dist/commands/clean/display.d.ts.map +1 -0
- package/dist/commands/clean/display.js +67 -0
- package/dist/commands/clean/display.js.map +1 -0
- package/dist/commands/clean/handlers/clean-all.d.ts +12 -0
- package/dist/commands/clean/handlers/clean-all.d.ts.map +1 -0
- package/dist/commands/clean/handlers/clean-all.js +43 -0
- package/dist/commands/clean/handlers/clean-all.js.map +1 -0
- package/dist/commands/clean/handlers/clean-single.d.ts +13 -0
- package/dist/commands/clean/handlers/clean-single.d.ts.map +1 -0
- package/dist/commands/clean/handlers/clean-single.js +78 -0
- package/dist/commands/clean/handlers/clean-single.js.map +1 -0
- package/dist/commands/clean/handlers/index.d.ts +6 -0
- package/dist/commands/clean/handlers/index.d.ts.map +1 -0
- package/dist/commands/clean/handlers/index.js +11 -0
- package/dist/commands/clean/handlers/index.js.map +1 -0
- package/dist/commands/clean/helpers.d.ts +25 -0
- package/dist/commands/clean/helpers.d.ts.map +1 -0
- package/dist/commands/clean/helpers.js +70 -0
- package/dist/commands/clean/helpers.js.map +1 -0
- package/dist/commands/clean/index.d.ts +12 -0
- package/dist/commands/clean/index.d.ts.map +1 -0
- package/dist/commands/clean/index.js +90 -0
- package/dist/commands/clean/index.js.map +1 -0
- package/dist/commands/clean/types.d.ts +21 -0
- package/dist/commands/clean/types.d.ts.map +1 -0
- package/dist/commands/clean/types.js +6 -0
- package/dist/commands/clean/types.js.map +1 -0
- package/dist/commands/clean.d.ts +5 -0
- package/dist/commands/clean.d.ts.map +1 -1
- package/dist/commands/clean.js +18 -35
- package/dist/commands/clean.js.map +1 -1
- package/dist/commands/config/display.d.ts +36 -0
- package/dist/commands/config/display.d.ts.map +1 -0
- package/dist/commands/config/display.js +86 -0
- package/dist/commands/config/display.js.map +1 -0
- package/dist/commands/config/handlers/index.d.ts +8 -0
- package/dist/commands/config/handlers/index.d.ts.map +1 -0
- package/dist/commands/config/handlers/index.js +15 -0
- package/dist/commands/config/handlers/index.js.map +1 -0
- package/dist/commands/config/handlers/set-value.d.ts +11 -0
- package/dist/commands/config/handlers/set-value.d.ts.map +1 -0
- package/dist/commands/config/handlers/set-value.js +36 -0
- package/dist/commands/config/handlers/set-value.js.map +1 -0
- package/dist/commands/config/handlers/show-all.d.ts +11 -0
- package/dist/commands/config/handlers/show-all.d.ts.map +1 -0
- package/dist/commands/config/handlers/show-all.js +24 -0
- package/dist/commands/config/handlers/show-all.js.map +1 -0
- package/dist/commands/config/handlers/show-path.d.ts +11 -0
- package/dist/commands/config/handlers/show-path.d.ts.map +1 -0
- package/dist/commands/config/handlers/show-path.js +20 -0
- package/dist/commands/config/handlers/show-path.js.map +1 -0
- package/dist/commands/config/handlers/show-value.d.ts +11 -0
- package/dist/commands/config/handlers/show-value.d.ts.map +1 -0
- package/dist/commands/config/handlers/show-value.js +31 -0
- package/dist/commands/config/handlers/show-value.js.map +1 -0
- package/dist/commands/config/helpers.d.ts +23 -0
- package/dist/commands/config/helpers.d.ts.map +1 -0
- package/dist/commands/config/helpers.js +53 -0
- package/dist/commands/config/helpers.js.map +1 -0
- package/dist/commands/config/index.d.ts +12 -0
- package/dist/commands/config/index.d.ts.map +1 -0
- package/dist/commands/config/index.js +56 -0
- package/dist/commands/config/index.js.map +1 -0
- package/dist/commands/config/types.d.ts +31 -0
- package/dist/commands/config/types.d.ts.map +1 -0
- package/dist/commands/config/types.js +13 -0
- package/dist/commands/config/types.js.map +1 -0
- package/dist/commands/config.d.ts +5 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +22 -41
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/index.d.ts +27 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +52 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/list/display.d.ts +39 -0
- package/dist/commands/list/display.d.ts.map +1 -0
- package/dist/commands/list/display.js +144 -0
- package/dist/commands/list/display.js.map +1 -0
- package/dist/commands/list/index.d.ts +12 -0
- package/dist/commands/list/index.d.ts.map +1 -0
- package/dist/commands/list/index.js +128 -0
- package/dist/commands/list/index.js.map +1 -0
- package/dist/commands/list/types.d.ts +32 -0
- package/dist/commands/list/types.d.ts.map +1 -0
- package/dist/commands/list/types.js +6 -0
- package/dist/commands/list/types.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +29 -60
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/load/display.d.ts +28 -0
- package/dist/commands/load/display.d.ts.map +1 -0
- package/dist/commands/load/display.js +53 -0
- package/dist/commands/load/display.js.map +1 -0
- package/dist/commands/load/handlers/copy-repo.d.ts +13 -0
- package/dist/commands/load/handlers/copy-repo.d.ts.map +1 -0
- package/dist/commands/load/handlers/copy-repo.js +82 -0
- package/dist/commands/load/handlers/copy-repo.js.map +1 -0
- package/dist/commands/load/handlers/index.d.ts +6 -0
- package/dist/commands/load/handlers/index.d.ts.map +1 -0
- package/dist/commands/load/handlers/index.js +11 -0
- package/dist/commands/load/handlers/index.js.map +1 -0
- package/dist/commands/load/handlers/url-add.d.ts +13 -0
- package/dist/commands/load/handlers/url-add.d.ts.map +1 -0
- package/dist/commands/load/handlers/url-add.js +50 -0
- package/dist/commands/load/handlers/url-add.js.map +1 -0
- package/dist/commands/load/helpers.d.ts +81 -0
- package/dist/commands/load/helpers.d.ts.map +1 -0
- package/dist/commands/load/helpers.js +199 -0
- package/dist/commands/load/helpers.js.map +1 -0
- package/dist/commands/load/index.d.ts +13 -0
- package/dist/commands/load/index.d.ts.map +1 -0
- package/dist/commands/load/index.js +46 -0
- package/dist/commands/load/index.js.map +1 -0
- package/dist/commands/load/types.d.ts +37 -0
- package/dist/commands/load/types.d.ts.map +1 -0
- package/dist/commands/load/types.js +6 -0
- package/dist/commands/load/types.js.map +1 -0
- package/dist/commands/load.d.ts +5 -0
- package/dist/commands/load.d.ts.map +1 -1
- package/dist/commands/load.js +27 -64
- package/dist/commands/load.js.map +1 -1
- package/dist/commands/options/all.d.ts +11 -0
- package/dist/commands/options/all.d.ts.map +1 -0
- package/dist/commands/options/all.js +14 -0
- package/dist/commands/options/all.js.map +1 -0
- package/dist/commands/options/branch.d.ts +11 -0
- package/dist/commands/options/branch.d.ts.map +1 -0
- package/dist/commands/options/branch.js +14 -0
- package/dist/commands/options/branch.js.map +1 -0
- package/dist/commands/options/check.d.ts +11 -0
- package/dist/commands/options/check.d.ts.map +1 -0
- package/dist/commands/options/check.js +14 -0
- package/dist/commands/options/check.js.map +1 -0
- package/dist/commands/options/clean-empty.d.ts +11 -0
- package/dist/commands/options/clean-empty.d.ts.map +1 -0
- package/dist/commands/options/clean-empty.js +14 -0
- package/dist/commands/options/clean-empty.js.map +1 -0
- package/dist/commands/options/depth.d.ts +11 -0
- package/dist/commands/options/depth.d.ts.map +1 -0
- package/dist/commands/options/depth.js +14 -0
- package/dist/commands/options/depth.js.map +1 -0
- package/dist/commands/options/dry-run.d.ts +11 -0
- package/dist/commands/options/dry-run.d.ts.map +1 -0
- package/dist/commands/options/dry-run.js +14 -0
- package/dist/commands/options/dry-run.js.map +1 -0
- package/dist/commands/options/force.d.ts +11 -0
- package/dist/commands/options/force.d.ts.map +1 -0
- package/dist/commands/options/force.js +14 -0
- package/dist/commands/options/force.js.map +1 -0
- package/dist/commands/options/index.d.ts +24 -0
- package/dist/commands/options/index.d.ts.map +1 -0
- package/dist/commands/options/index.js +53 -0
- package/dist/commands/options/index.js.map +1 -0
- package/dist/commands/options/json.d.ts +11 -0
- package/dist/commands/options/json.d.ts.map +1 -0
- package/dist/commands/options/json.js +14 -0
- package/dist/commands/options/json.js.map +1 -0
- package/dist/commands/options/keep-empty.d.ts +11 -0
- package/dist/commands/options/keep-empty.d.ts.map +1 -0
- package/dist/commands/options/keep-empty.js +14 -0
- package/dist/commands/options/keep-empty.js.map +1 -0
- package/dist/commands/options/list.d.ts +11 -0
- package/dist/commands/options/list.d.ts.map +1 -0
- package/dist/commands/options/list.js +14 -0
- package/dist/commands/options/list.js.map +1 -0
- package/dist/commands/options/name.d.ts +11 -0
- package/dist/commands/options/name.d.ts.map +1 -0
- package/dist/commands/options/name.js +14 -0
- package/dist/commands/options/name.js.map +1 -0
- package/dist/commands/options/no-ignore.d.ts +11 -0
- package/dist/commands/options/no-ignore.d.ts.map +1 -0
- package/dist/commands/options/no-ignore.js +14 -0
- package/dist/commands/options/no-ignore.js.map +1 -0
- package/dist/commands/options/path.d.ts +11 -0
- package/dist/commands/options/path.d.ts.map +1 -0
- package/dist/commands/options/path.js +14 -0
- package/dist/commands/options/path.js.map +1 -0
- package/dist/commands/options/shallow.d.ts +16 -0
- package/dist/commands/options/shallow.d.ts.map +1 -0
- package/dist/commands/options/shallow.js +19 -0
- package/dist/commands/options/shallow.js.map +1 -0
- package/dist/commands/options/status.d.ts +11 -0
- package/dist/commands/options/status.d.ts.map +1 -0
- package/dist/commands/options/status.js +14 -0
- package/dist/commands/options/status.js.map +1 -0
- package/dist/commands/options/subdir.d.ts +11 -0
- package/dist/commands/options/subdir.d.ts.map +1 -0
- package/dist/commands/options/subdir.js +14 -0
- package/dist/commands/options/subdir.js.map +1 -0
- package/dist/commands/options/sync-only.d.ts +11 -0
- package/dist/commands/options/sync-only.d.ts.map +1 -0
- package/dist/commands/options/sync-only.js +14 -0
- package/dist/commands/options/sync-only.js.map +1 -0
- package/dist/commands/options/sync.d.ts +11 -0
- package/dist/commands/options/sync.d.ts.map +1 -0
- package/dist/commands/options/sync.js +14 -0
- package/dist/commands/options/sync.js.map +1 -0
- package/dist/commands/options/verbose.d.ts +11 -0
- package/dist/commands/options/verbose.d.ts.map +1 -0
- package/dist/commands/options/verbose.js +14 -0
- package/dist/commands/options/verbose.js.map +1 -0
- package/dist/commands/unload/display.d.ts +29 -0
- package/dist/commands/unload/display.d.ts.map +1 -0
- package/dist/commands/unload/display.js +125 -0
- package/dist/commands/unload/display.js.map +1 -0
- package/dist/commands/unload/handlers/clean-empty.d.ts +11 -0
- package/dist/commands/unload/handlers/clean-empty.d.ts.map +1 -0
- package/dist/commands/unload/handlers/clean-empty.js +111 -0
- package/dist/commands/unload/handlers/clean-empty.js.map +1 -0
- package/dist/commands/unload/handlers/index.d.ts +8 -0
- package/dist/commands/unload/handlers/index.d.ts.map +1 -0
- package/dist/commands/unload/handlers/index.js +15 -0
- package/dist/commands/unload/handlers/index.js.map +1 -0
- package/dist/commands/unload/handlers/list.d.ts +11 -0
- package/dist/commands/unload/handlers/list.d.ts.map +1 -0
- package/dist/commands/unload/handlers/list.js +42 -0
- package/dist/commands/unload/handlers/list.js.map +1 -0
- package/dist/commands/unload/handlers/remove-all.d.ts +11 -0
- package/dist/commands/unload/handlers/remove-all.d.ts.map +1 -0
- package/dist/commands/unload/handlers/remove-all.js +184 -0
- package/dist/commands/unload/handlers/remove-all.js.map +1 -0
- package/dist/commands/unload/handlers/remove-single.d.ts +12 -0
- package/dist/commands/unload/handlers/remove-single.d.ts.map +1 -0
- package/dist/commands/unload/handlers/remove-single.js +217 -0
- package/dist/commands/unload/handlers/remove-single.js.map +1 -0
- package/dist/commands/unload/helpers.d.ts +55 -0
- package/dist/commands/unload/helpers.d.ts.map +1 -0
- package/dist/commands/unload/helpers.js +256 -0
- package/dist/commands/unload/helpers.js.map +1 -0
- package/dist/commands/unload/index.d.ts +12 -0
- package/dist/commands/unload/index.d.ts.map +1 -0
- package/dist/commands/unload/index.js +121 -0
- package/dist/commands/unload/index.js.map +1 -0
- package/dist/commands/unload/types.d.ts +53 -0
- package/dist/commands/unload/types.d.ts.map +1 -0
- package/dist/commands/unload/types.js +6 -0
- package/dist/commands/unload/types.js.map +1 -0
- package/dist/commands/unload.d.ts +6 -1
- package/dist/commands/unload.d.ts.map +1 -1
- package/dist/commands/unload.js +165 -169
- package/dist/commands/unload.js.map +1 -1
- package/dist/commands/update/display.d.ts +30 -0
- package/dist/commands/update/display.d.ts.map +1 -0
- package/dist/commands/update/display.js +161 -0
- package/dist/commands/update/display.js.map +1 -0
- package/dist/commands/update/handlers/index.d.ts +8 -0
- package/dist/commands/update/handlers/index.d.ts.map +1 -0
- package/dist/commands/update/handlers/index.js +15 -0
- package/dist/commands/update/handlers/index.js.map +1 -0
- package/dist/commands/update/handlers/status.d.ts +11 -0
- package/dist/commands/update/handlers/status.d.ts.map +1 -0
- package/dist/commands/update/handlers/status.js +20 -0
- package/dist/commands/update/handlers/status.js.map +1 -0
- package/dist/commands/update/handlers/sync-only.d.ts +11 -0
- package/dist/commands/update/handlers/sync-only.d.ts.map +1 -0
- package/dist/commands/update/handlers/sync-only.js +41 -0
- package/dist/commands/update/handlers/sync-only.js.map +1 -0
- package/dist/commands/update/handlers/update-all.d.ts +10 -0
- package/dist/commands/update/handlers/update-all.d.ts.map +1 -0
- package/dist/commands/update/handlers/update-all.js +125 -0
- package/dist/commands/update/handlers/update-all.js.map +1 -0
- package/dist/commands/update/handlers/update-single.d.ts +11 -0
- package/dist/commands/update/handlers/update-single.d.ts.map +1 -0
- package/dist/commands/update/handlers/update-single.js +154 -0
- package/dist/commands/update/handlers/update-single.js.map +1 -0
- package/dist/commands/update/helpers.d.ts +13 -0
- package/dist/commands/update/helpers.d.ts.map +1 -0
- package/dist/commands/update/helpers.js +86 -0
- package/dist/commands/update/helpers.js.map +1 -0
- package/dist/commands/update/index.d.ts +12 -0
- package/dist/commands/update/index.d.ts.map +1 -0
- package/dist/commands/update/index.js +67 -0
- package/dist/commands/update/index.js.map +1 -0
- package/dist/commands/update/types.d.ts +55 -0
- package/dist/commands/update/types.d.ts.map +1 -0
- package/dist/commands/update/types.js +6 -0
- package/dist/commands/update/types.js.map +1 -0
- package/dist/commands/update.d.ts +6 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +73 -80
- package/dist/commands/update.js.map +1 -1
- package/dist/core/config-manager.d.ts +83 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +170 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/config.d.ts +22 -2
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +71 -35
- package/dist/core/config.js.map +1 -1
- package/dist/core/filesystem.js +1 -1
- package/dist/core/filesystem.js.map +1 -1
- package/dist/core/loading-state.d.ts +141 -0
- package/dist/core/loading-state.d.ts.map +1 -0
- package/dist/core/loading-state.js +237 -0
- package/dist/core/loading-state.js.map +1 -0
- package/dist/core/loading.d.ts +24 -27
- package/dist/core/loading.d.ts.map +1 -1
- package/dist/core/loading.js +127 -88
- package/dist/core/loading.js.map +1 -1
- package/dist/core/migration.d.ts +54 -0
- package/dist/core/migration.d.ts.map +1 -0
- package/dist/core/migration.js +277 -0
- package/dist/core/migration.js.map +1 -0
- package/dist/core/paths.d.ts +58 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +103 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/repos-index.d.ts +113 -0
- package/dist/core/repos-index.d.ts.map +1 -0
- package/dist/core/repos-index.js +206 -0
- package/dist/core/repos-index.js.map +1 -0
- package/dist/core/repository.js +2 -2
- package/dist/core/repository.js.map +1 -1
- package/dist/core/sync.d.ts.map +1 -1
- package/dist/core/sync.js +3 -3
- package/dist/core/sync.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/ui/format.d.ts +159 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +300 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/index.d.ts +9 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +53 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/prompt.d.ts +94 -0
- package/dist/ui/prompt.d.ts.map +1 -0
- package/dist/ui/prompt.js +223 -0
- package/dist/ui/prompt.js.map +1 -0
- package/dist/ui/spinner.d.ts +99 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +136 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/table.d.ts +142 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +213 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/utils/constants.d.ts +152 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +160 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/error.d.ts +109 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +212 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +44 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/validation.d.ts +122 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +248 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +23 -3
package/dist/commands/unload.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* unload 命令
|
|
4
|
-
*
|
|
4
|
+
* 从当前项目中移除已加载的参考代码(use 命令的逆操作)
|
|
5
5
|
*/
|
|
6
6
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
7
|
if (k2 === undefined) k2 = k;
|
|
@@ -41,67 +41,40 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
41
41
|
};
|
|
42
42
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
43
|
exports.unloadCommand = void 0;
|
|
44
|
+
exports.registerUnloadCommand = registerUnloadCommand;
|
|
44
45
|
const commander_1 = require("commander");
|
|
45
46
|
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
-
const ora_1 = __importDefault(require("ora"));
|
|
47
47
|
const path_1 = __importDefault(require("path"));
|
|
48
|
-
const readline = __importStar(require("readline"));
|
|
49
48
|
const prompts_1 = require("@inquirer/prompts");
|
|
50
49
|
const filesystem = __importStar(require("../core/filesystem.js"));
|
|
51
50
|
const loading = __importStar(require("../core/loading.js"));
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
const
|
|
51
|
+
const spinner_js_1 = require("../ui/spinner.js");
|
|
52
|
+
const prompt_js_1 = require("../ui/prompt.js");
|
|
53
|
+
const table_js_1 = require("../ui/table.js");
|
|
54
|
+
const error_js_1 = require("../utils/error.js");
|
|
55
|
+
const constants_js_1 = require("../utils/constants.js");
|
|
56
|
+
const index_js_1 = require("./options/index.js");
|
|
55
57
|
/**
|
|
56
|
-
*
|
|
57
|
-
* @param
|
|
58
|
-
* @returns 由 gitreference 管理的路径列表
|
|
58
|
+
* 注册 unload 命令
|
|
59
|
+
* @param program Commander 程序实例
|
|
59
60
|
*/
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return entries.map((entry) => entry.targetPath);
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* 填充字符串到指定宽度
|
|
66
|
-
* @param str 原始字符串
|
|
67
|
-
* @param width 目标宽度
|
|
68
|
-
* @returns 填充后的字符串
|
|
69
|
-
*/
|
|
70
|
-
function padEnd(str, width) {
|
|
71
|
-
if (str.length >= width)
|
|
72
|
-
return str;
|
|
73
|
-
return str + " ".repeat(width - str.length);
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* 确认提示
|
|
77
|
-
* @param message 提示消息
|
|
78
|
-
* @returns 用户是否确认
|
|
79
|
-
*/
|
|
80
|
-
async function confirm(message) {
|
|
81
|
-
const rl = readline.createInterface({
|
|
82
|
-
input: process.stdin,
|
|
83
|
-
output: process.stdout,
|
|
84
|
-
});
|
|
85
|
-
return new Promise((resolve) => {
|
|
86
|
-
rl.question(`${message} (y/N) `, (answer) => {
|
|
87
|
-
rl.close();
|
|
88
|
-
resolve(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
|
|
89
|
-
});
|
|
90
|
-
});
|
|
61
|
+
function registerUnloadCommand(program) {
|
|
62
|
+
program.addCommand(exports.unloadCommand);
|
|
91
63
|
}
|
|
64
|
+
/** .gitreference 目录名(使用共享常量) */
|
|
65
|
+
const GITREFERENCE_DIR = constants_js_1.DIR_NAMES.GITREFERENCE;
|
|
92
66
|
/**
|
|
93
67
|
* 从 loading.json 获取所有已加载的仓库条目
|
|
94
|
-
* @param projectRoot 项目根目录
|
|
95
68
|
* @returns 加载条目列表
|
|
96
69
|
*/
|
|
97
|
-
async function getLoadedEntries(
|
|
98
|
-
return await loading.getEntries(
|
|
70
|
+
async function getLoadedEntries() {
|
|
71
|
+
return await loading.getEntries();
|
|
99
72
|
}
|
|
100
73
|
/**
|
|
101
|
-
* 递归扫描 .gitreference
|
|
74
|
+
* 递归扫描 .gitreference 目录以获取空目录列表
|
|
102
75
|
* @param baseDir .gitreference 目录的绝对路径
|
|
103
|
-
* @param currentPath
|
|
104
|
-
* @param loadedPaths
|
|
76
|
+
* @param currentPath 当前正在扫描的相对路径
|
|
77
|
+
* @param loadedPaths 已加载路径列表(用于排除)
|
|
105
78
|
* @returns 空目录列表
|
|
106
79
|
*/
|
|
107
80
|
async function scanEmptyDirs(baseDir, currentPath = "", loadedPaths = new Set()) {
|
|
@@ -160,7 +133,7 @@ function matchEntries(entries, name) {
|
|
|
160
133
|
return entries.filter((entry) => {
|
|
161
134
|
const repoName = entry.repoName.replace(/\\/g, "/");
|
|
162
135
|
const targetPath = entry.targetPath.replace(/\\/g, "/");
|
|
163
|
-
//
|
|
136
|
+
// 完整仓库名称匹配: github.com/facebook/react
|
|
164
137
|
if (repoName === normalizedName) {
|
|
165
138
|
return true;
|
|
166
139
|
}
|
|
@@ -168,7 +141,7 @@ function matchEntries(entries, name) {
|
|
|
168
141
|
if (targetPath === normalizedName) {
|
|
169
142
|
return true;
|
|
170
143
|
}
|
|
171
|
-
//
|
|
144
|
+
// 短仓库名称匹配: react -> 匹配所有名为 react 的仓库
|
|
172
145
|
const shortName = path_1.default.basename(repoName);
|
|
173
146
|
if (shortName === normalizedName) {
|
|
174
147
|
return true;
|
|
@@ -187,7 +160,7 @@ function matchEntries(entries, name) {
|
|
|
187
160
|
/**
|
|
188
161
|
* 递归删除空的父目录
|
|
189
162
|
* @param dirPath 起始目录路径
|
|
190
|
-
* @param stopAt
|
|
163
|
+
* @param stopAt 停止的目录(不会删除此目录)
|
|
191
164
|
* @param verbose 是否输出详细信息
|
|
192
165
|
*/
|
|
193
166
|
async function removeEmptyParents(dirPath, stopAt, verbose = false) {
|
|
@@ -197,7 +170,7 @@ async function removeEmptyParents(dirPath, stopAt, verbose = false) {
|
|
|
197
170
|
const entries = await filesystem.readDir(currentDir);
|
|
198
171
|
if (entries.length === 0) {
|
|
199
172
|
if (verbose) {
|
|
200
|
-
console.log(chalk_1.default.gray(`
|
|
173
|
+
console.log(chalk_1.default.gray(` Cleaning empty directory: ${path_1.default.relative(stopAt, currentDir)}`));
|
|
201
174
|
}
|
|
202
175
|
await filesystem.removeDir(currentDir);
|
|
203
176
|
currentDir = path_1.default.dirname(currentDir);
|
|
@@ -233,7 +206,7 @@ async function cleanEmptyDirectories(gitrefDir, emptyDirs, verbose = false) {
|
|
|
233
206
|
const entries = await filesystem.readDir(dir.absolutePath);
|
|
234
207
|
if (entries.length === 0) {
|
|
235
208
|
if (verbose) {
|
|
236
|
-
console.log(chalk_1.default.gray(`
|
|
209
|
+
console.log(chalk_1.default.gray(` Removing empty directory: ${dir.fullPath.replace(/\\/g, "/")}`));
|
|
237
210
|
}
|
|
238
211
|
await filesystem.removeDir(dir.absolutePath);
|
|
239
212
|
cleanedCount++;
|
|
@@ -249,24 +222,24 @@ async function cleanEmptyDirectories(gitrefDir, emptyDirs, verbose = false) {
|
|
|
249
222
|
return cleanedCount;
|
|
250
223
|
}
|
|
251
224
|
/**
|
|
252
|
-
*
|
|
225
|
+
* 交互式仓库条目选择
|
|
253
226
|
* @param matches 匹配的条目列表
|
|
254
227
|
* @param name 用户输入的名称
|
|
255
228
|
* @returns 用户选择的条目,如果取消则返回 null
|
|
256
229
|
*/
|
|
257
230
|
async function selectEntry(matches, name) {
|
|
258
|
-
console.log(chalk_1.default.yellow(
|
|
231
|
+
console.log(chalk_1.default.yellow(`Found ${matches.length} reference code matching '${name}':`));
|
|
259
232
|
console.log();
|
|
260
233
|
try {
|
|
261
234
|
const selected = await (0, prompts_1.select)({
|
|
262
|
-
message: "
|
|
235
|
+
message: "Select reference code to remove:",
|
|
263
236
|
choices: [
|
|
264
237
|
...matches.map((match) => ({
|
|
265
238
|
name: `${match.repoName} -> ${match.targetPath}`,
|
|
266
239
|
value: match,
|
|
267
240
|
})),
|
|
268
241
|
{
|
|
269
|
-
name: chalk_1.default.gray("
|
|
242
|
+
name: chalk_1.default.gray("Cancel"),
|
|
270
243
|
value: null,
|
|
271
244
|
},
|
|
272
245
|
],
|
|
@@ -279,20 +252,20 @@ async function selectEntry(matches, name) {
|
|
|
279
252
|
}
|
|
280
253
|
}
|
|
281
254
|
/**
|
|
282
|
-
*
|
|
255
|
+
* 在详细模式下删除目录
|
|
283
256
|
* @param dirPath 要删除的目录路径
|
|
284
|
-
* @param displayPath
|
|
257
|
+
* @param displayPath 用于显示的路径
|
|
285
258
|
* @param verbose 是否输出详细信息
|
|
286
259
|
*/
|
|
287
260
|
async function removeDirVerbose(dirPath, displayPath, verbose) {
|
|
288
261
|
if (verbose) {
|
|
289
|
-
console.log(chalk_1.default.gray(`
|
|
262
|
+
console.log(chalk_1.default.gray(` Removing directory: ${displayPath}`));
|
|
290
263
|
}
|
|
291
264
|
await filesystem.removeDir(dirPath);
|
|
292
265
|
}
|
|
293
266
|
/**
|
|
294
|
-
*
|
|
295
|
-
* @param targetPath
|
|
267
|
+
* 从 .gitignore 中清理参考代码路径条目
|
|
268
|
+
* @param targetPath 已删除的目标路径(相对于工作目录)
|
|
296
269
|
* @param gitreferenceDirExists .gitreference 目录是否仍然存在
|
|
297
270
|
* @param verbose 是否输出详细信息
|
|
298
271
|
*/
|
|
@@ -301,11 +274,11 @@ async function cleanupGitignore(targetPath, gitreferenceDirExists, verbose = fal
|
|
|
301
274
|
// 如果删除的是 .gitreference 目录下的内容
|
|
302
275
|
if (targetPath.startsWith(".gitreference") ||
|
|
303
276
|
targetPath.startsWith(GITREFERENCE_DIR)) {
|
|
304
|
-
//
|
|
277
|
+
// 只有当目录不存在或为空时才从 .gitignore 中移除 .gitreference/ 条目
|
|
305
278
|
if (!gitreferenceDirExists) {
|
|
306
279
|
const removed = await filesystem.removeFromGitignore(cwd, ".gitreference/");
|
|
307
280
|
if (removed && verbose) {
|
|
308
|
-
console.log(chalk_1.default.gray("
|
|
281
|
+
console.log(chalk_1.default.gray(" Removed .gitreference/ from .gitignore"));
|
|
309
282
|
}
|
|
310
283
|
}
|
|
311
284
|
}
|
|
@@ -316,27 +289,27 @@ async function cleanupGitignore(targetPath, gitreferenceDirExists, verbose = fal
|
|
|
316
289
|
: targetPath + "/";
|
|
317
290
|
const removed = await filesystem.removeFromGitignore(cwd, gitignoreEntry);
|
|
318
291
|
if (removed && verbose) {
|
|
319
|
-
console.log(chalk_1.default.gray(`
|
|
292
|
+
console.log(chalk_1.default.gray(` Removed ${gitignoreEntry} from .gitignore`));
|
|
320
293
|
}
|
|
321
294
|
}
|
|
322
295
|
}
|
|
323
296
|
exports.unloadCommand = new commander_1.Command("unload")
|
|
324
297
|
.description("Remove reference code from current project")
|
|
325
298
|
.argument("[name]", "Repository name to remove")
|
|
326
|
-
.
|
|
327
|
-
.
|
|
328
|
-
.
|
|
329
|
-
.
|
|
330
|
-
.
|
|
331
|
-
.
|
|
332
|
-
.
|
|
299
|
+
.addOption(index_js_1.allOption)
|
|
300
|
+
.addOption(index_js_1.forceOption)
|
|
301
|
+
.addOption(index_js_1.dryRunOption)
|
|
302
|
+
.addOption(index_js_1.listOption)
|
|
303
|
+
.addOption(index_js_1.keepEmptyOption)
|
|
304
|
+
.addOption(index_js_1.cleanEmptyOption)
|
|
305
|
+
.addOption(index_js_1.verboseOption)
|
|
333
306
|
.action(async (name, options) => {
|
|
334
307
|
const startTime = Date.now();
|
|
335
308
|
try {
|
|
336
309
|
const cwd = process.cwd();
|
|
337
310
|
const gitrefDir = path_1.default.join(cwd, GITREFERENCE_DIR);
|
|
338
311
|
// 获取所有已加载的条目
|
|
339
|
-
const loadedEntries = await getLoadedEntries(
|
|
312
|
+
const loadedEntries = await getLoadedEntries();
|
|
340
313
|
// 检查 .gitreference 目录是否存在(用于空目录扫描)
|
|
341
314
|
const gitrefDirExists = await filesystem.exists(gitrefDir);
|
|
342
315
|
// 扫描空目录(仅当 .gitreference 目录存在时)
|
|
@@ -347,29 +320,29 @@ exports.unloadCommand = new commander_1.Command("unload")
|
|
|
347
320
|
// 情况 0: --clean-empty 选项,清理空目录
|
|
348
321
|
if (options.cleanEmpty) {
|
|
349
322
|
if (emptyDirs.length === 0) {
|
|
350
|
-
console.log(chalk_1.default.green("
|
|
323
|
+
console.log(chalk_1.default.green("No empty directories to clean."));
|
|
351
324
|
return;
|
|
352
325
|
}
|
|
353
|
-
console.log(
|
|
326
|
+
console.log(`Found ${chalk_1.default.bold(emptyDirs.length)} empty directories:`);
|
|
354
327
|
for (const dir of emptyDirs) {
|
|
355
328
|
console.log(` - ${dir.fullPath.replace(/\\/g, "/")}`);
|
|
356
329
|
}
|
|
357
330
|
console.log();
|
|
358
331
|
// dry-run 模式
|
|
359
332
|
if (options.dryRun) {
|
|
360
|
-
console.log(chalk_1.default.yellow("(
|
|
333
|
+
console.log(chalk_1.default.yellow("(Dry run mode, no actual deletion)"));
|
|
361
334
|
return;
|
|
362
335
|
}
|
|
363
336
|
// 确认删除
|
|
364
337
|
if (!options.force) {
|
|
365
|
-
const confirmed = await confirm("
|
|
338
|
+
const confirmed = await (0, prompt_js_1.confirm)("Are you sure you want to clean these empty directories?");
|
|
366
339
|
if (!confirmed) {
|
|
367
|
-
console.log(chalk_1.default.yellow("
|
|
340
|
+
console.log(chalk_1.default.yellow("Operation cancelled."));
|
|
368
341
|
return;
|
|
369
342
|
}
|
|
370
343
|
}
|
|
371
344
|
// 执行清理
|
|
372
|
-
const spinner = (0,
|
|
345
|
+
const spinner = (0, spinner_js_1.startSpinner)("Cleaning empty directories...");
|
|
373
346
|
try {
|
|
374
347
|
const cleanedCount = await cleanEmptyDirectories(gitrefDir, emptyDirs, options.verbose);
|
|
375
348
|
// 检查 .gitreference 目录是否为空
|
|
@@ -378,7 +351,7 @@ exports.unloadCommand = new commander_1.Command("unload")
|
|
|
378
351
|
const remaining = await filesystem.readDir(gitrefDir);
|
|
379
352
|
if (remaining.length === 0) {
|
|
380
353
|
if (options.verbose) {
|
|
381
|
-
console.log(chalk_1.default.gray(`
|
|
354
|
+
console.log(chalk_1.default.gray(` Removing empty .gitreference directory`));
|
|
382
355
|
}
|
|
383
356
|
await filesystem.removeDir(gitrefDir);
|
|
384
357
|
}
|
|
@@ -388,13 +361,13 @@ exports.unloadCommand = new commander_1.Command("unload")
|
|
|
388
361
|
}
|
|
389
362
|
}
|
|
390
363
|
const elapsed = Date.now() - startTime;
|
|
391
|
-
spinner.succeed(chalk_1.default.green(
|
|
364
|
+
spinner.succeed(chalk_1.default.green(`Cleaned ${cleanedCount} empty directories!`));
|
|
392
365
|
if (options.verbose) {
|
|
393
|
-
console.log(chalk_1.default.gray(`
|
|
366
|
+
console.log(chalk_1.default.gray(` Time elapsed: ${elapsed}ms`));
|
|
394
367
|
}
|
|
395
368
|
}
|
|
396
369
|
catch (error) {
|
|
397
|
-
spinner.fail(chalk_1.default.red("
|
|
370
|
+
spinner.fail(chalk_1.default.red("Cleanup failed"));
|
|
398
371
|
throw error;
|
|
399
372
|
}
|
|
400
373
|
return;
|
|
@@ -402,20 +375,20 @@ exports.unloadCommand = new commander_1.Command("unload")
|
|
|
402
375
|
// 情况 1: --list 选项,列出所有已加载的参考代码
|
|
403
376
|
if (options.list) {
|
|
404
377
|
if (loadedEntries.length === 0 && emptyDirs.length === 0) {
|
|
405
|
-
console.log(chalk_1.default.yellow("
|
|
378
|
+
console.log(chalk_1.default.yellow("No loaded reference code in current project."));
|
|
406
379
|
return;
|
|
407
380
|
}
|
|
408
381
|
if (loadedEntries.length > 0) {
|
|
409
|
-
console.log(chalk_1.default.bold(`📦
|
|
382
|
+
console.log(chalk_1.default.bold(`📦 Loaded reference code in current project (${loadedEntries.length})`));
|
|
410
383
|
console.log();
|
|
411
384
|
// 表头
|
|
412
385
|
const COL_NAME = 35;
|
|
413
386
|
const COL_PATH = 30;
|
|
414
387
|
const COL_COMMIT = 10;
|
|
415
388
|
console.log(chalk_1.default.gray(" " +
|
|
416
|
-
padEnd("REPO", COL_NAME) +
|
|
417
|
-
padEnd("PATH", COL_PATH) +
|
|
418
|
-
padEnd("COMMIT", COL_COMMIT)));
|
|
389
|
+
(0, table_js_1.padEnd)("REPO", COL_NAME) +
|
|
390
|
+
(0, table_js_1.padEnd)("PATH", COL_PATH) +
|
|
391
|
+
(0, table_js_1.padEnd)("COMMIT", COL_COMMIT)));
|
|
419
392
|
// 条目列表
|
|
420
393
|
for (const entry of loadedEntries) {
|
|
421
394
|
const repoName = entry.repoName.replace(/\\/g, "/");
|
|
@@ -424,51 +397,51 @@ exports.unloadCommand = new commander_1.Command("unload")
|
|
|
424
397
|
? entry.commitId.substring(0, 7)
|
|
425
398
|
: "-";
|
|
426
399
|
console.log(" " +
|
|
427
|
-
padEnd(repoName, COL_NAME) +
|
|
428
|
-
padEnd(targetPath, COL_PATH) +
|
|
429
|
-
padEnd(commitShort, COL_COMMIT));
|
|
400
|
+
(0, table_js_1.padEnd)(repoName, COL_NAME) +
|
|
401
|
+
(0, table_js_1.padEnd)(targetPath, COL_PATH) +
|
|
402
|
+
(0, table_js_1.padEnd)(commitShort, COL_COMMIT));
|
|
430
403
|
}
|
|
431
404
|
console.log();
|
|
432
|
-
//
|
|
405
|
+
// 在详细模式下显示更多信息
|
|
433
406
|
if (options.verbose) {
|
|
434
|
-
console.log(chalk_1.default.gray("
|
|
407
|
+
console.log(chalk_1.default.gray("Details:"));
|
|
435
408
|
for (const entry of loadedEntries) {
|
|
436
409
|
console.log(chalk_1.default.gray(` - ${entry.repoName}`));
|
|
437
410
|
console.log(chalk_1.default.gray(` ID: ${entry.id}`));
|
|
438
411
|
console.log(chalk_1.default.gray(` URL: ${entry.repoUrl}`));
|
|
439
|
-
console.log(chalk_1.default.gray(`
|
|
412
|
+
console.log(chalk_1.default.gray(` Path: ${entry.targetPath}`));
|
|
440
413
|
console.log(chalk_1.default.gray(` Commit: ${entry.commitId}`));
|
|
441
414
|
if (entry.branch) {
|
|
442
|
-
console.log(chalk_1.default.gray(`
|
|
415
|
+
console.log(chalk_1.default.gray(` Branch: ${entry.branch}`));
|
|
443
416
|
}
|
|
444
417
|
if (entry.subdir) {
|
|
445
|
-
console.log(chalk_1.default.gray(`
|
|
418
|
+
console.log(chalk_1.default.gray(` Subdir: ${entry.subdir}`));
|
|
446
419
|
}
|
|
447
|
-
console.log(chalk_1.default.gray(`
|
|
420
|
+
console.log(chalk_1.default.gray(` Loaded at: ${entry.loadedAt}`));
|
|
448
421
|
if (entry.updatedAt) {
|
|
449
|
-
console.log(chalk_1.default.gray(`
|
|
422
|
+
console.log(chalk_1.default.gray(` Updated at: ${entry.updatedAt}`));
|
|
450
423
|
}
|
|
451
424
|
}
|
|
452
425
|
console.log();
|
|
453
426
|
}
|
|
454
427
|
}
|
|
455
428
|
else {
|
|
456
|
-
console.log(chalk_1.default.yellow("
|
|
429
|
+
console.log(chalk_1.default.yellow("No loaded reference code in current project."));
|
|
457
430
|
console.log();
|
|
458
431
|
}
|
|
459
432
|
// 显示空目录提示
|
|
460
433
|
if (emptyDirs.length > 0) {
|
|
461
|
-
console.log(chalk_1.default.yellow(`⚠️
|
|
434
|
+
console.log(chalk_1.default.yellow(`⚠️ Found ${emptyDirs.length} empty directory structures`));
|
|
462
435
|
if (options.verbose) {
|
|
463
436
|
for (const dir of emptyDirs) {
|
|
464
437
|
console.log(chalk_1.default.gray(` - ${dir.fullPath.replace(/\\/g, "/")}`));
|
|
465
438
|
}
|
|
466
439
|
}
|
|
467
|
-
console.log(chalk_1.default.gray(`
|
|
440
|
+
console.log(chalk_1.default.gray(` Use 'grf unload --clean-empty' to clean empty directories`));
|
|
468
441
|
console.log();
|
|
469
442
|
}
|
|
470
443
|
if (loadedEntries.length > 0) {
|
|
471
|
-
console.log(chalk_1.default.gray(`💡
|
|
444
|
+
console.log(chalk_1.default.gray(`💡 Use 'grf unload <name>' to remove specific reference code`));
|
|
472
445
|
}
|
|
473
446
|
return;
|
|
474
447
|
}
|
|
@@ -476,9 +449,9 @@ exports.unloadCommand = new commander_1.Command("unload")
|
|
|
476
449
|
if (options.all) {
|
|
477
450
|
// 如果没有已加载的条目
|
|
478
451
|
if (loadedEntries.length === 0) {
|
|
479
|
-
console.log(chalk_1.default.yellow("
|
|
452
|
+
console.log(chalk_1.default.yellow("No reference code found to delete."));
|
|
480
453
|
console.log();
|
|
481
|
-
console.log(chalk_1.default.gray("💡
|
|
454
|
+
console.log(chalk_1.default.gray("💡 Hint: No loaded reference code recorded in loading.json."));
|
|
482
455
|
return;
|
|
483
456
|
}
|
|
484
457
|
const pathsToDelete = [];
|
|
@@ -492,40 +465,64 @@ exports.unloadCommand = new commander_1.Command("unload")
|
|
|
492
465
|
});
|
|
493
466
|
}
|
|
494
467
|
// 显示将要删除的内容
|
|
495
|
-
console.log(
|
|
468
|
+
console.log(`Will delete ${chalk_1.default.bold(loadedEntries.length)} reference code:`);
|
|
496
469
|
for (const pathInfo of pathsToDelete) {
|
|
497
|
-
const status = pathInfo.exists
|
|
470
|
+
const status = pathInfo.exists
|
|
471
|
+
? ""
|
|
472
|
+
: chalk_1.default.gray(" (path does not exist)");
|
|
498
473
|
console.log(` - ${pathInfo.entry.repoName} -> ${pathInfo.entry.targetPath}${status}`);
|
|
499
474
|
}
|
|
500
475
|
console.log();
|
|
501
476
|
// dry-run 模式
|
|
502
477
|
if (options.dryRun) {
|
|
503
|
-
console.log(chalk_1.default.yellow("(
|
|
478
|
+
console.log(chalk_1.default.yellow("(Dry run mode, no actual deletion)"));
|
|
504
479
|
return;
|
|
505
480
|
}
|
|
506
481
|
// 确认删除
|
|
507
482
|
if (!options.force) {
|
|
508
|
-
const confirmed = await confirm("
|
|
483
|
+
const confirmed = await (0, prompt_js_1.confirm)("Are you sure you want to delete?");
|
|
509
484
|
if (!confirmed) {
|
|
510
|
-
console.log(chalk_1.default.yellow("
|
|
485
|
+
console.log(chalk_1.default.yellow("Operation cancelled."));
|
|
511
486
|
return;
|
|
512
487
|
}
|
|
513
488
|
}
|
|
514
489
|
// 执行删除
|
|
515
|
-
const spinner = (0,
|
|
490
|
+
const spinner = (0, spinner_js_1.startSpinner)("Removing reference code...");
|
|
516
491
|
try {
|
|
517
492
|
let deletedCount = 0;
|
|
518
493
|
for (const pathInfo of pathsToDelete) {
|
|
519
494
|
if (options.verbose) {
|
|
520
495
|
spinner.stop();
|
|
521
|
-
console.log(chalk_1.default.gray(`
|
|
496
|
+
console.log(chalk_1.default.gray(` Removing: ${pathInfo.entry.targetPath}`));
|
|
522
497
|
spinner.start();
|
|
523
498
|
}
|
|
524
499
|
// 删除实际文件/目录(如果存在)
|
|
525
500
|
if (pathInfo.exists) {
|
|
526
501
|
await filesystem.removeDir(pathInfo.absolutePath);
|
|
502
|
+
// 递归删除空的父目录
|
|
503
|
+
if (pathInfo.entry.targetPath.startsWith(".gitreference/") ||
|
|
504
|
+
pathInfo.entry.targetPath.startsWith(GITREFERENCE_DIR + "/")) {
|
|
505
|
+
// 在 .gitreference 下,清理到 gitrefDir 为止
|
|
506
|
+
if (options.verbose) {
|
|
507
|
+
spinner.stop();
|
|
508
|
+
}
|
|
509
|
+
await removeEmptyParents(pathInfo.absolutePath, gitrefDir, options.verbose);
|
|
510
|
+
if (options.verbose) {
|
|
511
|
+
spinner.start();
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
// 自定义路径,清理到工作目录为止
|
|
516
|
+
if (options.verbose) {
|
|
517
|
+
spinner.stop();
|
|
518
|
+
}
|
|
519
|
+
await removeEmptyParents(pathInfo.absolutePath, cwd, options.verbose);
|
|
520
|
+
if (options.verbose) {
|
|
521
|
+
spinner.start();
|
|
522
|
+
}
|
|
523
|
+
}
|
|
527
524
|
}
|
|
528
|
-
//
|
|
525
|
+
// 从 .gitignore 中清理对应条目
|
|
529
526
|
const gitignoreEntry = pathInfo.entry.targetPath.endsWith("/")
|
|
530
527
|
? pathInfo.entry.targetPath
|
|
531
528
|
: pathInfo.entry.targetPath + "/";
|
|
@@ -533,21 +530,21 @@ exports.unloadCommand = new commander_1.Command("unload")
|
|
|
533
530
|
deletedCount++;
|
|
534
531
|
}
|
|
535
532
|
// 清空 loading.json
|
|
536
|
-
await loading.clearAllEntries(
|
|
533
|
+
await loading.clearAllEntries();
|
|
537
534
|
// 检查 .gitreference 目录是否为空
|
|
538
535
|
if (!options.keepEmpty && gitrefDirExists) {
|
|
539
536
|
try {
|
|
540
537
|
const remaining = await filesystem.readDir(gitrefDir);
|
|
541
|
-
//
|
|
538
|
+
// 当只剩 loading.json 或为空时删除整个目录
|
|
542
539
|
if (remaining.length === 0 ||
|
|
543
540
|
(remaining.length === 1 && remaining[0] === "loading.json")) {
|
|
544
541
|
if (options.verbose) {
|
|
545
542
|
spinner.stop();
|
|
546
|
-
console.log(chalk_1.default.gray(`
|
|
543
|
+
console.log(chalk_1.default.gray(` Removing .gitreference directory`));
|
|
547
544
|
spinner.start();
|
|
548
545
|
}
|
|
549
546
|
await filesystem.removeDir(gitrefDir);
|
|
550
|
-
//
|
|
547
|
+
// 从 .gitignore 中移除 .gitreference/ 条目
|
|
551
548
|
await filesystem.removeFromGitignore(cwd, ".gitreference/");
|
|
552
549
|
}
|
|
553
550
|
}
|
|
@@ -556,44 +553,44 @@ exports.unloadCommand = new commander_1.Command("unload")
|
|
|
556
553
|
}
|
|
557
554
|
}
|
|
558
555
|
const elapsed = Date.now() - startTime;
|
|
559
|
-
spinner.succeed(chalk_1.default.green(
|
|
556
|
+
spinner.succeed(chalk_1.default.green(`Deleted ${deletedCount} reference code!`));
|
|
560
557
|
if (options.verbose) {
|
|
561
|
-
console.log(chalk_1.default.gray(`
|
|
558
|
+
console.log(chalk_1.default.gray(` Time elapsed: ${elapsed}ms`));
|
|
562
559
|
}
|
|
563
560
|
}
|
|
564
561
|
catch (error) {
|
|
565
|
-
spinner.fail(chalk_1.default.red("
|
|
562
|
+
spinner.fail(chalk_1.default.red("Deletion failed"));
|
|
566
563
|
throw error;
|
|
567
564
|
}
|
|
568
565
|
return;
|
|
569
566
|
}
|
|
570
|
-
// 情况 3:
|
|
567
|
+
// 情况 3: 指定了仓库名称,删除特定参考代码
|
|
571
568
|
if (name) {
|
|
572
569
|
// 匹配条目
|
|
573
570
|
const matches = matchEntries(loadedEntries, name);
|
|
574
571
|
if (matches.length === 0) {
|
|
575
|
-
console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")}
|
|
572
|
+
console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")} No matching reference code found: ${name}`));
|
|
576
573
|
console.log();
|
|
577
|
-
console.log(
|
|
574
|
+
console.log(`Use '${chalk_1.default.cyan("grf unload --list")}' to see all loaded reference code.`);
|
|
578
575
|
process.exit(1);
|
|
579
576
|
}
|
|
580
577
|
let targetEntry;
|
|
581
578
|
if (matches.length > 1) {
|
|
582
|
-
// 如果使用了 --force
|
|
579
|
+
// 如果使用了 --force 选项,仍然需要精确指定
|
|
583
580
|
if (options.force) {
|
|
584
|
-
console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")}
|
|
581
|
+
console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")} Found multiple matching reference code:`));
|
|
585
582
|
console.log();
|
|
586
583
|
for (const match of matches) {
|
|
587
584
|
console.log(` - ${match.repoName} -> ${match.targetPath}`);
|
|
588
585
|
}
|
|
589
586
|
console.log();
|
|
590
|
-
console.log(
|
|
587
|
+
console.log(`Please use full path to specify exactly which reference code to delete.`);
|
|
591
588
|
process.exit(1);
|
|
592
589
|
}
|
|
593
590
|
// 交互式选择
|
|
594
591
|
const selected = await selectEntry(matches, name);
|
|
595
592
|
if (!selected) {
|
|
596
|
-
console.log(chalk_1.default.yellow("
|
|
593
|
+
console.log(chalk_1.default.yellow("Operation cancelled."));
|
|
597
594
|
return;
|
|
598
595
|
}
|
|
599
596
|
targetEntry = selected;
|
|
@@ -607,46 +604,47 @@ exports.unloadCommand = new commander_1.Command("unload")
|
|
|
607
604
|
const absolutePath = path_1.default.resolve(cwd, targetEntry.targetPath);
|
|
608
605
|
const pathExists = await filesystem.exists(absolutePath);
|
|
609
606
|
// 显示将要删除的内容
|
|
610
|
-
console.log(
|
|
611
|
-
console.log(`
|
|
607
|
+
console.log(`Will delete: ${chalk_1.default.cyan(displayName)}`);
|
|
608
|
+
console.log(` Target path: ${chalk_1.default.gray(displayPath)}`);
|
|
612
609
|
if (!pathExists) {
|
|
613
|
-
console.log(chalk_1.default.yellow(` (
|
|
610
|
+
console.log(chalk_1.default.yellow(` (Note: Target path does not exist, will only remove record from loading.json)`));
|
|
614
611
|
}
|
|
615
612
|
if (options.verbose) {
|
|
616
|
-
console.log(`
|
|
613
|
+
console.log(` Absolute path: ${chalk_1.default.gray(absolutePath)}`);
|
|
617
614
|
console.log(` Commit: ${chalk_1.default.gray(targetEntry.commitId)}`);
|
|
618
615
|
if (targetEntry.branch) {
|
|
619
|
-
console.log(`
|
|
616
|
+
console.log(` Branch: ${chalk_1.default.gray(targetEntry.branch)}`);
|
|
620
617
|
}
|
|
621
618
|
}
|
|
622
619
|
console.log();
|
|
623
620
|
// dry-run 模式
|
|
624
621
|
if (options.dryRun) {
|
|
625
|
-
console.log(chalk_1.default.yellow("(
|
|
622
|
+
console.log(chalk_1.default.yellow("(Dry run mode, no actual deletion)"));
|
|
626
623
|
return;
|
|
627
624
|
}
|
|
628
625
|
// 确认删除
|
|
629
626
|
if (!options.force) {
|
|
630
|
-
const confirmed = await confirm(
|
|
627
|
+
const confirmed = await (0, prompt_js_1.confirm)(`Are you sure you want to delete '${displayName}'?`);
|
|
631
628
|
if (!confirmed) {
|
|
632
|
-
console.log(chalk_1.default.yellow("
|
|
629
|
+
console.log(chalk_1.default.yellow("Operation cancelled."));
|
|
633
630
|
return;
|
|
634
631
|
}
|
|
635
632
|
}
|
|
636
633
|
// 执行删除
|
|
637
|
-
const spinner = (0,
|
|
634
|
+
const spinner = (0, spinner_js_1.startSpinner)("Removing reference code...");
|
|
638
635
|
try {
|
|
639
636
|
// 删除实际文件/目录(如果存在)
|
|
640
637
|
if (pathExists) {
|
|
641
638
|
if (options.verbose) {
|
|
642
639
|
spinner.stop();
|
|
643
|
-
console.log(chalk_1.default.gray(`
|
|
640
|
+
console.log(chalk_1.default.gray(` Removing directory: ${displayPath}`));
|
|
644
641
|
spinner.start();
|
|
645
642
|
}
|
|
646
643
|
await filesystem.removeDir(absolutePath);
|
|
647
|
-
//
|
|
644
|
+
// 递归删除空的父目录
|
|
648
645
|
if (targetEntry.targetPath.startsWith(".gitreference/") ||
|
|
649
646
|
targetEntry.targetPath.startsWith(GITREFERENCE_DIR + "/")) {
|
|
647
|
+
// 在 .gitreference 下,清理到 gitrefDir 为止
|
|
650
648
|
if (options.verbose) {
|
|
651
649
|
spinner.stop();
|
|
652
650
|
}
|
|
@@ -655,36 +653,46 @@ exports.unloadCommand = new commander_1.Command("unload")
|
|
|
655
653
|
spinner.start();
|
|
656
654
|
}
|
|
657
655
|
}
|
|
656
|
+
else {
|
|
657
|
+
// 自定义路径,清理到工作目录为止
|
|
658
|
+
if (options.verbose) {
|
|
659
|
+
spinner.stop();
|
|
660
|
+
}
|
|
661
|
+
await removeEmptyParents(absolutePath, cwd, options.verbose);
|
|
662
|
+
if (options.verbose) {
|
|
663
|
+
spinner.start();
|
|
664
|
+
}
|
|
665
|
+
}
|
|
658
666
|
}
|
|
659
|
-
// 从 loading.json
|
|
660
|
-
await loading.removeEntry(targetEntry.id
|
|
661
|
-
//
|
|
667
|
+
// 从 loading.json 中移除条目
|
|
668
|
+
await loading.removeEntry(targetEntry.id);
|
|
669
|
+
// 从 .gitignore 中清理对应条目
|
|
662
670
|
const gitignoreEntry = targetEntry.targetPath.endsWith("/")
|
|
663
671
|
? targetEntry.targetPath
|
|
664
672
|
: targetEntry.targetPath + "/";
|
|
665
673
|
const gitignoreRemoved = await filesystem.removeFromGitignore(cwd, gitignoreEntry);
|
|
666
674
|
if (gitignoreRemoved && options.verbose) {
|
|
667
675
|
spinner.stop();
|
|
668
|
-
console.log(chalk_1.default.gray(`
|
|
676
|
+
console.log(chalk_1.default.gray(` Removed ${gitignoreEntry} from .gitignore`));
|
|
669
677
|
spinner.start();
|
|
670
678
|
}
|
|
671
679
|
// 检查 .gitreference 目录是否为空
|
|
672
680
|
if (!options.keepEmpty && gitrefDirExists) {
|
|
673
681
|
try {
|
|
674
682
|
const remaining = await filesystem.readDir(gitrefDir);
|
|
675
|
-
//
|
|
683
|
+
// 当只剩 loading.json 或为空时删除整个目录
|
|
676
684
|
if (remaining.length === 0 ||
|
|
677
685
|
(remaining.length === 1 && remaining[0] === "loading.json")) {
|
|
678
686
|
// 检查 loading.json 是否还有其他条目
|
|
679
|
-
const remainingEntries = await loading.getEntries(
|
|
687
|
+
const remainingEntries = await loading.getEntries();
|
|
680
688
|
if (remainingEntries.length === 0) {
|
|
681
689
|
if (options.verbose) {
|
|
682
690
|
spinner.stop();
|
|
683
|
-
console.log(chalk_1.default.gray(`
|
|
691
|
+
console.log(chalk_1.default.gray(` Removing empty .gitreference directory`));
|
|
684
692
|
spinner.start();
|
|
685
693
|
}
|
|
686
694
|
await filesystem.removeDir(gitrefDir);
|
|
687
|
-
//
|
|
695
|
+
// 从 .gitignore 中移除 .gitreference/ 条目
|
|
688
696
|
await filesystem.removeFromGitignore(cwd, ".gitreference/");
|
|
689
697
|
}
|
|
690
698
|
}
|
|
@@ -694,45 +702,33 @@ exports.unloadCommand = new commander_1.Command("unload")
|
|
|
694
702
|
}
|
|
695
703
|
}
|
|
696
704
|
const elapsed = Date.now() - startTime;
|
|
697
|
-
spinner.succeed(chalk_1.default.green("
|
|
705
|
+
spinner.succeed(chalk_1.default.green("Reference code removed!"));
|
|
698
706
|
console.log();
|
|
699
|
-
console.log(` ${chalk_1.default.gray("
|
|
700
|
-
console.log(` ${chalk_1.default.gray("
|
|
707
|
+
console.log(` ${chalk_1.default.gray("Repository:")} ${displayName}`);
|
|
708
|
+
console.log(` ${chalk_1.default.gray("Path:")} ${displayPath}`);
|
|
701
709
|
if (options.verbose) {
|
|
702
|
-
console.log(chalk_1.default.gray(`
|
|
710
|
+
console.log(chalk_1.default.gray(` Time elapsed: ${elapsed}ms`));
|
|
703
711
|
}
|
|
704
712
|
}
|
|
705
713
|
catch (error) {
|
|
706
|
-
spinner.fail(chalk_1.default.red("
|
|
714
|
+
spinner.fail(chalk_1.default.red("Deletion failed"));
|
|
707
715
|
throw error;
|
|
708
716
|
}
|
|
709
717
|
return;
|
|
710
718
|
}
|
|
711
|
-
// 情况 4:
|
|
712
|
-
console.log(chalk_1.default.yellow("
|
|
719
|
+
// 情况 4: 未指定名称、--all 或 --list,显示用法
|
|
720
|
+
console.log(chalk_1.default.yellow("No reference code specified to remove."));
|
|
713
721
|
console.log();
|
|
714
|
-
console.log("
|
|
715
|
-
console.log(` ${chalk_1.default.cyan("grf unload <name>")}
|
|
716
|
-
console.log(` ${chalk_1.default.cyan("grf unload --all")}
|
|
717
|
-
console.log(` ${chalk_1.default.cyan("grf unload --list")}
|
|
718
|
-
console.log(` ${chalk_1.default.cyan("grf unload --clean-empty")}
|
|
722
|
+
console.log("Usage:");
|
|
723
|
+
console.log(` ${chalk_1.default.cyan("grf unload <name>")} Remove specific reference code`);
|
|
724
|
+
console.log(` ${chalk_1.default.cyan("grf unload --all")} Remove all reference code`);
|
|
725
|
+
console.log(` ${chalk_1.default.cyan("grf unload --list")} List all loaded reference code`);
|
|
726
|
+
console.log(` ${chalk_1.default.cyan("grf unload --clean-empty")} Clean empty directory structures`);
|
|
719
727
|
console.log();
|
|
720
|
-
console.log(
|
|
728
|
+
console.log(`Use '${chalk_1.default.cyan("grf unload --list")}' to see all loaded reference code.`);
|
|
721
729
|
}
|
|
722
730
|
catch (error) {
|
|
723
|
-
|
|
724
|
-
console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")} ${error.message}`));
|
|
725
|
-
if (error.code === index_js_1.ErrorCode.FS_PERMISSION_DENIED) {
|
|
726
|
-
console.error(chalk_1.default.gray(` 权限被拒绝,请检查文件权限。`));
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
else if (error instanceof Error) {
|
|
730
|
-
console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")} ${error.message}`));
|
|
731
|
-
}
|
|
732
|
-
else {
|
|
733
|
-
console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")} 发生未知错误`));
|
|
734
|
-
}
|
|
735
|
-
process.exit(1);
|
|
731
|
+
(0, error_js_1.handleError)(error, { exit: true });
|
|
736
732
|
}
|
|
737
733
|
});
|
|
738
734
|
//# sourceMappingURL=unload.js.map
|